Moved Death and Pain methods into CBaseEntity.

This commit is contained in:
Marco Cawthorne 2020-03-25 22:35:05 +01:00
parent b70b0cd6f9
commit 2bb8bd00cf
65 changed files with 355 additions and 361 deletions

View file

@ -72,6 +72,8 @@ class CBaseEntity
virtual void() RendermodeUpdate;
virtual void() ParentUpdate;
virtual float(entity, float) SendEntity;
virtual void(int iHitBody) Pain;
virtual void(int iHitBody) Death;
};
/* Make sure StartFrame calls this */
@ -128,6 +130,16 @@ float CBaseEntity::SendEntity(entity ePEnt, float fChanged)
return TRUE;
}
void CBaseEntity::Pain(int body)
{
}
void CBaseEntity::Death(int body)
{
}
/* Make sure StartFrame calls this */
void CBaseEntity::ParentUpdate(void)
{

View file

@ -14,12 +14,23 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
enum {
MONSTER_IDLE,
MONSTER_WALK,
MONSTER_RUN,
MONSTER_DEAD
};
class CBaseMonster:CBaseEntity
{
int body;
int oldnet_body;
vector oldnet_velocity;
float m_flPitch;
int m_iFlags;
vector base_mins;
vector base_maxs;
int base_health;
void() CBaseMonster;
@ -27,9 +38,10 @@ class CBaseMonster:CBaseEntity
virtual void() Hide;
virtual void() Respawn;
virtual void() PlayerUse;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Physics;
virtual void() IdleNoise;
virtual void() Gib;
virtual void(string) Speak;
virtual float(entity, float) SendEntity;
@ -93,6 +105,11 @@ void CBaseMonster::Gib(void)
Hide();
}
void CBaseMonster::IdleNoise(void)
{
}
void CBaseMonster::Physics(void)
{
input_movevalues = [0,0,0];
@ -105,6 +122,8 @@ void CBaseMonster::Physics(void)
runstandardplayerphysics(this);
movetype = MOVETYPE_NONE;
IdleNoise();
}
void CBaseMonster::touch(void)
@ -157,21 +176,27 @@ void CBaseMonster::ParentUpdate(void)
oldnet_body = body;
}
void CBaseMonster::vPain(int iHitBody)
void CBaseMonster::Pain(int iHitBody)
{
}
void CBaseMonster::vDeath(int iHitBody)
void CBaseMonster::Death(int iHitBody)
{
customphysics = __NULL__;
m_iFlags = 0x0;
if (health < -50) {
Gib();
return;
}
/* make sure we're not causing any more obituaries */
flags &= ~FL_MONSTER;
/* gibbing action */
movetype = MOVETYPE_NONE;
solid = SOLID_CORPSE;
style = MONSTER_DEAD;
}
void CBaseMonster::Hide(void)
@ -184,22 +209,26 @@ void CBaseMonster::Hide(void)
void CBaseMonster::Respawn(void)
{
flags |= FL_MONSTER;
setorigin(this, m_oldOrigin);
v_angle[0] = Math_FixDelta(m_oldAngle[0]);
v_angle[1] = Math_FixDelta(m_oldAngle[1]);
v_angle[2] = Math_FixDelta(m_oldAngle[2]);
angles = v_angle;
solid = SOLID_SLIDEBOX;
movetype = MOVETYPE_NONE;
setmodel(this, m_oldModel);
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
movetype = MOVETYPE_WALK;
takedamage = DAMAGE_YES;
iBleeds = TRUE;
customphysics = Physics;
health = 100;
velocity = [0,0,0];
m_iFlags = 0x0;
SendFlags = 0xff;
style = MONSTER_IDLE;
health = base_health;
setmodel(this, m_oldModel);
setsize(this, base_mins, base_maxs);
setorigin(this, m_oldOrigin);
}
void CBaseMonster::CBaseMonster(void)
{
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
}

View file

