+ if (client->csqcentityscope[number])
+ {
+ client->csqcentityscope[number] = 1;
+ client->csqcentitysendflags[number] = 0xFFFFFF;
+ }
+ }
+ ed = prog->edicts + number;
+ val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
+ if (val->function)
+ client->csqcentityscope[number] = 2;
+ else if (client->csqcentityscope[number])
+ {
+ client->csqcentityscope[number] = 1;
+ client->csqcentitysendflags[number] = 0xFFFFFF;
+ }
+ number++;
+ }
+ end = client->csqcnumedicts;
+ for (;number < end;number++)
+ {
+ if (client->csqcentityscope[number])
+ {
+ client->csqcentityscope[number] = 1;
+ client->csqcentitysendflags[number] = 0xFFFFFF;
+ }
+ }
+
+ /*
+ // mark all scope entities as remove
+ for (number = 1;number < client->csqcnumedicts;number++)
+ if (client->csqcentityscope[number])
+ client->csqcentityscope[number] = 1;
+ // keep visible entities
+ for (i = 0, n = states;i < numstates;i++, n++)
+ {
+ number = n->number;
+ ed = prog->edicts + number;
+ val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
+ if (val->function)
+ client->csqcentityscope[number] = 2;
+ }
+ */
+
+ // now try to emit the entity updates
+ // (FIXME: prioritize by distance?)
+ end = client->csqcnumedicts;
+ for (number = 1;number < end;number++)
+ {
+ if (!client->csqcentityscope[number])
+ continue;
+ sendflags = client->csqcentitysendflags[number];
+ if (!sendflags)
+ continue;
+ ed = prog->edicts + number;
+ // entity scope is either update (2) or remove (1)
+ if (client->csqcentityscope[number] == 1)
+ {
+ // write a remove message
+ // first write the message identifier if needed
+ if(!sectionstarted)
+ {
+ sectionstarted = 1;
+ MSG_WriteByte(msg, svc_csqcentities);
+ }
+ // write the remove message
+ MSG_WriteShort(msg, (unsigned short)number | 0x8000);
+ client->csqcentityscope[number] = 0;
+ client->csqcentitysendflags[number] = 0;
+ if (msg->cursize + 17 >= maxsize)
+ break;