diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 86fa6da57..649b011a2 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -2524,6 +2524,9 @@ void CL_ParsePlayerinfo (void) state->viewangles[0] = state->command.angles[0] * (360.0/65536); state->viewangles[1] = state->command.angles[1] * (360.0/65536); state->viewangles[2] = state->command.angles[2] * (360.0/65536); + + if (!(cls.z_ext & Z_EXT_VWEP)) + state->command.impulse = 0; } for (i=0 ; i<3 ; i++) @@ -2744,7 +2747,7 @@ void CL_AddFlagModels (entity_t *ent, int team) VectorInverse(newent->axis[1]); } -void CL_AddVWeapModel(entity_t *player, int model) +void CL_AddVWeapModel(entity_t *player, model_t *model) { entity_t *newent; vec3_t angles; @@ -2753,7 +2756,7 @@ void CL_AddVWeapModel(entity_t *player, int model) VectorCopy(player->origin, newent->origin); VectorCopy(player->angles, newent->angles); newent->skinnum = player->skinnum; - newent->model = cl.model_precache[model]; + newent->model = model; newent->framestate = player->framestate; VectorCopy(newent->angles, angles); @@ -2881,7 +2884,10 @@ void CL_LinkPlayers (void) ent->forcedshader = NULL; #endif - ent->model = cl.model_precache[state->modelindex]; + if (state->command.impulse && cl.model_precache_vwep[0]) + ent->model = cl.model_precache_vwep[0]; + else + ent->model = cl.model_precache[state->modelindex]; ent->skinnum = state->skinnum; ent->framestate.g[FS_REG].frametime[0] = cl.time - cl.lerpplayers[j].framechange; @@ -3003,7 +3009,9 @@ void CL_LinkPlayers (void) else if (state->effects & QWEF_FLAG2) CL_AddFlagModels (ent, 1); else if (info->vweapindex) - CL_AddVWeapModel (ent, info->vweapindex); + CL_AddVWeapModel (ent, cl.model_precache[info->vweapindex]); + else if (state->command.impulse) + CL_AddVWeapModel (ent, cl.model_precache_vwep[state->command.impulse]); } } diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 6146a6c6b..3ee79a3fa 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -510,6 +510,14 @@ void CL_DownloadFinished(void) break; } } + for (i = 0; i < MAX_VWEP_MODELS; i++) + { + if (!strcmp(cl.model_name_vwep[i], filename)) + { + cl.model_precache_vwep[i] = Mod_ForName(cl.model_name_vwep[i], false); + break; + } + } } S_ResetFailedLoad(); //okay, so this can still get a little spammy in bad places... @@ -793,6 +801,17 @@ void Model_CheckDownloads (void) CL_CheckOrEnqueDownloadFile(s, s, (i==1)?DLLF_REQUIRED:0); //world is required to be loaded. CL_CheckModelResources(s); } + + for (i = 0; i < MAX_VWEP_MODELS; i++) + { + s = cl.model_name_vwep[i]; + + if (!stricmp(COM_FileExtension(s), "dsp")) //doom sprites are weird, and not really downloadable via this system + continue; + + CL_CheckOrEnqueDownloadFile(s, s, 0); + CL_CheckModelResources(s); + } } int CL_LoadModels(int stage, qboolean dontactuallyload) @@ -911,6 +930,18 @@ int CL_LoadModels(int stage, qboolean dontactuallyload) endstage(); } } + for (i = 0; i < MAX_VWEP_MODELS; i++) + { + if (!cl.model_name_vwep[i][0]) + continue; + + if (atstage()) + { + CSQC_LoadResource(cl.model_name_vwep[i], "model"); + cl.model_precache_vwep[i] = Mod_ForName (cl.model_name_vwep[i], false); + endstage(); + } + } } @@ -4429,9 +4460,21 @@ void CL_ParseStuffCmd(char *msg, int destsplit) //this protects stuffcmds from n Cbuf_AddText ("\n", RESTRICT_SERVER+destsplit); } } - else if (!strncmp(stufftext, "//vweap ", 8)) + else if (!strncmp(stufftext, "//vwep ", 7)) { - Con_Printf("vweap!: %s\n", stufftext); + int i; + char *mname; + Cmd_TokenizeString(stufftext+7, false, false); + for (i = 0; i < Cmd_Argc(); i++) + { + mname = va("progs/%s.mdl", Cmd_Argv(i)); + Q_strncpyz(cl.model_name_vwep[i], mname, sizeof(cl.model_name_vwep[i])); + if (cls.state == ca_active) + { + CL_CheckOrEnqueDownloadFile(mname, NULL, 0); + cl.model_precache_vwep[i] = Mod_ForName(mname, false); + } + } } else if (!strncmp(stufftext, "//exectrigger ", 14)) { diff --git a/engine/client/client.h b/engine/client/client.h index c9fc00703..82d7d9e75 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -551,10 +551,12 @@ typedef struct // // information that is static for the entire time connected to a server // + char model_name_vwep[MAX_VWEP_MODELS][MAX_QPATH]; char model_name[MAX_MODELS][MAX_QPATH]; char sound_name[MAX_SOUNDS][MAX_QPATH]; char image_name[Q2MAX_IMAGES][MAX_QPATH]; + struct model_s *model_precache_vwep[MAX_VWEP_MODELS]; struct model_s *model_precache[MAX_MODELS]; struct sfx_s *sound_precache[MAX_SOUNDS]; @@ -1134,7 +1136,8 @@ void SCR_StringToRGB (char *rgbstring, float *rgb, float rgbinputscale); int SCR_StringToPalIndex (char *rgbstring, float rgbinputscale); -void CL_AddVWeapModel(entity_t *player, int model); +struct model_s; +void CL_AddVWeapModel(entity_t *player, struct model_s *model); qboolean Media_PlayingFullScreen(void); diff --git a/engine/client/merged.h b/engine/client/merged.h index face5dc6f..12685e788 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -134,6 +134,7 @@ extern void FNC(Mod_NowLoadExternal) (void); extern void FNC(Mod_Think) (void); extern int FNC(Mod_SkinForName) (struct model_s *model, char *name); extern int FNC(Mod_FrameForName) (struct model_s *model, char *name); +extern float FNC(Mod_GetFrameDuration) (struct model_s *model, int framenum); #undef FNC @@ -223,6 +224,7 @@ typedef struct { int (*Mod_TagNumForName) (struct model_s *model, char *name); int (*Mod_SkinForName) (struct model_s *model, char *name); int (*Mod_FrameForName) (struct model_s *model, char *name); + float (*Mod_GetFrameDuration) (struct model_s *model, int frame); qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette); diff --git a/engine/client/net_master.c b/engine/client/net_master.c index 9d618483a..142dd5783 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -1365,6 +1365,9 @@ void MasterInfo_Begin(void) Master_AddMaster("195.74.0.8", MT_MASTERQW, "unknown2 master server."); Master_AddMaster("204.182.161.2", MT_MASTERQW, "unknown5 master server."); + Master_AddMaster("asgaard.morphos-team.net:27000",MT_MASTERQW, "Asgaard"); + Master_AddMaster("master.quakeservers.net:27000",MT_MASTERQW, "QuakeServers.net"); + Master_AddMaster("255.255.255.255:27500", MT_BCASTQW, "Nearby QuakeWorld UDP servers."); } diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 658fd3c78..e378dc0c7 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -3627,6 +3627,17 @@ static void PF_frameforname (progfuncs_t *prinst, struct globalvars_s *pr_global else G_FLOAT(OFS_RETURN) = -1; } +static void PF_frameduration (progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + int modelindex = G_FLOAT(OFS_PARM0); + char *str = PF_VarString(prinst, 1, pr_globals); + model_t *mod = CSQC_GetModelForIndex(modelindex); + + if (mod && Mod_GetFrameDuration) + G_FLOAT(OFS_RETURN) = Mod_GetFrameDuration(mod, str); + else + G_FLOAT(OFS_RETURN) = 0; +} static void PF_skinforname (progfuncs_t *prinst, struct globalvars_s *pr_globals) { int modelindex = G_FLOAT(OFS_PARM0); @@ -5126,6 +5137,7 @@ static struct { {"skel_copybones", PF_skel_copybones, 274},//void(float skeldst, float skelsrc, float startbone, float entbone) skel_copybones = #273; // (FTE_CSQC_SKELETONOBJECTS) {"skel_delete", PF_skel_delete, 275},//void(float skel) skel_delete = #274; // (FTE_CSQC_SKELETONOBJECTS) {"frameforname", PF_frameforname, 276},//void(float modidx, string framename) frameforname = #275 (FTE_CSQC_SKELETONOBJECTS) + {"frameduration", PF_frameduration, 277},//void(float modidx, float framenum) frameduration = #276 (FTE_CSQC_SKELETONOBJECTS) //300 {"clearscene", PF_R_ClearScene, 300}, // #300 void() clearscene (EXT_CSQC) diff --git a/engine/client/render.h b/engine/client/render.h index 841ef01d6..e1a844045 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -384,6 +384,7 @@ void GLMod_Init (void); int Mod_TagNumForName(struct model_s *model, char *name); int Mod_SkinNumForName(struct model_s *model, char *name); int Mod_FrameNumForName(struct model_s *model, char *name); +float Mod_FrameDuration(struct model_s *model, int frameno); void GLMod_ClearAll (void); struct model_s *GLMod_ForName (char *name, qboolean crash); diff --git a/engine/client/renderer.c b/engine/client/renderer.c index e36f049cb..ea0f7c857 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -788,6 +788,7 @@ void (*Mod_Think) (void); //int (*Mod_TagNumForName) (struct model_s *model, char *name); int (*Mod_SkinForName) (struct model_s *model, char *name); int (*Mod_FrameForName) (struct model_s *model, char *name); +float (*Mod_GetFrameDuration) (struct model_s *model, int framenum); @@ -882,6 +883,12 @@ rendererinfo_t dedicatedrendererinfo = { SWMod_NowLoadExternal, SWMod_Think, + + NULL, //Mod_GetTag + NULL, //fixme: server will need this one at some point. + NULL, + NULL, + NULL, #elif defined(RGLQUAKE) || defined(D3DQUAKE) GLMod_Init, GLMod_ClearAll, @@ -892,14 +899,16 @@ rendererinfo_t dedicatedrendererinfo = { GLMod_NowLoadExternal, GLMod_Think, -#else -#error "Need logic here!" -#endif NULL, //Mod_GetTag NULL, //fixme: server will need this one at some point. NULL, NULL, + Mod_FrameDuration, + +#else +#error "Need logic here!" +#endif NULL, //VID_Init, NULL, //VID_DeInit, @@ -994,6 +1003,7 @@ rendererinfo_t softwarerendererinfo = { NULL, //Mod_TagForName NULL, NULL, + NULL, SWVID_Init, SWVID_Shutdown, @@ -1092,6 +1102,7 @@ rendererinfo_t openglrendererinfo = { Mod_TagNumForName, Mod_SkinNumForName, Mod_FrameNumForName, + Mod_FrameDuration, GLVID_Init, GLVID_DeInit, @@ -1548,6 +1559,8 @@ void R_SetRenderer(int wanted) // Mod_GetTag = ri->Mod_GetTag; // Mod_TagNumForName = ri->Mod_TagNumForName; Mod_SkinForName = ri->Mod_SkinForName; + Mod_FrameForName = ri->Mod_FrameForName; + Mod_GetFrameDuration = ri->Mod_GetFrameDuration; SCR_UpdateScreen = ri->SCR_UpdateScreen; } diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index 1ecf5179c..3aed3485c 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -394,6 +394,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAX_STANDARDLIGHTSTYLES 64 #define MAX_MODELS 512 // these are sent over the net as bytes #define MAX_SOUNDS 512 // so they cannot be blindly increased +#define MAX_VWEP_MODELS 32 #define MAX_CSQCMODELS 256 // these live entirly clientside diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 3ecaf18cd..73acbb37b 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -2835,9 +2835,9 @@ int Mod_FrameNumForName(model_t *model, char *name) inf = Mod_Extradata(model); - for (i = 0; i < model->numframes; i++) + group = (galiasgroup_t*)((char*)inf + inf->groupofs); + for (i = 0; i < inf->groups; i++, group++) { - group = (galiasgroup_t*)((char*)inf + inf->groupofs); if (!strcmp(group->name, name)) return i; } @@ -2863,6 +2863,23 @@ int Mod_SkinNumForName(model_t *model, char *name) return -1; } + +float Mod_FrameDuration(model_t *model, int frameno) +{ + int i; + galiasinfo_t *inf; + galiasgroup_t *group; + + if (!model || model->type != mod_alias) + return 0; + inf = Mod_Extradata(model); + + group = (galiasgroup_t*)((char*)inf + inf->groupofs); + if (frameno < 0 || frameno >= inf->groups) + return 0; + group += frameno; + return group->numposes/group->rate; +} #endif diff --git a/engine/common/protocol.h b/engine/common/protocol.h index 7aa41f280..4669400b9 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -83,7 +83,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define Z_EXT_VWEP (1<<7) //#define Z_EXT_PF_SOLID (1<<8) //conflicts with many FTE extensions. -#define SUPPORTED_Z_EXTENSIONS (Z_EXT_PM_TYPE|Z_EXT_PM_TYPE_NEW|Z_EXT_VIEWHEIGHT|Z_EXT_SERVERTIME|Z_EXT_PITCHLIMITS|Z_EXT_JOIN_OBSERVE) +#define SUPPORTED_Z_EXTENSIONS (Z_EXT_PM_TYPE|Z_EXT_PM_TYPE_NEW|Z_EXT_VIEWHEIGHT|Z_EXT_SERVERTIME|Z_EXT_PITCHLIMITS|Z_EXT_JOIN_OBSERVE|Z_EXT_VWEP) #define PROTOCOL_VERSION_FTE (('F'<<0) + ('T'<<8) + ('E'<<16) + ('X' << 24)) //fte extensions. diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index ce6e73e5a..4cca1f6f9 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -688,51 +688,6 @@ void (D3D7_R_LessenStains) (void) { } -void (D3D7_Mod_Init) (void) -{ -} -void (D3D7_Mod_ClearAll) (void) -{ -} -struct model_s *(D3D7_Mod_ForName) (char *name, qboolean crash) -{ - return NULL; -} -struct model_s *(D3D7_Mod_FindName) (char *name) -{ - return NULL; -} -void *(D3D7_Mod_Extradata) (struct model_s *mod) -{ - return NULL; -} // handles caching -void (D3D7_Mod_TouchModel) (char *name) -{ -} - -void (D3D7_Mod_NowLoadExternal) (void) -{ -} -void (D3D7_Mod_Think) (void) -{ -} -qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, framestate_t *fstate, float *result) -{ - return false; -} -int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name) -{ - return 0; -} -int (D3D7_Mod_SkinForName) (struct model_s *model, char *name) -{ - return 0; -} -int (D3D7_Mod_FrameForName) (struct model_s *model, char *name) -{ - return 0; -} - void (D3D7_VID_DeInit) (void) { if (pPrimary) @@ -1094,7 +1049,6 @@ void (D3D7_Mod_TouchModel) (char *name); void (D3D7_Mod_NowLoadExternal) (void); void (D3D7_Mod_Think) (void); -qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result); int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name); int (D3D7_Mod_SkinForName) (struct model_s *model, char *name); @@ -1186,10 +1140,11 @@ rendererinfo_t d3d7rendererinfo = GLMod_NowLoadExternal, GLMod_Think, - D3D7_Mod_GetTag, - D3D7_Mod_TagNumForName, - D3D7_Mod_SkinForName, - D3D7_Mod_FrameForName, + Mod_GetTag, + Mod_TagNumForName, + Mod_SkinNumForName, + Mod_FrameNumForName, + Mod_FrameDuration, D3D7_VID_Init, diff --git a/engine/d3d9/vid_d3d9.c b/engine/d3d9/vid_d3d9.c index 0748b0404..2b9f4e7c9 100644 --- a/engine/d3d9/vid_d3d9.c +++ b/engine/d3d9/vid_d3d9.c @@ -864,44 +864,6 @@ void (D3D9_R_LessenStains) (void) { } -void (D3D9_Mod_Init) (void) -{ -} -void (D3D9_Mod_ClearAll) (void) -{ -} -struct model_s *(D3D9_Mod_ForName) (char *name, qboolean crash) -{ - return NULL; -} -struct model_s *(D3D9_Mod_FindName) (char *name) -{ - return NULL; -} -void *(D3D9_Mod_Extradata) (struct model_s *mod) -{ - return NULL; -} // handles caching -void (D3D9_Mod_TouchModel) (char *name) -{ -} - -void (D3D9_Mod_NowLoadExternal) (void) -{ -} -void (D3D9_Mod_Think) (void) -{ -} - -int (D3D9_Mod_SkinForName) (struct model_s *model, char *name) -{ - return 0; -} -int (D3D9_Mod_FrameForName) (struct model_s *model, char *name) -{ - return 0; -} - void (D3D9_VID_DeInit) (void) { if (pD3DDev9) @@ -1452,8 +1414,9 @@ rendererinfo_t d3d9rendererinfo = GLMod_Think, Mod_GetTag, Mod_TagNumForName, - D3D9_Mod_SkinForName, - D3D9_Mod_FrameForName, + Mod_SkinNumForName, + Mod_FrameNumForName, + Mod_FrameDuration, D3D9_VID_Init, diff --git a/engine/gl/gltod3d/gl_fakegl.cpp b/engine/gl/gltod3d/gl_fakegl.cpp index ec54bcce0..3d367c176 100644 --- a/engine/gl/gltod3d/gl_fakegl.cpp +++ b/engine/gl/gltod3d/gl_fakegl.cpp @@ -4143,8 +4143,9 @@ rendererinfo_t d3drendererinfo = { Mod_GetTag, Mod_TagNumForName, - NULL, - NULL, + Mod_SkinForName, + Mod_FrameForName, + Mod_GetFrameDuration, D3DVID_Init, GLVID_DeInit, diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 4771da28b..5bd7fdf47 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -1990,6 +1990,50 @@ void PF_set_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) PF_setmodel_Internal(prinst, e, fullname); } +static void PF_frameforname (progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + unsigned int modelindex = G_FLOAT(OFS_PARM0); + char *str = PF_VarString(prinst, 1, pr_globals); + model_t *mod = (modelindex>= MAX_MODELS)?NULL:sv.models[modelindex]; + + if (mod && Mod_FrameForName) + G_FLOAT(OFS_RETURN) = Mod_FrameForName(mod, str); + else + G_FLOAT(OFS_RETURN) = -1; +} +static void PF_frameduration (progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + unsigned int modelindex = G_FLOAT(OFS_PARM0); + unsigned int framenum = G_FLOAT(OFS_PARM1); + model_t *mod; + + if (modelindex >= MAX_MODELS) + G_FLOAT(OFS_RETURN) = 0; + else + { + mod = sv.models[modelindex]; + if (!mod) + mod = sv.models[modelindex] = Mod_ForName(sv.strings.model_precache[modelindex], false); + + if (mod && Mod_GetFrameDuration) + G_FLOAT(OFS_RETURN) = Mod_GetFrameDuration(mod, framenum); + else + G_FLOAT(OFS_RETURN) = 0; + } +} +static void PF_skinforname (progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + unsigned int modelindex = G_FLOAT(OFS_PARM0); + char *str = PF_VarString(prinst, 1, pr_globals); + model_t *mod = (modelindex>= MAX_MODELS)?NULL:sv.models[modelindex]; + + + if (mod && Mod_SkinForName) + G_FLOAT(OFS_RETURN) = Mod_SkinForName(mod, str); + else + G_FLOAT(OFS_RETURN) = -1; +} + /* ================= PF_bprint @@ -9126,6 +9170,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"globalstat", PF_globalstat, 0, 0, 0, 233}, //EXT_CSQC_1 actually //END EXT_CSQC {"isbackbuffered", PF_isbackbuffered, 0, 0, 0, 234}, + {"skinforname", PF_skinforname, 0, 0, 0, 237}, // #237 {"te_bloodqw", PF_te_bloodqw, 0, 0, 0, 239}, {"checkpvs", PF_checkpvs, 0, 0, 0, 240}, @@ -9151,6 +9196,10 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"stoh", PF_stoh, 0, 0, 0, 261}, {"htos", PF_htos, 0, 0, 0, 262}, + {"frameforname", PF_frameforname, 0, 0, 0, 276},//void(float modidx, string framename) frameforname = #276 (FTE_CSQC_SKELETONOBJECTS) + {"frameduration", PF_frameduration, 0, 0, 0, 277},//float(float modidx, float framenum) frameduration = #277 (FTE_CSQC_SKELETONOBJECTS) + + //EXT_CSQC // {"setmodelindex", PF_sv_SetModelIndex,0, 0, 0, 333}, // #333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC) // {"modelnameforindex",PF_sv_ModelnameForIndex,0, 0, 0, 334}, // #334 string(float mdlindex) modelnameforindex (EXT_CSQC) diff --git a/engine/server/pr_q1qvm.c b/engine/server/pr_q1qvm.c index 486ecfd6b..c57c56637 100755 --- a/engine/server/pr_q1qvm.c +++ b/engine/server/pr_q1qvm.c @@ -137,7 +137,7 @@ typedef enum G_MAKEVECTORS, G_NEXTCLIENT, - G_PRECAHCE_VWEP_MODEL, + G_PRECACHE_VWEP_MODEL, G_SETPAUSE, G_SETUSERINFO, G_MOVETOGOAL, @@ -502,13 +502,14 @@ void PF_ExecuteCommand (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_setspawnparms (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_ForceInfoKey(progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_precache_vwep_model(progfuncs_t *prinst, struct globalvars_s *pr_globals); int PF_checkclient_Internal (progfuncs_t *prinst); void PF_precache_sound_Internal (progfuncs_t *prinst, char *s); void PF_precache_model_Internal (progfuncs_t *prinst, char *s); void PF_setmodel_Internal (progfuncs_t *prinst, edict_t *e, char *m); -char *PF_infokey_Internal (int entnum, char *value); +char *PF_infokey_Internal (int entnum, char *value);; static int WrapQCBuiltin(builtin_t func, void *offset, unsigned int mask, const int *arg, char *argtypes) { @@ -816,6 +817,13 @@ static int syscallqvm (void *offset, unsigned int mask, int fn, const int *arg) case G_LOGFRAG: WrapQCBuiltin(PF_logfrag, offset, mask, arg, "nn"); break; + case G_PRECACHE_VWEP_MODEL: + { + int i = WrapQCBuiltin(PF_precache_vwep_model, offset, mask, arg, "s"); + float f = *(float*)&i; + return f; + } + break; case G_GETINFOKEY: { diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 5612ced88..59fc6882a 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -931,7 +931,7 @@ void SV_Modellist_f (void) if (n == 0 && (host_client->zquake_extensions & Z_EXT_VWEP)) { char mname[MAX_QPATH]; - char vweaplist[1024] = "//vweap"; + char vweaplist[1024] = "//vwep"; int pos = strlen(vweaplist); for (i = 0; sv.strings.vw_model_precache[i]; i++)