@ -18,7 +18,7 @@ class CBasePhysics:CBaseEntity
virtual void() Respawn;
virtual void() touch;
virtual void() TouchThink;
virtual void(entity, int, int) vPain;
virtual void(int) Pain;
};
void CBasePhysics::TouchThink(void)
@ -63,11 +63,11 @@ void CBasePhysics::touch(void)
#endif
}
void CBasePhysics::vPain(entity eAttacker, int iType, int iDamage)
void CBasePhysics::Pain(int body)
{
#ifdef GS_BULLET_PHYSICS
makevectors(vectoangles(origin - trace_endpos));
physics_addforce(this, v_forward * iDamage, trace_endpos);
physics_addforce(this, v_forward * 20, trace_endpos);
health = 100000;
physics_enable(this, TRUE);
#endif

View file

@ -30,10 +30,10 @@ class cycler:CBaseTrigger
{
void() cycler;
virtual void() Respawn;
virtual void(entity, int, int) vPain;
virtual void(int) Pain;
};
void cycler::vPain(entity attacker, int type, int damage)
void cycler::Pain(int body)
{
if (frame >= modelframecount(modelindex)) {
frame = 0;

View file

@ -85,11 +85,11 @@ class func_breakable:CBaseTrigger
virtual void() Trigger;
virtual void() PlayerTouch;
/*virtual void() PressureDeath;*/
virtual void(entity eAttacker, int iType, int iDamage) vPain;
virtual void(entity eAttacker, int iType, int iDamage) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
};
void func_breakable::vPain (entity attacker, int type, int damage)
void func_breakable::Pain (int body)
{
if (spawnflags & SF_TRIGGER) {
return;
@ -139,13 +139,13 @@ void func_breakable::Explode(void)
CBaseEntity::Hide();
}
void func_breakable::vDeath (entity attacker, int type, int damage)
void func_breakable::Death(int body)
{
if (m_iMaterial == BREAKMT_GLASS_UNBREAKABLE) {
return;
}
health = 0;
eActivator = attacker;
eActivator = g_eAttacker;
/* This may seem totally absurd. That's because it is. It's very
* unreliable but exploding breakables in close proximity it WILL cause
@ -165,12 +165,12 @@ void func_breakable::vDeath (entity attacker, int type, int damage)
void func_breakable::Trigger(void)
{
func_breakable::vDeath(world, 0, 0);
func_breakable::Death(0);
}
/*void func_breakable::PressureDeath(void)
{
func_breakable::vDeath(m_pressAttacker, m_pressType, m_pressDamage);
func_breakable::Death(m_pressAttacker, m_pressType, m_pressDamage);
}*/
void func_breakable::PlayerTouch(void)

View file

@ -68,11 +68,11 @@ class func_button:CBaseTrigger
virtual void() Blocked;
virtual void() Trigger;
virtual void() Use;
virtual void(entity eAttacker, int iType, int iDamage) vPain;
virtual void(entity eAttacker, int iType, int iDamage) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() SetMovementDirection;
virtual void(vector vdest, void() func) MoveToDestination;
virtual void(vector, void()) MoveToDestination;
virtual void() MoveToDestination_End;
};
@ -254,12 +254,12 @@ void func_button::Use(void)
Trigger();
}
void func_button::vPain (entity attacker, int type, int damage)
void func_button::Pain (int body)
{
Trigger();
}
void func_button::vDeath (entity attacker, int type, int damage)
void func_button::Death (int body)
{
Trigger();
}

View file

@ -306,7 +306,7 @@ void func_door_rotating::Respawn(void)
#ifdef GS_BULLET_PHYSICS
takedamage = DAMAGE_YES;
health = 100;
vDeath = func_door_rotating::Unhinge;
Death = func_door_rotating::Unhinge;
#endif
solid = SOLID_BSP;

View file

@ -38,7 +38,7 @@ class func_guntarget:CBaseTrigger
virtual void() Move;
virtual void() Stop;
virtual void() Trigger;
virtual void(int) vDeath;
virtual void(int) Death;
virtual int() GetValue;
};
@ -103,7 +103,7 @@ void func_guntarget::NextPath(void)
}
}
void func_guntarget::vDeath(int iHitBody)
void func_guntarget::Death(int iHitBody)
{
entity a;
Stop();

View file

@ -141,8 +141,8 @@ void Game_PutClientInServer(void)
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_WALK;
self.flags = FL_CLIENT;
self.vPain = Player_Pain;
self.vDeath = Player_Death;
self.Pain = Player_Pain;
self.Death = Player_Death;
self.iBleeds = TRUE;
self.pvsflags = PVSF_IGNOREPVS;
self.fSlotGrenade = 0;

View file

@ -191,9 +191,9 @@ void Damage_Apply(entity eTarget, entity eAttacker, float iDamage, vector vHitPo
if (self.health <= 0) {
self.health = 0;
self.vDeath(trace_surface_id);
self.Death(trace_surface_id);
} else {
self.vPain(trace_surface_id);
self.Pain(trace_surface_id);
}
self = eOld;

View file

@ -87,8 +87,8 @@ class hostage_entity:CBaseEntity
virtual void() Hide;
virtual void() Respawn;
virtual void() PlayerUse;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Physics;
};
@ -198,13 +198,13 @@ void hostage_entity::PlayerUse(void)
}
}
void hostage_entity::vPain(int iHitBody)
void hostage_entity::Pain(int iHitBody)
{
frame = HOSA_FLINCH + floor(random(0, 5));
//m_iScared = TRUE;
}
void hostage_entity::vDeath(int iHitBody)
void hostage_entity::Death(int iHitBody)
{
solid = SOLID_NOT;
takedamage = DAMAGE_NO;

View file

@ -91,8 +91,8 @@ void Spawn_RespawnClient(float fTeam)
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_WALK;
self.flags = FL_CLIENT;
self.vPain = Player_Pain;
self.vDeath = Player_Death;
self.Pain = Player_Pain;
self.Death = Player_Death;
self.iBleeds = TRUE;
self.fSlotC4Bomb = 0; // Clear the C4
self.viewzoom = 1.0; // Clear scopes

View file

@ -37,8 +37,6 @@ entity g_eAttacker;
/* Generic entity fields */
.void() PlayerUse;
.int iBleeds;
.void(int iHitBody) vPain;
.void(int iHitBody) vDeath;
.entity eUser;
.float material;
.float armor;

View file

@ -19,9 +19,42 @@
../logging.c
../nodes.c
../../gs-entbase/server.src
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
../valve/monster_alien_slave.cpp
../valve/monster_babycrab.cpp
../valve/monster_barnacle.cpp
../valve/monster_barney.cpp
../valve/monster_barney_dead.cpp
../valve/monster_bigmomma.cpp
../valve/monster_bloater.cpp
../valve/monster_bullchicken.cpp
../valve/monster_cockroach.cpp
../valve/monster_flyer_flock.cpp
../valve/monster_gargantua.cpp
../valve/monster_gman.cpp
../valve/monster_headcrab.cpp
../valve/monster_hevsuit_dead.cpp
../valve/monster_houndeye.cpp
../valve/monster_human_grunt.cpp
../valve/monster_hgrunt_dead.cpp
../valve/monster_human_assassin.cpp
../valve/monster_ichthyosaur.cpp
../valve/monster_leech.cpp
../valve/monster_miniturret.cpp
../valve/monster_nihilanth.cpp
../valve/monster_osprey.cpp
../valve/monster_rat.cpp
../valve/monster_scientist.cpp
../valve/monster_scientist_dead.cpp
../valve/monster_sitting_scientist.cpp
../valve/monster_scientist.cpp
../valve/monster_sentry.cpp
../valve/monster_tentacle.cpp
../valve/monster_turret.cpp
../valve/monster_zombie.cpp
../../shared/decals.c
../../shared/effects.c
../../shared/spraylogo.cpp

View file

@ -238,8 +238,8 @@ Game_PutClientInServer(void)
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.vPain = Player_Pain;
pl.vDeath = Player_Death;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));

