diff --git a/src/gs-entbase/server/basemonster.cpp b/src/gs-entbase/server/basemonster.cpp index 899a2c31..e6de6390 100644 --- a/src/gs-entbase/server/basemonster.cpp +++ b/src/gs-entbase/server/basemonster.cpp @@ -102,8 +102,32 @@ class CBaseMonster:CBaseEntity virtual void() CheckRoute; virtual void() WalkRoute; virtual void(vector) NewRoute; + + /* animation cycles */ + float m_flAnimTime; + virtual int() AnimIdle; + virtual int() AnimWalk; + virtual int() AnimRun; }; +int +CBaseMonster::AnimIdle(void) +{ + return 0; +} + +int +CBaseMonster::AnimWalk(void) +{ + return 0; +} + +int +CBaseMonster::AnimRun(void) +{ + return 0; +} + void CBaseMonster::Sound(string msg) { sound(this, CHAN_VOICE, msg, 1.0, ATTN_NORM); @@ -280,6 +304,13 @@ void CBaseMonster::NewRoute(vector destination) p.m_iNodes = numnodes; p.m_iCurNode = numnodes - 1; p.m_pRoute = nodelist; + + /* we can walk there directly */ + tracebox(p.origin, p.mins, p.maxs, dest, TRUE, this); + if (trace_fraction == 1.0) { + print("^2CBaseMonster::NewRoute^7: Walking directly to last node\n"); + p.m_iCurNode = -1; + } } ClearRoute(); @@ -309,6 +340,22 @@ void CBaseMonster::Physics(void) runstandardplayerphysics(this); movetype = MOVETYPE_NONE; IdleNoise(); + + if (style != MONSTER_DEAD) { + if (m_flAnimTime > time) { + input_movevalues = [0,0,0]; + } else { + float spvel = vlen(velocity); + + if (spvel < 5) { + frame = AnimIdle(); + } else if (spvel <= 140) { + frame = AnimWalk(); + } else if (spvel <= 240) { + frame = AnimRun(); + } + } + } } /* support for think/nextthink */ @@ -322,6 +369,10 @@ void CBaseMonster::Physics(void) void CBaseMonster::touch(void) { + if (movetype != MOVETYPE_WALK) { + return; + } + if (other.movetype == MOVETYPE_WALK) { velocity = normalize(other.origin - origin) * -128; } diff --git a/src/gs-entbase/server/basenpc.cpp b/src/gs-entbase/server/basenpc.cpp index 495e2d2c..43ac53f6 100644 --- a/src/gs-entbase/server/basenpc.cpp +++ b/src/gs-entbase/server/basenpc.cpp @@ -42,9 +42,6 @@ class CBaseNPC:CBaseMonster float m_flChangePath; float m_flTraceTime; - /* damage/combat related */ - float m_flPainTime; - /* sentences identifiers */ string m_talkAnswer; /* random answer to whenever a question is asked */ string m_talkAsk; /* asks a random generic question */ @@ -75,9 +72,6 @@ class CBaseNPC:CBaseMonster virtual void() FollowPlayer; virtual void() FollowChain; virtual void() Physics; - virtual int() AnimIdle; - virtual int() AnimWalk; - virtual int() AnimRun; virtual void() PlayerUse; virtual void() PanicFrame; virtual void() Hide; @@ -103,24 +97,6 @@ class CBaseNPC:CBaseMonster virtual void() TalkStopFollow; }; -int -CBaseNPC::AnimIdle(void) -{ - return 0; -} - -int -CBaseNPC::AnimWalk(void) -{ - return 0; -} - -int -CBaseNPC::AnimRun(void) -{ - return 0; -} - void CBaseNPC::WarnAllies(void) { @@ -490,7 +466,7 @@ CBaseNPC::Physics(void) } } - if (m_flPainTime > time) { + if (m_flAnimTime > time) { input_movevalues = [0,0,0]; } else { spvel = vlen(velocity); diff --git a/src/server/valve/monster_alien_grunt.cpp b/src/server/valve/monster_alien_grunt.cpp index b1b77d92..9ff11ea4 100644 --- a/src/server/valve/monster_alien_grunt.cpp +++ b/src/server/valve/monster_alien_grunt.cpp @@ -186,5 +186,6 @@ monster_alien_grunt::monster_alien_grunt(void) model = "models/agrunt.mdl"; base_mins = [-32,-32,0]; base_maxs = [32,32,64]; + base_health = Skill_GetValue("agrunt_health"); CBaseMonster::CBaseMonster(); } diff --git a/src/server/valve/monster_apache.cpp b/src/server/valve/monster_apache.cpp index 48075c48..6f4b45e6 100644 --- a/src/server/valve/monster_apache.cpp +++ b/src/server/valve/monster_apache.cpp @@ -41,5 +41,6 @@ void monster_apache::monster_apache(void) model = "models/apache.mdl"; base_mins = [-16,-16,0]; base_maxs = [16,16,72]; + base_health = Skill_GetValue("apache_health"); CBaseMonster::CBaseMonster(); } diff --git a/src/server/valve/monster_barney.cpp b/src/server/valve/monster_barney.cpp index 1d9b056b..86b591d3 100644 --- a/src/server/valve/monster_barney.cpp +++ b/src/server/valve/monster_barney.cpp @@ -100,7 +100,7 @@ monster_barney::Pain(int iHitBody) { WarnAllies(); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -113,7 +113,7 @@ monster_barney::Pain(int iHitBody) frame = BA_FLINCH_LA + floor(random(0, 5)); m_iFlags |= MONSTER_FEAR; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void @@ -176,7 +176,7 @@ monster_barney::monster_barney(void) model = "models/barney.mdl"; netname = "Barney"; - base_health = 50; + base_health = Skill_GetValue("barney_health"); base_mins = [-16,-16,0]; base_maxs = [16,16,72]; CBaseNPC::CBaseNPC(); diff --git a/src/server/valve/monster_bigmomma.cpp b/src/server/valve/monster_bigmomma.cpp index cab04a72..fdedab5a 100644 --- a/src/server/valve/monster_bigmomma.cpp +++ b/src/server/valve/monster_bigmomma.cpp @@ -92,7 +92,6 @@ string gon_sndstep[] = { class monster_bigmomma:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_bigmomma; @@ -125,7 +124,7 @@ monster_bigmomma::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -136,7 +135,7 @@ monster_bigmomma::Pain(int iHitBody) int rand = floor(random(0,gon_sndpain.length)); Sound(gon_sndpain[rand]); frame = GON_FLINCH; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_bullchicken.cpp b/src/server/valve/monster_bullchicken.cpp index e0adf14b..001ef972 100644 --- a/src/server/valve/monster_bullchicken.cpp +++ b/src/server/valve/monster_bullchicken.cpp @@ -94,16 +94,35 @@ string bull_sndpain[] = { class monster_bullchicken:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_bullchicken; virtual void(int) Death; virtual void(int) Pain; - virtual void(void) IdleNoise; - virtual void(void) Respawn; + virtual void() IdleNoise; + virtual int() AnimIdle; + virtual int() AnimWalk; + virtual int() AnimRun; }; +int +monster_bullchicken::AnimIdle(void) +{ + return BULL_IDLE; +} + +int +monster_bullchicken::AnimWalk(void) +{ + return BULL_WALK; +} + +int +monster_bullchicken::AnimRun(void) +{ + return BULL_RUN; +} + void monster_bullchicken::IdleNoise(void) { @@ -127,7 +146,7 @@ monster_bullchicken::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -138,7 +157,7 @@ monster_bullchicken::Pain(int iHitBody) int rand = floor(random(0,bull_sndpain.length)); Sound(bull_sndpain[rand]); frame = (random() < 0.5) ? BULL_FLINCH : BULL_FLINCH2; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void @@ -159,13 +178,6 @@ monster_bullchicken::Death(int iHitBody) CBaseMonster::Death(iHitBody); } -void -monster_bullchicken::Respawn(void) -{ - CBaseMonster::Respawn(); - frame = BULL_IDLE; -} - void monster_bullchicken::monster_bullchicken(void) { for (int i = 0; i time) { + if (m_flAnimTime > time) { return; } @@ -140,7 +139,7 @@ monster_gargantua::Pain(int iHitBody) int rand = floor(random(0,garg_sndpain.length)); Sound(garg_sndpain[rand]); frame = (random() < 0.5) ? GARG_FLINCH : GARG_FLINCH2; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_gman.cpp b/src/server/valve/monster_gman.cpp index ead9156b..3d8ce914 100644 --- a/src/server/valve/monster_gman.cpp +++ b/src/server/valve/monster_gman.cpp @@ -40,9 +40,31 @@ enum { class monster_gman:CBaseMonster { void() monster_gman; + virtual void() Respawn; + virtual int() AnimIdle; + virtual int() AnimWalk; + virtual int() AnimRun; }; +int +monster_gman::AnimIdle(void) +{ + return GMAN_IDLE; +} + +int +monster_gman::AnimWalk(void) +{ + return GMAN_WALK; +} + +int +monster_gman::AnimRun(void) +{ + return GMAN_WALK; +} + void monster_gman::Respawn(void) { /* he can't die, he's the G-Man! */ diff --git a/src/server/valve/monster_headcrab.cpp b/src/server/valve/monster_headcrab.cpp index 397dd82d..7fa7cc02 100644 --- a/src/server/valve/monster_headcrab.cpp +++ b/src/server/valve/monster_headcrab.cpp @@ -81,22 +81,41 @@ string hc_sndsee[] = { class monster_headcrab:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_headcrab; virtual void(int) Pain; virtual void(int) Death; virtual void(void) IdleNoise; - virtual void(void) Respawn; + virtual int() AnimIdle; + virtual int() AnimWalk; + virtual int() AnimRun; }; +int +monster_headcrab::AnimIdle(void) +{ + return HC_IDLE1; +} + +int +monster_headcrab::AnimWalk(void) +{ + return HC_WALK; +} + +int +monster_headcrab::AnimRun(void) +{ + return HC_RUN; +} + void monster_headcrab::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -107,7 +126,7 @@ monster_headcrab::Pain(int iHitBody) int rand = floor(random(0,hc_sndpain.length)); Sound(hc_sndpain[rand]); frame = HC_FLINCH; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void @@ -143,13 +162,6 @@ monster_headcrab::IdleNoise(void) Sound(hc_sndidle[rand]); } -void -monster_headcrab::Respawn(void) -{ - CBaseMonster::Respawn(); - frame = HC_IDLE1; -} - void monster_headcrab::monster_headcrab(void) { diff --git a/src/server/valve/monster_houndeye.cpp b/src/server/valve/monster_houndeye.cpp index 471c2ebf..783f5e83 100644 --- a/src/server/valve/monster_houndeye.cpp +++ b/src/server/valve/monster_houndeye.cpp @@ -95,7 +95,6 @@ string he_sndsee[] = { class monster_houndeye:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_houndeye; @@ -110,7 +109,7 @@ monster_houndeye::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -121,7 +120,7 @@ monster_houndeye::Pain(int iHitBody) int rand = floor(random(0,he_sndpain.length)); Sound(he_sndpain[rand]); frame = HE_FLINCH + floor(random(0, 2)); - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_human_grunt.cpp b/src/server/valve/monster_human_grunt.cpp index dc0c2433..9edb6fa5 100644 --- a/src/server/valve/monster_human_grunt.cpp +++ b/src/server/valve/monster_human_grunt.cpp @@ -125,7 +125,6 @@ string gr_sndpain[] = { class monster_human_grunt:CBaseNPC { float m_flIdleTime; - float m_flPainTime; void() monster_human_grunt; @@ -134,9 +133,29 @@ class monster_human_grunt:CBaseNPC virtual void() Respawn; virtual void(int) Pain; virtual void(int) Death; - + virtual int() AnimIdle; + virtual int() AnimWalk; + virtual int() AnimRun; }; +int +monster_human_grunt::AnimIdle(void) +{ + return GR_IDLE; +} + +int +monster_human_grunt::AnimWalk(void) +{ + return GR_WALK; +} + +int +monster_human_grunt::AnimRun(void) +{ + return GR_RUN; +} + void monster_human_grunt::Scream(void) { if (m_flIdleTime > time) { @@ -168,7 +187,7 @@ monster_human_grunt::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -179,7 +198,7 @@ monster_human_grunt::Pain(int iHitBody) int rand = floor(random(0,gr_sndpain.length)); Sound(gr_sndpain[rand]); frame = GR_FLINCH; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_ichthyosaur.cpp b/src/server/valve/monster_ichthyosaur.cpp index 3b70dee9..80c7a628 100644 --- a/src/server/valve/monster_ichthyosaur.cpp +++ b/src/server/valve/monster_ichthyosaur.cpp @@ -69,7 +69,6 @@ string ichy_sndsee[] = { class monster_ichthyosaur:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_ichthyosaur; @@ -84,7 +83,7 @@ monster_ichthyosaur::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -95,7 +94,7 @@ monster_ichthyosaur::Pain(int iHitBody) int rand = floor(random(0,ichy_sndpain.length)); Sound(ichy_sndpain[rand]); frame = ICHY_FLINCH + floor(random(0, 2)); - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_leech.cpp b/src/server/valve/monster_leech.cpp index 5e11f7c7..db7a19b3 100644 --- a/src/server/valve/monster_leech.cpp +++ b/src/server/valve/monster_leech.cpp @@ -45,7 +45,6 @@ string leech_sndsee[] = { class monster_leech:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_leech; diff --git a/src/server/valve/monster_nihilanth.cpp b/src/server/valve/monster_nihilanth.cpp index d5ce7869..17e8e180 100644 --- a/src/server/valve/monster_nihilanth.cpp +++ b/src/server/valve/monster_nihilanth.cpp @@ -77,7 +77,6 @@ string nil_sndrecharge[] = { class monster_nihilanth:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_nihilanth; @@ -110,7 +109,7 @@ monster_nihilanth::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -122,7 +121,7 @@ monster_nihilanth::Pain(int iHitBody) Sound(nil_sndpain[rand]); frame = (random() < 0.5) ? NIL_FLINCH : NIL_FLINCH2; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/server/valve/monster_scientist.cpp b/src/server/valve/monster_scientist.cpp index f5a7298f..d119fc09 100644 --- a/src/server/valve/monster_scientist.cpp +++ b/src/server/valve/monster_scientist.cpp @@ -133,7 +133,7 @@ monster_scientist::Pain(int iHitBody) { WarnAllies(); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -146,7 +146,7 @@ monster_scientist::Pain(int iHitBody) frame = SCIA_FLINCH + floor(random(0, 6)); m_iFlags |= MONSTER_FEAR; - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void @@ -228,6 +228,7 @@ monster_scientist::monster_scientist(void) model = "models/scientist.mdl"; base_mins = [-16,-16,0]; base_maxs = [16,16,72]; + base_health = Skill_GetValue("scientist_health"); /* has the body not been overriden, etc. choose a character for us */ if (body == -1) { diff --git a/src/server/valve/monster_sentry.cpp b/src/server/valve/monster_sentry.cpp index dd58fdea..0e526599 100644 --- a/src/server/valve/monster_sentry.cpp +++ b/src/server/valve/monster_sentry.cpp @@ -41,7 +41,6 @@ string sent_snddie[] = { class monster_sentry:CBaseMonster { - void() monster_sentry; virtual void(int) Death; diff --git a/src/server/valve/monster_zombie.cpp b/src/server/valve/monster_zombie.cpp index feb76840..cd3c4bb9 100644 --- a/src/server/valve/monster_zombie.cpp +++ b/src/server/valve/monster_zombie.cpp @@ -104,7 +104,6 @@ string zo_sndsee[] = { class monster_zombie:CBaseMonster { float m_flIdleTime; - float m_flPainTime; void() monster_zombie; @@ -119,7 +118,7 @@ monster_zombie::Pain(int iHitBody) { CBaseMonster::Pain(iHitBody); - if (m_flPainTime > time) { + if (m_flAnimTime > time) { return; } @@ -130,7 +129,7 @@ monster_zombie::Pain(int iHitBody) int rand = floor(random(0,zo_sndpain.length)); Sound(zo_sndpain[rand]); frame = ZO_FLINCH + floor(random(0, 2)); - m_flPainTime = time + 0.25f; + m_flAnimTime = time + 0.25f; } void diff --git a/src/shared/effects.c b/src/shared/effects.c index 1ce0f18d..3c76e6a1 100755 --- a/src/shared/effects.c +++ b/src/shared/effects.c @@ -366,8 +366,8 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float msg_entity = self; vector vWorldPos; - vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0])); - vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1])); + vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0])); + vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1])); vWorldPos[2] = vMins[2] + (0.5 * (vMaxs[2] - vMins[2])); multicast(vWorldPos, MULTICAST_PVS); #else @@ -376,8 +376,7 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float float fModelCount; vector vPos; string sModel = ""; - float fCount = 20; - + switch (fStyle) { case GSMATERIAL_GLASS: case GSMATERIAL_GLASS_UNBREAKABLE: @@ -416,8 +415,8 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float } vector vWorldPos; - vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0])); - vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1])); + vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0])); + vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1])); vWorldPos[2] = vMins[2] + (0.5 * (vMaxs[2] - vMins[2])); switch (fStyle) { @@ -443,7 +442,7 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float break; } - while (fCount > 0) { + for (int i = 0; i < count; i++) { entity eGib = spawn(); eGib.classname = "gib"; @@ -466,8 +465,7 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float if ((fStyle == GSMATERIAL_GLASS) || (fStyle == GSMATERIAL_GLASS_UNBREAKABLE)) { eGib.effects = EF_ADDITIVE; } - - fCount--; + eGib.drawmask = MASK_ENGINE; } #endif