diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 00b2cc7cf..0b7cff7ff 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -592,7 +592,7 @@ entity_state_t *CL_FindOldPacketEntity(int num) return NULL; } -void CLNQ_ParseEntity(int bits) +void CLNQ_ParseEntity(unsigned int bits) { int i; int num, pnum; @@ -600,6 +600,7 @@ void CLNQ_ParseEntity(int bits) entity_state_t *base; static float lasttime; packet_entities_t *pack; + cl.validsequence=1; #define NQU_MOREBITS (1<<0) #define NQU_ORIGIN1 (1<<1) @@ -619,6 +620,30 @@ void CLNQ_ParseEntity(int bits) #define NQU_EFFECTS (1<<13) #define NQU_LONGENTITY (1<<14) + +// LordHavoc's: protocol extension +#define DPU_EXTEND1 (1<<15) +// LordHavoc: first extend byte +#define DPU_DELTA (1<<16) // no data, while this is set the entity is delta compressed (uses previous frame as a baseline, meaning only things that have changed from the previous frame are sent, except for the forced full update every half second) +#define DPU_ALPHA (1<<17) // 1 byte, 0.0-1.0 maps to 0-255, not sent if exactly 1, and the entity is not sent if <=0 unless it has effects (model effects are checked as well) +#define DPU_SCALE (1<<18) // 1 byte, scale / 16 positive, not sent if 1.0 +#define DPU_EFFECTS2 (1<<19) // 1 byte, this is .effects & 0xFF00 (second byte) +#define DPU_GLOWSIZE (1<<20) // 1 byte, encoding is float/4.0, unsigned, not sent if 0 +#define DPU_GLOWCOLOR (1<<21) // 1 byte, palette index, default is 254 (white), this IS used for darklight (allowing colored darklight), however the particles from a darklight are always black, not sent if default value (even if glowsize or glowtrail is set) +// LordHavoc: colormod feature has been removed, because no one used it +#define DPU_COLORMOD (1<<22) // 1 byte, 3 bit red, 3 bit green, 2 bit blue, this lets you tint an object artifically, so you could make a red rocket, or a blue fiend... +#define DPU_EXTEND2 (1<<23) // another byte to follow +// LordHavoc: second extend byte +#define DPU_GLOWTRAIL (1<<24) // leaves a trail of particles (of color .glowcolor, or black if it is a negative glowsize) +#define DPU_VIEWMODEL (1<<25) // attachs the model to the view (origin and angles become relative to it), only shown to owner, a more powerful alternative to .weaponmodel and such +#define DPU_FRAME2 (1<<26) // 1 byte, this is .frame & 0xFF00 (second byte) +#define DPU_MODEL2 (1<<27) // 1 byte, this is .modelindex & 0xFF00 (second byte) +#define DPU_EXTERIORMODEL (1<<28) // causes this model to not be drawn when using a first person view (third person will draw it, first person will not) +#define DPU_UNUSED29 (1<<29) // future expansion +#define DPU_UNUSED30 (1<<30) // future expansion +#define DPU_EXTEND3 (1<<31) // another byte to follow, future expansion + + if (cls.signon == 4 - 1) { // first update is the final signon stage cls.signon = 4; @@ -632,6 +657,16 @@ void CLNQ_ParseEntity(int bits) i = MSG_ReadByte (); bits |= (i<<8); } + if (bits & DPU_EXTEND1) + { + i = MSG_ReadByte (); + bits |= (i<<16); + } + if (bits & DPU_EXTEND2) + { + i = MSG_ReadByte (); + bits |= (i<<24); + } if (bits & NQU_LONGENTITY) num = MSG_ReadShort (); @@ -787,10 +822,12 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent) float *org=NULL, *ang=NULL; vec3_t axis[3]; vec3_t temp[3]; - int model; - int frame; - float *tagorg=NULL, *tagaxis; + int model = 0; //these two are only initialised because msvc sucks at detecting usage. + int frame = 0; + + float *tagorg=NULL; + float *tagaxis; ps = CL_FindPacketEntity(tagent); if (ps) @@ -825,10 +862,13 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent) AngleVectors(ang, axis[0], axis[1], axis[2]); VectorInverse(axis[1]); - Mod_GetTag(cl.model_precache[model], cl.lerpents[tagent].tagindex, frame, &tagorg, &tagaxis); + if (Mod_GetTag) + Mod_GetTag(cl.model_precache[model], cl.lerpents[tagent].tagindex, frame, &tagorg, &tagaxis); + else + tagaxis = NULL; if (tagaxis) { - Matrix3_Multiply(ent->axis, tagaxis, temp); + Matrix3_Multiply(ent->axis, (void*)tagaxis, temp); } else //hrm. memcpy(temp, ent->axis, sizeof(temp)); @@ -894,7 +934,7 @@ void CL_LinkPacketEntities (void) { if (s1->number == cl.viewentity[spnum]) { - float a1, a2; +// float a1, a2; cl.simvel[spnum][0] = 0; cl.simvel[spnum][1] = 0; cl.simvel[spnum][2] = 0; diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 89d46781e..154e1d074 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -1521,7 +1521,7 @@ void CL_ConnectionlessPacket (void) char *s2; for (s2 = s; *s; s++) { - if (*s < '0' || *s > '9') + if ((*s < '0' || *s > '9') && *s != '-') break; } if (*s) @@ -2611,6 +2611,10 @@ void Host_Init (quakeparms_t *parms) extern cvar_t vid_renderer; COM_InitArgv (parms->argc, parms->argv); + if (setjmp (host_abort) ) + Sys_Error("Host_Init: An error occured. Try the -condebug commandline parameter\n"); + + Sys_mkdir("qw"); if (COM_CheckParm ("-minmemory")) @@ -2691,7 +2695,7 @@ void Host_Init (quakeparms_t *parms) Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); host_hunklevel = Hunk_LowMark (); - R_SetRenderer(QR_NONE);//set the mod stuff... + R_SetRenderer(0);//set the renderer stuff to 'none'... host_initialized = true; diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index e57de5343..3270aa554 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -85,6 +85,7 @@ extern cvar_t scr_chatmodecvar; int mouseusedforgui; int mousecursor_x, mousecursor_y; +int mousemove_x, mousemove_y; // only the refresh window will be updated unless these variables are flagged int scr_copytop; @@ -1275,7 +1276,7 @@ int MipColor(int r, int g, int b) return best; } -void SCR_ScreenShot (char *filename) +void SCR_ScreenShot (char *filename) { int truewidth, trueheight; qbyte *buffer; diff --git a/engine/client/client.h b/engine/client/client.h index 5c2dc9b80..95722661d 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -630,6 +630,7 @@ void CL_BaseMove (usercmd_t *cmd, int pnum); float CL_KeyState (kbutton_t *key, int pnum); char *Key_KeynumToString (int keynum); +int Key_StringToKeynum (char *str, int *modifier); // // cl_demo.c @@ -687,6 +688,7 @@ void CL_InitTEnts (void); void CL_ClearTEnts (void); void CL_ClearCustomTEnts(void); void CL_ParseCustomTEnt(void); +void CL_ParseEffect (qboolean effect2); // // cl_ents.c @@ -801,7 +803,7 @@ void CLQ2_ParseTEnt (void); void CLQ2_AddEntities (void); void CLQ2_ParseBaseline (void); void CLQ2_ParseFrame (void); -void CLNQ_ParseEntity(int bits); +void CLNQ_ParseEntity(unsigned int bits); int CLQ2_RegisterTEntModels (void); #endif diff --git a/engine/client/console.c b/engine/client/console.c index 9bf89532f..f14047e06 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -704,7 +704,7 @@ void VARGS Con_Printf (const char *fmt, ...) return; } #endif - + // also echo to debugging console Sys_Printf ("%s", msg); // also echo to debugging console @@ -720,7 +720,7 @@ void VARGS Con_Printf (const char *fmt, ...) /* if (con != &con_main) return; - + // update the screen immediately if the console is displayed if (cls.state != ca_active && !filmactive) #ifndef CLIENTONLY diff --git a/engine/client/in_win.c b/engine/client/in_win.c index 058034c75..554f37614 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -922,6 +922,7 @@ void IN_MouseEvent (int mstate) static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum) { extern int mouseusedforgui, mousecursor_x, mousecursor_y; + extern int mousemove_x, mousemove_y; int mx, my; int mouse_x, mouse_y; @@ -971,6 +972,8 @@ static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum) if (mouseusedforgui || (key_dest == key_menu && m_state == m_complex) || UI_MenuState()) { + mousemove_x += mx; + mousemove_y += my; mousecursor_x += mx; mousecursor_y += my; diff --git a/engine/client/m_options.c b/engine/client/m_options.c index 07a65162e..7152fe5df 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -413,12 +413,3 @@ void M_Menu_FPS_f (void) menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 200, 32, NULL, false); } - -void M_OptionsMenusInit(void) -{ - Cmd_AddCommand ("menu_options", M_Menu_Options_f); - Cmd_AddCommand ("menu_video", M_Menu_Video_f); - Cmd_AddCommand ("menu_audio", M_Menu_Audio_f); - Cmd_AddCommand ("menu_fps", M_Menu_FPS_f); - Cmd_AddCommand ("menu_particles", M_Menu_Particles_f); -} diff --git a/engine/client/menu.c b/engine/client/menu.c index 4e0f1a64b..ede713a61 100644 --- a/engine/client/menu.c +++ b/engine/client/menu.c @@ -205,6 +205,8 @@ M_ToggleMenu_f */ void M_ToggleMenu_f (void) { + if (MP_Toggle()) + return; m_entersound = true; if (key_dest == key_menu) @@ -789,37 +791,93 @@ void M_Menu_Quit_f (void) /* Menu Subsystem */ -void M_OptionsMenusInit (void); void M_Menu_MediaFiles_f (void); -void M_Init (void) +void M_Menu_FPS_f (void); +void M_Menu_Particles_f (void); +static qboolean internalmenusregistered; +void M_Init_Internal (void) { - Cmd_AddCommand ("togglemenu", M_ToggleMenu_f); + MP_Shutdown(); + + if (internalmenusregistered) + return; + internalmenusregistered = true; + #ifndef CLIENTONLY - Cmd_AddCommand ("menu_save", M_Menu_Save_f); - Cmd_AddCommand ("menu_load", M_Menu_Load_f); - Cmd_AddCommand ("menu_loadgame", M_Menu_Load_f); //q2... + Cmd_AddRemCommand ("menu_save", M_Menu_Save_f); + Cmd_AddRemCommand ("menu_load", M_Menu_Load_f); + Cmd_AddRemCommand ("menu_loadgame", M_Menu_Load_f); //q2... #endif - Cmd_AddCommand ("menu_single", M_Menu_SinglePlayer_f); - Cmd_AddCommand ("menu_multi", M_Menu_MultiPlayer_f); - Cmd_AddCommand ("menu_demo", M_Menu_Demos_f); + Cmd_AddRemCommand ("menu_single", M_Menu_SinglePlayer_f); + Cmd_AddRemCommand ("menu_multi", M_Menu_MultiPlayer_f); + Cmd_AddRemCommand ("menu_demo", M_Menu_Demos_f); - Cmd_AddCommand ("menu_keys", M_Menu_Keys_f); - Cmd_AddCommand ("help", M_Menu_Help_f); - Cmd_AddCommand ("menu_quit", M_Menu_Quit_f); - Cmd_AddCommand ("menu_media", M_Menu_Media_f); - Cmd_AddCommand ("menu_mediafiles", M_Menu_MediaFiles_f); + Cmd_AddRemCommand ("menu_keys", M_Menu_Keys_f); + Cmd_AddRemCommand ("help", M_Menu_Help_f); + Cmd_AddRemCommand ("menu_quit", M_Menu_Quit_f); + Cmd_AddRemCommand ("menu_media", M_Menu_Media_f); + Cmd_AddRemCommand ("menu_mediafiles", M_Menu_MediaFiles_f); #ifdef CL_MASTER - Cmd_AddCommand ("menu_servers", M_Menu_ServerList_f); - Cmd_AddCommand ("menu_slist", M_Menu_ServerList_f); + Cmd_AddRemCommand ("menu_servers", M_Menu_ServerList_f); + Cmd_AddRemCommand ("menu_slist", M_Menu_ServerList_f); #endif - Cmd_AddCommand ("menu_setup", M_Menu_Setup_f); - Cmd_AddCommand ("menu_newmulti", M_Menu_GameOptions_f); + Cmd_AddRemCommand ("menu_setup", M_Menu_Setup_f); + Cmd_AddRemCommand ("menu_newmulti", M_Menu_GameOptions_f); + Cmd_AddRemCommand ("menu_main", M_Menu_Main_f); //I've moved main to last because that way tab give us main and not quit. - Cmd_AddCommand ("menu_main", M_Menu_Main_f); //I've moved main to last because that way tab give us main and not quit. + Cmd_AddRemCommand ("menu_options", M_Menu_Options_f); + Cmd_AddRemCommand ("menu_video", M_Menu_Video_f); + Cmd_AddRemCommand ("menu_audio", M_Menu_Audio_f); + Cmd_AddRemCommand ("menu_fps", M_Menu_FPS_f); + Cmd_AddRemCommand ("menu_particles", M_Menu_Particles_f); +} - M_OptionsMenusInit(); +void M_DeInit_Internal (void) +{ + M_RemoveAllMenus(); + + if (!internalmenusregistered) + return; + internalmenusregistered = false; + +#ifndef CLIENTONLY + Cmd_RemoveCommand ("menu_save"); + Cmd_RemoveCommand ("menu_load"); + Cmd_RemoveCommand ("menu_loadgame"); //q2... +#endif + Cmd_RemoveCommand ("menu_single"); + Cmd_RemoveCommand ("menu_multi"); + Cmd_RemoveCommand ("menu_demo"); + + Cmd_RemoveCommand ("menu_keys"); + Cmd_RemoveCommand ("help"); + Cmd_RemoveCommand ("menu_quit"); + Cmd_RemoveCommand ("menu_media"); + Cmd_RemoveCommand ("menu_mediafiles"); + +#ifdef CL_MASTER + Cmd_RemoveCommand ("menu_servers"); + Cmd_RemoveCommand ("menu_slist"); +#endif + Cmd_RemoveCommand ("menu_setup"); + Cmd_RemoveCommand ("menu_newmulti"); + Cmd_RemoveCommand ("menu_main"); //I've moved main to last because that way tab give us main and not quit. + + Cmd_RemoveCommand ("menu_options"); + Cmd_RemoveCommand ("menu_video"); + Cmd_RemoveCommand ("menu_audio"); + Cmd_RemoveCommand ("menu_fps"); + Cmd_RemoveCommand ("menu_particles"); +} + +//menu.dat is loaded later... after the video and everything is up. +void M_Init (void) +{ + M_Init_Internal(); + + Cmd_AddCommand("togglemenu", M_ToggleMenu_f); Cvar_Register(&m_helpismedia, "Menu thingumiebobs"); @@ -914,6 +972,9 @@ void M_Draw (int uimenu) Plug_Menu_Event (0, (int)(realtime*1000)); break; #endif + case m_menu_dat: + MP_Draw(); + return; } if (m_entersound) @@ -964,6 +1025,10 @@ void M_Keydown (int key) Plug_Menu_Event (1, key); return; #endif + + case m_menu_dat: + MP_Keydown(key); + return; } } @@ -980,6 +1045,9 @@ void M_Keyup (int key) Plug_Menu_Event (2, key); return; #endif + case m_menu_dat: + MP_Keyup(key); + return; default: break; } diff --git a/engine/client/menu.h b/engine/client/menu.h index cfdc9b36e..8acec5c93 100644 --- a/engine/client/menu.h +++ b/engine/client/menu.h @@ -50,7 +50,7 @@ void XWindows_Init(void); -typedef enum {m_none, m_complex, m_help, m_keys, m_slist, m_media, m_xwindows, m_plugin} m_state_t; +typedef enum {m_none, m_complex, m_help, m_keys, m_slist, m_media, m_xwindows, m_plugin, m_menu_dat} m_state_t; extern m_state_t m_state; typedef enum {mt_childwindow, mt_button, mt_buttonbigfont, mt_box, mt_colouredbox, mt_line, mt_edit, mt_text, mt_slider, mt_combo, mt_bind, mt_checkbox, mt_picture, mt_menudot, mt_custom} menutype_t; @@ -293,3 +293,10 @@ void M_DrawPic (int x, int y, qpic_t *pic); void M_FindKeysForCommand (char *command, int *twokeys); void M_UnbindCommand (char *command); + +void MP_Shutdown (void); +void MP_Init (void); +qboolean MP_Toggle(void); +void MP_Draw(void); +void MP_Keydown(int key); +void MP_Keyup(int key); diff --git a/engine/client/merged.h b/engine/client/merged.h index 2dd926c52..d80f7c003 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -38,6 +38,10 @@ extern void (*Draw_Fill) (int x, int y, int w, int h, int c); extern void (*Draw_FadeScreen) (void); extern void (*Draw_BeginDisc) (void); extern void (*Draw_EndDisc) (void); +extern qboolean (*Draw_IsCached) (char *picname); //can be null + +extern void (*Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, qpic_t *pic); //gl-style scaled/coloured/subpic +extern void (*Draw_ImageColours) (float r, float g, float b, float a); extern void (*R_Init) (void); extern void (*R_DeInit) (void); @@ -72,8 +76,8 @@ extern void (*VID_ForceLockState) (int lk); extern int (*VID_ForceUnlockedAndReturnState) (void); extern void (*VID_SetPalette) (unsigned char *palette); extern void (*VID_ShiftPalette) (unsigned char *palette); -extern char *(*VID_GetRGBInfo)(int prepad, int *truevidwidth, int *truevidheight); -extern void (*VID_SetWindowCaption) (char *msg); +extern char *(*VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); +extern void (*VID_SetWindowCaption) (char *msg); extern void SCR_Init (void); extern void SCR_DeInit (void); @@ -99,6 +103,7 @@ extern qbyte *FNC(Mod_Q1LeafPVS) (struct mleaf_s *leaf, struct model_s *mode extern void FNC(Mod_NowLoadExternal) (void); extern void FNC(Mod_Think) (void); +extern void (*Mod_GetTag) (struct model_s *model, int tagnum, int frame, float **org, float **axis); #undef FNC diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index eb3117f66..c6e7382bc 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -162,7 +162,7 @@ extern "C" { #include "progs.h" #include "world.h" //#ifdef Q2SERVER -#include "q2game.h" //under development. +#include "q2game.h" //#endif #include "server.h" #endif diff --git a/engine/client/render.h b/engine/client/render.h index 9f85f1e67..7579aebb6 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -236,6 +236,7 @@ void R_SetVrect (vrect_t *pvrect, vrect_t *pvrectin, int lineadj); #if defined(RGLQUAKE) void GLMod_Init (void); +void GLMod_GetTag(struct model_s *model, int tagnum, int frame, float **org, float **axis); void GLMod_ClearAll (void); struct model_s *GLMod_ForName (char *name, qboolean crash); struct model_s *GLMod_FindName (char *name);