View file

@ -238,8 +238,8 @@ Game_PutClientInServer(void)
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.vPain = Player_Pain;
pl.vDeath = Player_Death;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));

View file

@ -195,8 +195,8 @@ void Game_PutClientInServer(void)
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.vPain = Player_Pain;
pl.vDeath = Player_Death;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));

View file

@ -59,7 +59,7 @@ void Game_Input(void)
// Respawn all the entities
for (entity a = world; (a = find(a, classname, "func_breakable"));) {
func_breakable caw = (func_breakable)a;
caw.vDeath(world, 0, 0);
caw.Death(0);
}
bprint(PRINT_HIGH, "BREAK EVERYTHING!\n");
}

View file

@ -317,8 +317,8 @@ class monster_scientist:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void() PlayerUse;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Physics;
virtual void() Scream;
virtual void() WarnOthers;
@ -548,7 +548,7 @@ void monster_scientist::PlayerUse(void)
}
}
void monster_scientist::vPain(int iHitBody)
void monster_scientist::Pain(int iHitBody)
{
WarnOthers();
@ -570,7 +570,7 @@ void monster_scientist::vPain(int iHitBody)
m_flPainTime = time + 0.25f;
}
void monster_scientist::vDeath(int iHitBody)
void monster_scientist::Death(int iHitBody)
{
int r;
r = floor(random(0,sci_snddie.length));

View file

@ -83,8 +83,8 @@ CSEv_TeamJoin_f(float f)
pl.armor = pl.activeweapon = pl.g_items = 0;
pl.customphysics = Empty;
pl.vPain = Player_Pain;
pl.vDeath = Player_Death;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));

View file

@ -311,8 +311,8 @@ Game_PutClientInServer(void)
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.vPain = Player_Pain;
pl.vDeath = Player_Death;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));

View file

@ -88,19 +88,16 @@ Damage_Apply(entity t, entity c, float dmg, int w, int type)
/* set this global in case we need it later */
g_eAttacker = c;
entity eOld = self;
self = t;
CBaseEntity s = (CBaseEntity)t;
if (self.health <= 0) {
if (s.health <= 0) {
if (t.flags & FL_MONSTER || t.flags & FL_CLIENT) {
Damage_Obituary(c, t, w, 0);
}
self.vDeath(trace_surface_id);
s.Death(trace_surface_id);
} else {
self.vPain(trace_surface_id);
s.Pain(trace_surface_id);
}
self = eOld;
}
/* physical check of whether or not we can trace important parts of an ent */

View file

