Added taunts, visible on Quake 2 player models. Same wave X commands apply.

This commit is contained in:
Marco Cawthorne 2019-08-08 01:41:26 -07:00
parent 21c8c88ec8
commit a74f5242a4
5 changed files with 83 additions and 0 deletions

View file

@ -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;

View file

@ -25,6 +25,7 @@ enum {
EV_MODELGIB,
EV_CAMERATRIGGER,
EV_ORBITUARY,
EV_TAUNT,
EV_CHAT,
EV_CHAT_TEAM,
EV_CHAT_VOX,

View file

@ -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
}

View file

@ -3,6 +3,7 @@
#define QWSSQC
#define VALVE
#define SCIHUNT
#includelist
../builtins.h

View file

@ -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