Remove pmodel attributes from the player class. Sound shaders for weapon firing now call alerts to AI.
254 lines
5 KiB
C++
254 lines
5 KiB
C++
/*
|
|
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
/*QUAKED monster_alien_slave (0 0.8 0.8) (-16 -16 0) (16 16 72)
|
|
|
|
HALF-LIFE (1998) ENTITY
|
|
|
|
Alien Slave
|
|
|
|
*/
|
|
|
|
enum
|
|
{
|
|
SLV_IDLE,
|
|
SLV_IDLE2,
|
|
SLV_IDLE3,
|
|
SLV_CROUCH,
|
|
SLV_WALK,
|
|
SLV_WALK2,
|
|
SLV_RUN,
|
|
SLV_RIGHT,
|
|
SLV_LEFT,
|
|
SLV_JUMP,
|
|
SLV_STAIRUP,
|
|
SLV_ATTACK,
|
|
SLV_ATTACKZAP,
|
|
SLV_FLINCH,
|
|
SLV_FLINCHLA,
|
|
SLV_FLINCHRA,
|
|
SLV_FLINCHL,
|
|
SLV_FLINCHR,
|
|
SLV_DIEHS,
|
|
SLV_DIE,
|
|
SLV_DIEBACK,
|
|
SLV_DIEFORWARD,
|
|
SLV_COLLAR,
|
|
SLV_COLLAR2,
|
|
SLV_PUSHUP,
|
|
SLV_GRAB,
|
|
SLV_UPDOWN,
|
|
SLV_DOWNUP,
|
|
SLV_JIBBER,
|
|
SLV_JABBER
|
|
};
|
|
|
|
class monster_alien_slave:CBaseNPC
|
|
{
|
|
float m_flIdleTime;
|
|
float m_flPainTime;
|
|
|
|
void(void) monster_alien_slave;
|
|
|
|
virtual void(void) Death;
|
|
virtual void(void) Pain;
|
|
virtual void(void) IdleChat;
|
|
virtual void(void) Respawn;
|
|
|
|
virtual int(void) AnimIdle;
|
|
virtual int(void) AnimWalk;
|
|
virtual int(void) AnimRun;
|
|
|
|
virtual int(void) AttackMelee;
|
|
virtual void(void) AttackFlail;
|
|
|
|
virtual int(void) AttackRanged;
|
|
virtual void(void) AttackBeam;
|
|
};
|
|
|
|
int
|
|
monster_alien_slave::AnimIdle(void)
|
|
{
|
|
return SLV_IDLE;
|
|
}
|
|
|
|
int
|
|
monster_alien_slave::AnimWalk(void)
|
|
{
|
|
return SLV_WALK;
|
|
}
|
|
|
|
int
|
|
monster_alien_slave::AnimRun(void)
|
|
{
|
|
return SLV_RUN;
|
|
}
|
|
|
|
int
|
|
monster_alien_slave::AttackMelee(void)
|
|
{
|
|
/* visual */
|
|
AnimPlay(SLV_ATTACK);
|
|
|
|
m_flAttackThink = m_flAnimTime;
|
|
|
|
/* functional */
|
|
think = AttackFlail;
|
|
nextthink = time + 0.25f;
|
|
return (1);
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::AttackFlail(void)
|
|
{
|
|
traceline(origin, m_eEnemy.origin, FALSE, this);
|
|
|
|
if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) {
|
|
Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackmiss");
|
|
return;
|
|
}
|
|
|
|
Damage_Apply(trace_ent, this, 25, 0, 0);
|
|
Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackhit");
|
|
}
|
|
|
|
int
|
|
monster_alien_slave::AttackRanged(void)
|
|
{
|
|
/* visual */
|
|
AnimPlay(SLV_ATTACKZAP);
|
|
|
|
m_flAttackThink = m_flAnimTime;
|
|
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.attack_charge");
|
|
|
|
/* functional */
|
|
think = AttackBeam;
|
|
nextthink = time + 1.5f;
|
|
return (1);
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::AttackBeam(void)
|
|
{
|
|
traceline(origin, m_eEnemy.origin, FALSE, this);
|
|
Sound_Play(this, CHAN_WEAPON, "monster_alien_slave.attack_shoot");
|
|
|
|
if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) {
|
|
//Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackmiss");
|
|
return;
|
|
}
|
|
|
|
Damage_Apply(trace_ent, this, 100, 0, 0);
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::IdleChat(void)
|
|
{
|
|
if (m_flIdleTime > time) {
|
|
return;
|
|
}
|
|
|
|
Sentence(m_talkIdle);
|
|
|
|
m_flIdleTime = time + 5.0f + random(0,20);
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::Pain(void)
|
|
{
|
|
CBaseNPC::Pain();
|
|
|
|
if (m_flPainTime > time) {
|
|
return;
|
|
}
|
|
|
|
if (random() < 0.25f) {
|
|
return;
|
|
}
|
|
|
|
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.pain");
|
|
SetFrame(SLV_FLINCH + floor(random(0, 2)));
|
|
m_flPainTime = time + 0.25f;
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::Death(void)
|
|
{
|
|
/* if we're already dead (corpse) don't change animations */
|
|
if (style != MONSTER_DEAD) {
|
|
/* headshots == different animation */
|
|
if (g_dmg_iHitBody == BODY_HEAD) {
|
|
if (random() < 0.5) {
|
|
SetFrame(SLV_DIEHS);
|
|
} else {
|
|
SetFrame(SLV_DIEBACK);
|
|
}
|
|
} else {
|
|
SetFrame(SLV_DIE + floor(random(0, 3)));
|
|
}
|
|
|
|
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.die");
|
|
}
|
|
|
|
/* set the functional differences */
|
|
CBaseNPC::Death();
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::Respawn(void)
|
|
{
|
|
CBaseNPC::Respawn();
|
|
SetFrame(SLV_IDLE);
|
|
}
|
|
|
|
void
|
|
monster_alien_slave::monster_alien_slave(void)
|
|
{
|
|
Sound_Precache("monster_alien_slave.die");
|
|
Sound_Precache("monster_alien_slave.pain");
|
|
Sound_Precache("monster_alien_slave.attack_charge");
|
|
Sound_Precache("monster_alien_slave.attack_shoot");
|
|
Sound_Precache("monster_zombie.attackhit");
|
|
Sound_Precache("monster_zombie.attackmiss");
|
|
|
|
m_talkAnswer = "";
|
|
m_talkAsk = "";
|
|
m_talkAllyShot = "";
|
|
m_talkGreet = "SLV_ALERT";
|
|
m_talkIdle = "!SLV_IDLE";
|
|
m_talkSmelling = "";
|
|
m_talkStare = "";
|
|
m_talkSurvived = "";
|
|
m_talkWounded = "";
|
|
|
|
m_talkPlayerAsk = "";
|
|
m_talkPlayerGreet = "!SLV_ALERT";
|
|
m_talkPlayerIdle = "";
|
|
m_talkPlayerWounded1 = "";
|
|
m_talkPlayerWounded2 = "";
|
|
m_talkPlayerWounded3 = "";
|
|
m_talkUnfollow = "";
|
|
m_talkFollow = "";
|
|
m_talkStopFollow = "";
|
|
|
|
netname = "Alien Slave";
|
|
model = "models/islave.mdl";
|
|
base_health = Skill_GetValue("islave_health", 30);
|
|
base_mins = [-16,-16,0];
|
|
base_maxs = [16,16,72];
|
|
m_iAlliance = MAL_ALIEN;
|
|
CBaseNPC::CBaseNPC();
|
|
}
|