@ -29,5 +29,7 @@ void monster_alien_controller::monster_alien_controller(void)
{
netname = "Alien Controller";
model = "models/controller.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Alien Grunt
class monster_alien_grunt:CBaseMonster
{
void() monster_alien_grunt;
virtual void() Respawn;
};
void monster_alien_grunt::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-32,-32,0], [32,32,64]);
}
void monster_alien_grunt::monster_alien_grunt(void)
{
netname = "Alien Grunt";
model = "models/agrunt.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
CBaseMonster::CBaseMonster();
}

View file

@ -29,5 +29,7 @@ void monster_alien_slave::monster_alien_slave(void)
{
netname = "Alien Slave";
model = "models/islave.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -39,5 +39,7 @@ void monster_apache::monster_apache(void)
{
netname = "Apache";
model = "models/apache.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Baby Headcrab
class monster_babycrab:CBaseMonster
{
void() monster_babycrab;
virtual void() Respawn;
};
void monster_babycrab::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,0], [16,16,36]);
}
void monster_babycrab::monster_babycrab(void)
{
netname = "Baby Headcrab";
model = "models/baby_headcrab.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,36];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Barnacle
class monster_barnacle:CBaseMonster
{
void() monster_barnacle;
virtual void() Respawn;
};
void monster_barnacle::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,-36], [16,16,0]);
}
void monster_barnacle::monster_barnacle(void)
{
netname = "Barnacle";
model = "models/barnacle.mdl";
base_mins = [-16,-16,-36];
base_maxs = [16,16,0];
CBaseMonster::CBaseMonster();
}

View file

@ -134,8 +134,8 @@ class monster_barney:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void() PlayerUse;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Physics;
virtual void() Scream;
virtual void() WarnOthers;
@ -361,7 +361,7 @@ void monster_barney::PlayerUse(void)
}
}
void monster_barney::vPain(int iHitBody)
void monster_barney::Pain(int iHitBody)
{
WarnOthers();
@ -383,7 +383,7 @@ void monster_barney::vPain(int iHitBody)
m_flPainTime = time + 0.25f;
}
void monster_barney::vDeath(int iHitBody)
void monster_barney::Death(int iHitBody)
{
int r;
r = floor(random(0,barney_snddie.length));

View file

@ -27,8 +27,6 @@ class monster_barney_dead:CBaseEntity
virtual void() Hide;
virtual void() Respawn;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void() Gib;
};
@ -39,19 +37,6 @@ void monster_barney_dead::Gib(void)
Hide();
}
void monster_barney_dead::vPain(int iHitBody)
{
}
void monster_barney_dead::vDeath(int iHitBody)
{
if (health < -50) {
Gib();
return;
}
}
void monster_barney_dead::Hide(void)
{
setmodel(this, "");
@ -81,7 +66,7 @@ void monster_barney_dead::Respawn(void)
void monster_barney_dead::monster_barney_dead(void)
{
model = "models/barney.mdl";
for (int i = 1; i < (tokenize(__fullspawndata)-1); i += 2) {
switch (argv(i)) {
case "pose":
@ -90,7 +75,7 @@ void monster_barney_dead::monster_barney_dead(void)
break;
}
}
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
Respawn();

View file

@ -23,18 +23,13 @@ Gonarch
class monster_bigmomma:CBaseMonster
{
void() monster_bigmomma;
virtual void() Respawn;
};
void monster_bigmomma::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-95,-95,0], [95,95,190]);
}
void monster_bigmomma::monster_bigmomma(void)
{
netname = "Gonarch";
model = "models/big_mom.mdl";
base_mins = [-95,-95,0];
base_maxs = [95,95,190];
CBaseMonster::CBaseMonster();
}

View file

@ -29,5 +29,7 @@ void monster_bloater::monster_bloater(void)
{
netname = "Floater";
model = "models/floater.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Bullsquid
class monster_bullchicken:CBaseMonster
{
void() monster_bullchicken;
virtual void() Respawn;
};
void monster_bullchicken::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-32,-32,0], [32,32,64]);
}
void monster_bullchicken::monster_bullchicken(void)
{
netname = "Bullsquid";
model = "models/bullsquid.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Cockroach
class monster_cockroach:CBaseMonster
{
void() monster_cockroach;
virtual void() Respawn;
};
void monster_cockroach::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-1,-1,0], [1,1,1]);
}
void monster_cockroach::monster_cockroach(void)
{
netname = "Cockroach";
model = "models/roach.mdl";
base_mins = [-1,-1,0];
base_maxs = [1,1,1];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Boid
class monster_flyer_flock:CBaseMonster
{
void() monster_flyer_flock;
virtual void() Respawn;
};
void monster_flyer_flock::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,0], [16,16,16]);
}
void monster_flyer_flock::monster_flyer_flock(void)
{
netname = "Boid";
model = "models/aflock.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,16];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Gargantua
class monster_gargantua:CBaseMonster
{
void() monster_gargantua;
virtual void() Respawn;
};
void monster_gargantua::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-32,-32,0], [32,32,128]);
}
void monster_gargantua::monster_gargantua(void)
{
netname = "Gargantua";
model = "models/garg.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,128];
CBaseMonster::CBaseMonster();
}

