From a74f5242a421e843be42ea4fb4dd7bfb9f05135e Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Thu, 8 Aug 2019 01:41:26 -0700 Subject: [PATCH] Added taunts, visible on Quake 2 player models. Same wave X commands apply. --- Source/client/entry.c | 12 ++++++++ Source/events.h | 1 + Source/server/client.c | 21 ++++++++++++++ Source/server/scihunt.src | 1 + Source/shared/valve/animations.c | 48 ++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) diff --git a/Source/client/entry.c b/Source/client/entry.c index 14b1245e..d098282d 100644 --- a/Source/client/entry.c +++ b/Source/client/entry.c @@ -39,6 +39,7 @@ void CSQC_Init(float apilevel, string enginename, float engineversion) registercommand("invprev"); registercommand("+showscores"); registercommand("-showscores"); + registercommand("wave"); registercommand("buildcubemaps"); precache_model("sprites/640_pain.spr"); @@ -412,6 +413,11 @@ void CSQC_Parse_Event(void) float fHeader = readbyte(); switch (fHeader) { + case EV_TAUNT: +#ifdef VALVE + Animation_Q2PlayerTaunt(); +#endif + break; case EV_FADE: Fade_Parse(); break; @@ -519,6 +525,12 @@ float CSQC_ConsoleCommand(string sCMD) tokenize(sCMD); switch (argv(0)) { + case "wave": + float numt = stof(argv(1)); + if (numt >= 0 && numt <= 4) { + sendevent("Taunt", "f", numt); + } + break; case "+zoomin": pSeat->iZoomed = TRUE; break; diff --git a/Source/events.h b/Source/events.h index b521fa48..db709259 100644 --- a/Source/events.h +++ b/Source/events.h @@ -25,6 +25,7 @@ enum { EV_MODELGIB, EV_CAMERATRIGGER, EV_ORBITUARY, + EV_TAUNT, EV_CHAT, EV_CHAT_TEAM, EV_CHAT_VOX, diff --git a/Source/server/client.c b/Source/server/client.c index 15156d29..1d87563d 100644 --- a/Source/server/client.c +++ b/Source/server/client.c @@ -20,3 +20,24 @@ void Client_TriggerCamera(entity target, vector pos, vector end, float wait) msg_entity = target; multicast([0,0,0], MULTICAST_ONE); } + +void CSEv_Taunt_f(float num) +{ + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_TAUNT); + WriteEntity(MSG_MULTICAST, self); + WriteByte(MSG_MULTICAST, num); + msg_entity = self; + multicast(self.origin, MULTICAST_PVS); + +#ifdef SCIHUNT + for (entity b = world; (b = find(b, ::classname, "monster_scientist"));) { + if (vlen(b.origin - self.origin) < 256) { + monster_scientist sci = (monster_scientist)b; + sci.m_iFlags |= SCIF_FEAR | SCIF_SEEN; + sci.m_eUser = world; + sci.m_eRescuer = world; + } + } +#endif +} \ No newline at end of file diff --git a/Source/server/scihunt.src b/Source/server/scihunt.src index c0bb7df9..cef5c1a4 100755 --- a/Source/server/scihunt.src +++ b/Source/server/scihunt.src @@ -3,6 +3,7 @@ #define QWSSQC #define VALVE +#define SCIHUNT #includelist ../builtins.h diff --git a/Source/shared/valve/animations.c b/Source/shared/valve/animations.c index 76c0c139..e42dc3e0 100755 --- a/Source/shared/valve/animations.c +++ b/Source/shared/valve/animations.c @@ -14,6 +14,7 @@ #ifdef CSQC .float frame_last; .float baseframe_last; +.float q2frameoverride; #else .float subblendfrac; .float subblend2frac; @@ -27,6 +28,41 @@ void Animation_Print( string sWow ) { #endif } +int Animation_Q2PlayerUpdate_Taunt(void) +{ +#ifdef CSQC + if (!self.q2frameoverride) { + return 0; + } + + /* Interpolation */ + self.lerpfrac -= clframetime * 10; + if (self.lerpfrac < 0.0) { + self.lerpfrac = 0.0f; + } + if (self.frame_time > cltime) { + return 1; + } + + /* Next animationf rame inbound, reset interpolation */ + self.frame2 = self.frame; + self.lerpfrac = 1.0f; + + /* Either advance frame (if we're in framgroup) or start new one */ + if (self.frame >= q2_anims[self.q2frameoverride].start && self.frame < q2_anims[self.q2frameoverride].end) { + self.frame += 1; + } else if (self.frame == q2_anims[self.q2frameoverride].end) { + self.q2frameoverride = 0; + } else { + self.frame = q2_anims[self.q2frameoverride].start; + } + + /* Q2 runs at 10 Hz */ + self.frame_time = cltime + 0.1f; +#endif + return 1; +} + void Animation_Q2PlayerUpdate_Run(int id) { #ifdef CSQC @@ -58,6 +94,9 @@ void Animation_Q2PlayerUpdate_Run(int id) void Animation_Q2PlayerUpdate(void) { + if (Animation_Q2PlayerUpdate_Taunt() == 1) { + return; + } if ( !( self.flags & FL_ONGROUND ) ) { Animation_Q2PlayerUpdate_Run(Q2ANIM_JUMP); } else if ( vlen( self.velocity ) == 0 ) { @@ -75,6 +114,15 @@ void Animation_Q2PlayerUpdate(void) } } +#ifdef CSQC +void Animation_Q2PlayerTaunt(void) +{ + entity boo = findfloat( world, entnum, readentitynum() ); + boo.q2frameoverride = Q2ANIM_FLIP + readbyte(); + print( sprintf("Taunt %d %s!\n", boo.q2frameoverride, boo.model)); +} +#endif + /* ================= Animation_PlayerUpdate