| 453 | static bool reliablemessages = false; |
| 454 | |
| 455 | bool buildworldstate() |
| 456 | { |
| 457 | static struct { int posoff, poslen, msgoff, msglen; } pkt[MAXCLIENTS]; |
| 458 | worldstate &ws = *new worldstate; |
| 459 | loopv(clients) |
| 460 | { |
| 461 | client &c = *clients[i]; |
| 462 | if(c.type!=ST_TCPIP || !c.isauthed) continue; |
| 463 | c.overflow = 0; |
| 464 | if(c.position.empty()) pkt[i].posoff = -1; |
| 465 | else |
| 466 | { |
| 467 | pkt[i].posoff = ws.positions.length(); |
| 468 | ws.positions.put(c.position.getbuf(), c.position.length()); |
| 469 | pkt[i].poslen = ws.positions.length() - pkt[i].posoff; |
| 470 | c.position.setsize(0); |
| 471 | } |
| 472 | if(c.messages.empty()) pkt[i].msgoff = -1; |
| 473 | else |
| 474 | { |
| 475 | pkt[i].msgoff = ws.messages.length(); |
| 476 | putint(ws.messages, SV_CLIENT); |
| 477 | putint(ws.messages, c.clientnum); |
| 478 | putuint(ws.messages, c.messages.length()); |
| 479 | ws.messages.put(c.messages.getbuf(), c.messages.length()); |
| 480 | pkt[i].msglen = ws.messages.length() - pkt[i].msgoff; |
| 481 | c.messages.setsize(0); |
| 482 | } |
| 483 | } |
| 484 | int psize = ws.positions.length(), msize = ws.messages.length(); |
| 485 | if(psize) |
| 486 | { |
| 487 | recordpacket(0, ws.positions.getbuf(), psize); |
| 488 | ucharbuf p = ws.positions.reserve(psize); |
| 489 | p.put(ws.positions.getbuf(), psize); |
| 490 | ws.positions.addbuf(p); |
| 491 | } |
| 492 | if(msize) |
| 493 | { |
| 494 | recordpacket(1, ws.messages.getbuf(), msize); |
| 495 | ucharbuf p = ws.messages.reserve(msize); |
| 496 | p.put(ws.messages.getbuf(), msize); |
| 497 | ws.messages.addbuf(p); |
| 498 | } |
| 499 | ws.uses = 0; |
| 500 | loopv(clients) |
| 501 | { |
| 502 | client &c = *clients[i]; |
| 503 | if(c.type!=ST_TCPIP || !c.isauthed) continue; |
| 504 | ENetPacket *packet; |
| 505 | if(psize && (pkt[i].posoff<0 || psize-pkt[i].poslen>0)) |
| 506 | { |
| 507 | packet = enet_packet_create(&ws.positions[pkt[i].posoff<0 ? 0 : pkt[i].posoff+pkt[i].poslen], |
| 508 | pkt[i].posoff<0 ? psize : psize-pkt[i].poslen, |
| 509 | ENET_PACKET_FLAG_NO_ALLOCATE); |
| 510 | sendpacket(c.clientnum, 0, packet); |
| 511 | if(!packet->referenceCount) enet_packet_destroy(packet); |
| 512 | else { ++ws.uses; packet->freeCallback = cleanworldstate; } |
no test coverage detected