View file

@ -29,7 +29,6 @@ class monster_gman:CBaseMonster
void monster_gman::Respawn(void)
{
CBaseMonster::Respawn();
movetype = MOVETYPE_NONE;
takedamage = DAMAGE_NO;
iBleeds = FALSE;
}
@ -38,5 +37,7 @@ void monster_gman::monster_gman(void)
{
netname = "G-Man";
model = "models/gman.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Headcrab
class monster_headcrab:CBaseMonster
{
void() monster_headcrab;
virtual void() Respawn;
};
void monster_headcrab::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,0], [16,16,36]);
}
void monster_headcrab::monster_headcrab(void)
{
netname = "Headcrab";
model = "models/headcrab.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,36];
CBaseMonster::CBaseMonster();
}

View file

@ -27,8 +27,6 @@ class monster_hevsuit_dead:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void() Gib;
};
@ -39,19 +37,6 @@ void monster_hevsuit_dead::Gib(void)
Hide();
}
void monster_hevsuit_dead::vPain(int iHitBody)
{
}
void monster_hevsuit_dead::vDeath(int iHitBody)
{
if (health < -50) {
Gib();
return;
}
}
void monster_hevsuit_dead::Hide(void)
{
setmodel(this, "");

View file

@ -27,8 +27,6 @@ class monster_hgrunt_dead:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void() Gib;
};
@ -39,19 +37,6 @@ void monster_hgrunt_dead::Gib(void)
Hide();
}
void monster_hgrunt_dead::vPain(int iHitBody)
{
}
void monster_hgrunt_dead::vDeath(int iHitBody)
{
if (health < -50) {
Gib();
return;
}
}
void monster_hgrunt_dead::Hide(void)
{
setmodel(this, "");

View file

@ -23,18 +23,13 @@ Houndeye
class monster_houndeye:CBaseMonster
{
void() monster_houndeye;
virtual void() Respawn;
};
void monster_houndeye::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,0], [16,16,36]);
}
void monster_houndeye::monster_houndeye(void)
{
netname = "Houndeye";
model = "models/houndeye.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,36];
CBaseMonster::CBaseMonster();
}

View file

@ -29,5 +29,7 @@ void monster_human_assassin::monster_human_assassin(void)
{
netname = "Assassin";
model = "models/hassassin.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -29,5 +29,7 @@ void monster_human_grunt::monster_human_grunt(void)
{
netname = "Grunt";
model = "models/hgrunt.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Ichthyosaur
class monster_ichthyosaur:CBaseMonster
{
void() monster_ichthyosaur;
virtual void() Respawn;
};
void monster_ichthyosaur::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-32,-32,0], [32,32,64]);
}
void monster_ichthyosaur::monster_ichthyosaur(void)
{
netname = "Ichthyosaur";
model = "models/icky.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Leech
class monster_leech:CBaseMonster
{
void() monster_leech;
virtual void() Respawn;
};
void monster_leech::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-6,-6,0], [6,6,6]);
}
void monster_leech::monster_leech(void)
{
netname = "Leech";
model = "models/leech.mdl";
base_mins = [-6,-6,0];
base_maxs = [6,6,6];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Automatic Turret (small)
class monster_miniturret:CBaseMonster
{
void() monster_miniturret;
virtual void() Respawn;
};
void monster_miniturret::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-16,-16,-32], [16,16,32]);
}
void monster_miniturret::monster_miniturret(void)
{
netname = "Mini-Turret";
model = "models/miniturret.mdl";
base_mins = [-16,-16,-32];
base_maxs = [16,16,32];
CBaseMonster::CBaseMonster();
}

View file

@ -23,18 +23,13 @@ Nihilanth
class monster_nihilanth:CBaseMonster
{
void() monster_nihilanth;
virtual void() Respawn;
};
void monster_nihilanth::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-192,-192,-32], [192,192,384]);
}
void monster_nihilanth::monster_nihilanth(void)
{
netname = "Nihilanth";
model = "models/nihilanth.mdl";
base_mins = [-192,-192,-32];
base_maxs = [192,192,384];
CBaseMonster::CBaseMonster();
}

View file

@ -29,15 +29,15 @@ class monster_osprey:CBaseMonster
void monster_osprey::Respawn(void)
{
CBaseMonster::Respawn();
movetype = MOVETYPE_NONE;
takedamage = DAMAGE_NO;
iBleeds = FALSE;
setsize(this, [-480,-480,-112], [480,480,24]);
}
void monster_osprey::monster_osprey(void)
{
netname = "Osprey";
model = "models/osprey.mdl";
base_mins = [-480,-480,-112];
base_maxs = [480,480,24];
CBaseMonster::CBaseMonster();
}

View file

