okay so i hacked up another version of trap_Trace called trap_TraceSpec and it works flawlessly especially with CG_Trace_World in client. If a player doesn’t have the client they will only notice a slight lag in door but thats it and it may have just been due to my test server being crappy.
but:
typedef struct content_save_s {
int entityNum;
int contents;
} content_save_t;
content_save_t content_save[MAX_GENTITIES];
void trap_TraceSpec( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ) {
static int i, j; //this gets called a lot, make it static
static int reset;
static int done;
done = 0;
j = 0; //count number of entities in the save array
for ( i = 0; i < MAX_GENTITIES; i++ )
{ // save contents and change as appropriate
if ( i == passEntityNum ) continue;
if ( i == ENTITYNUM_WORLD ) continue;
if ( i == ENTITYNUM_NONE ) continue;
if ( g_entities[i].r.contents )
{ // there are some strange situations where contents can get over-written twice... sigh
content_save[j].entityNum = i;
content_save[j].contents = g_entities[i].r.contents;
j++;
g_entities[i].r.contents = 0;
}
}
syscall( G_TRACE, results, start, mins, maxs, end, passEntityNum, contentmask, 0, 10 );
//consider results
while ( results->fraction < 1.0 || results->startsolid ) // add start solid test????
{
if (results->entityNum != ENTITYNUM_WORLD && results->entityNum != ENTITYNUM_NONE )
{ // hit a real entity
if ( g_entities[results->entityNum].r.contents )
{ // there are some strange situations where contents can get over-written twice... sigh
content_save[j].entityNum = results->entityNum;
content_save[j].contents = g_entities[results->entityNum].r.contents;
j++;
g_entities[results->entityNum].r.contents = 0; // change contents of hit entity and run trace again
}
}
else
{
done = 1; // hit world or nothing so proceed...
}
if ( done )
{
break; //while
}
syscall( G_TRACE, results, start, mins, maxs, end, passEntityNum, contentmask, 0, 10 );
}
// now reset all entity contents that have been saved
for ( i = 0; i < j; i++ )
{
g_entities[content_save[i].entityNum].r.contents = content_save[i].contents;
}
}
the extra 0, 10 in G_TRACE syscall is just some extra stuff for ghoul2 system.