06 Sep 2007
This commit is contained in:
parent
cc5ec77d05
commit
d6ccf91e53
|
@ -6,15 +6,10 @@ SV_Move SV_Trace
|
|||
SV_ClipMoveToEntity CM_BoxTrace
|
||||
SV_ClipToLinks SV_ClipMoveToEntities
|
||||
|
||||
|
||||
1. Откатываем назад до имплементации QC, пытаемся восстановить работоспособность OK
|
||||
2. Откатываем назад таймер (предварительно сохранив текущуюю версию)
|
||||
|
||||
//==================================================
|
||||
// FIXME
|
||||
//==================================================
|
||||
1. Переписать главный игровой цикл
|
||||
2. Пофиксить физику
|
||||
1. Пофиксить движение игрока (сл. большая скорость)
|
||||
|
||||
//==================================================
|
||||
// òî, ÷òî óæå ãîòîâî
|
||||
|
|
|
@ -601,7 +601,7 @@ void CL_ParsePlayerstate (frame_t *oldframe, frame_t *newframe)
|
|||
}
|
||||
|
||||
if (flags & PS_FOV)
|
||||
state->fov = MSG_ReadFloat (&net_message);
|
||||
state->fov = MSG_ReadByte (&net_message);
|
||||
|
||||
if (flags & PS_RDFLAGS)
|
||||
state->rdflags = MSG_ReadByte (&net_message);
|
||||
|
|
|
@ -295,9 +295,7 @@ void CL_BaseMove (usercmd_t *cmd)
|
|||
cmd->forwardmove -= cl_forwardspeed->value * CL_KeyState (&in_back);
|
||||
}
|
||||
|
||||
//
|
||||
// adjust for speed key / running
|
||||
//
|
||||
// adjust for speed key / running
|
||||
if ( (in_speed.state & 1) ^ (int)(cl_run->value) )
|
||||
{
|
||||
cmd->forwardmove *= 2;
|
||||
|
@ -369,8 +367,7 @@ usercmd_t CL_CreateCmd (void)
|
|||
usercmd_t cmd;
|
||||
|
||||
frame_msec = host.cl_timer - old_sys_frame_time;
|
||||
if (frame_msec < 1) frame_msec = 1;
|
||||
if (frame_msec > 200) frame_msec = 200;
|
||||
frame_msec = bound(1, frame_msec, 200);
|
||||
|
||||
// get basic movement from keyboard
|
||||
CL_BaseMove (&cmd);
|
||||
|
|
|
@ -1401,7 +1401,7 @@ CL_InitLocal
|
|||
void CL_InitLocal (void)
|
||||
{
|
||||
cls.state = ca_disconnected;
|
||||
cls.realtime = 1.0f;
|
||||
cls.realtime = Sys_DoubleTime();
|
||||
|
||||
CL_InitInput ();
|
||||
|
||||
|
@ -1429,7 +1429,7 @@ void CL_InitLocal (void)
|
|||
cl_footsteps = Cvar_Get ("cl_footsteps", "1", 0);
|
||||
cl_noskins = Cvar_Get ("cl_noskins", "0", 0);
|
||||
cl_autoskins = Cvar_Get ("cl_autoskins", "0", 0);
|
||||
cl_predict = Cvar_Get ("cl_predict", "0", 0);
|
||||
cl_predict = Cvar_Get ("cl_predict", "1", 0);
|
||||
// cl_minfps = Cvar_Get ("cl_minfps", "5", 0);
|
||||
cl_maxfps = Cvar_Get ("cl_maxfps", "90", 0);
|
||||
|
||||
|
@ -1606,8 +1606,8 @@ void CL_FixCvarCheats (void)
|
|||
int i;
|
||||
cheatvar_t *var;
|
||||
|
||||
if ( !strcmp(cl.configstrings[CS_MAXCLIENTS], "1") || !cl.configstrings[CS_MAXCLIENTS][0] )
|
||||
return; // single player can cheat
|
||||
if(!strcmp(cl.configstrings[CS_MAXCLIENTS], "1") || !cl.configstrings[CS_MAXCLIENTS][0] )
|
||||
return; // single player can cheat
|
||||
|
||||
// find all the cvars if we haven't done it yet
|
||||
if (!numcheatvars)
|
||||
|
|
|
@ -439,8 +439,7 @@ SCR_DrawNet
|
|||
*/
|
||||
void SCR_DrawNet (void)
|
||||
{
|
||||
if (cls.netchan.outgoing_sequence - cls.netchan.incoming_acknowledged
|
||||
< CMD_BACKUP-1)
|
||||
if (cls.netchan.outgoing_sequence - cls.netchan.incoming_acknowledged < CMD_BACKUP-1)
|
||||
return;
|
||||
|
||||
re->DrawPic (scr_vrect.x+64, scr_vrect.y, "net");
|
||||
|
|
|
@ -486,7 +486,7 @@ bool NET_CompareBaseAdr (netadr_t a, netadr_t b);
|
|||
bool NET_IsLocalAddress (netadr_t adr);
|
||||
char *NET_AdrToString (netadr_t a);
|
||||
bool NET_StringToAdr (char *s, netadr_t *a);
|
||||
void NET_Sleep(float time);
|
||||
void NET_Sleep(int msec);
|
||||
|
||||
//============================================================================
|
||||
|
||||
|
@ -502,13 +502,13 @@ typedef struct
|
|||
|
||||
int dropped; // between last packet and previous
|
||||
|
||||
float last_received; // for timeouts
|
||||
float last_sent; // for retransmits
|
||||
int last_received; // for timeouts
|
||||
int last_sent; // for retransmits
|
||||
|
||||
netadr_t remote_address;
|
||||
int qport; // qport value to write when transmitting
|
||||
|
||||
// sequencing variables
|
||||
// sequencing variables
|
||||
int incoming_sequence;
|
||||
int incoming_acknowledged;
|
||||
int incoming_reliable_acknowledged; // single bit
|
||||
|
|
|
@ -93,7 +93,7 @@ void Con_ToggleConsole_f (void)
|
|||
M_ForceMenuOff ();
|
||||
cls.key_dest = key_console;
|
||||
|
||||
if (host.maxclients == 1 && Com_ServerState ())
|
||||
if (host.maxclients == 1 && Com_ServerState())
|
||||
Cvar_Set ("paused", "1");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ cvar_t *Cvar_FindVar (const char *var_name)
|
|||
{
|
||||
cvar_t *var;
|
||||
|
||||
for (var=cvar_vars ; var ; var=var->next)
|
||||
for (var = cvar_vars; var; var = var->next)
|
||||
if (!strcmp (var_name, var->name))
|
||||
return var;
|
||||
|
||||
|
@ -93,16 +93,15 @@ Cvar_CompleteVariable
|
|||
char *Cvar_CompleteVariable (char *partial)
|
||||
{
|
||||
cvar_t *cvar;
|
||||
int len;
|
||||
int len;
|
||||
|
||||
len = strlen(partial);
|
||||
|
||||
if (!len)
|
||||
return NULL;
|
||||
if (!len) return NULL;
|
||||
|
||||
// check exact match
|
||||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||
if (!strcmp (partial,cvar->name))
|
||||
if (!strcmp (partial, cvar->name))
|
||||
return cvar->name;
|
||||
|
||||
// check partial match
|
||||
|
@ -177,12 +176,9 @@ Cvar_Set2
|
|||
cvar_t *Cvar_Set2 (const char *var_name, const char *value, bool force)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
{ // create it
|
||||
return Cvar_Get (var_name, value, 0);
|
||||
}
|
||||
if (!var) return Cvar_Get (var_name, value, 0); // create it
|
||||
|
||||
if (var->flags & (CVAR_USERINFO | CVAR_SERVERINFO))
|
||||
{
|
||||
|
@ -242,13 +238,13 @@ cvar_t *Cvar_Set2 (const char *var_name, const char *value, bool force)
|
|||
|
||||
var->modified = true;
|
||||
|
||||
if (var->flags & CVAR_USERINFO)
|
||||
userinfo_modified = true; // transmit at next oportunity
|
||||
// transmit at next oportunity
|
||||
if (var->flags & CVAR_USERINFO) userinfo_modified = true;
|
||||
|
||||
Z_Free (var->string); // free the old value string
|
||||
Z_Free (var->string); // free the old value string
|
||||
|
||||
var->string = CopyString(value);
|
||||
var->value = atof (var->string);
|
||||
var->value = atof(var->string);
|
||||
|
||||
return var;
|
||||
}
|
||||
|
@ -268,7 +264,7 @@ cvar_t *Cvar_ForceSet (const char *var_name, const char *value)
|
|||
Cvar_Set
|
||||
============
|
||||
*/
|
||||
cvar_t *Cvar_Set (const char *var_name, const char *value)
|
||||
cvar_t *_Cvar_Set (const char *var_name, const char *value, const char *filename, int fileline)
|
||||
{
|
||||
return Cvar_Set2 (var_name, value, false);
|
||||
}
|
||||
|
@ -350,14 +346,13 @@ Handles variable inspection and changing from the console
|
|||
*/
|
||||
bool Cvar_Command (void)
|
||||
{
|
||||
cvar_t *v;
|
||||
|
||||
// check variables
|
||||
cvar_t *v;
|
||||
|
||||
// check variables
|
||||
v = Cvar_FindVar (Cmd_Argv(0));
|
||||
if (!v)
|
||||
return false;
|
||||
if (!v) return false;
|
||||
|
||||
// perform a variable print or set
|
||||
// perform a variable print or set
|
||||
if (Cmd_Argc() == 1)
|
||||
{
|
||||
Msg ("\"%s\" is \"%s\"\n", v->name, v->string);
|
||||
|
@ -390,10 +385,8 @@ void Cvar_Set_f (void)
|
|||
|
||||
if (c == 4)
|
||||
{
|
||||
if (!strcmp(Cmd_Argv(3), "u"))
|
||||
flags = CVAR_USERINFO;
|
||||
else if (!strcmp(Cmd_Argv(3), "s"))
|
||||
flags = CVAR_SERVERINFO;
|
||||
if (!strcmp(Cmd_Argv(3), "u")) flags = CVAR_USERINFO;
|
||||
else if (!strcmp(Cmd_Argv(3), "s")) flags = CVAR_SERVERINFO;
|
||||
else
|
||||
{
|
||||
Msg ("flags can only be 'u' or 's'\n");
|
||||
|
@ -401,8 +394,7 @@ void Cvar_Set_f (void)
|
|||
}
|
||||
Cvar_FullSet (Cmd_Argv(1), Cmd_Argv(2), flags);
|
||||
}
|
||||
else
|
||||
Cvar_Set (Cmd_Argv(1), Cmd_Argv(2));
|
||||
else Cvar_Set (Cmd_Argv(1), Cmd_Argv(2));
|
||||
}
|
||||
|
||||
|
||||
|
@ -473,7 +465,7 @@ void Cvar_List_f (void)
|
|||
bool userinfo_modified;
|
||||
|
||||
|
||||
char *Cvar_BitInfo (int bit)
|
||||
char *Cvar_BitInfo (int bit)
|
||||
{
|
||||
static char info[MAX_INFO_STRING];
|
||||
cvar_t *var;
|
||||
|
@ -489,13 +481,13 @@ char *Cvar_BitInfo (int bit)
|
|||
}
|
||||
|
||||
// returns an info string containing all the CVAR_USERINFO cvars
|
||||
char *Cvar_Userinfo (void)
|
||||
char *Cvar_Userinfo (void)
|
||||
{
|
||||
return Cvar_BitInfo (CVAR_USERINFO);
|
||||
}
|
||||
|
||||
// returns an info string containing all the CVAR_SERVERINFO cvars
|
||||
char *Cvar_Serverinfo (void)
|
||||
char *Cvar_Serverinfo (void)
|
||||
{
|
||||
return Cvar_BitInfo (CVAR_SERVERINFO);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,8 @@ cvar_t *Cvar_Get (const char *var_name, const char *value, int flags);
|
|||
// if it exists, the value will not be changed, but flags will be ORed in
|
||||
// that allows variables to be unarchived without needing bitflags
|
||||
|
||||
cvar_t *Cvar_Set (const char *var_name, const char *value);
|
||||
#define Cvar_Set(name, val) _Cvar_Set (name, val, __FILE__, __LINE__)
|
||||
cvar_t *_Cvar_Set (const char *var_name, const char *value, const char *filename, int fileline);
|
||||
// will create the variable if it doesn't exist
|
||||
|
||||
cvar_t *Cvar_ForceSet (const char *var_name, const char *value);
|
||||
|
|
|
@ -158,7 +158,7 @@ void Netchan_Setup (netsrc_t sock, netchan_t *chan, netadr_t adr, int qport)
|
|||
chan->sock = sock;
|
||||
chan->remote_address = adr;
|
||||
chan->qport = qport;
|
||||
chan->last_received = host.realtime;
|
||||
chan->last_received = host.realtime * 1000;
|
||||
chan->incoming_sequence = 0;
|
||||
chan->outgoing_sequence = 1;
|
||||
|
||||
|
@ -230,7 +230,7 @@ void Netchan_Transmit (netchan_t *chan, int length, byte *data)
|
|||
|
||||
if (!chan->reliable_length && chan->message.cursize)
|
||||
{
|
||||
memcpy (chan->reliable_buf, chan->message_buf, chan->message.cursize);
|
||||
Mem_Copy (chan->reliable_buf, chan->message_buf, chan->message.cursize);
|
||||
chan->reliable_length = chan->message.cursize;
|
||||
chan->message.cursize = 0;
|
||||
chan->reliable_sequence ^= 1;
|
||||
|
@ -244,7 +244,7 @@ void Netchan_Transmit (netchan_t *chan, int length, byte *data)
|
|||
w2 = ( chan->incoming_sequence & ~(1<<31) ) | (chan->incoming_reliable_sequence<<31);
|
||||
|
||||
chan->outgoing_sequence++;
|
||||
chan->last_sent = host.realtime;
|
||||
chan->last_sent = host.realtime * 1000;
|
||||
|
||||
MSG_WriteLong (&send, w1);
|
||||
MSG_WriteLong (&send, w2);
|
||||
|
@ -297,9 +297,9 @@ bool Netchan_Process (netchan_t *chan, sizebuf_t *msg)
|
|||
{
|
||||
unsigned sequence, sequence_ack;
|
||||
unsigned reliable_ack, reliable_message;
|
||||
int qport;
|
||||
int qport;
|
||||
|
||||
// get sequence numbers
|
||||
// get sequence numbers
|
||||
MSG_BeginReading (msg);
|
||||
sequence = MSG_ReadLong (msg);
|
||||
sequence_ack = MSG_ReadLong (msg);
|
||||
|
@ -351,7 +351,10 @@ bool Netchan_Process (netchan_t *chan, sizebuf_t *msg)
|
|||
if (chan->dropped > 0)
|
||||
{
|
||||
if (showdrop->value)
|
||||
Msg ("%s:Dropped %i packets at %i\n", NET_AdrToString (chan->remote_address), chan->dropped, sequence);
|
||||
Msg ("%s:Dropped %i packets at %i\n",
|
||||
NET_AdrToString (chan->remote_address),
|
||||
chan->dropped,
|
||||
sequence);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -375,7 +378,7 @@ bool Netchan_Process (netchan_t *chan, sizebuf_t *msg)
|
|||
//
|
||||
// the message can now be read from the current message pointer
|
||||
//
|
||||
chan->last_received = host.realtime;
|
||||
chan->last_received = host.realtime * 1000;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -707,7 +707,7 @@ void NET_Config (bool multiplayer)
|
|||
}
|
||||
|
||||
// sleeps msec or until net socket is ready
|
||||
void NET_Sleep(float time)
|
||||
void NET_Sleep(int msec)
|
||||
{
|
||||
struct timeval timeout;
|
||||
fd_set fdset;
|
||||
|
@ -717,8 +717,6 @@ void NET_Sleep(float time)
|
|||
if (host.type == HOST_NORMAL) return;
|
||||
FD_ZERO(&fdset);
|
||||
|
||||
Msg("NET_Sleep: sleep time %g\n", time );
|
||||
|
||||
if (ip_sockets[NS_SERVER])
|
||||
{
|
||||
FD_SET(ip_sockets[NS_SERVER], &fdset); // network socket
|
||||
|
@ -729,8 +727,8 @@ void NET_Sleep(float time)
|
|||
FD_SET(ipx_sockets[NS_SERVER], &fdset); // network socket
|
||||
if (ipx_sockets[NS_SERVER] > i) i = ipx_sockets[NS_SERVER];
|
||||
}
|
||||
timeout.tv_sec = time;
|
||||
timeout.tv_usec = fmod(time, 1.0f) * 1.0f;
|
||||
timeout.tv_sec = msec/1000;
|
||||
timeout.tv_usec = (msec%1000) * 1000;
|
||||
select(i+1, &fdset, NULL, NULL, &timeout);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
--------------------Configuration: engine - Win32 Debug--------------------
|
||||
</h3>
|
||||
<h3>Command Lines</h3>
|
||||
Creating temporary file "C:\Temp\RSP451.tmp" with contents
|
||||
Creating temporary file "C:\Temp\RSP89.tmp" with contents
|
||||
[
|
||||
/nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "prvm" /I "common" /I "server" /I "client" /I "../public" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\engine\!debug/" /Fo"..\temp\engine\!debug/" /Fd"..\temp\engine\!debug/" /FD /c
|
||||
"D:\XASH3D\src_main\!source\engine\system.c"
|
||||
"D:\XASH3D\src_main\!source\engine\server\sv_user.c"
|
||||
]
|
||||
Creating command line "cl.exe @C:\Temp\RSP451.tmp"
|
||||
Creating temporary file "C:\Temp\RSP452.tmp" with contents
|
||||
Creating command line "cl.exe @C:\Temp\RSP89.tmp"
|
||||
Creating temporary file "C:\Temp\RSP8A.tmp" with contents
|
||||
[
|
||||
gdi32.lib winmm.lib kernel32.lib user32.lib wsock32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\engine\!debug/engine.pdb" /debug /machine:I386 /out:"..\temp\engine\!debug/engine.dll" /implib:"..\temp\engine\!debug/engine.lib" /pdbtype:sept
|
||||
"\XASH3D\src_main\!source\temp\engine\!debug\cl_cin.obj"
|
||||
|
@ -66,15 +66,15 @@ gdi32.lib winmm.lib kernel32.lib user32.lib wsock32.lib /nologo /subsystem:windo
|
|||
"\XASH3D\src_main\!source\temp\engine\!debug\vm_edict.obj"
|
||||
"\XASH3D\src_main\!source\temp\engine\!debug\vm_exec.obj"
|
||||
]
|
||||
Creating command line "link.exe @C:\Temp\RSP452.tmp"
|
||||
Creating temporary file "C:\Temp\RSP453.bat" with contents
|
||||
Creating command line "link.exe @C:\Temp\RSP8A.tmp"
|
||||
Creating temporary file "C:\Temp\RSP8B.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
copy \XASH3D\src_main\!source\temp\engine\!debug\engine.dll "D:\Xash3D\bin\engine.dll"
|
||||
]
|
||||
Creating command line "C:\Temp\RSP453.bat"
|
||||
Creating command line "C:\Temp\RSP8B.bat"
|
||||
Compiling...
|
||||
system.c
|
||||
sv_user.c
|
||||
Linking...
|
||||
<h3>Output Window</h3>
|
||||
Performing Custom Build Step on \XASH3D\src_main\!source\temp\engine\!debug\engine.dll
|
||||
|
|
|
@ -214,8 +214,12 @@ void Host_Main( void )
|
|||
DispatchMessage (&msg);
|
||||
}
|
||||
|
||||
newtime = Sys_DoubleTime();
|
||||
host.realtime = newtime - oldtime;
|
||||
do
|
||||
{
|
||||
newtime = Sys_DoubleTime();
|
||||
host.realtime = newtime - oldtime;
|
||||
|
||||
} while (host.realtime < 0.001);
|
||||
|
||||
Host_Frame (host.realtime);
|
||||
oldtime = newtime;
|
||||
|
|
|
@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
typedef struct link_s
|
||||
{
|
||||
struct link_s *prev, *next;
|
||||
int entitynumber;
|
||||
int entnum; // get edict by number
|
||||
} link_t;
|
||||
|
||||
typedef struct server_edict_s
|
||||
|
|
|
@ -107,19 +107,18 @@ typedef void (*prvm_builtin_t) (void);
|
|||
// NOTE: external code has to create and free the mempools but everything else is done by prvm !
|
||||
typedef struct prvm_prog_s
|
||||
{
|
||||
dprograms_t *progs;
|
||||
mfunction_t *functions;
|
||||
char *strings;
|
||||
int stringssize;
|
||||
ddef_t *fielddefs;
|
||||
ddef_t *globaldefs;
|
||||
dstatement_t *statements;
|
||||
int edict_size; // in bytes
|
||||
int edictareasize; // LordHavoc: in bytes (for bound checking)
|
||||
dprograms_t *progs;
|
||||
mfunction_t *functions;
|
||||
char *strings;
|
||||
int stringssize;
|
||||
ddef_t *fielddefs;
|
||||
ddef_t *globaldefs;
|
||||
dstatement_t *statements;
|
||||
int edict_size; // in bytes
|
||||
int edictareasize; // in bytes (for bound checking)
|
||||
|
||||
int *statement_linenums;// NULL if not available
|
||||
|
||||
double *statement_profile; // only incremented if prvm_statementprofiling is on
|
||||
int *statement_linenums;// NULL if not available
|
||||
double *statement_profile; // only incremented if prvm_statementprofiling is on
|
||||
|
||||
union
|
||||
{
|
||||
|
@ -127,117 +126,117 @@ typedef struct prvm_prog_s
|
|||
globalvars_t *server;
|
||||
} globals;
|
||||
|
||||
int maxknownstrings;
|
||||
int numknownstrings;
|
||||
int maxknownstrings;
|
||||
int numknownstrings;
|
||||
|
||||
// this is updated whenever a string is removed or added
|
||||
// (simple optimization of the free string search)
|
||||
int firstfreeknownstring;
|
||||
const char **knownstrings;
|
||||
unsigned char *knownstrings_freeable;
|
||||
const char ***stringshash;
|
||||
int firstfreeknownstring;
|
||||
const char **knownstrings;
|
||||
byte *knownstrings_freeable;
|
||||
const char ***stringshash;
|
||||
|
||||
// all memory allocations related to this vm_prog (code, edicts, strings)
|
||||
byte *progs_mempool; // [INIT]
|
||||
byte *progs_mempool; // [INIT]
|
||||
|
||||
prvm_builtin_t *builtins; // [INIT]
|
||||
int numbuiltins; // [INIT]
|
||||
prvm_builtin_t *builtins; // [INIT]
|
||||
int numbuiltins; // [INIT]
|
||||
|
||||
int argc;
|
||||
int argc;
|
||||
|
||||
int trace;
|
||||
mfunction_t *xfunction;
|
||||
int xstatement;
|
||||
int trace;
|
||||
mfunction_t *xfunction;
|
||||
int xstatement;
|
||||
|
||||
// stacktrace writes into stack[MAX_STACK_DEPTH]
|
||||
// thus increase the array, so depth wont be overwritten
|
||||
prvm_stack_t stack[PRVM_MAX_STACK_DEPTH+1];
|
||||
int depth;
|
||||
prvm_stack_t stack[PRVM_MAX_STACK_DEPTH + 1];
|
||||
int depth;
|
||||
|
||||
int localstack[PRVM_LOCALSTACK_SIZE];
|
||||
int localstack_used;
|
||||
int localstack[PRVM_LOCALSTACK_SIZE];
|
||||
int localstack_used;
|
||||
|
||||
word filecrc;
|
||||
word filecrc;
|
||||
|
||||
//============================================================================
|
||||
// until this point everything also exists (with the pr_ prefix) in the old vm
|
||||
|
||||
file_t *openfiles[PRVM_MAX_OPENFILES];
|
||||
search_t *opensearches[PRVM_MAX_OPENSEARCHES];
|
||||
file_t *openfiles[PRVM_MAX_OPENFILES];
|
||||
search_t *opensearches[PRVM_MAX_OPENSEARCHES];
|
||||
|
||||
// copies of some vars that were former read from sv
|
||||
int num_edicts;
|
||||
int num_edicts;
|
||||
// number of edicts for which space has been (should be) allocated
|
||||
int max_edicts; // [INIT]
|
||||
int max_edicts; // [INIT]
|
||||
// used instead of the constant MAX_EDICTS
|
||||
int limit_edicts; // [INIT]
|
||||
int limit_edicts; // [INIT]
|
||||
|
||||
// number of reserved edicts (allocated from 1)
|
||||
int reserved_edicts; // [INIT]
|
||||
int reserved_edicts; // [INIT]
|
||||
|
||||
prvm_edict_t *edicts;
|
||||
void *edictsfields;
|
||||
void *edictprivate;
|
||||
prvm_edict_t *edicts;
|
||||
void *edictsfields;
|
||||
void *edictprivate;
|
||||
|
||||
// size of the engine private struct
|
||||
int edictprivate_size; // [INIT]
|
||||
int edictprivate_size; // [INIT]
|
||||
|
||||
// has to be updated every frame - so the vm time is up-to-date
|
||||
// AK changed so time will point to the time field (if there is one) else it points to _time
|
||||
// actually should be double, but qc doesnt support it
|
||||
float *time;
|
||||
float _time;
|
||||
float *time;
|
||||
float _time;
|
||||
|
||||
// allow writing to world entity fields, this is set by server init and
|
||||
// cleared before first server frame
|
||||
bool allowworldwrites;
|
||||
bool protect_world;
|
||||
|
||||
// name of the prog, e.g. "Server", "Client" or "Menu" (used for text output)
|
||||
char *name; // [INIT]
|
||||
char *name; // [INIT]
|
||||
|
||||
// flag - used to store general flags like PRVM_GE_SELF, etc.
|
||||
int flag;
|
||||
int flag;
|
||||
|
||||
char *extensionstring; // [INIT]
|
||||
char *extensionstring; // [INIT]
|
||||
|
||||
bool loadintoworld; // [INIT]
|
||||
bool loadintoworld; // [INIT]
|
||||
|
||||
// used to indicate whether a prog is loaded
|
||||
bool loaded;
|
||||
|
||||
// now passes as parameter of PRVM_LoadProgs
|
||||
// char **required_func;
|
||||
// int numrequiredfunc;
|
||||
bool loaded;
|
||||
|
||||
//============================================================================
|
||||
|
||||
ddef_t *self; // if self != 0 then there is a global self
|
||||
ddef_t *self; // if self != 0 then there is a global self
|
||||
|
||||
//============================================================================
|
||||
// function pointers
|
||||
|
||||
void (*begin_increase_edicts)(void); // [INIT] used by PRVM_MEM_Increase_Edicts
|
||||
void (*end_increase_edicts)(void); // [INIT]
|
||||
void (*begin_increase_edicts)(void); // [INIT] used by PRVM_MEM_Increase_Edicts
|
||||
void (*end_increase_edicts)(void); // [INIT]
|
||||
|
||||
void (*init_edict)(prvm_edict_t *edict); // [INIT] used by PRVM_ED_ClearEdict
|
||||
void (*free_edict)(prvm_edict_t *ed); // [INIT] used by PRVM_ED_Free
|
||||
void (*init_edict)(prvm_edict_t *edict); // [INIT] used by PRVM_ED_ClearEdict
|
||||
void (*free_edict)(prvm_edict_t *ed); // [INIT] used by PRVM_ED_Free
|
||||
|
||||
void (*count_edicts)(void); // [INIT] used by PRVM_ED_Count_f
|
||||
void (*count_edicts)(void); // [INIT] used by PRVM_ED_Count_f
|
||||
|
||||
bool (*load_edict)(prvm_edict_t *ent); // [INIT] used by PRVM_ED_LoadFromFile
|
||||
bool (*load_edict)(prvm_edict_t *ent); // [INIT] used by PRVM_ED_LoadFromFile
|
||||
|
||||
void (*init_cmd)(void); // [INIT] used by PRVM_InitProg
|
||||
void (*reset_cmd)(void); // [INIT] used by PRVM_ResetProg
|
||||
void (*init_cmd)(void); // [INIT] used by PRVM_InitProg
|
||||
void (*reset_cmd)(void); // [INIT] used by PRVM_ResetProg
|
||||
|
||||
void (*error_cmd)(const char *format, ...); // [INIT]
|
||||
void (*error_cmd)(const char *format, ...); // [INIT]
|
||||
|
||||
} prvm_prog_t;
|
||||
|
||||
extern prvm_prog_t *prog;
|
||||
|
||||
#define PRVM_MAXPROGS 3
|
||||
#define PRVM_SERVERPROG 0 // actually not used at the moment
|
||||
#define PRVM_CLIENTPROG 1
|
||||
#define PRVM_MENUPROG 2
|
||||
enum
|
||||
{
|
||||
PRVM_SERVERPROG = 0,
|
||||
PRVM_CLIENTPROG,
|
||||
PRVM_MENUPROG,
|
||||
PRVM_MAXPROGS, // must be last
|
||||
};
|
||||
|
||||
extern prvm_prog_t prvm_prog_list[PRVM_MAXPROGS];
|
||||
|
||||
|
@ -291,7 +290,9 @@ void PRVM_Crash (void);
|
|||
int PRVM_ED_FindFieldOffset(const char *field);
|
||||
int PRVM_ED_FindGlobalOffset(const char *global);
|
||||
ddef_t *PRVM_ED_FindField (const char *name);
|
||||
ddef_t *PRVM_ED_FindGlobal (const char *name);
|
||||
mfunction_t *PRVM_ED_FindFunction (const char *name);
|
||||
func_t PRVM_ED_FindFunctionOffset(const char *function);
|
||||
|
||||
void PRVM_MEM_IncreaseEdicts(void);
|
||||
|
||||
|
@ -310,27 +311,19 @@ void PRVM_ED_ParseGlobals (const char *data);
|
|||
void PRVM_ED_LoadFromFile (const char *data);
|
||||
|
||||
prvm_edict_t *PRVM_EDICT_NUM_ERROR(int n, char *filename, int fileline);
|
||||
#define PRVM_EDICT_NUM(n) (((n) >= 0 && (n) < prog->max_edicts) ? prog->edicts + (n) : PRVM_EDICT_NUM_ERROR(n, __FILE__, __LINE__))
|
||||
#define PRVM_EDICT_NUM_UNSIGNED(n) (((n) < prog->max_edicts) ? prog->edicts + (n) : PRVM_EDICT_NUM_ERROR(n, __FILE__, __LINE__))
|
||||
#define PRVM_EDICT_FROM_AREA(l) ((prvm_edict_t *)((byte *)l - (int)&(((prvm_edict_t *)0)->priv.sv->area)))
|
||||
|
||||
//int NUM_FOR_EDICT_ERROR(prvm_edict_t *e);
|
||||
#define PRVM_EDICT_NUM(n) (((n) >= 0 && (n) < prog->max_edicts) ? prog->edicts + (n) : PRVM_EDICT_NUM_ERROR(n, __FILE__, __LINE__))
|
||||
#define PRVM_EDICT_NUM_UNSIGNED(n) (((n) < prog->max_edicts) ? prog->edicts + (n) : PRVM_EDICT_NUM_ERROR(n, __FILE__, __LINE__))
|
||||
#define PRVM_NUM_FOR_EDICT(e) ((int)((prvm_edict_t *)(e) - prog->edicts))
|
||||
//int PRVM_NUM_FOR_EDICT(prvm_edict_t *e);
|
||||
|
||||
#define PRVM_NEXT_EDICT(e) ((e) + 1)
|
||||
|
||||
#define PRVM_NEXT_EDICT(e) ((e) + 1)
|
||||
#define PRVM_EDICT_TO_PROG(e) (PRVM_NUM_FOR_EDICT(e))
|
||||
//int PRVM_EDICT_TO_PROG(prvm_edict_t *e);
|
||||
#define PRVM_PROG_TO_EDICT(n) (PRVM_EDICT_NUM(n))
|
||||
//prvm_edict_t *PRVM_PROG_TO_EDICT(int n);
|
||||
|
||||
//============================================================================
|
||||
|
||||
#define PRVM_G_FLOAT(o) (prog->globals.generic[o])
|
||||
#define PRVM_G_INT(o) (*(int *)&prog->globals.generic[o])
|
||||
#define PRVM_G_EDICT(o) (PRVM_PROG_TO_EDICT(*(int *)&prog->globals.generic[o]))
|
||||
#define PRVM_G_EDICTNUM(o) PRVM_NUM_FOR_EDICT(PRVM_G_EDICT(o))
|
||||
#define PRVM_G_EDICTNUM(o) PRVM_NUM_FOR_EDICT(PRVM_G_EDICT(o))
|
||||
#define PRVM_G_VECTOR(o) (&prog->globals.generic[o])
|
||||
#define PRVM_G_STRING(o) (PRVM_GetString(*(string_t *)&prog->globals.generic[o]))
|
||||
//#define PRVM_G_FUNCTION(o) (*(func_t *)&prog->globals.generic[o])
|
||||
|
@ -341,7 +334,7 @@ prvm_edict_t *PRVM_EDICT_NUM_ERROR(int n, char *filename, int fileline);
|
|||
//#define PRVM_E_VECTOR(e,o) (&((float*)e->fields.vp)[o])
|
||||
#define PRVM_E_STRING(e,o) (PRVM_GetString(*(string_t *)&((float*)e->fields.vp)[o]))
|
||||
|
||||
extern int prvm_type_size[8]; // for consistency : I think a goal of this sub-project is to
|
||||
extern int prvm_type_size[8]; // for consistency : I think a goal of this sub-project is to
|
||||
// make the new vm mostly independent from the old one, thus if it's necessary, I copy everything
|
||||
|
||||
void PRVM_Init_Exec(void);
|
||||
|
@ -356,28 +349,13 @@ void PRVM_FreeString(int num);
|
|||
|
||||
//============================================================================
|
||||
|
||||
// used as replacement for a prog stack
|
||||
//#define PRVM_DEBUGPRSTACK
|
||||
|
||||
#ifdef PRVM_DEBUGPRSTACK
|
||||
#define PRVM_Begin if(prog != 0) Con_Printf("prog not 0(prog = %i) in file: %s line: %i!\n", PRVM_GetProgNr(), __FILE__, __LINE__)
|
||||
#define PRVM_End prog = 0
|
||||
#else
|
||||
#define PRVM_Begin
|
||||
#define PRVM_End prog = 0
|
||||
#endif
|
||||
|
||||
//#define PRVM_SAFENAME
|
||||
#ifndef PRVM_SAFENAME
|
||||
# define PRVM_NAME (prog->name)
|
||||
#else
|
||||
# define PRVM_NAME (prog->name ? prog->name : "Unknown prog name")
|
||||
#endif
|
||||
#define PRVM_NAME (prog->name ? prog->name : "unnamed.dat")
|
||||
|
||||
// helper macro to make function pointer calls easier
|
||||
#define PRVM_GCALL(func) if(prog->func) prog->func
|
||||
|
||||
#define PRVM_ERROR prog->error_cmd
|
||||
#define PRVM_GCALL(func) if(prog->func) prog->func
|
||||
#define PRVM_ERROR prog->error_cmd
|
||||
|
||||
// other prog handling functions
|
||||
bool PRVM_SetProgFromString(const char *str);
|
||||
|
@ -396,7 +374,7 @@ void PRVM_ResetProg(void);
|
|||
|
||||
bool PRVM_ProgLoaded(int prognr);
|
||||
|
||||
int PRVM_GetProgNr(void);
|
||||
int PRVM_GetProgNr(void);
|
||||
|
||||
void VM_Warning(const char *fmt, ...);
|
||||
void VM_Error(const char *fmt, ...);
|
||||
|
|
|
@ -26,7 +26,7 @@ prvm_prog_t *prog;
|
|||
|
||||
static prvm_prog_t prog_list[PRVM_MAXPROGS];
|
||||
|
||||
int prvm_type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4};
|
||||
int prvm_type_size[8] = {1, sizeof(string_t)/4,1,3,1,1, sizeof(func_t)/4, sizeof(void *)/4};
|
||||
|
||||
ddef_t *PRVM_ED_FieldAtOfs(int ofs);
|
||||
bool PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s);
|
||||
|
@ -120,19 +120,25 @@ int PRVM_ED_FindFieldOffset(const char *field)
|
|||
{
|
||||
ddef_t *d;
|
||||
d = PRVM_ED_FindField(field);
|
||||
if (!d)
|
||||
return 0;
|
||||
return d->ofs*4;
|
||||
if (!d) return 0;
|
||||
return d->ofs * 4;
|
||||
}
|
||||
|
||||
ddef_t* PRVM_ED_FindGlobal(const char *name);
|
||||
int PRVM_ED_FindGlobalOffset(const char *global)
|
||||
{
|
||||
ddef_t *d;
|
||||
d = PRVM_ED_FindGlobal(global);
|
||||
if (!d)
|
||||
if (!d) return 0;
|
||||
return d->ofs * 4;
|
||||
}
|
||||
|
||||
func_t PRVM_ED_FindFunctionOffset(const char *function)
|
||||
{
|
||||
mfunction_t *f;
|
||||
f = PRVM_ED_FindFunction(function);
|
||||
if (!f)
|
||||
return 0;
|
||||
return d->ofs*4;
|
||||
return (func_t)(f - prog->functions);
|
||||
}
|
||||
|
||||
bool PRVM_ProgLoaded(int prognr)
|
||||
|
@ -226,7 +232,7 @@ prvm_edict_t *PRVM_ED_Alloc (void)
|
|||
// AK: changed i=svs.maxclients+1
|
||||
// AK: changed so the edict 0 wont spawn -> used as reserved/world entity
|
||||
// although the menu/client has no world
|
||||
for (i = prog->reserved_edicts + 1;i < prog->num_edicts;i++)
|
||||
for (i = prog->reserved_edicts + 1; i < prog->num_edicts; i++)
|
||||
{
|
||||
e = PRVM_EDICT_NUM(i);
|
||||
// the first couple seconds of server time can involve a lot of
|
||||
|
@ -948,10 +954,8 @@ bool PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
|
|||
MsgDev(D_WARN, "PRVM_ED_ParseEpair: ev_entity reference too large (edict %u >= MAX_EDICTS %u) on %s\n", (uint)i, (uint)MAX_EDICTS, PRVM_NAME);
|
||||
while (i >= prog->max_edicts)
|
||||
PRVM_MEM_IncreaseEdicts();
|
||||
//SV_IncreaseEdicts();
|
||||
// if SV_IncreaseEdicts was called the base pointer needs to be updated
|
||||
if (ent)
|
||||
val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs);
|
||||
// if IncreaseEdicts was called the base pointer needs to be updated
|
||||
if (ent) val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs);
|
||||
val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM((int)i));
|
||||
break;
|
||||
|
||||
|
@ -1131,8 +1135,7 @@ void PRVM_ED_LoadFromFile (const char *data)
|
|||
prog->loadintoworld = false;
|
||||
ent = PRVM_EDICT_NUM(0);
|
||||
}
|
||||
else
|
||||
ent = PRVM_ED_Alloc();
|
||||
else ent = PRVM_ED_Alloc();
|
||||
|
||||
// clear it
|
||||
if (ent != prog->edicts) // hack
|
||||
|
@ -1508,8 +1511,7 @@ void PRVM_LoadProgs (const char *filename, int numedfunc, char **ed_func, int nu
|
|||
if(PRVM_ED_FindField ("classname"))
|
||||
prog->flag |= PRVM_FE_CLASSNAME;
|
||||
|
||||
if(PRVM_ED_FindField ("nextthink") && PRVM_ED_FindField ("frame") && PRVM_ED_FindField ("think")
|
||||
&& prog->flag && prog->self)
|
||||
if(PRVM_ED_FindField ("nextthink") && PRVM_ED_FindField ("frame") && PRVM_ED_FindField ("think") && prog->flag && prog->self)
|
||||
prog->flag |= PRVM_OP_STATE;
|
||||
|
||||
PRVM_GCALL(init_cmd)();
|
||||
|
@ -1830,48 +1832,6 @@ prvm_edict_t *PRVM_EDICT_NUM_ERROR(int n, char *filename, int fileline)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
int NUM_FOR_EDICT_ERROR(prvm_edict_t *e)
|
||||
{
|
||||
PRVM_ERROR ("PRVM_NUM_FOR_EDICT: bad pointer %p (world is %p, entity number would be %i)", e, prog->edicts, e - prog->edicts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PRVM_NUM_FOR_EDICT(prvm_edict_t *e)
|
||||
{
|
||||
int n;
|
||||
n = e - prog->edicts;
|
||||
if ((unsigned int)n >= prog->limit_edicts)
|
||||
Host_Error ("PRVM_NUM_FOR_EDICT: bad pointer");
|
||||
return n;
|
||||
}
|
||||
|
||||
//int NoCrash_NUM_FOR_EDICT(prvm_edict_t *e)
|
||||
//{
|
||||
// return e - prog->edicts;
|
||||
//}
|
||||
|
||||
//#define PRVM_EDICT_TO_PROG(e) ((unsigned char *)(((prvm_edict_t *)e)->v) - (unsigned char *)(prog->edictsfields))
|
||||
//#define PRVM_PROG_TO_EDICT(e) (prog->edicts + ((e) / (progs->entityfields * 4)))
|
||||
int PRVM_EDICT_TO_PROG(prvm_edict_t *e)
|
||||
{
|
||||
int n;
|
||||
n = e - prog->edicts;
|
||||
if ((unsigned int)n >= (unsigned int)prog->max_edicts)
|
||||
Host_Error("PRVM_EDICT_TO_PROG: invalid edict %8p (number %i compared to world at %8p)", e, n, prog->edicts);
|
||||
return n;// EXPERIMENTAL
|
||||
//return (unsigned char *)e->v - (unsigned char *)prog->edictsfields;
|
||||
}
|
||||
prvm_edict_t *PRVM_PROG_TO_EDICT(int n)
|
||||
{
|
||||
if ((unsigned int)n >= (unsigned int)prog->max_edicts)
|
||||
Host_Error("PRVM_PROG_TO_EDICT: invalid edict number %i", n);
|
||||
return prog->edicts + n; // EXPERIMENTAL
|
||||
//return prog->edicts + ((n) / (progs->entityfields * 4));
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
const char *PRVM_GetString(int num)
|
||||
{
|
||||
if (num >= 0 && num < prog->stringssize)
|
||||
|
@ -1901,7 +1861,7 @@ int PRVM_SetEngineString(const char *s)
|
|||
if (prog->knownstrings[i] == s)
|
||||
return -1 - i;
|
||||
// new unknown engine string
|
||||
MsgDev(D_WARN, "new engine string %p\n", s);
|
||||
MsgDev(D_WARN, "new engine string %p\n", s );
|
||||
for (i = prog->firstfreeknownstring;i < prog->numknownstrings;i++)
|
||||
if (!prog->knownstrings[i])
|
||||
break;
|
||||
|
|
|
@ -702,7 +702,7 @@ chooseexecprogram:
|
|||
PRVM_ERROR("%s attempted to address an invalid field (%i) in an edict", PRVM_NAME, OPB->_int);
|
||||
return;
|
||||
}
|
||||
if (OPA->edict == 0 && !prog->allowworldwrites)
|
||||
if (OPA->edict == 0 && prog->protect_world)
|
||||
{
|
||||
prog->xfunction->profile += (st - startst);
|
||||
prog->xstatement = st - prog->statements;
|
||||
|
@ -710,7 +710,7 @@ chooseexecprogram:
|
|||
return;
|
||||
}
|
||||
ed = PRVM_PROG_TO_EDICT(OPA->edict);
|
||||
OPC->_int = (unsigned char *)((int *)ed->fields.vp + OPB->_int) - (unsigned char *)prog->edictsfields;
|
||||
OPC->_int = (byte *)((int *)ed->fields.vp + OPB->_int) - (unsigned char *)prog->edictsfields;
|
||||
break;
|
||||
|
||||
case OP_LOAD_F:
|
||||
|
|
|
@ -196,7 +196,7 @@ void SV_GameMap_f (void)
|
|||
for (i = 0, cl = svs.clients; i < host.maxclients; i++, cl++)
|
||||
{
|
||||
savedInuse[i] = cl->edict->priv.sv->free;
|
||||
cl->edict->priv.sv->free = false;
|
||||
cl->edict->priv.sv->free = true;
|
||||
}
|
||||
|
||||
SV_WriteSaveFile( "save0" ); //autosave
|
||||
|
@ -243,7 +243,7 @@ void SV_Map_f (void)
|
|||
SV_SendClientMessages ();
|
||||
SV_SpawnServer (level_path, NULL, NULL, ss_game, false, false);
|
||||
Cbuf_CopyToDefer ();
|
||||
//SV_BroadcastCommand ("reconnect\n");
|
||||
//FIXME//SV_BroadcastCommand ("reconnect\n");
|
||||
strncpy (svs.mapcmd, Cmd_Argv(1), sizeof(svs.mapcmd) - 1); // archive server state
|
||||
}
|
||||
else Msg ("Can't loading %s\n", level_path);
|
||||
|
|
|
@ -325,7 +325,7 @@ void SV_WritePlayerstateToClient (client_frame_t *from, client_frame_t *to, size
|
|||
MSG_WriteByte (msg, ps->blend[2] * 255);
|
||||
MSG_WriteByte (msg, ps->blend[3] * 255);
|
||||
}
|
||||
if (pflags & PS_FOV) MSG_WriteFloat (msg, ps->fov);
|
||||
if (pflags & PS_FOV) MSG_WriteByte (msg, ps->fov);
|
||||
if (pflags & PS_RDFLAGS) MSG_WriteByte (msg, ps->rdflags);
|
||||
|
||||
// send stats
|
||||
|
@ -526,10 +526,7 @@ void SV_BuildClientFrame (client_t *client)
|
|||
// doors can legally straddle two areas, so
|
||||
// we may need to check another one
|
||||
if (!ent->priv.sv->areanum2 || !CM_AreasConnected (clientarea, ent->priv.sv->areanum2))
|
||||
{
|
||||
//Msg("blocked by a door [%i]\n", ent->priv.sv->state.number);
|
||||
//continue; // blocked by a door
|
||||
}
|
||||
continue; // blocked by a door
|
||||
}
|
||||
|
||||
// beams just check one point for PHS
|
||||
|
@ -565,10 +562,7 @@ void SV_BuildClientFrame (client_t *client)
|
|||
break;
|
||||
}
|
||||
if (i == ent->priv.sv->num_clusters)
|
||||
{
|
||||
//Msg("i == ent->priv.sv->num_clusters\n");
|
||||
//continue; // not visible
|
||||
}
|
||||
continue; // not visible
|
||||
}
|
||||
|
||||
if (!(int)ent->fields.sv->modelindex)
|
||||
|
@ -588,7 +582,7 @@ void SV_BuildClientFrame (client_t *client)
|
|||
state = &svs.client_entities[svs.next_client_entities % svs.num_client_entities];
|
||||
if (ent->priv.sv->state.number != e)
|
||||
{
|
||||
MsgWarn ("SV_BuildClientFrame: invalid ent->priv.sv->state.number %d\n", ent->priv.sv->state.number );
|
||||
MsgWarn ("SV_BuildClientFrame: invalid ent->priv.sv->state.number %d (must be %d)\n", ent->priv.sv->state.number, e );
|
||||
ent->priv.sv->state.number = e; // ptr to current entity such as entnumber
|
||||
}
|
||||
|
||||
|
@ -648,7 +642,7 @@ void SV_RecordDemoMessage (void)
|
|||
while (e < prog->num_edicts)
|
||||
{
|
||||
// ignore ents without visible models unless they have an effect
|
||||
if (ent->priv.sv->free && ent->priv.sv->state.number && (ent->fields.sv->modelindex || ent->fields.sv->effects || ent->priv.sv->state.sound || ent->priv.sv->state.event) && !((int)ent->fields.sv->flags & SVF_NOCLIENT))
|
||||
if (!ent->priv.sv->free && ent->priv.sv->state.number && ((int)ent->fields.sv->modelindex || ent->fields.sv->effects || ent->priv.sv->state.sound || ent->priv.sv->state.event) && !((int)ent->fields.sv->flags & SVF_NOCLIENT))
|
||||
MSG_WriteDeltaEntity (&nostate, &ent->priv.sv->state, &buf, false, true);
|
||||
e++;
|
||||
ent = PRVM_EDICT_NUM(e);
|
||||
|
|
|
@ -87,6 +87,43 @@ void SetMinMaxSize (prvm_edict_t *e, float *min, float *max, bool rotate)
|
|||
SV_LinkEdict (e);
|
||||
}
|
||||
|
||||
|
||||
//test for stats
|
||||
void PF_SetStats( void )
|
||||
{
|
||||
prvm_edict_t *e;
|
||||
int stat_num;
|
||||
const char *string;
|
||||
short value;
|
||||
|
||||
e = PRVM_G_EDICT(OFS_PARM0);
|
||||
|
||||
if(!e->priv.sv->client) return;
|
||||
|
||||
stat_num = (int)PRVM_G_FLOAT(OFS_PARM1);
|
||||
|
||||
if(stat_num < 0 || stat_num > MAX_STATS) return;
|
||||
|
||||
string = PRVM_G_STRING(OFS_PARM2);
|
||||
|
||||
switch(stat_num)
|
||||
{
|
||||
case STAT_HEALTH_ICON:
|
||||
value = SV_ImageIndex( string );
|
||||
break;
|
||||
case STAT_HEALTH:
|
||||
value = atoi( string );
|
||||
break;
|
||||
case STAT_HELPICON:
|
||||
value = SV_ImageIndex( string );
|
||||
break;
|
||||
default:
|
||||
MsgWarn("unknown stat type %d\n", stat_num );
|
||||
return;
|
||||
}
|
||||
e->priv.sv->client->stats[stat_num] = value;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
PF_setsize
|
||||
|
@ -1391,7 +1428,7 @@ PF_lightstyle, // #35 void(float style, string value) lightstyle
|
|||
VM_rint, // #36 float(float v) rint
|
||||
VM_floor, // #37 float(float v) floor
|
||||
VM_ceil, // #38 float(float v) ceil
|
||||
NULL, // #39
|
||||
PF_SetStats, // #39 void(entity e, float f, string stats) setstats
|
||||
PF_checkbottom, // #40 float(entity e) checkbottom
|
||||
PF_pointcontents, // #41 float(vector v) pointcontents
|
||||
NULL, // #42
|
||||
|
|
|
@ -186,7 +186,11 @@ void SV_CreateBaseline (void)
|
|||
{
|
||||
svent = PRVM_EDICT_NUM(entnum);
|
||||
|
||||
if (!svent->priv.sv->free) continue;
|
||||
if (svent->priv.sv->free)
|
||||
{
|
||||
Msg("Can't create baseline for entity [%d]\n", entnum );
|
||||
continue;
|
||||
}
|
||||
if (!(int)svent->fields.sv->modelindex && !(int)svent->priv.sv->state.sound && !(int)svent->fields.sv->effects)
|
||||
continue;
|
||||
|
||||
|
@ -336,6 +340,7 @@ void SV_SpawnServer (char *server, char *spawnpoint, char *savename, server_stat
|
|||
}
|
||||
|
||||
sv.state = ss_loading;
|
||||
prog->protect_world = false;
|
||||
|
||||
if (serverstate != ss_game)
|
||||
{
|
||||
|
@ -394,6 +399,7 @@ void SV_SpawnServer (char *server, char *spawnpoint, char *savename, server_stat
|
|||
// all precaches are complete
|
||||
sv.state = serverstate;
|
||||
Com_SetServerState (sv.state);
|
||||
prog->protect_world = true;
|
||||
|
||||
// run two frames to allow everything to settle
|
||||
for (i = 0; i < 2; i++)
|
||||
|
@ -583,7 +589,7 @@ void SV_VM_BeginIncreaseEdicts(void)
|
|||
// links don't survive the transition, so unlink everything
|
||||
for (i = 0, ent = prog->edicts;i < prog->max_edicts;i++, ent++)
|
||||
{
|
||||
if (!ent->priv.sv->free) SV_UnlinkEdict(prog->edicts + i);
|
||||
if (!ent->priv.sv->free) SV_UnlinkEdict(prog->edicts + i); //free old entity
|
||||
memset(&ent->priv.sv->clusternums, 0, sizeof(ent->priv.sv->clusternums));
|
||||
}
|
||||
SV_ClearWorld();
|
||||
|
|
|
@ -736,7 +736,7 @@ void SV_Frame (float time)
|
|||
if (sv_showclamp->value) Msg ("sv lowclamp\n");
|
||||
svs.realtime = sv.time - 0.1;
|
||||
}
|
||||
NET_Sleep(sv.time - svs.realtime);
|
||||
NET_Sleep((sv.time - svs.realtime) * 0.001);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1224,15 +1224,6 @@ void SV_PhysicsStep (prvm_edict_t *ent)
|
|||
|
||||
void SV_PhysicsClient(prvm_edict_t *ent)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*for (i = 0; i < 3; i++)
|
||||
{
|
||||
ent->priv.sv->client->pmove.origin[i] = ent->priv.sv->state.origin[i];
|
||||
ent->priv.sv->client->pmove.velocity[i] = ent->fields.sv->velocity[i];
|
||||
}*/
|
||||
return;
|
||||
|
||||
SV_ApplyClientMove();
|
||||
SV_CheckVelocity(ent); // make sure the velocity is sane (not a NaN)
|
||||
SV_ClientThink();
|
||||
|
@ -1356,10 +1347,26 @@ void SV_PhysicsEntity(prvm_edict_t *ent)
|
|||
}
|
||||
}
|
||||
|
||||
void ClientEndServerFrame (prvm_edict_t *ent)
|
||||
{
|
||||
int i;
|
||||
|
||||
return;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
ent->priv.sv->state.old_origin[i] = ent->priv.sv->state.origin[i];
|
||||
ent->priv.sv->client->pmove.origin[i] = ent->priv.sv->state.origin[i]*8.0;
|
||||
ent->priv.sv->client->pmove.velocity[i] = ent->fields.sv->velocity[i]*8.0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SV_Physics (void)
|
||||
{
|
||||
int i;
|
||||
prvm_edict_t *ent;
|
||||
prvm_edict_t *ent;
|
||||
|
||||
|
||||
// we always need to bump framenum, even if we
|
||||
// don't run the world, otherwise the delta
|
||||
|
@ -1378,20 +1385,23 @@ void SV_Physics (void)
|
|||
PRVM_ExecuteProgram (prog->globals.server->StartFrame, "QC function StartFrame is missing");
|
||||
|
||||
// run physics on the client entities
|
||||
for (i = 1, ent = PRVM_EDICT_NUM(i), sv_client = svs.clients; i <= host.maxclients; i++, ent = PRVM_NEXT_EDICT(ent), sv_client++)
|
||||
for (i = 1, sv_client = svs.clients; i < host.maxclients; i++, sv_client++)
|
||||
{
|
||||
if (!ent->priv.sv->free)
|
||||
{
|
||||
// don't do physics on disconnected clients, FrikBot relies on this
|
||||
if (sv_client->state != cs_spawned)
|
||||
memset(&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd));
|
||||
else SV_PhysicsClient(ent);
|
||||
}
|
||||
if (sv_client->edict->priv.sv->free) continue;
|
||||
ClientEndServerFrame (sv_client->edict);
|
||||
|
||||
// don't do physics on disconnected clients, FrikBot relies on this
|
||||
if (sv_client->state != cs_spawned)
|
||||
memset(&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd));
|
||||
else SV_PhysicsClient(sv_client->edict);
|
||||
|
||||
}
|
||||
|
||||
for (;i < prog->num_edicts; i++, ent = PRVM_NEXT_EDICT(ent))
|
||||
for (i = 1;i < prog->num_edicts; i++)
|
||||
{
|
||||
if (!ent->priv.sv->free) SV_PhysicsEntity(ent);
|
||||
ent = PRVM_EDICT_NUM( i );
|
||||
if (ent->priv.sv->free) continue;
|
||||
SV_PhysicsEntity(ent);
|
||||
}
|
||||
|
||||
prog->globals.server->self = PRVM_EDICT_TO_PROG(prog->edicts);
|
||||
|
|
|
@ -258,8 +258,8 @@ void SV_Begin_f (void)
|
|||
}
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
sv_player->priv.sv->client->pmove.origin[i] = sv_player->fields.sv->origin[i]*8.0;
|
||||
//ent->client->ps.pmove.velocity[i] = ent->velocity[i]*8.0;
|
||||
sv_player->priv.sv->client->pmove.origin[i] = sv_player->priv.sv->state.origin[i] = sv_player->fields.sv->origin[i]*8.0;
|
||||
sv_player->priv.sv->client->pmove.velocity[i] = sv_player->fields.sv->velocity[i]*8.0;
|
||||
}
|
||||
sv_player->priv.sv->client->gunindex = SV_ModelIndex("models/weapons/v_glock.mdl" );
|
||||
sv_player->priv.sv->client->fov = 90;
|
||||
|
@ -533,7 +533,7 @@ void SV_ClientRun (client_t *cl, usercmd_t *cmd)
|
|||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
pm.s.origin[i] = cl->edict->priv.sv->state.origin[i] * 8;
|
||||
pm.s.origin[i] = cl->edict->fields.sv->origin[i] * 8;
|
||||
pm.s.velocity[i] = cl->edict->fields.sv->velocity[i] * 8;
|
||||
}
|
||||
pm.cmd = *cmd;
|
||||
|
@ -541,6 +541,8 @@ void SV_ClientRun (client_t *cl, usercmd_t *cmd)
|
|||
pm.trace = PM_trace; // adds default parms
|
||||
pm.pointcontents = SV_PointContents;
|
||||
|
||||
Msg("org before pmove [%i %i %i]\n", pm.s.origin[0], pm.s.origin[1], pm.s.origin[2] );
|
||||
|
||||
Pmove (&pm); //run pmove
|
||||
|
||||
// save results of pmove
|
||||
|
@ -550,8 +552,9 @@ void SV_ClientRun (client_t *cl, usercmd_t *cmd)
|
|||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
cl->edict->priv.sv->state.origin[i] = (float)pm.s.origin[i]*0.125;
|
||||
cl->edict->fields.sv->velocity[i] = (float)pm.s.velocity[i]*0.125;
|
||||
cl->edict->priv.sv->state.old_origin[i] = pm.s.origin[i]*0.125;
|
||||
cl->edict->fields.sv->origin[i] = pm.s.origin[i]*0.125;
|
||||
cl->edict->fields.sv->velocity[i] = pm.s.velocity[i]*0.125;
|
||||
}
|
||||
VectorCopy (pm.mins, cl->edict->fields.sv->mins);
|
||||
VectorCopy (pm.maxs, cl->edict->fields.sv->maxs);
|
||||
|
@ -888,7 +891,7 @@ void SV_ExecuteClientMessage (client_t *cl)
|
|||
int stringCmdCount;
|
||||
int checksum, calculatedChecksum;
|
||||
int checksumIndex;
|
||||
bool move_issued;
|
||||
bool move_issued;
|
||||
int lastframe;
|
||||
|
||||
sv_client = cl;
|
||||
|
@ -960,7 +963,9 @@ void SV_ExecuteClientMessage (client_t *cl)
|
|||
MsgWarn("SV_ExecuteClientMessage: failed command checksum for %s (%d != %d)/%d\n", cl->name, calculatedChecksum, checksum, cl->netchan.incoming_sequence);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//Msg("sv_paused->value %g\n", sv_paused->value );
|
||||
|
||||
if (!sv_paused->value)
|
||||
{
|
||||
net_drop = cl->netchan.dropped;
|
||||
|
@ -988,4 +993,5 @@ void SV_ExecuteClientMessage (client_t *cl)
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -65,8 +65,9 @@ void RemoveLink (link_t *l)
|
|||
l->prev->next = l->next;
|
||||
}
|
||||
|
||||
void InsertLinkBefore (link_t *l, link_t *before)
|
||||
void InsertLinkBefore (link_t *l, link_t *before, int entnum)
|
||||
{
|
||||
l->entnum = entnum;
|
||||
l->next = before;
|
||||
l->prev = before->prev;
|
||||
l->prev->next = l;
|
||||
|
@ -166,7 +167,11 @@ void SV_LinkEdict (prvm_edict_t *ent)
|
|||
|
||||
if (ent->priv.sv->area.prev) SV_UnlinkEdict (ent); // unlink from old position
|
||||
if (ent == prog->edicts) return; // don't add the world
|
||||
if (!ent->priv.sv->free) return;
|
||||
if (ent->priv.sv->free)
|
||||
{
|
||||
Msg("Can't link entity [%d]\n", ent->priv.sv->state.number );
|
||||
return;
|
||||
}
|
||||
|
||||
// set the size
|
||||
VectorSubtract (ent->fields.sv->maxs, ent->fields.sv->mins, ent->fields.sv->size);
|
||||
|
@ -217,7 +222,8 @@ void SV_LinkEdict (prvm_edict_t *ent)
|
|||
}
|
||||
}
|
||||
else
|
||||
{ // normal
|
||||
{
|
||||
// normal
|
||||
VectorAdd (ent->fields.sv->origin, ent->fields.sv->mins, ent->fields.sv->absmin);
|
||||
VectorAdd (ent->fields.sv->origin, ent->fields.sv->maxs, ent->fields.sv->absmax);
|
||||
}
|
||||
|
@ -309,8 +315,9 @@ void SV_LinkEdict (prvm_edict_t *ent)
|
|||
}
|
||||
|
||||
// link it in
|
||||
if (ent->fields.sv->solid == SOLID_TRIGGER) InsertLinkBefore (&ent->priv.sv->area, &node->trigger_edicts);
|
||||
else InsertLinkBefore (&ent->priv.sv->area, &node->solid_edicts);
|
||||
if (ent->fields.sv->solid == SOLID_TRIGGER)
|
||||
InsertLinkBefore (&ent->priv.sv->area, &node->trigger_edicts, PRVM_NUM_FOR_EDICT(ent));
|
||||
else InsertLinkBefore (&ent->priv.sv->area, &node->solid_edicts, PRVM_NUM_FOR_EDICT(ent));
|
||||
|
||||
}
|
||||
|
||||
|
@ -335,7 +342,7 @@ void SV_AreaEdicts_r (areanode_t *node)
|
|||
for (l = start->next; l != start; l = next)
|
||||
{
|
||||
next = l->next;
|
||||
check = PRVM_EDICT_FROM_AREA(l);
|
||||
check = PRVM_EDICT_NUM_UNSIGNED(l->entnum);
|
||||
|
||||
if (check->fields.sv->solid == SOLID_NOT) continue; // deactivated
|
||||
if (check->fields.sv->absmin[0] > area_maxs[0] || check->fields.sv->absmin[1] > area_maxs[1] || check->fields.sv->absmin[2] > area_maxs[2]
|
||||
|
@ -355,10 +362,8 @@ void SV_AreaEdicts_r (areanode_t *node)
|
|||
if (node->axis == -1) return; // terminal node
|
||||
|
||||
// recurse down both sides
|
||||
if ( area_maxs[node->axis] > node->dist )
|
||||
SV_AreaEdicts_r ( node->children[0] );
|
||||
if ( area_mins[node->axis] < node->dist )
|
||||
SV_AreaEdicts_r ( node->children[1] );
|
||||
if ( area_maxs[node->axis] > node->dist ) SV_AreaEdicts_r ( node->children[0] );
|
||||
if ( area_mins[node->axis] < node->dist ) SV_AreaEdicts_r ( node->children[1] );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -85,6 +85,7 @@ void Sys_Init (void)
|
|||
|
||||
if (!GetVersionEx (&vinfo)) Sys_Error ("Couldn't get OS info");
|
||||
if (vinfo.dwMajorVersion < 4) Sys_Error ("%s requires windows version 4 or greater", GI.title);
|
||||
srand(time(NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -119,6 +120,8 @@ void Sys_SendKeyEvents (void)
|
|||
{
|
||||
MSG msg;
|
||||
|
||||
rand();
|
||||
|
||||
while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
|
||||
{
|
||||
if (!GetMessage (&msg, NULL, 0, 0)) Sys_Quit ();
|
||||
|
|
|
@ -462,6 +462,12 @@ char *FS_Title( void )
|
|||
return GI.title;
|
||||
}
|
||||
|
||||
cvar_t *VID_Cvar_Set (const char *var_name, const char *value)
|
||||
{
|
||||
return Cvar_Set( var_name, value );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
VID_InitRenderer
|
||||
|
@ -490,7 +496,7 @@ void VID_InitRenderer( void )
|
|||
ri.gamedir = FS_Gamedir;
|
||||
ri.title = FS_Title;
|
||||
ri.Cvar_Get = Cvar_Get;
|
||||
ri.Cvar_Set = Cvar_Set;
|
||||
ri.Cvar_Set = VID_Cvar_Set;
|
||||
ri.Cvar_SetValue = Cvar_SetValue;
|
||||
ri.Vid_GetModeInfo = VID_GetModeInfo;
|
||||
ri.Vid_MenuInit = VID_MenuInit;
|
||||
|
|
|
@ -184,7 +184,6 @@ void() ClientConnect =
|
|||
{
|
||||
pprint(self, " has", " joined the game.");
|
||||
configstring (2, "sky"); //CS_SKY
|
||||
configstring (30, "4" ); //CS_MAXCLIENTS
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -278,7 +277,9 @@ void() PutClientInServer =
|
|||
setmodel (self, "models/player.mdl"); // Set my player to the player model
|
||||
setsize (self, VEC_HULL_MIN, VEC_HULL_MAX); // Set my size
|
||||
|
||||
self.view_ofs = '0 0 72'; // Center my view
|
||||
self.view_ofs = '0 0 22'; // Center my view
|
||||
|
||||
setsize(self, '-16 -16 -32', '16 16 32' );
|
||||
|
||||
if (self.aflag)
|
||||
CCamChasePlayer ();
|
||||
|
@ -287,7 +288,11 @@ void() PutClientInServer =
|
|||
|
||||
self.th_pain = PlayerPain;
|
||||
self.th_die = PlayerDie;
|
||||
|
||||
|
||||
setstats( self, STAT_HEALTH_ICON, "i_health");
|
||||
setstats( self, STAT_HEALTH, ftos(self.health));
|
||||
//setstats( self, STAT_HELPICON, "i_help");
|
||||
|
||||
GetLevelParms();
|
||||
};
|
||||
|
||||
|
|
28
progs/defs.c
28
progs/defs.c
|
@ -166,6 +166,7 @@ void(float style, string value) lightstyle = #35;
|
|||
float(float v) rint = #36; // round to nearest int
|
||||
float(float v) floor = #37; // largest integer <= v
|
||||
float(float v) ceil = #38; // smallest integer >= v
|
||||
void(entity e, float f, string stats) setstats = #39;
|
||||
float(entity e) checkbottom = #40; // true if self is on ground
|
||||
float(vector v) pointcontents = #41; // returns a CONTENT_*
|
||||
float(float f) fabs = #43;
|
||||
|
@ -213,6 +214,33 @@ void(entity e) setspawnparms = #78; // set parm1... to the
|
|||
float FALSE = 0;
|
||||
float TRUE = 1;
|
||||
|
||||
// newdefines
|
||||
#define CS_STATUSBAR 5
|
||||
|
||||
#define CS_MAXCLIENTS 30
|
||||
|
||||
#define STAT_HEALTH_ICON 0
|
||||
#define STAT_HEALTH 1.0
|
||||
#define STAT_AMMO_ICON 2
|
||||
#define STAT_AMMO 3
|
||||
#define STAT_ARMOR_ICON 4
|
||||
#define STAT_ARMOR 5
|
||||
#define STAT_SELECTED_ICON 6
|
||||
#define STAT_PICKUP_ICON 7
|
||||
#define STAT_PICKUP_STRING 8
|
||||
#define STAT_TIMER_ICON 9
|
||||
#define STAT_TIMER 10
|
||||
#define STAT_HELPICON 11
|
||||
#define STAT_SELECTED_ITEM 12
|
||||
#define STAT_LAYOUTS 13
|
||||
#define STAT_FRAGS 14
|
||||
#define STAT_FLASHES 15 // cleared each frame, 1 = health, 2 = armor
|
||||
#define STAT_CHASE 16
|
||||
#define STAT_SPECTATOR 17
|
||||
#define STAT_SPEED 22
|
||||
#define STAT_ZOOM 23
|
||||
#define MAX_STATS 32
|
||||
|
||||
// edict.flags
|
||||
float FL_FLY = 1;
|
||||
float FL_SWIM = 2;
|
||||
|
|
18
progs/main.c
18
progs/main.c
|
@ -83,6 +83,18 @@ void() GetLevelParms =
|
|||
void() StartFrame = {};
|
||||
void() EndFrame = {};
|
||||
|
||||
// hud program string
|
||||
string single_statusbar =
|
||||
"yb -24 xv 0 hnum xv 50 pic 0 \
|
||||
if 2 { xv 100 anum xv 150 pic 2 } \
|
||||
if 4 { xv 200 rnum xv 250 pic 4 } \
|
||||
if 6 { xv 296 pic 6 } yb -50 \
|
||||
if 7 { xv 0 pic 7 xv 26 yb -42 stat_string 8 yb -50 } \
|
||||
if 9 { xv 230 num 4 10 xv 296 pic 9 } \
|
||||
if 11 { xv 148 pic 11 } \
|
||||
if 22 { yb -90 xv 128 pic 22 } \
|
||||
if 23 { yv 0 xv 0 pic 23 }";
|
||||
|
||||
/*
|
||||
===============
|
||||
|WORLDSPAWN():|
|
||||
|
@ -92,11 +104,13 @@ This function is called when the world spawns.
|
|||
=================================================================================
|
||||
*/
|
||||
|
||||
void() worldspawn =
|
||||
void worldspawn( void )
|
||||
{
|
||||
precaches();
|
||||
LightStyles_setup();
|
||||
};
|
||||
configstring (CS_MAXCLIENTS, "1" );
|
||||
configstring (CS_STATUSBAR, single_statusbar );
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
|
|
BIN
progs/qcclib.exe
BIN
progs/qcclib.exe
Binary file not shown.
BIN
progs/server.dat
BIN
progs/server.dat
Binary file not shown.
Reference in New Issue