@ -20,25 +20,16 @@ Rat
*/
class monster_rat:CBaseEntity
class monster_rat:CBaseMonster
{
void() monster_rat;
virtual void() Respawn;
};
void monster_rat::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-6,-6,-0], [6,6,6]);
}
void monster_rat::monster_rat(void)
{
netname = "Rat";
CBaseEntity::CBaseEntity();
precache_model("models/bigrat.mdl");
solid = SOLID_SLIDEBOX;
movetype = MOVETYPE_WALK;
setmodel(this, "models/bigrat.mdl");
setorigin(this, origin);
model = "models/bigrat.mdl";
base_mins = [-6,-6,-0];
base_maxs = [6,6,6];
CBaseMonster::CBaseMonster();
}

View file

@ -21,10 +21,10 @@ Scientist
*/
enum {
SCI_IDLE,
SCI_WALK,
SCI_RUN,
SCI_DEAD
MONSTER_IDLE,
MONSTER_WALK,
MONSTER_RUN,
MONSTER_DEAD
};
enum {
@ -320,8 +320,8 @@ class monster_scientist:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void() PlayerUse;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Physics;
virtual void() Scream;
virtual void() WarnOthers;
@ -371,7 +371,7 @@ void monster_scientist::Physics(void)
input_impulse = 0;
input_buttons = 0;
if (style != SCI_DEAD) {
if (style != MONSTER_DEAD) {
if (!(m_iFlags & SCIF_SEEN)) {
for (entity b = world; (b = find(b, ::classname, "player"));) {
/* Find players in a 256 unit radius */
@ -551,7 +551,7 @@ void monster_scientist::PlayerUse(void)
}
}
void monster_scientist::vPain(int iHitBody)
void monster_scientist::Pain(int iHitBody)
{
WarnOthers();
@ -573,7 +573,7 @@ void monster_scientist::vPain(int iHitBody)
m_flPainTime = time + 0.25f;
}
void monster_scientist::vDeath(int iHitBody)
void monster_scientist::Death(int iHitBody)
{
int r;
r = floor(random(0,sci_snddie.length));
@ -598,9 +598,9 @@ void monster_scientist::vDeath(int iHitBody)
solid = SOLID_CORPSE;
//takedamage = DAMAGE_NO;
if (style != SCI_DEAD) {
if (style != MONSTER_DEAD) {
frame = SCIA_DIE_SIMPLE + floor(random(0, 6));
style = SCI_DEAD;
style = MONSTER_DEAD;
}
}
@ -629,7 +629,7 @@ void monster_scientist::Respawn(void)
m_eUser = world;
takedamage = DAMAGE_YES;
iBleeds = TRUE;
style = SCI_IDLE;
style = MONSTER_IDLE;
customphysics = Physics;
frame = SCIA_IDLE1;
SendFlags |= NPC_FRAME;

View file

@ -37,8 +37,6 @@ class monster_scientist_dead:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void() Gib;
};
@ -49,19 +47,6 @@ void monster_scientist_dead::Gib(void)
Hide();
}
void monster_scientist_dead::vPain(int iHitBody)
{
}
void monster_scientist_dead::vDeath(int iHitBody)
{
if (health < -50) {
Gib();
return;
}
}
void monster_scientist_dead::Hide(void)
{
setmodel(this, "");

View file

@ -29,5 +29,7 @@ void monster_sentry::monster_sentry(void)
{
netname = "Sentry";
model = "models/sentry.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -37,8 +37,8 @@ class monster_sitting_scientist:CBaseMonster
virtual void() Hide;
virtual void() Respawn;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void() Gib;
};
@ -49,12 +49,12 @@ void monster_sitting_scientist::Gib(void)
Hide();
}
void monster_sitting_scientist::vPain(int iHitBody)
void monster_sitting_scientist::Pain(int iHitBody)
{
}
void monster_sitting_scientist::vDeath(int iHitBody)
void monster_sitting_scientist::Death(int iHitBody)
{
if (health < -50) {
Gib();

View file

@ -23,18 +23,13 @@ Tentacle
class monster_tentacle:CBaseMonster
{
void() monster_tentacle;
virtual void() Respawn;
};
void monster_tentacle::Respawn(void)
{
CBaseMonster::Respawn();
setsize(this, [-32,-32,0], [32,32,64]);
}
void monster_tentacle::monster_tentacle(void)
{
netname = "Tentacle";
model = "models/tentacle2.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
CBaseMonster::CBaseMonster();
}

View file

@ -29,5 +29,7 @@ void monster_turret::monster_turret(void)
{
netname = "Turret";
model = "models/turret.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -67,31 +67,58 @@ enum {
ZOMA_RISESNACK
};
enum {
ZOMB_IDLE,
ZOMB_WALK,
ZOMB_DEAD
string zom_sndattack[] = {
"zombie/zo_attack1.wav",
"zombie/zo_attack2.wav"
};
string zom_sndclaw[] = {
"zombie/claw_strike1.wav",
"zombie/claw_strike2.wav",
"zombie/claw_strike3.wav"
};
string zom_sndclawmiss[] = {
"zombie/claw_miss1.wav",
"zombie/claw_miss2.wav"
};
string zom_sndidle[] = {
"zombie/zo_idle1.wav",
"zombie/zo_idle2.wav",
"zombie/zo_idle3.wav",
"zombie/zo_idle4.wav"
};
string zom_sndpain[] = {
"zombie/zo_pain1.wav",
"zombie/zo_pain2.wav"
};
string zom_sndsee[] = {
"zombie/zo_alert10.wav",
"zombie/zo_alert20.wav",
"zombie/zo_alert30.wav"
};
class monster_zombie:CBaseMonster
{
float m_flScaredTime;
float m_flScreamTime;
float m_flIdleTime;
float m_flPainTime;
float m_flChangePath;
float m_flTraceTime;
float m_flPitch;
int m_iFlags;
void() monster_zombie;
virtual void(int) vPain;
virtual void(int) vDeath;
virtual void(int) Pain;
virtual void(int) Death;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void monster_zombie::vPain(int iHitBody)
void
monster_zombie::Pain(int iHitBody)
{
CBaseMonster::Pain(iHitBody);
if (m_flPainTime > time) {
return;
}
@ -100,64 +127,87 @@ void monster_zombie::vPain(int iHitBody)
return;
}
int rand = floor(random(0,sci_sndpain.length));
Speak(sci_sndpain[rand]);
int rand = floor(random(0,zom_sndpain.length));
Speak(zom_sndpain[rand]);
frame = ZOMA_FLINCH + floor(random(0, 2));
m_flPainTime = time + 0.25f;
}
void monster_zombie::vDeath(int iHitBody)
void
monster_zombie::Death(int iHitBody)
{
think = Respawn;
nextthink = time + 10.0f;
/* if we're already dead (corpse) don't change animations */
if (style != MONSTER_DEAD) {
/* headshots == different animation */
if (iHitBody == BODY_HEAD) {
if (random() < 0.5) {
frame = ZOMA_DIEHS;
} else {
frame = ZOMA_DIEHS2;
}
} else {
frame = ZOMA_DIE + floor(random(0, 3));
}
SendFlags |= NPC_FRAME;
m_iFlags = 0x0;
/* the sound */
int rand = floor(random(0,zom_sndpain.length));
Speak(zom_sndpain[rand]);
}
if (health < -50) {
Gib();
/* set the functional differences */
CBaseMonster::Death(iHitBody);
}
void
monster_zombie::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (style == MONSTER_DEAD) {
return;
}
flags &= ~FL_MONSTER;
movetype = MOVETYPE_NONE;
solid = SOLID_CORPSE;
if (style != ZOMB_DEAD) {
frame = ZOMA_DIE + floor(random(0, 3));
style = ZOMB_DEAD;
if (m_flIdleTime > time) {
return;
}
m_flIdleTime = time + 2.0f + random(0,5);
int rand = floor(random(0, zom_sndidle.length));
Speak(zom_sndidle[rand]);
}
void monster_zombie::Respawn(void)
void
monster_zombie::Respawn(void)
{
v_angle[0] = Math_FixDelta(m_oldAngle[0]);
v_angle[1] = Math_FixDelta(m_oldAngle[1]);
v_angle[2] = Math_FixDelta(m_oldAngle[2]);
setorigin(this, m_oldOrigin);
angles = v_angle;
solid = SOLID_SLIDEBOX;
movetype = MOVETYPE_WALK;
setmodel(this, m_oldModel);
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
takedamage = DAMAGE_YES;
iBleeds = TRUE;
customphysics = Physics;
CBaseMonster::Respawn();
frame = ZOMA_IDLE;
SendFlags |= NPC_FRAME;
health = 50;
velocity = [0,0,0];
m_iFlags = 0x0;
SendFlags = 0xff;
style = ZOMB_IDLE;
netname = "Zombie";
}
void monster_zombie::monster_zombie(void)
void
monster_zombie::monster_zombie(void)
{
for (int i = 0; i < zom_sndattack.length; i++) {
precache_sound(zom_sndattack[i]);
}
for (int i = 0; i < zom_sndclaw.length; i++) {
precache_sound(zom_sndclaw[i]);
}
for (int i = 0; i < zom_sndclawmiss.length; i++) {
precache_sound(zom_sndclawmiss[i]);
}
for (int i = 0; i < zom_sndidle.length; i++) {
precache_sound(zom_sndidle[i]);
}
for (int i = 0; i < zom_sndpain.length; i++) {
precache_sound(zom_sndpain[i]);
}
for (int i = 0; i < zom_sndsee.length; i++) {
precache_sound(zom_sndsee[i]);
}
netname = "Zombie";
model = "models/zombie.mdl";
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
Respawn();
base_health = 50;
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
CBaseMonster::CBaseMonster();
}

View file

@ -15,7 +15,7 @@
*/
int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -15,7 +15,7 @@
*/
int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -130,8 +130,7 @@ void
penguin_die(int i)
{
/* clear this first to avoid infinite recursion */
self.customphysics = __NULL__;
self.vDeath = __NULL__;
self.health = 0;
/* now we can explodededededed */
Effect_CreateExplosion(self.origin);
@ -155,7 +154,7 @@ penguin_pain(int i)
void
w_penguin_deploy(void)
{
entity pingu = spawn();
CBaseEntity pingu = spawn(CBaseEntity);
pingu.owner = self;
pingu.goalentity = self;
pingu.netname = "Penguin";
@ -169,10 +168,10 @@ w_penguin_deploy(void)
pingu.customphysics = penguin_ai;
pingu.angles = self.angles;
pingu.health = 20;
pingu.vPain = penguin_pain;
pingu.Pain = penguin_pain;
pingu.takedamage = DAMAGE_YES;
pingu.aiment = __NULL__;
pingu.vDeath = penguin_die;
pingu.Death = penguin_die;
pingu.weapon = 3.0f;
penguin_squeak(pingu);
}

View file

@ -15,7 +15,7 @@
*/
int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -15,7 +15,7 @@
*/
int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -15,7 +15,7 @@
*/
int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -15,7 +15,7 @@
*/
noref int input_sequence;
class player
class player:CBaseEntity
{
float health;
float armor;

View file

@ -115,7 +115,7 @@ void w_snark_deploy(void)
remove(self);
}
static void snark_pain(int i) { }
entity snark = spawn();
CBaseEntity snark = spawn(CBaseEntity);
snark.owner = self;
snark.goalentity = self;
snark.netname = "Snark";
@ -129,10 +129,10 @@ void w_snark_deploy(void)
snark.customphysics = snark_ai;
snark.angles = self.angles;
snark.health = 20;
snark.vPain = snark_pain;
snark.Pain = snark_pain;
snark.takedamage = DAMAGE_YES;
snark.aiment = __NULL__;
snark.vDeath = snark_die;
snark.Death = snark_die;
snark.weapon = 1.0f;
}
#endif

View file

@ -82,41 +82,44 @@ void w_tripmine_holster(void)
#ifdef SSQC
void w_tripmine_trip(int walkthrough)
{
CBaseEntity mine = (CBaseEntity)self;
if (!walkthrough) {
self.real_owner = g_eAttacker;
mine.real_owner = g_eAttacker;
}
/* This is to prevent infinite loops in Damage_Radius */
self.vDeath =
self.vPain = __NULL__;
self.takedamage = DAMAGE_NO;
mine.Death =
mine.Pain = __NULL__;
mine.takedamage = DAMAGE_NO;
Effect_CreateExplosion(self.origin);
Damage_Radius(self.origin, self.real_owner, 150, 150 * 2.5f, TRUE, WEAPON_TRIPMINE);
sound(self, CHAN_WEAPON, sprintf( "weapons/explode%d.wav", floor( random() * 2 ) + 3 ), 1, ATTN_NORM);
remove(self);
Effect_CreateExplosion(mine.origin);
Damage_Radius(mine.origin, mine.real_owner, 150, 150 * 2.5f, TRUE, WEAPON_TRIPMINE);
sound(mine, CHAN_WEAPON, sprintf( "weapons/explode%d.wav", floor( random() * 2 ) + 3 ), 1, ATTN_NORM);
remove(mine);
}
void w_tripmine_ready(void)
{
makevectors(self.angles);
traceline(self.origin, self.origin + v_forward * 2048, FALSE, self);
CBaseEntity mine = (CBaseEntity)self;
makevectors(mine.angles);
traceline(mine.origin, mine.origin + v_forward * 2048, FALSE, mine);
if (!self.health) {
self.SendFlags = 1;
self.health = 1;
self.vDeath =
self.vPain = w_tripmine_trip;
self.takedamage = DAMAGE_YES;
self.solid = SOLID_BBOX;
setsize(self, [-8,-8,-8], [8,8,8]);
self.armor = trace_plane_dist;
sound(self, CHAN_WEAPON, "weapons/mine_activate.wav", 1, ATTN_NORM);
if (!mine.health) {
mine.SendFlags = 1;
mine.health = 1;
mine.Death =
mine.Pain = w_tripmine_trip;
mine.takedamage = DAMAGE_YES;
mine.solid = SOLID_BBOX;
setsize(mine, [-8,-8,-8], [8,8,8]);
mine.armor = trace_plane_dist;
sound(mine, CHAN_WEAPON, "weapons/mine_activate.wav", 1, ATTN_NORM);
}
if (trace_plane_dist != self.armor) {
if (trace_plane_dist != mine.armor) {
w_tripmine_trip(1);
}
self.nextthink = time;
mine.nextthink = time;
}
#endif