diff --git a/data/mdl/crate.gsm b/data/mdl/crate.gsm index ebc5c97..6172778 100644 Binary files a/data/mdl/crate.gsm and b/data/mdl/crate.gsm differ diff --git a/data/mdl/fish.gsm b/data/mdl/fish.gsm index 028436e..b080492 100644 Binary files a/data/mdl/fish.gsm and b/data/mdl/fish.gsm differ diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index 6fc3415..9b5680a 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -258,12 +258,12 @@ struct _GSNetClient { unsigned int rxseq; unsigned int rxindex; unsigned int rxtotal; - unsigned int rxstate; unsigned int txseq; unsigned int txindex; unsigned int txtotal; unsigned int txstate; + unsigned long txtick; GSBinary* rx; GSBinary* tx; diff --git a/engine/src/core.c b/engine/src/core.c index b7f5130..60466ca 100644 --- a/engine/src/core.c +++ b/engine/src/core.c @@ -158,8 +158,7 @@ void GSEngineLoop(GSEngine engine) { tick += 1.0 / engine->tps; if(tick >= 1) { - engine->tps_sampled += engine->tps; - engine->tps_sampled /= 2; + engine->tps_sampled = engine->tps; tick = tick - 1; } diff --git a/engine/src/net/net_client.c b/engine/src/net/net_client.c index ab07a40..3cbd1ea 100644 --- a/engine/src/net/net_client.c +++ b/engine/src/net/net_client.c @@ -1,6 +1,9 @@ #include #include +#include + +#include GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) { GSNetClient net = malloc(sizeof(*net)); @@ -16,6 +19,11 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) { return NULL; } + GSBinary b; + b.data = strdup("Hello"); + b.size = 5; + arrput(net->tx, b); + return net; } @@ -32,22 +40,67 @@ void GSNetClientStep(GSNetClient net) { GSNetPacketRead(net->fd, &pkt, &addr); if(pkt.header.flag & GSNetPacketFlagAcknowledge) { - if(net->txstate == WaitingAcknowledge && net->txindex == pkt.header.index && net->txseq == pkt.header.seq) { - GSLog(net->engine, GSLogDebug, "ACK received for %d:%d", net->txindex, net->txseq); + if(arrlen(net->tx) > 0 && net->txstate == WaitingAcknowledge && net->txindex == pkt.header.index && net->txseq == pkt.header.seq) { + GSLog(net->engine, GSLogDebug, "Received ACK packet %d:%d", net->txindex, net->txseq); - if(net->txseq == net->txtotal) net->txstate = Acknowledged; + net->txstate = Acknowledged; + net->txseq++; + if(net->txseq == (net->txtotal + 1)){ + net->txseq = 0; + net->txindex++; + + arrdel(net->tx, 0); + } } } else { - if(net->rxstate == Acknowledged && net->rxindex == pkt.header.index && net->rxseq == pkt.header.seq) { + if(net->rxindex == pkt.header.index && net->rxseq == pkt.header.seq) { + GSLog(net->engine, GSLogDebug, "Received packet %d:%d", net->rxindex, net->rxseq); + pkt.header.flag |= GSNetPacketFlagAcknowledge; pkt.header.index = net->rxindex; pkt.header.seq = net->rxseq; pkt.size = 0; + if(net->rxseq == 0){ + net->rxtotal = GSEndianSwapU32BE(*(GSU32*)pkt.data); + } + GSNetPacketWrite(net->fd, &pkt, &addr); + + net->rxseq++; + if(net->rxseq == (net->rxtotal + 1)){ + net->rxseq = 0; + net->rxindex++; + } } } } + + if(arrlen(net->tx) > 0){ + if(net->txstate == Acknowledged){ + int n = net->tx[0].size; + + if(net->txseq == 0){ + net->txtotal = 0; + + while(n > 0){ + n -= 508 - sizeof(pkt.header); + net->txtotal++; + } + + } + + net->txstate = WaitingAcknowledge; + if(net->engine->param->get_tick != NULL) net->txtick = net->engine->param->get_tick(); + + GSLog(net->engine, GSLogDebug, "Sent packet %d:%d", net->txindex, net->txseq); + }else if(net->engine->param->get_tick == NULL){ + }else if((net->engine->param->get_tick() - net->txtick) >= 500){ + GSLog(net->engine, GSLogDebug, "Lost pcaket %d:%d", net->txindex, net->txseq); + + net->txstate = Acknowledged; + } + } } void GSNetClientClose(GSNetClient net) {