rendered paste body#define PRESPAWN_FTE_WAY
/*
==================
Cmd_PreSpawn_f
==================
*/
static void Cmd_PreSpawn_f (void)
{
unsigned int buf, bufs;
unsigned int check;
if (sv_client->state != cs_connected)
{
Con_Printf ("prespawn not valid -- already spawned\n");
return;
}
// handle the case of a level changing while a client was connecting
if (Q_atoi(Cmd_Argv(1)) != svs.spawncount)
{
SV_ClearReliable (sv_client);
Con_Printf ("SV_PreSpawn_f from different level\n");
Cmd_New_f ();
return;
}
buf = Q_atoi(Cmd_Argv(2));
if (buf >= sv.num_signon_buffers)
buf = 0;
if (!buf)
{
// should be three numbers following containing checksums
check = Q_atoi(Cmd_Argv(3));
// Con_DPrintf("Client check = %d\n", check);
if ((int)sv_mapcheck.value && check != sv.map_checksum &&
check != sv.map_checksum2)
{
SV_ClientPrintf (sv_client, PRINT_HIGH,
"Map model file does not match (%s), %i != %i/%i.\n"
"You may need a new version of the map, or the proper install files.\n",
sv.modelname, check, sv.map_checksum, sv.map_checksum2);
SV_DropClient (sv_client);
return;
}
sv_client->checksum = check;
}
//NOTE: This doesn't go through ClientReliableWrite since it's before the user
//spawns. These functions are written to not overflow
if (sv_client->num_backbuf)
{
Con_Printf("WARNING %s: [SV_PreSpawn] Back buffered (%d0), clearing\n", sv_client->name, sv_client->netchan.message.cursize);
sv_client->num_backbuf = 0;
SZ_Clear(&sv_client->netchan.message);
}
SZ_Write (&sv_client->netchan.message,
sv.signon_buffers[buf],
sv.signon_buffer_size[buf]);
#ifdef PRESPAWN_FTE_WAY
bufs = sv.num_signon_buffers;
if (buf >= bufs)
{
int i;
entity_state_t from;
entity_state_t *state;
edict_t *ent;
// svcustomtents_t *ctent;
memset(&from, 0, sizeof(from));
while (sv_client->netchan.message.cursize < (sv_client->netchan.message.maxsize/2)) //static entities
{
if (buf - bufs >= sv.numextrastatics)
break;
state = &sv.extendedstatics[buf - bufs];
if (sv_client->fteprotocolextensions & PEXT_SPAWNSTATIC2)
{
MSG_WriteByte(&sv_client->netchan.message, svc_spawnstatic2);
SV_PreWriteDelta(&from, state, &sv_client->netchan.message, true, sv_client->fteprotocolextensions);
}
else if (state->modelindex < 256)
{
MSG_WriteByte(&sv_client->netchan.message, svc_spawnstatic);
MSG_WriteByte (&sv_client->netchan.message, state->modelindex&255);
MSG_WriteByte (&sv_client->netchan.message, state->frame);
MSG_WriteByte (&sv_client->netchan.message, (int)state->colormap);
MSG_WriteByte (&sv_client->netchan.message, (int)state->skinnum);
for (i=0 ; i<3 ; i++)
{
MSG_WriteCoord(&sv_client->netchan.message, state->origin[i]);
MSG_WriteAngle(&sv_client->netchan.message, state->angles[i]);
}
}
buf++;
}
while (sv_client->netchan.message.cursize < (sv_client->netchan.message.maxsize/2)) //baselines
{
if (buf - bufs - sv.numextrastatics >= sv.num_edicts)
break;
ent = EDICT_NUM(/*svprogfuncs, */buf - bufs - sv.numextrastatics);
state = &ent->baseline;
if (!state->number || !state->modelindex)
{ //ent doesn't have a baseline
buf++;
continue;
}
if (!ent)
{
MSG_WriteByte(&sv_client->netchan.message, svc_spawnbaseline);
MSG_WriteShort (&sv_client->netchan.message, buf - bufs - sv.numextrastatics);
MSG_WriteByte (&sv_client->netchan.message, 0);
MSG_WriteByte (&sv_client->netchan.message, 0);
MSG_WriteByte (&sv_client->netchan.message, 0);
MSG_WriteByte (&sv_client->netchan.message, 0);
for (i=0 ; i<3 ; i++)
{
MSG_WriteCoord(&sv_client->netchan.message, 0);
MSG_WriteAngle(&sv_client->netchan.message, 0);
}
}
else if (sv_client->fteprotocolextensions & PEXT_SPAWNSTATIC2)
{
MSG_WriteByte(&sv_client->netchan.message, svc_spawnbaseline2);
SV_PreWriteDelta(&from, state, &sv_client->netchan.message, true, sv_client->fteprotocolextensions);
}
else if (state->modelindex < 256)
{
MSG_WriteByte(&sv_client->netchan.message, svc_spawnbaseline);
MSG_WriteShort (&sv_client->netchan.message, buf - bufs - sv.numextrastatics);
MSG_WriteByte (&sv_client->netchan.message, state->modelindex);
MSG_WriteByte (&sv_client->netchan.message, state->frame);
MSG_WriteByte (&sv_client->netchan.message, (int)state->colormap);
MSG_WriteByte (&sv_client->netchan.message, (int)state->skinnum);
for (i=0 ; i<3 ; i++)
{
MSG_WriteCoord(&sv_client->netchan.message, state->origin[i]);
MSG_WriteAngle(&sv_client->netchan.message, state->angles[i]);
}
}
buf++;
}
/* while (sv_client->netchan.message.cursize < (sv_client->netchan.message.maxsize/2))
{
i = buf - bufs - sv.numextrastatics - sv.num_edicts;
if (i >= 255)
break;
ctent = &sv.customtents[i];
buf++;
if (!*ctent->particleeffecttype)
{ //effect isn't registered.
continue;
}
if (sv_client->fteprotocolextensions & PEXT_CUSTOMTEMPEFFECTS)
{
MSG_WriteByte(&sv_client->netchan.message, svc_customtempent);
MSG_WriteByte(&sv_client->netchan.message, 255);
MSG_WriteByte(&sv_client->netchan.message, i);
MSG_WriteByte(&sv_client->netchan.message, ctent->netstyle);
MSG_WriteString(&sv_client->netchan.message, ctent->particleeffecttype);
if (ctent->netstyle & CTE_STAINS)
{
MSG_WriteChar(&sv_client->netchan.message, ctent->stain[0]);
MSG_WriteChar(&sv_client->netchan.message, ctent->stain[0]);
MSG_WriteChar(&sv_client->netchan.message, ctent->stain[0]);
MSG_WriteByte(&sv_client->netchan.message, ctent->radius);
}
if (ctent->netstyle & CTE_GLOWS)
{
MSG_WriteByte(&sv_client->netchan.message, ctent->dlightrgb[0]);
MSG_WriteByte(&sv_client->netchan.message, ctent->dlightrgb[1]);
MSG_WriteByte(&sv_client->netchan.message, ctent->dlightrgb[2]);
MSG_WriteByte(&sv_client->netchan.message, ctent->dlightradius);
MSG_WriteByte(&sv_client->netchan.message, ctent->dlighttime);
}
}
}*/
}
else if (buf >= bufs)
{
buf = bufs+sv.numextrastatics+sv.num_edicts+255;
}
else
{
/* if (sv.democausesreconnect)
{
if (sv_client->netchan.message.cursize+sv.signon_buffer_size[buf]+30 < sv_client->netchan.message.maxsize)
{
SZ_Write (&sv_client->netchan.message,
sv.demosignon_buffers[buf],
sv.demosignon_buffer_size[buf]);
buf++;
}
}
else
{*/
if (sv_client->netchan.message.cursize+sv.signon_buffer_size[buf]+30 < sv_client->netchan.message.maxsize)
{
SZ_Write (&sv_client->netchan.message,
sv.signon_buffers[buf],
sv.signon_buffer_size[buf]);
buf++;
}
//}
}
if (buf == bufs+sv.numextrastatics+sv.num_edicts+255)
{ // all done prespawning
MSG_WriteByte (&sv_client->netchan.message, svc_stufftext);
MSG_WriteString (&sv_client->netchan.message, va("cmd spawn %i\n",svs.spawncount) );
}
else
{ // need to prespawn more
MSG_WriteByte (&sv_client->netchan.message, svc_stufftext);
MSG_WriteString (&sv_client->netchan.message,
va("cmd prespawn %i %i\n", svs.spawncount, buf) );
}
#else
buf++;
if (buf == sv.num_signon_buffers)
{ // all done prespawning
MSG_WriteByte (&sv_client->netchan.message, svc_stufftext);
MSG_WriteString (&sv_client->netchan.message, va("cmd spawn %i 0\n",svs.spawncount) );
}
else
{ // need to prespawn more
MSG_WriteByte (&sv_client->netchan.message, svc_stufftext);
MSG_WriteString (&sv_client->netchan.message,
va("cmd prespawn %i %i\n", svs.spawncount, buf) );
}
#endif
}