From 56b2d4259d84f32461b9541d0719f274024bb120 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 30 Nov 2022 14:27:11 -0800 Subject: [PATCH] Fix tree against the latest Nuclide code upstream. --- src/client/progs.src | 1 - src/server/client.qc | 1 - src/shared/player.h | 460 ++++++++++++++++++++++++++++++------------- 3 files changed, 319 insertions(+), 143 deletions(-) diff --git a/src/client/progs.src b/src/client/progs.src index 6f9b3e0..3cd35e1 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -25,7 +25,6 @@ draw.qc textmenu.qc init.qc ../../../valve/src/client/flashlight.qc -../../../valve/src/client/player.qc entities.qc cmds.qc game_event.qc diff --git a/src/server/client.qc b/src/server/client.qc index a70ad96..70e8be6 100644 --- a/src/server/client.qc +++ b/src/server/client.qc @@ -23,7 +23,6 @@ Game_RunClientCommand(void) pl.gflags &= ~GF_RESCUEZONE; pl.gflags &= ~GF_BOMBZONE; - Footsteps_Update(); pl.Physics_Run(); } diff --git a/src/shared/player.h b/src/shared/player.h index 0c26dda..4126c31 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -14,6 +14,89 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef CLIENT +/* Here's a list of bone names that we are aware of on HL player models. + Usually we'd use skeletalobjects to share the same skeleton/anim with + another model - but because FTEQW does not support that for HLMDL we + are forced to manually position the bones of our attachnment + by iterating over them and manually setting their position in 3D-space. +*/ +string g_pbones[] = +{ + "Bip01", + "Bip01 Footsteps", + "Bip01 Pelvis", + "Bip01 L Leg", + "Bip01 L Leg1", + "Bip01 L Foot", + "Bip01 L Toe0", + "Bip01 L Toe01", + "Bip01 L Toe02", + "Dummy16", + "Bip01 R Leg", + "Bip01 R Leg1", + "Bip01 R Foot", + "Bip01 R Toe0", + "Bip01 R Toe01", + "Bip01 R Toe02", + "Dummy11", + "Bip01 Spine", + "Bip01 Spine1", + "Bip01 Spine2", + "Bip01 Spine3", + "Bip01 Neck", + "Bip01 Head", + "Dummy21", + "Dummy08", + "Bone02", + "Bone03", + "Bone04", + "Dummy05", + "Bone09", + "Bone10", + "Dummy04", + "Bone05", + "Bone06", + "Dummy03", + "Bone07", + "Bone08", + "Dummy09", + "Bone11", + "Bone12", +"Dummy10", + "Bone13", + "Bone14", + "Bone15", + "Bip01 L Arm", + "Bip01 L Arm1", + "Bip01 L Arm2", + "Bip01 L Hand", + "Bip01 L Finger0", + "Bip01 L Finger01", + "Bip01 L Finger02", + "Dummy06", + "Bip01 L Finger1", + "Bip01 L Finger11", + "Bip01 L Finger12", + "Dummy07", + "Bip01 R Arm", + "Bip01 R Arm1", + "Bip01 R Arm2", + "Bip01 R Hand", + "Bip01 R Finger0", + "Bip01 R Finger01", + "Bip01 R Finger02", + "Dummy01", + "Bip01 R Finger1", + "Bip01 R Finger11", + "Bip01 R Finger12", + "Dummy02", + "Box02", + "Bone08", + "Bone15" +}; +#endif + /* all potential SendFlags bits we can possibly send */ enumflags { @@ -29,62 +112,63 @@ class player:NSClientPlayer { int ingame; - PREDICTED_INT(usp45_mag); - PREDICTED_INT(glock18_mag); - PREDICTED_INT(deagle_mag); - PREDICTED_INT(p228_mag); - PREDICTED_INT(elites_mag); - PREDICTED_INT(fiveseven_mag); - PREDICTED_INT(m3_mag); - PREDICTED_INT(xm1014_mag); - PREDICTED_INT(mp5_mag); - PREDICTED_INT(p90_mag); - PREDICTED_INT(ump45_mag); - PREDICTED_INT(mac10_mag); - PREDICTED_INT(tmp_mag); - PREDICTED_INT(ak47_mag); - PREDICTED_INT(sg552_mag); - PREDICTED_INT(m4a1_mag); - PREDICTED_INT(aug_mag); - PREDICTED_INT(scout_mag); - PREDICTED_INT(awp_mag); - PREDICTED_INT(g3sg1_mag); - PREDICTED_INT(sg550_mag); - PREDICTED_INT(para_mag); + PREDICTED_INT(usp45_mag) + PREDICTED_INT(glock18_mag) + PREDICTED_INT(deagle_mag) + PREDICTED_INT(p228_mag) + PREDICTED_INT(elites_mag) + PREDICTED_INT(fiveseven_mag) + PREDICTED_INT(m3_mag) + PREDICTED_INT(xm1014_mag) + PREDICTED_INT(mp5_mag) + PREDICTED_INT(p90_mag) + PREDICTED_INT(ump45_mag) + PREDICTED_INT(mac10_mag) + PREDICTED_INT(tmp_mag) + PREDICTED_INT(ak47_mag) + PREDICTED_INT(sg552_mag) + PREDICTED_INT(m4a1_mag) + PREDICTED_INT(aug_mag) + PREDICTED_INT(scout_mag) + PREDICTED_INT(awp_mag) + PREDICTED_INT(g3sg1_mag) + PREDICTED_INT(sg550_mag) + PREDICTED_INT(para_mag) - PREDICTED_INT(ammo_50ae); - PREDICTED_INT(ammo_762mm); - PREDICTED_INT(ammo_556mm); - PREDICTED_INT(ammo_556mmbox); - PREDICTED_INT(ammo_338mag); - PREDICTED_INT(ammo_9mm); - PREDICTED_INT(ammo_buckshot); - PREDICTED_INT(ammo_45acp); - PREDICTED_INT(ammo_357sig); - PREDICTED_INT(ammo_57mm); - PREDICTED_INT(ammo_hegrenade); - PREDICTED_INT(ammo_fbgrenade); - PREDICTED_INT(ammo_smokegrenade); + PREDICTED_INT(ammo_50ae) + PREDICTED_INT(ammo_762mm) + PREDICTED_INT(ammo_556mm) + PREDICTED_INT(ammo_556mmbox) + PREDICTED_INT(ammo_338mag) + PREDICTED_INT(ammo_9mm) + PREDICTED_INT(ammo_buckshot) + PREDICTED_INT(ammo_45acp) + PREDICTED_INT(ammo_357sig) + PREDICTED_INT(ammo_57mm) + PREDICTED_INT(ammo_hegrenade) + PREDICTED_INT(ammo_fbgrenade) + PREDICTED_INT(ammo_smokegrenade) - PREDICTED_INT(mode_usp45); - PREDICTED_INT(mode_m4a1); - PREDICTED_INT(mode_glock18); - PREDICTED_INT(mode_temp); + PREDICTED_INT(mode_usp45) + PREDICTED_INT(mode_m4a1) + PREDICTED_INT(mode_glock18) + PREDICTED_INT(mode_temp) - PREDICTED_INT(cs_shotmultiplier); - PREDICTED_FLOAT(cs_shottime); + PREDICTED_INT(cs_shotmultiplier) + PREDICTED_FLOAT(cs_shottime) - PREDICTED_FLOAT(anim_top); - PREDICTED_FLOAT(anim_top_time); - PREDICTED_FLOAT(anim_top_delay); - PREDICTED_FLOAT(anim_bottom); - PREDICTED_FLOAT(anim_bottom_time); + PREDICTED_FLOAT(anim_top) + PREDICTED_FLOAT(anim_top_time) + PREDICTED_FLOAT(anim_top_delay) + PREDICTED_FLOAT(anim_bottom) + PREDICTED_FLOAT(anim_bottom_time) virtual float(void) Physics_MaxSpeed; virtual void(float) Physics_Fall; virtual void(void) Physics_Jump; virtual void(void) Physics_InputPostMove; + virtual void UpdatePlayerAnimation(float); #ifdef CLIENT int playertype; @@ -93,9 +177,10 @@ class player:NSClientPlayer int cs_cross_deltadist; float cs_crosshairdistance; - virtual void(void) draw; - virtual float() predraw; - virtual void(void) postdraw; + //virtual void(void) draw; + //virtual float() predraw; + //virtual void(void) postdraw; + virtual void UpdatePlayerAttachments(bool); virtual void(float, float) ReceiveEntity; virtual void(void) PredictPreFrame; virtual void(void) PredictPostFrame; @@ -124,7 +209,100 @@ player::Physics_InputPostMove(void) } +void Animation_PlayerUpdate(player); +void Animation_TimerUpdate(player, float); + +void +player::UpdatePlayerAnimation(float timelength) +{ + /* calculate our skeletal progression */ + Animation_PlayerUpdate(this); + /* advance animation timers */ + Animation_TimerUpdate(this, timelength); +} + #ifdef CLIENT +.string oldmodel; +string Weapons_GetPlayermodel(player, int); + +void +player::UpdatePlayerAttachments(bool visible) +{ + /* draw the flashlight */ + if (gflags & GF_FLASHLIGHT) { + vector src; + vector ang; + + if (entnum != player_localentnum) { + src = origin + view_ofs; + ang = v_angle; + } else { + src = pSeat->m_vecPredictedOrigin + [0,0,-8]; + ang = view_angles; + } + + makevectors(ang); + traceline(src, src + (v_forward * 8096), MOVE_NORMAL, this); + + if (serverkeyfloat("*bspversion") == BSPVER_HL) { + dynamiclight_add(trace_endpos + (v_forward * -2), 128, [1,1,1]); + } else { + float p = dynamiclight_add(src, 512, [1,1,1], 0, "textures/flashlight"); + dynamiclight_set(p, LFIELD_ANGLES, ang); + dynamiclight_set(p, LFIELD_FLAGS, 3); + } + } + + /* FIXME: this needs to be incorporated and simplified, now that we can handle it all in-class */ + if (!visible) + return; + + /* what's the current weapon model supposed to be anyway? */ + p_model.oldmodel = Weapons_GetPlayermodel(this, activeweapon); + + /* we changed weapons, update skeletonindex */ + if (p_model.model != p_model.oldmodel) { + /* free memory */ + if (p_model.skeletonindex) + skel_delete(p_model.skeletonindex); + + /* set the new model and mark us updated */ + setmodel(p_model, p_model.oldmodel); + p_model.model = p_model.oldmodel; + + /* set the new skeletonindex */ + p_model.skeletonindex = skel_create(p_model.modelindex); + + /* hack this thing in here FIXME: this should be done when popping in/out of a pvs */ + if (autocvar(cl_himodels, 1, "Use high-quality thisayer models over lower-definition ones")) + setcustomskin(this, "", "geomset 0 2\n"); + else + setcustomskin(this, "", "geomset 0 1\n"); + } + + /* follow thisayer at all times */ + setorigin(p_model, origin); + p_model.angles = angles; + skel_build(p_model.skeletonindex, p_model, p_model.modelindex,0, 0, -1); + + /* we have to loop through all valid bones of the weapon model and match them + * to the thisayer one */ + for (float i = 0; i < g_pbones.length; i++) { + vector bpos; + float pbone = gettagindex(this, g_pbones[i]); + float wbone = gettagindex(p_model, g_pbones[i]); + + /* if the bone doesn't ignore in either skeletal mesh, ignore */ + if (wbone <= 0 || pbone <= 0) + continue; + + bpos = gettaginfo(this, pbone); + + /* the most expensive bit */ + skel_set_bone_world(p_model, wbone, bpos, v_forward, v_right, v_up); + } +} + void Weapons_AmmoUpdate(entity); void HUD_AmmoNotify_Check(player pl); /* @@ -206,52 +384,52 @@ player::PredictPreFrame(void) { NSClientPlayer::PredictPreFrame(); - SAVE_STATE(usp45_mag); - SAVE_STATE(glock18_mag); - SAVE_STATE(deagle_mag); - SAVE_STATE(p228_mag); - SAVE_STATE(elites_mag); - SAVE_STATE(fiveseven_mag); - SAVE_STATE(m3_mag); - SAVE_STATE(xm1014_mag); - SAVE_STATE(mp5_mag); - SAVE_STATE(p90_mag); - SAVE_STATE(ump45_mag); - SAVE_STATE(mac10_mag); - SAVE_STATE(tmp_mag); - SAVE_STATE(ak47_mag); - SAVE_STATE(sg552_mag); - SAVE_STATE(m4a1_mag); - SAVE_STATE(aug_mag); - SAVE_STATE(scout_mag); - SAVE_STATE(awp_mag); - SAVE_STATE(g3sg1_mag); - SAVE_STATE(sg550_mag); - SAVE_STATE(para_mag); - SAVE_STATE(ammo_50ae); - SAVE_STATE(ammo_762mm); - SAVE_STATE(ammo_556mm); - SAVE_STATE(ammo_556mmbox); - SAVE_STATE(ammo_338mag); - SAVE_STATE(ammo_9mm); - SAVE_STATE(ammo_buckshot); - SAVE_STATE(ammo_45acp); - SAVE_STATE(ammo_357sig); - SAVE_STATE(ammo_57mm); - SAVE_STATE(ammo_hegrenade); - SAVE_STATE(ammo_fbgrenade); - SAVE_STATE(ammo_smokegrenade); - SAVE_STATE(mode_usp45); - SAVE_STATE(mode_m4a1); - SAVE_STATE(mode_glock18); - SAVE_STATE(mode_temp); - SAVE_STATE(cs_shotmultiplier); - SAVE_STATE(cs_shottime); - SAVE_STATE(anim_top); - SAVE_STATE(anim_top_time); - SAVE_STATE(anim_top_delay); - SAVE_STATE(anim_bottom); - SAVE_STATE(anim_bottom_time); + SAVE_STATE(usp45_mag) + SAVE_STATE(glock18_mag) + SAVE_STATE(deagle_mag) + SAVE_STATE(p228_mag) + SAVE_STATE(elites_mag) + SAVE_STATE(fiveseven_mag) + SAVE_STATE(m3_mag) + SAVE_STATE(xm1014_mag) + SAVE_STATE(mp5_mag) + SAVE_STATE(p90_mag) + SAVE_STATE(ump45_mag) + SAVE_STATE(mac10_mag) + SAVE_STATE(tmp_mag) + SAVE_STATE(ak47_mag) + SAVE_STATE(sg552_mag) + SAVE_STATE(m4a1_mag) + SAVE_STATE(aug_mag) + SAVE_STATE(scout_mag) + SAVE_STATE(awp_mag) + SAVE_STATE(g3sg1_mag) + SAVE_STATE(sg550_mag) + SAVE_STATE(para_mag) + SAVE_STATE(ammo_50ae) + SAVE_STATE(ammo_762mm) + SAVE_STATE(ammo_556mm) + SAVE_STATE(ammo_556mmbox) + SAVE_STATE(ammo_338mag) + SAVE_STATE(ammo_9mm) + SAVE_STATE(ammo_buckshot) + SAVE_STATE(ammo_45acp) + SAVE_STATE(ammo_357sig) + SAVE_STATE(ammo_57mm) + SAVE_STATE(ammo_hegrenade) + SAVE_STATE(ammo_fbgrenade) + SAVE_STATE(ammo_smokegrenade) + SAVE_STATE(mode_usp45) + SAVE_STATE(mode_m4a1) + SAVE_STATE(mode_glock18) + SAVE_STATE(mode_temp) + SAVE_STATE(cs_shotmultiplier) + SAVE_STATE(cs_shottime) + SAVE_STATE(anim_top) + SAVE_STATE(anim_top_time) + SAVE_STATE(anim_top_delay) + SAVE_STATE(anim_bottom) + SAVE_STATE(anim_bottom_time) } /* @@ -266,52 +444,52 @@ player::PredictPostFrame(void) { NSClientPlayer::PredictPostFrame(); - ROLL_BACK(usp45_mag); - ROLL_BACK(glock18_mag); - ROLL_BACK(deagle_mag); - ROLL_BACK(p228_mag); - ROLL_BACK(elites_mag); - ROLL_BACK(fiveseven_mag); - ROLL_BACK(m3_mag); - ROLL_BACK(xm1014_mag); - ROLL_BACK(mp5_mag); - ROLL_BACK(p90_mag); - ROLL_BACK(ump45_mag); - ROLL_BACK(mac10_mag); - ROLL_BACK(tmp_mag); - ROLL_BACK(ak47_mag); - ROLL_BACK(sg552_mag); - ROLL_BACK(m4a1_mag); - ROLL_BACK(aug_mag); - ROLL_BACK(scout_mag); - ROLL_BACK(awp_mag); - ROLL_BACK(g3sg1_mag); - ROLL_BACK(sg550_mag); - ROLL_BACK(para_mag); - ROLL_BACK(ammo_50ae); - ROLL_BACK(ammo_762mm); - ROLL_BACK(ammo_556mm); - ROLL_BACK(ammo_556mmbox); - ROLL_BACK(ammo_338mag); - ROLL_BACK(ammo_9mm); - ROLL_BACK(ammo_buckshot); - ROLL_BACK(ammo_45acp); - ROLL_BACK(ammo_357sig); - ROLL_BACK(ammo_57mm); - ROLL_BACK(ammo_hegrenade); - ROLL_BACK(ammo_fbgrenade); - ROLL_BACK(ammo_smokegrenade); - ROLL_BACK(mode_usp45); - ROLL_BACK(mode_m4a1); - ROLL_BACK(mode_glock18); - ROLL_BACK(mode_temp); - ROLL_BACK(cs_shotmultiplier); - ROLL_BACK(cs_shottime); - ROLL_BACK(anim_top); - ROLL_BACK(anim_top_time); - ROLL_BACK(anim_top_delay); - ROLL_BACK(anim_bottom); - ROLL_BACK(anim_bottom_time); + ROLL_BACK(usp45_mag) + ROLL_BACK(glock18_mag) + ROLL_BACK(deagle_mag) + ROLL_BACK(p228_mag) + ROLL_BACK(elites_mag) + ROLL_BACK(fiveseven_mag) + ROLL_BACK(m3_mag) + ROLL_BACK(xm1014_mag) + ROLL_BACK(mp5_mag) + ROLL_BACK(p90_mag) + ROLL_BACK(ump45_mag) + ROLL_BACK(mac10_mag) + ROLL_BACK(tmp_mag) + ROLL_BACK(ak47_mag) + ROLL_BACK(sg552_mag) + ROLL_BACK(m4a1_mag) + ROLL_BACK(aug_mag) + ROLL_BACK(scout_mag) + ROLL_BACK(awp_mag) + ROLL_BACK(g3sg1_mag) + ROLL_BACK(sg550_mag) + ROLL_BACK(para_mag) + ROLL_BACK(ammo_50ae) + ROLL_BACK(ammo_762mm) + ROLL_BACK(ammo_556mm) + ROLL_BACK(ammo_556mmbox) + ROLL_BACK(ammo_338mag) + ROLL_BACK(ammo_9mm) + ROLL_BACK(ammo_buckshot) + ROLL_BACK(ammo_45acp) + ROLL_BACK(ammo_357sig) + ROLL_BACK(ammo_57mm) + ROLL_BACK(ammo_hegrenade) + ROLL_BACK(ammo_fbgrenade) + ROLL_BACK(ammo_smokegrenade) + ROLL_BACK(mode_usp45) + ROLL_BACK(mode_m4a1) + ROLL_BACK(mode_glock18) + ROLL_BACK(mode_temp) + ROLL_BACK(cs_shotmultiplier) + ROLL_BACK(cs_shottime) + ROLL_BACK(anim_top) + ROLL_BACK(anim_top_time) + ROLL_BACK(anim_top_delay) + ROLL_BACK(anim_bottom) + ROLL_BACK(anim_bottom_time) } #else