MCPcopy Create free account
hub / github.com/assaultcube/AC / buildworldstate

Function buildworldstate

source/src/server.cpp:455–536  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

453static bool reliablemessages = false;
454
455bool 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; }

Callers 1

sendworldstateFunction · 0.85

Calls 7

recordpacketFunction · 0.85
reserveMethod · 0.80
addbufMethod · 0.80
lengthMethod · 0.45
getbufMethod · 0.45
putMethod · 0.45
addMethod · 0.45

Tested by

no test coverage detected