24 Oct 2010
This commit is contained in:
parent
8014f738c9
commit
404d084524
|
@ -11,6 +11,7 @@ extern cl_enginefuncs_t gEngfuncs;
|
||||||
#include "event_api.h"
|
#include "event_api.h"
|
||||||
#include "enginecallback.h"
|
#include "enginecallback.h"
|
||||||
#include "shake.h"
|
#include "shake.h"
|
||||||
|
#include "com_model.h"
|
||||||
|
|
||||||
#define FILE_GLOBAL static
|
#define FILE_GLOBAL static
|
||||||
#define DLL_GLOBAL
|
#define DLL_GLOBAL
|
||||||
|
|
|
@ -18,6 +18,16 @@
|
||||||
|
|
||||||
#define CONTENTS_NODE 1 // fake contents to determine nodes
|
#define CONTENTS_NODE 1 // fake contents to determine nodes
|
||||||
|
|
||||||
|
// model types
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
mod_bad = -1,
|
||||||
|
mod_brush,
|
||||||
|
mod_sprite,
|
||||||
|
mod_alias,
|
||||||
|
mod_studio
|
||||||
|
} modtype_t;
|
||||||
|
|
||||||
typedef struct mplane_s
|
typedef struct mplane_s
|
||||||
{
|
{
|
||||||
vec3_t normal;
|
vec3_t normal;
|
||||||
|
|
|
@ -725,16 +725,6 @@ typedef struct
|
||||||
byte r, g, b;
|
byte r, g, b;
|
||||||
} color24;
|
} color24;
|
||||||
|
|
||||||
// model types
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
mod_bad,
|
|
||||||
mod_world,
|
|
||||||
mod_brush,
|
|
||||||
mod_studio,
|
|
||||||
mod_sprite
|
|
||||||
} modtype_t;
|
|
||||||
|
|
||||||
// link_t is only used for entity area links now
|
// link_t is only used for entity area links now
|
||||||
typedef struct link_s
|
typedef struct link_s
|
||||||
{
|
{
|
||||||
|
|
|
@ -755,6 +755,8 @@ void CL_SendDisconnectMessage( void )
|
||||||
sizebuf_t buf;
|
sizebuf_t buf;
|
||||||
byte data[32];
|
byte data[32];
|
||||||
|
|
||||||
|
if( cls.state == ca_disconnected ) return;
|
||||||
|
|
||||||
BF_Init( &buf, "LastMessage", data, sizeof( data ));
|
BF_Init( &buf, "LastMessage", data, sizeof( data ));
|
||||||
BF_WriteByte( &buf, clc_stringcmd );
|
BF_WriteByte( &buf, clc_stringcmd );
|
||||||
BF_WriteString( &buf, "disconnect" );
|
BF_WriteString( &buf, "disconnect" );
|
||||||
|
@ -811,7 +813,6 @@ void CL_Disconnect_f( void )
|
||||||
void CL_Crashed_f( void )
|
void CL_Crashed_f( void )
|
||||||
{
|
{
|
||||||
// already freed
|
// already freed
|
||||||
if( cls.state == ca_disconnected ) return;
|
|
||||||
if( host.state == HOST_CRASHED ) return;
|
if( host.state == HOST_CRASHED ) return;
|
||||||
if( host.type != HOST_NORMAL ) return;
|
if( host.type != HOST_NORMAL ) return;
|
||||||
if( !cls.initialized ) return;
|
if( !cls.initialized ) return;
|
||||||
|
@ -1553,6 +1554,7 @@ void CL_InitLocal( void )
|
||||||
cl_cmdbackup = Cvar_Get( "cl_cmdbackup", "2", CVAR_ARCHIVE, "how many additional history commands are sent" );
|
cl_cmdbackup = Cvar_Get( "cl_cmdbackup", "2", CVAR_ARCHIVE, "how many additional history commands are sent" );
|
||||||
cl_cmdrate = Cvar_Get( "cl_cmdrate", "30", CVAR_ARCHIVE, "Max number of command packets sent to server per second" );
|
cl_cmdrate = Cvar_Get( "cl_cmdrate", "30", CVAR_ARCHIVE, "Max number of command packets sent to server per second" );
|
||||||
Cvar_Get( "hud_scale", "0", CVAR_ARCHIVE|CVAR_LATCH, "scale hud at current resolution" );
|
Cvar_Get( "hud_scale", "0", CVAR_ARCHIVE|CVAR_LATCH, "scale hud at current resolution" );
|
||||||
|
Cvar_Get( "skin", "", CVAR_USERINFO, "player skin" ); // XDM 3.3 want this cvar
|
||||||
|
|
||||||
// server commands
|
// server commands
|
||||||
Cmd_AddCommand ("noclip", NULL, "enable or disable no clipping mode" );
|
Cmd_AddCommand ("noclip", NULL, "enable or disable no clipping mode" );
|
||||||
|
|
|
@ -378,11 +378,15 @@ static void BSP_LoadSurfaces( const dlump_t *l )
|
||||||
out->plane = loadmodel->planes + LittleLong( in->planenum );
|
out->plane = loadmodel->planes + LittleLong( in->planenum );
|
||||||
out->texinfo = loadmodel->texinfo + LittleLong( in->texinfo );
|
out->texinfo = loadmodel->texinfo + LittleLong( in->texinfo );
|
||||||
|
|
||||||
|
// some DMC maps have bad textures
|
||||||
|
if( out->texinfo->texture )
|
||||||
|
{
|
||||||
if( !com.strncmp( out->texinfo->texture->name, "sky", 3 ))
|
if( !com.strncmp( out->texinfo->texture->name, "sky", 3 ))
|
||||||
out->flags |= (SURF_DRAWSKY|SURF_DRAWTILED);
|
out->flags |= (SURF_DRAWSKY|SURF_DRAWTILED);
|
||||||
|
|
||||||
if( out->texinfo->texture->name[0] == '*' || out->texinfo->texture->name[0] == '!' )
|
if( out->texinfo->texture->name[0] == '*' || out->texinfo->texture->name[0] == '!' )
|
||||||
out->flags |= (SURF_DRAWTURB|SURF_DRAWTILED);
|
out->flags |= (SURF_DRAWTURB|SURF_DRAWTILED);
|
||||||
|
}
|
||||||
|
|
||||||
BSP_CalcSurfaceExtents( out );
|
BSP_CalcSurfaceExtents( out );
|
||||||
|
|
||||||
|
@ -841,7 +845,7 @@ static void CM_BrushModel( model_t *mod, byte *buffer )
|
||||||
|
|
||||||
*starmod = *loadmodel;
|
*starmod = *loadmodel;
|
||||||
|
|
||||||
starmod->type = (i == 0) ? mod_world : mod_brush;
|
starmod->type = mod_brush;
|
||||||
starmod->hulls[0].firstclipnode = bm->headnode[0];
|
starmod->hulls[0].firstclipnode = bm->headnode[0];
|
||||||
|
|
||||||
for( j = 1; j < MAX_MAP_HULLS; j++ )
|
for( j = 1; j < MAX_MAP_HULLS; j++ )
|
||||||
|
@ -1061,7 +1065,6 @@ void CM_BeginRegistration( const char *name, bool clientload, uint *checksum )
|
||||||
// load the newmap
|
// load the newmap
|
||||||
worldmodel = CM_ModForName( name, true );
|
worldmodel = CM_ModForName( name, true );
|
||||||
if( !worldmodel ) Host_Error( "Couldn't load %s\n", name );
|
if( !worldmodel ) Host_Error( "Couldn't load %s\n", name );
|
||||||
worldmodel->type = mod_world;
|
|
||||||
sv_models[1] = cm_models; // make link to world
|
sv_models[1] = cm_models; // make link to world
|
||||||
|
|
||||||
if( checksum ) *checksum = cm.checksum;
|
if( checksum ) *checksum = cm.checksum;
|
||||||
|
|
|
@ -104,6 +104,31 @@ void Con_Clear_f( void )
|
||||||
con.display = con.current; // go to end
|
con.display = con.current; // go to end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Con_SetColor_f
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
void Con_SetColor_f( void )
|
||||||
|
{
|
||||||
|
vec3_t color;
|
||||||
|
|
||||||
|
switch( Cmd_Argc() )
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
Msg( "\"con_color\" is %i %i %i\n", g_color_table[7][0], g_color_table[7][1], g_color_table[7][2] );
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
VectorSet( color, g_color_table[7][0], g_color_table[7][1], g_color_table[7][2] );
|
||||||
|
com.atov( color, Cmd_Argv( 1 ), 3 );
|
||||||
|
Con_DefaultColor( color[0], color[1], color[2] );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Msg( "Usage: con_color \"r g b\"\n" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
Con_ClearNotify
|
Con_ClearNotify
|
||||||
|
@ -507,6 +532,7 @@ void Con_Init( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f, "opens or closes the console" );
|
Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f, "opens or closes the console" );
|
||||||
|
Cmd_AddCommand( "con_color", Con_SetColor_f, "set a custom console color" );
|
||||||
Cmd_AddCommand( "clear", Con_Clear_f, "clear console history" );
|
Cmd_AddCommand( "clear", Con_Clear_f, "clear console history" );
|
||||||
|
|
||||||
MsgDev( D_NOTE, "Console initialized.\n" );
|
MsgDev( D_NOTE, "Console initialized.\n" );
|
||||||
|
|
|
@ -99,7 +99,7 @@ const char *PM_TraceTexture( physent_t *pe, vec3_t start, vec3_t end )
|
||||||
vec3_t temp, offset;
|
vec3_t temp, offset;
|
||||||
|
|
||||||
bmodel = pe->model;
|
bmodel = pe->model;
|
||||||
if( !bmodel || bmodel->type != mod_brush && bmodel->type != mod_world )
|
if( !bmodel || bmodel->type != mod_brush )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
hull = PM_HullForBsp( pe, vec3_origin, vec3_origin, offset );
|
hull = PM_HullForBsp( pe, vec3_origin, vec3_origin, offset );
|
||||||
|
@ -130,7 +130,9 @@ const char *PM_TraceTexture( physent_t *pe, vec3_t start, vec3_t end )
|
||||||
}
|
}
|
||||||
|
|
||||||
surf = PM_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l );
|
surf = PM_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l );
|
||||||
if( !surf ) return NULL;
|
|
||||||
|
if( !surf || !surf->texinfo || !surf->texinfo->texture )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return surf->texinfo->texture->name;
|
return surf->texinfo->texture->name;
|
||||||
}
|
}
|
|
@ -124,7 +124,7 @@ hull_t *PM_HullForEntity( physent_t *pe, vec3_t mins, vec3_t maxs, vec3_t offset
|
||||||
if( pe->movetype != MOVETYPE_PUSH )
|
if( pe->movetype != MOVETYPE_PUSH )
|
||||||
Host_Error( "SOLID_BSP without MOVETYPE_PUSH\n" );
|
Host_Error( "SOLID_BSP without MOVETYPE_PUSH\n" );
|
||||||
|
|
||||||
if( !pe->model || pe->model->type != mod_brush && pe->model->type != mod_world )
|
if( !pe->model || pe->model->type != mod_brush )
|
||||||
Host_Error( "Entity %s has MOVETYPE_PUSH with a non bsp model\n", pe->name );
|
Host_Error( "Entity %s has MOVETYPE_PUSH with a non bsp model\n", pe->name );
|
||||||
|
|
||||||
VectorSubtract( maxs, mins, size );
|
VectorSubtract( maxs, mins, size );
|
||||||
|
@ -178,7 +178,7 @@ hull_t *PM_HullForBsp( physent_t *pe, const vec3_t mins, const vec3_t maxs, floa
|
||||||
// decide which clipping hull to use, based on the size
|
// decide which clipping hull to use, based on the size
|
||||||
model = pe->model;
|
model = pe->model;
|
||||||
|
|
||||||
if( !model || ( model->type != mod_brush && model->type != mod_world ))
|
if( !model || model->type != mod_brush )
|
||||||
Host_Error( "Entity %i SOLID_BSP with a non bsp model %i\n", pe->info, model->type );
|
Host_Error( "Entity %i SOLID_BSP with a non bsp model %i\n", pe->info, model->type );
|
||||||
|
|
||||||
VectorSubtract( maxs, mins, size );
|
VectorSubtract( maxs, mins, size );
|
||||||
|
|
|
@ -50,6 +50,11 @@ void Host_ShutdownServer( void )
|
||||||
SV_Shutdown( false );
|
SV_Shutdown( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Host_Null( void )
|
||||||
|
{
|
||||||
|
// just a stub for some commands in dedicated-mode
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
Host_NewGame
|
Host_NewGame
|
||||||
|
@ -813,6 +818,7 @@ void Host_Init( const int argc, const char **argv )
|
||||||
{
|
{
|
||||||
Cmd_AddCommand( "quit", Sys_Quit, "quit the game" );
|
Cmd_AddCommand( "quit", Sys_Quit, "quit the game" );
|
||||||
Cmd_AddCommand( "exit", Sys_Quit, "quit the game" );
|
Cmd_AddCommand( "exit", Sys_Quit, "quit the game" );
|
||||||
|
Cmd_AddCommand( "@crashed", Host_Null, "" );
|
||||||
|
|
||||||
// dedicated servers using settings from server.cfg file
|
// dedicated servers using settings from server.cfg file
|
||||||
Cbuf_AddText( va( "exec %s\n", Cvar_VariableString( "servercfgfile" )));
|
Cbuf_AddText( va( "exec %s\n", Cvar_VariableString( "servercfgfile" )));
|
||||||
|
|
|
@ -269,7 +269,8 @@ edict_t *SV_FakeConnect( const char *netname )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( !newcl )
|
|
||||||
|
if( i == sv_maxclients->integer )
|
||||||
{
|
{
|
||||||
MsgDev( D_INFO, "SV_DirectConnect: rejected a connection.\n");
|
MsgDev( D_INFO, "SV_DirectConnect: rejected a connection.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -305,6 +306,7 @@ edict_t *SV_FakeConnect( const char *netname )
|
||||||
newcl->state = cs_spawned;
|
newcl->state = cs_spawned;
|
||||||
newcl->lastmessage = host.realtime; // don't timeout
|
newcl->lastmessage = host.realtime; // don't timeout
|
||||||
newcl->lastconnect = host.realtime;
|
newcl->lastconnect = host.realtime;
|
||||||
|
newcl->sendinfo = true;
|
||||||
|
|
||||||
return ent;
|
return ent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
//=======================================================================
|
||||||
|
// Copyright XashXT Group 2008 ©
|
||||||
|
// sv_edict.h - server prvm edict
|
||||||
|
//=======================================================================
|
||||||
|
#ifndef SV_EDICT_H
|
||||||
|
#define SV_EDICT_H
|
||||||
|
|
||||||
|
struct sv_globalvars_s
|
||||||
|
{
|
||||||
|
int pad[34];
|
||||||
|
int pev;
|
||||||
|
int other;
|
||||||
|
int world;
|
||||||
|
float time;
|
||||||
|
float frametime;
|
||||||
|
float serverflags;
|
||||||
|
string_t mapname;
|
||||||
|
string_t startspot;
|
||||||
|
vec3_t spotoffset;
|
||||||
|
float deathmatch;
|
||||||
|
float teamplay;
|
||||||
|
float coop;
|
||||||
|
float total_secrets;
|
||||||
|
float found_secrets;
|
||||||
|
float total_monsters;
|
||||||
|
float killed_monsters;
|
||||||
|
vec3_t v_forward;
|
||||||
|
vec3_t v_right;
|
||||||
|
vec3_t v_up;
|
||||||
|
float trace_allsolid;
|
||||||
|
float trace_startsolid;
|
||||||
|
float trace_fraction;
|
||||||
|
float trace_plane_dist;
|
||||||
|
vec3_t trace_endpos;
|
||||||
|
vec3_t trace_plane_normal;
|
||||||
|
float trace_contents;
|
||||||
|
float trace_hitgroup;
|
||||||
|
float trace_flags;
|
||||||
|
int trace_ent;
|
||||||
|
func_t CreateAPI;
|
||||||
|
func_t StartFrame;
|
||||||
|
func_t EndFrame;
|
||||||
|
func_t PlayerPreThink;
|
||||||
|
func_t PlayerPostThink;
|
||||||
|
func_t ClientConnect;
|
||||||
|
func_t ClientDisconnect;
|
||||||
|
func_t PutClientInServer;
|
||||||
|
func_t ClientCommand;
|
||||||
|
func_t ClientUserInfoChanged;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sv_entvars_s
|
||||||
|
{
|
||||||
|
string_t classname;
|
||||||
|
string_t globalname;
|
||||||
|
int chain;
|
||||||
|
func_t precache;
|
||||||
|
func_t activate;
|
||||||
|
func_t blocked;
|
||||||
|
func_t touch;
|
||||||
|
func_t think;
|
||||||
|
func_t use;
|
||||||
|
vec3_t origin;
|
||||||
|
vec3_t angles;
|
||||||
|
float modelindex;
|
||||||
|
vec3_t old_origin;
|
||||||
|
vec3_t old_angles;
|
||||||
|
vec3_t velocity;
|
||||||
|
vec3_t avelocity;
|
||||||
|
vec3_t m_pcentre[3];
|
||||||
|
vec3_t m_pmatrix[4];
|
||||||
|
vec3_t movedir;
|
||||||
|
vec3_t force;
|
||||||
|
vec3_t torque;
|
||||||
|
vec3_t post_origin;
|
||||||
|
vec3_t post_angles;
|
||||||
|
vec3_t origin_offset;
|
||||||
|
vec3_t absmin;
|
||||||
|
vec3_t absmax;
|
||||||
|
vec3_t mins;
|
||||||
|
vec3_t maxs;
|
||||||
|
vec3_t size;
|
||||||
|
float mass;
|
||||||
|
float solid;
|
||||||
|
float contents;
|
||||||
|
float movetype;
|
||||||
|
float waterlevel;
|
||||||
|
float watertype;
|
||||||
|
float ltime;
|
||||||
|
string_t model;
|
||||||
|
float skin;
|
||||||
|
float body;
|
||||||
|
float frame;
|
||||||
|
float speed;
|
||||||
|
float sequence;
|
||||||
|
float animtime;
|
||||||
|
float framerate;
|
||||||
|
float style;
|
||||||
|
float gaitsequence;
|
||||||
|
float effects;
|
||||||
|
float rendermode;
|
||||||
|
float renderfx;
|
||||||
|
float renderamt;
|
||||||
|
float colormap;
|
||||||
|
float flags;
|
||||||
|
float aiflags;
|
||||||
|
float spawnflags;
|
||||||
|
float fixangle;
|
||||||
|
vec3_t v_angle;
|
||||||
|
vec3_t view_ofs;
|
||||||
|
vec3_t punchangle;
|
||||||
|
float button0;
|
||||||
|
float button1;
|
||||||
|
float button2;
|
||||||
|
float impulse;
|
||||||
|
string_t v_model;
|
||||||
|
float v_frame;
|
||||||
|
float v_body;
|
||||||
|
float v_skin;
|
||||||
|
float v_sequence;
|
||||||
|
string_t p_model;
|
||||||
|
float p_sequence;
|
||||||
|
float p_frame;
|
||||||
|
float p_body;
|
||||||
|
float p_skin;
|
||||||
|
string_t loopsound;
|
||||||
|
float loopsndvol;
|
||||||
|
float loopsndattn;
|
||||||
|
int owner;
|
||||||
|
int enemy;
|
||||||
|
int aiment;
|
||||||
|
int goalentity;
|
||||||
|
float teleport_time;
|
||||||
|
float ideal_yaw;
|
||||||
|
float yaw_speed;
|
||||||
|
float m_flGroundSpeed;
|
||||||
|
float m_flFrameRate;
|
||||||
|
int groundentity;
|
||||||
|
float takedamage;
|
||||||
|
float nextthink;
|
||||||
|
float gravity;
|
||||||
|
float health;
|
||||||
|
float frags;
|
||||||
|
float team;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PROG_CRC_SERVER 8066
|
||||||
|
|
||||||
|
#endif//SV_EDICT_H
|
|
@ -2822,7 +2822,7 @@ pfnServerPrint
|
||||||
void pfnServerPrint( const char *szMsg )
|
void pfnServerPrint( const char *szMsg )
|
||||||
{
|
{
|
||||||
// while loading in-progress we can sending message only for local client
|
// while loading in-progress we can sending message only for local client
|
||||||
if( sv.state == ss_loading ) MsgDev( D_INFO, szMsg );
|
if( sv.state != ss_active ) MsgDev( D_INFO, szMsg );
|
||||||
else SV_BroadcastPrintf( PRINT_HIGH, "%s", szMsg );
|
else SV_BroadcastPrintf( PRINT_HIGH, "%s", szMsg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3829,7 +3829,7 @@ pfnAddServerCommand
|
||||||
*/
|
*/
|
||||||
void pfnAddServerCommand( const char *cmd_name, void (*function)(void) )
|
void pfnAddServerCommand( const char *cmd_name, void (*function)(void) )
|
||||||
{
|
{
|
||||||
Cmd_AddCommand( cmd_name, function, "" );
|
Cmd_AddGameCommand( cmd_name, function );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -4273,6 +4273,11 @@ void SV_UnloadProgs( void )
|
||||||
Mem_FreePool( &svgame.stringspool );
|
Mem_FreePool( &svgame.stringspool );
|
||||||
else StringTable_Delete( svgame.hStringTable );
|
else StringTable_Delete( svgame.hStringTable );
|
||||||
|
|
||||||
|
if( svgame.dllFuncs2.pfnGameShutdown )
|
||||||
|
{
|
||||||
|
svgame.dllFuncs2.pfnGameShutdown ();
|
||||||
|
}
|
||||||
|
|
||||||
// now we can unload cvars
|
// now we can unload cvars
|
||||||
Cvar_FullSet( "host_gameloaded", "0", CVAR_INIT );
|
Cvar_FullSet( "host_gameloaded", "0", CVAR_INIT );
|
||||||
|
|
||||||
|
@ -4292,6 +4297,7 @@ bool SV_LoadProgs( const char *name )
|
||||||
static APIFUNCTION2 GetEntityAPI2;
|
static APIFUNCTION2 GetEntityAPI2;
|
||||||
static GIVEFNPTRSTODLL GiveFnptrsToDll;
|
static GIVEFNPTRSTODLL GiveFnptrsToDll;
|
||||||
static NEW_DLL_FUNCTIONS_FN GiveNewDllFuncs;
|
static NEW_DLL_FUNCTIONS_FN GiveNewDllFuncs;
|
||||||
|
static enginefuncs_t gpEngfuncs;
|
||||||
static globalvars_t gpGlobals;
|
static globalvars_t gpGlobals;
|
||||||
static playermove_t gpMove;
|
static playermove_t gpMove;
|
||||||
edict_t *e;
|
edict_t *e;
|
||||||
|
@ -4308,6 +4314,9 @@ bool SV_LoadProgs( const char *name )
|
||||||
// make sure what new dll functions is cleared
|
// make sure what new dll functions is cleared
|
||||||
Mem_Set( &svgame.dllFuncs2, 0, sizeof( svgame.dllFuncs2 ));
|
Mem_Set( &svgame.dllFuncs2, 0, sizeof( svgame.dllFuncs2 ));
|
||||||
|
|
||||||
|
// make local copy of engfuncs to prevent overwrite it with bots.dll
|
||||||
|
Mem_Copy( &gpEngfuncs, &gEngfuncs, sizeof( gpEngfuncs ));
|
||||||
|
|
||||||
GetEntityAPI = (APIFUNCTION)FS_GetProcAddress( svgame.hInstance, "GetEntityAPI" );
|
GetEntityAPI = (APIFUNCTION)FS_GetProcAddress( svgame.hInstance, "GetEntityAPI" );
|
||||||
GetEntityAPI2 = (APIFUNCTION2)FS_GetProcAddress( svgame.hInstance, "GetEntityAPI2" );
|
GetEntityAPI2 = (APIFUNCTION2)FS_GetProcAddress( svgame.hInstance, "GetEntityAPI2" );
|
||||||
GiveNewDllFuncs = (NEW_DLL_FUNCTIONS_FN)FS_GetProcAddress( svgame.hInstance, "GetNewDLLFunctions" );
|
GiveNewDllFuncs = (NEW_DLL_FUNCTIONS_FN)FS_GetProcAddress( svgame.hInstance, "GetNewDLLFunctions" );
|
||||||
|
@ -4330,7 +4339,7 @@ bool SV_LoadProgs( const char *name )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GiveFnptrsToDll( &gEngfuncs, svgame.globals );
|
GiveFnptrsToDll( &gpEngfuncs, svgame.globals );
|
||||||
|
|
||||||
// get extended callbacks
|
// get extended callbacks
|
||||||
if( GiveNewDllFuncs )
|
if( GiveNewDllFuncs )
|
||||||
|
|
|
@ -82,6 +82,7 @@ void SV_CalcPings( void )
|
||||||
{
|
{
|
||||||
cl = &svs.clients[i];
|
cl = &svs.clients[i];
|
||||||
if( cl->state != cs_spawned ) continue;
|
if( cl->state != cs_spawned ) continue;
|
||||||
|
if( cl->fakeclient ) continue;
|
||||||
|
|
||||||
total = count = 0;
|
total = count = 0;
|
||||||
|
|
||||||
|
@ -89,7 +90,7 @@ void SV_CalcPings( void )
|
||||||
{
|
{
|
||||||
client_frame_t *frame;
|
client_frame_t *frame;
|
||||||
|
|
||||||
frame = &cl->frames[(cl->netchan.incoming_acknowledged - 1 - j) & SV_UPDATE_MASK];
|
frame = &cl->frames[(cl->netchan.incoming_acknowledged - (j + 1)) & SV_UPDATE_MASK];
|
||||||
if( frame->latency > 0 )
|
if( frame->latency > 0 )
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
|
|
|
@ -306,22 +306,10 @@ static pmtrace_t *pfnTraceLine( float *start, float *end, int flags, int usehull
|
||||||
return &tr;
|
return &tr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: re-order modtypes
|
|
||||||
static int pfnGetModelType( model_t *mod )
|
static int pfnGetModelType( model_t *mod )
|
||||||
{
|
{
|
||||||
if( !mod ) return -1;
|
if( !mod ) return mod_bad;
|
||||||
|
return mod->type;
|
||||||
switch( mod->type )
|
|
||||||
{
|
|
||||||
case mod_brush:
|
|
||||||
case mod_world:
|
|
||||||
return 0;
|
|
||||||
case mod_studio:
|
|
||||||
return 3;
|
|
||||||
case mod_sprite:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pfnGetModelBounds( model_t *mod, float *mins, float *maxs )
|
static void pfnGetModelBounds( model_t *mod, float *mins, float *maxs )
|
||||||
|
|
|
@ -121,7 +121,7 @@ hull_t *SV_HullForEntity( edict_t *ent, int hullNumber, vec3_t mins, vec3_t maxs
|
||||||
|
|
||||||
model = CM_ClipHandleToModel( ent->v.modelindex );
|
model = CM_ClipHandleToModel( ent->v.modelindex );
|
||||||
|
|
||||||
if( !model || model->type != mod_brush && model->type != mod_world )
|
if( !model || model->type != mod_brush )
|
||||||
Host_Error( "MOVETYPE_PUSH with a non bsp model\n" );
|
Host_Error( "MOVETYPE_PUSH with a non bsp model\n" );
|
||||||
|
|
||||||
VectorSubtract( maxs, mins, size );
|
VectorSubtract( maxs, mins, size );
|
||||||
|
@ -223,7 +223,7 @@ hull_t *SV_HullForBsp( edict_t *ent, const vec3_t mins, const vec3_t maxs, float
|
||||||
// decide which clipping hull to use, based on the size
|
// decide which clipping hull to use, based on the size
|
||||||
model = CM_ClipHandleToModel( ent->v.modelindex );
|
model = CM_ClipHandleToModel( ent->v.modelindex );
|
||||||
|
|
||||||
if( !model || ( model->type != mod_brush && model->type != mod_world ))
|
if( !model || model->type != mod_brush )
|
||||||
Host_Error( "Entity %i SOLID_BSP with a non bsp model %i\n", ent->serialnumber, model->type );
|
Host_Error( "Entity %i SOLID_BSP with a non bsp model %i\n", ent->serialnumber, model->type );
|
||||||
|
|
||||||
VectorSubtract( maxs, mins, size );
|
VectorSubtract( maxs, mins, size );
|
||||||
|
@ -1066,7 +1066,7 @@ const char *SV_TraceTexture( edict_t *ent, const vec3_t start, const vec3_t end
|
||||||
vec3_t temp, offset;
|
vec3_t temp, offset;
|
||||||
|
|
||||||
bmodel = CM_ClipHandleToModel( ent->v.modelindex );
|
bmodel = CM_ClipHandleToModel( ent->v.modelindex );
|
||||||
if( !bmodel || bmodel->type != mod_brush && bmodel->type != mod_world )
|
if( !bmodel || bmodel->type != mod_brush )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
hull = SV_HullForBsp( ent, vec3_origin, vec3_origin, offset );
|
hull = SV_HullForBsp( ent, vec3_origin, vec3_origin, offset );
|
||||||
|
@ -1097,7 +1097,9 @@ const char *SV_TraceTexture( edict_t *ent, const vec3_t start, const vec3_t end
|
||||||
}
|
}
|
||||||
|
|
||||||
surf = SV_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l );
|
surf = SV_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l );
|
||||||
if( !surf ) return NULL;
|
|
||||||
|
if( !surf || !surf->texinfo || !surf->texinfo->texture )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return surf->texinfo->texture->name;
|
return surf->texinfo->texture->name;
|
||||||
}
|
}
|
||||||
|
|
70
launch/cmd.c
70
launch/cmd.c
|
@ -318,12 +318,15 @@ void Cmd_Echo_f( void )
|
||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define CMD_EXTDLL BIT( 0 )
|
||||||
|
|
||||||
typedef struct cmd_function_s
|
typedef struct cmd_function_s
|
||||||
{
|
{
|
||||||
struct cmd_function_s *next;
|
struct cmd_function_s *next;
|
||||||
char *name;
|
char *name;
|
||||||
char *desc;
|
char *desc;
|
||||||
xcommand_t function;
|
xcommand_t function;
|
||||||
|
int flags;
|
||||||
} cmd_function_t;
|
} cmd_function_t;
|
||||||
|
|
||||||
static int cmd_argc;
|
static int cmd_argc;
|
||||||
|
@ -480,6 +483,31 @@ void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_
|
||||||
cmd_functions = cmd;
|
cmd_functions = cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
============
|
||||||
|
Cmd_AddGameCommand
|
||||||
|
============
|
||||||
|
*/
|
||||||
|
void Cmd_AddGameCommand( const char *cmd_name, xcommand_t function )
|
||||||
|
{
|
||||||
|
cmd_function_t *cmd;
|
||||||
|
|
||||||
|
// fail if the command already exists
|
||||||
|
if( Cmd_Exists( cmd_name ))
|
||||||
|
{
|
||||||
|
MsgDev(D_INFO, "Cmd_AddCommand: %s already defined\n", cmd_name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// use a small malloc to avoid zone fragmentation
|
||||||
|
cmd = Malloc( sizeof( cmd_function_t ));
|
||||||
|
cmd->name = copystring( cmd_name );
|
||||||
|
cmd->function = function;
|
||||||
|
cmd->flags = CMD_EXTDLL;
|
||||||
|
cmd->next = cmd_functions;
|
||||||
|
cmd_functions = cmd;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cmd_RemoveCommand
|
Cmd_RemoveCommand
|
||||||
|
@ -612,6 +640,48 @@ void Cmd_List_f( void )
|
||||||
Msg( "%i commands\n", i );
|
Msg( "%i commands\n", i );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
============
|
||||||
|
Cmd_Unlink
|
||||||
|
|
||||||
|
unlink all commands with flag CVAR_EXTDLL
|
||||||
|
============
|
||||||
|
*/
|
||||||
|
void Cmd_Unlink( void )
|
||||||
|
{
|
||||||
|
cmd_function_t *cmd;
|
||||||
|
cmd_function_t **prev;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
if( Cvar_VariableInteger( "host_gameloaded" ))
|
||||||
|
{
|
||||||
|
Msg( "can't unlink cvars while game is loaded\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unlink commands first
|
||||||
|
Cmd_Unlink ();
|
||||||
|
|
||||||
|
prev = &cmd_functions;
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
cmd = *prev;
|
||||||
|
if( !cmd ) break;
|
||||||
|
|
||||||
|
if( !( cmd->flags & CMD_EXTDLL ))
|
||||||
|
{
|
||||||
|
prev = &cmd->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
*prev = cmd->next;
|
||||||
|
if( cmd->name ) Mem_Free( cmd->name );
|
||||||
|
if( cmd->desc ) Mem_Free( cmd->desc );
|
||||||
|
Mem_Free( cmd );
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cmd_Init
|
Cmd_Init
|
||||||
|
|
|
@ -508,4 +508,5 @@ void Sys_PrintLog( const char *pMsg )
|
||||||
{
|
{
|
||||||
if( !Sys.logfile ) return;
|
if( !Sys.logfile ) return;
|
||||||
fprintf( Sys.logfile, pMsg );
|
fprintf( Sys.logfile, pMsg );
|
||||||
|
fflush( Sys.logfile );
|
||||||
}
|
}
|
|
@ -230,17 +230,11 @@ Adds a freestanding variable to the variable list.
|
||||||
*/
|
*/
|
||||||
void Cvar_RegisterVariable( cvar_t *var )
|
void Cvar_RegisterVariable( cvar_t *var )
|
||||||
{
|
{
|
||||||
const char *oldstring;
|
convar_t **prev, *cur = NULL;
|
||||||
|
convar_t *find;
|
||||||
|
|
||||||
ASSERT( var != NULL );
|
ASSERT( var != NULL );
|
||||||
|
|
||||||
// first check to see if it has allready been defined
|
|
||||||
if( Cvar_FindVar( var->name ))
|
|
||||||
{
|
|
||||||
MsgDev( D_ERROR, "can't register variable %s, allready defined\n", var->name );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for overlap with a command
|
// check for overlap with a command
|
||||||
if( Cmd_Exists( var->name ))
|
if( Cmd_Exists( var->name ))
|
||||||
{
|
{
|
||||||
|
@ -248,9 +242,55 @@ void Cvar_RegisterVariable( cvar_t *var )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// first check to see if it has allready been defined
|
||||||
|
if(( cur = Cvar_FindVar( var->name )) != NULL )
|
||||||
|
{
|
||||||
|
// this cvar is already registered with Cvar_RegisterVariable
|
||||||
|
// so we can't replace it
|
||||||
|
if( cur->flags & CVAR_EXTDLL )
|
||||||
|
{
|
||||||
|
MsgDev( D_ERROR, "can't register variable %s, allready defined\n", var->name );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( cur )
|
||||||
|
{
|
||||||
|
prev = &cvar_vars;
|
||||||
|
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
find = *prev;
|
||||||
|
ASSERT( find != NULL );
|
||||||
|
|
||||||
|
// search for previous cvar
|
||||||
|
if( cur != find->next )
|
||||||
|
{
|
||||||
|
prev = &find->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// link new variable
|
||||||
|
find->next = (convar_t *)var;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var->string = cur->string; // we already have right string
|
||||||
|
var->value = com.atof( var->string );
|
||||||
|
var->flags |= CVAR_EXTDLL; // all cvars passed this function are game cvars
|
||||||
|
var->next = (cvar_t *)cur->next;
|
||||||
|
|
||||||
|
// release current cvar (but keep string)
|
||||||
|
if( cur->name ) Mem_Free( cur->name );
|
||||||
|
if( cur->latched_string ) Mem_Free( cur->latched_string );
|
||||||
|
if( cur->reset_string ) Mem_Free( cur->reset_string );
|
||||||
|
if( cur->description ) Mem_Free( cur->description );
|
||||||
|
Mem_Free( cur );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// copy the value off, because future sets will Z_Free it
|
// copy the value off, because future sets will Z_Free it
|
||||||
oldstring = var->string;
|
var->string = copystring( var->string );
|
||||||
var->string = copystring( oldstring );
|
|
||||||
var->value = com.atof( var->string );
|
var->value = com.atof( var->string );
|
||||||
var->flags |= CVAR_EXTDLL; // all cvars passed this function are game cvars
|
var->flags |= CVAR_EXTDLL; // all cvars passed this function are game cvars
|
||||||
|
|
||||||
|
@ -258,6 +298,7 @@ void Cvar_RegisterVariable( cvar_t *var )
|
||||||
var->next = (cvar_t *)cvar_vars;
|
var->next = (cvar_t *)cvar_vars;
|
||||||
cvar_vars = (convar_t *)var;
|
cvar_vars = (convar_t *)var;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
|
@ -689,10 +730,8 @@ bool Cvar_Command( void )
|
||||||
// perform a variable print or set
|
// perform a variable print or set
|
||||||
if( Cmd_Argc() == 1 )
|
if( Cmd_Argc() == 1 )
|
||||||
{
|
{
|
||||||
if( v->flags & CVAR_INIT ) Msg( "%s: %s\n", v->name, v->string );
|
if( v->flags & ( CVAR_INIT|CVAR_EXTDLL )) Msg( "%s: %s\n", v->name, v->string );
|
||||||
else Msg( "%s: %s ( ^3%s^7 )\n", v->name, v->string, v->reset_string );
|
else Msg( "%s: %s ( ^3%s^7 )\n", v->name, v->string, v->reset_string );
|
||||||
if( v->flags & CVAR_EXTDLL ) Msg( "%s: %s\n", v->name, v->string );
|
|
||||||
else if( v->latched_string ) Msg( "%s: %s\n", v->name, v->latched_string );
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1098,7 +1137,7 @@ void Cvar_LatchedAudio_f( void )
|
||||||
============
|
============
|
||||||
Cvar_Unlink_f
|
Cvar_Unlink_f
|
||||||
|
|
||||||
Now all latched audio strings is valid
|
unlink all cvars with flag CVAR_EXTDLL
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void Cvar_Unlink_f( void )
|
void Cvar_Unlink_f( void )
|
||||||
|
|
|
@ -2932,7 +2932,7 @@ dll_user_t *FS_FindLibrary( const char *dllname, bool directpath )
|
||||||
string dllpath;
|
string dllpath;
|
||||||
searchpath_t *search;
|
searchpath_t *search;
|
||||||
dll_user_t *hInst;
|
dll_user_t *hInst;
|
||||||
int index;
|
int i, index;
|
||||||
|
|
||||||
// check for bad exports
|
// check for bad exports
|
||||||
if( !dllname || !*dllname )
|
if( !dllname || !*dllname )
|
||||||
|
@ -2944,7 +2944,14 @@ dll_user_t *FS_FindLibrary( const char *dllname, bool directpath )
|
||||||
|
|
||||||
fs_ext_path = directpath;
|
fs_ext_path = directpath;
|
||||||
|
|
||||||
com.strncpy( dllpath, dllname, sizeof( dllpath ));
|
// replace all backward slashes
|
||||||
|
for( i = 0; i < com.strlen( dllname ); i++ )
|
||||||
|
{
|
||||||
|
if( dllname[i] == '\\' ) dllpath[i] = '/';
|
||||||
|
else dllpath[i] = com.tolower( dllname[i] );
|
||||||
|
}
|
||||||
|
dllpath[i] = '\0';
|
||||||
|
|
||||||
FS_DefaultExtension( dllpath, ".dll" ); // trying to apply if forget
|
FS_DefaultExtension( dllpath, ".dll" ); // trying to apply if forget
|
||||||
|
|
||||||
search = FS_FindFile( dllpath, &index, false );
|
search = FS_FindFile( dllpath, &index, false );
|
||||||
|
|
|
@ -409,7 +409,9 @@ uint Cmd_Argc( void );
|
||||||
char *Cmd_Args( void );
|
char *Cmd_Args( void );
|
||||||
char *Cmd_Argv( uint arg );
|
char *Cmd_Argv( uint arg );
|
||||||
void Cmd_Init( void );
|
void Cmd_Init( void );
|
||||||
|
void Cmd_Unlink( void );
|
||||||
void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc );
|
void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc );
|
||||||
|
void Cmd_AddGameCommand( const char *cmd_name, xcommand_t function );
|
||||||
void Cmd_RemoveCommand( const char *cmd_name );
|
void Cmd_RemoveCommand( const char *cmd_name );
|
||||||
bool Cmd_Exists( const char *cmd_name );
|
bool Cmd_Exists( const char *cmd_name );
|
||||||
void Cmd_LookupCmds( char *buffer, void *ptr, setpair_t callback );
|
void Cmd_LookupCmds( char *buffer, void *ptr, setpair_t callback );
|
||||||
|
|
|
@ -158,6 +158,7 @@ void Sys_GetStdAPI( void )
|
||||||
com.Cmd_Argv = Cmd_Argv;
|
com.Cmd_Argv = Cmd_Argv;
|
||||||
com.Cmd_LookupCmds = Cmd_LookupCmds;
|
com.Cmd_LookupCmds = Cmd_LookupCmds;
|
||||||
com.Cmd_AddCommand = Cmd_AddCommand;
|
com.Cmd_AddCommand = Cmd_AddCommand;
|
||||||
|
com.Cmd_AddGameCommand = Cmd_AddGameCommand;
|
||||||
com.Cmd_DelCommand = Cmd_RemoveCommand;
|
com.Cmd_DelCommand = Cmd_RemoveCommand;
|
||||||
com.Cmd_TokenizeString = Cmd_TokenizeString;
|
com.Cmd_TokenizeString = Cmd_TokenizeString;
|
||||||
|
|
||||||
|
|
|
@ -593,6 +593,7 @@ typedef struct stdilib_api_s
|
||||||
char *(*Cmd_Argv)( uint arg );
|
char *(*Cmd_Argv)( uint arg );
|
||||||
void (*Cmd_LookupCmds)( char *buffer, void *ptr, setpair_t callback );
|
void (*Cmd_LookupCmds)( char *buffer, void *ptr, setpair_t callback );
|
||||||
void (*Cmd_AddCommand)( const char *name, xcommand_t function, const char *desc );
|
void (*Cmd_AddCommand)( const char *name, xcommand_t function, const char *desc );
|
||||||
|
void (*Cmd_AddGameCommand)( const char *cmd_name, xcommand_t function );
|
||||||
void (*Cmd_TokenizeString)( const char *text_in );
|
void (*Cmd_TokenizeString)( const char *text_in );
|
||||||
void (*Cmd_DelCommand)( const char *name );
|
void (*Cmd_DelCommand)( const char *name );
|
||||||
|
|
||||||
|
@ -905,6 +906,7 @@ console commands
|
||||||
#define Cmd_TokenizeString com.Cmd_TokenizeString
|
#define Cmd_TokenizeString com.Cmd_TokenizeString
|
||||||
#define Cmd_LookupCmds com.Cmd_LookupCmds
|
#define Cmd_LookupCmds com.Cmd_LookupCmds
|
||||||
#define Cmd_AddCommand com.Cmd_AddCommand
|
#define Cmd_AddCommand com.Cmd_AddCommand
|
||||||
|
#define Cmd_AddGameCommand com.Cmd_AddGameCommand
|
||||||
#define Cmd_RemoveCommand com.Cmd_DelCommand
|
#define Cmd_RemoveCommand com.Cmd_DelCommand
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -41,6 +41,16 @@ BRUSH MODELS
|
||||||
//
|
//
|
||||||
// in memory representation
|
// in memory representation
|
||||||
//
|
//
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
mod_bad = -1,
|
||||||
|
mod_brush,
|
||||||
|
mod_sprite,
|
||||||
|
mod_alias,
|
||||||
|
mod_studio,
|
||||||
|
mod_world, // added
|
||||||
|
} modtype_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
vec3_t mins, maxs;
|
vec3_t mins, maxs;
|
||||||
|
|
|
@ -2625,7 +2625,9 @@ void R_AddStudioModelToList( ref_entity_t *e )
|
||||||
|
|
||||||
void R_StudioRunEvents( ref_entity_t *e )
|
void R_StudioRunEvents( ref_entity_t *e )
|
||||||
{
|
{
|
||||||
if( !e->model->extradata ) return;
|
if( !e || !e->model || !e->model->extradata )
|
||||||
|
return;
|
||||||
|
|
||||||
if( RP_FOLLOWENTITY( e )) return;
|
if( RP_FOLLOWENTITY( e )) return;
|
||||||
|
|
||||||
RI.currententity = e;
|
RI.currententity = e;
|
||||||
|
|
Reference in New Issue