2021-03-08 01:53:48 -08:00
|
|
|
/*
|
2022-03-13 16:57:51 -07:00
|
|
|
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
|
2021-03-08 01:53:48 -08:00
|
|
|
*
|
|
|
|
* 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_barney (0 0.8 0.8) (-16 -16 0) (16 16 72)
|
|
|
|
|
|
|
|
HALF-LIFE (1998) ENTITY
|
|
|
|
|
|
|
|
Barney Calhoun
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
BA_IDLE1,
|
|
|
|
BA_IDLE2,
|
|
|
|
BA_IDLE3,
|
|
|
|
BA_IDLE4,
|
|
|
|
BA_WALK,
|
|
|
|
BA_RUN,
|
|
|
|
BA_SHOOT1,
|
|
|
|
BA_SHOOT2,
|
|
|
|
BA_DRAW,
|
|
|
|
BA_HOLSTER,
|
|
|
|
BA_RELOAD,
|
|
|
|
BA_TURNLEFT,
|
|
|
|
BA_TURNRIGHT,
|
|
|
|
BA_FLINCH_LA,
|
|
|
|
BA_FLINCH_RA,
|
|
|
|
BA_FLINCH_LL,
|
|
|
|
BA_FLINCH_RL,
|
|
|
|
BA_FLINCH_SML
|
|
|
|
};
|
|
|
|
|
2022-05-10 15:00:15 -07:00
|
|
|
class monster_barney:NSTalkMonster
|
2021-03-08 01:53:48 -08:00
|
|
|
{
|
|
|
|
void(void) monster_barney;
|
|
|
|
|
|
|
|
virtual void(void) Respawn;
|
|
|
|
virtual void(void) OnPlayerUse;
|
|
|
|
virtual void(void) Pain;
|
|
|
|
virtual void(void) Death;
|
|
|
|
virtual int(void) AnimIdle;
|
|
|
|
virtual int(void) AnimWalk;
|
|
|
|
virtual int(void) AnimRun;
|
|
|
|
|
|
|
|
virtual void(void) AttackDraw;
|
|
|
|
virtual void(void) AttackHolster;
|
|
|
|
virtual int(void) AttackMelee;
|
|
|
|
virtual int(void) AttackRanged;
|
2022-07-17 00:04:35 -07:00
|
|
|
|
2022-08-12 14:29:08 -07:00
|
|
|
virtual void(monsterState_t, monsterState_t) StateChanged;
|
2021-03-08 01:53:48 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
int
|
|
|
|
monster_barney::AnimIdle(void)
|
|
|
|
{
|
|
|
|
return BA_IDLE1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
monster_barney::AnimWalk(void)
|
|
|
|
{
|
|
|
|
return BA_WALK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
monster_barney::AnimRun(void)
|
|
|
|
{
|
|
|
|
return BA_RUN;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::AttackDraw(void)
|
|
|
|
{
|
|
|
|
AnimPlay(BA_DRAW);
|
|
|
|
m_flAttackThink = m_flAnimTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::AttackHolster(void)
|
|
|
|
{
|
|
|
|
AnimPlay(BA_HOLSTER);
|
|
|
|
m_flAttackThink = m_flAnimTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
monster_barney::AttackMelee(void)
|
|
|
|
{
|
|
|
|
return AttackRanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
monster_barney::AttackRanged(void)
|
|
|
|
{
|
|
|
|
/* visual */
|
|
|
|
AnimPlay(BA_SHOOT1);
|
|
|
|
m_flAttackThink = time + 0.4f;
|
|
|
|
|
|
|
|
/* functional */
|
|
|
|
v_angle = vectoangles(m_eEnemy.origin - origin);
|
|
|
|
TraceAttack_FireBullets(1, origin + [0,0,16], 8, [0.01,0.01], 2);
|
|
|
|
Sound_Play(this, CHAN_WEAPON, "weapon_glock.fire");
|
2021-05-09 23:16:22 -07:00
|
|
|
return (1);
|
2021-03-08 01:53:48 -08:00
|
|
|
}
|
|
|
|
|
2022-07-17 00:04:35 -07:00
|
|
|
|
|
|
|
void
|
2022-08-12 14:29:08 -07:00
|
|
|
monster_barney::StateChanged(monsterState_t oldState, monsterState_t newState)
|
2022-07-17 00:04:35 -07:00
|
|
|
{
|
|
|
|
super::StateChanged(oldState, newState);
|
|
|
|
|
|
|
|
switch (newState) {
|
|
|
|
case MONSTER_AIMING:
|
|
|
|
if (oldState == MONSTER_ALERT)
|
|
|
|
AttackDraw();
|
|
|
|
break;
|
|
|
|
case MONSTER_ALERT:
|
|
|
|
if (oldState == MONSTER_AIMING)
|
|
|
|
AttackHolster();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-08 01:53:48 -08:00
|
|
|
void
|
|
|
|
monster_barney::OnPlayerUse(void)
|
|
|
|
{
|
|
|
|
if (spawnflags & MSF_PREDISASTER) {
|
|
|
|
Sentence("!BA_POK");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-05-10 15:00:15 -07:00
|
|
|
super::OnPlayerUse();
|
2021-03-08 01:53:48 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::Pain(void)
|
|
|
|
{
|
2022-07-17 00:04:35 -07:00
|
|
|
/* don't bother if we're fully dead */
|
|
|
|
if (IsAlive() == false)
|
|
|
|
return;
|
2021-03-08 01:53:48 -08:00
|
|
|
|
2022-07-17 00:04:35 -07:00
|
|
|
super::Pain();
|
2021-03-08 01:53:48 -08:00
|
|
|
|
2022-07-19 16:28:10 -07:00
|
|
|
if (InAnimation() == true)
|
2021-03-08 01:53:48 -08:00
|
|
|
return;
|
|
|
|
|
2022-07-17 00:04:35 -07:00
|
|
|
if (random() < 0.25f)
|
2021-03-08 01:53:48 -08:00
|
|
|
return;
|
|
|
|
|
|
|
|
Sound_Speak(this, "monster_barney.pain");
|
|
|
|
|
|
|
|
AnimPlay(BA_FLINCH_LA + floor(random(0, 5)));
|
|
|
|
m_flAttackThink = m_flAnimTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::Death(void)
|
|
|
|
{
|
2022-07-17 00:04:35 -07:00
|
|
|
if (IsAlive() == true) {
|
2021-03-08 01:53:48 -08:00
|
|
|
SetFrame(25 + floor(random(0, 6)));
|
|
|
|
Sound_Speak(this, "monster_barney.die");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now mark our state as 'dead' */
|
2022-05-10 15:00:15 -07:00
|
|
|
super::Death();
|
2021-03-08 01:53:48 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::Respawn(void)
|
|
|
|
{
|
2022-05-10 15:00:15 -07:00
|
|
|
super::Respawn();
|
2021-03-08 01:53:48 -08:00
|
|
|
m_iFlags |= MONSTER_CANFOLLOW;
|
|
|
|
PlayerUse = OnPlayerUse;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
monster_barney::monster_barney(void)
|
|
|
|
{
|
|
|
|
Sound_Precache("monster_barney.die");
|
|
|
|
Sound_Precache("monster_barney.pain");
|
|
|
|
|
|
|
|
/* TODO
|
|
|
|
* BA_MAD - When player gets too naughty
|
|
|
|
* */
|
|
|
|
m_talkAnswer = "!BA_ANSWER";
|
|
|
|
m_talkAsk = "!BA_QUESTION";
|
|
|
|
m_talkAllyShot = "!BA_SHOOT";
|
|
|
|
m_talkGreet = "";
|
|
|
|
m_talkIdle = "!BA_IDLE";
|
|
|
|
m_talkHearing = "!BA_HEAR";
|
|
|
|
m_talkSmelling = "!BA_SMELL";
|
|
|
|
m_talkStare = "!BA_STARE";
|
|
|
|
m_talkSurvived = "!BA_WOUND";
|
|
|
|
m_talkWounded = "!BA_WOUND";
|
|
|
|
|
|
|
|
m_talkPlayerAsk = "!BA_QUESTION";
|
|
|
|
m_talkPlayerGreet = "!BA_HELLO";
|
|
|
|
m_talkPlayerIdle = "!BA_IDLE";
|
|
|
|
m_talkPlayerWounded1 = "!BA_CUREA";
|
|
|
|
m_talkPlayerWounded2 = "!BA_CUREB";
|
|
|
|
m_talkPlayerWounded3 = "!BA_CUREC";
|
|
|
|
m_talkUnfollow = "!BA_WAIT";
|
|
|
|
m_talkFollow = "!BA_OK";
|
|
|
|
m_talkStopFollow = "!BA_STOP";
|
|
|
|
|
|
|
|
model = "models/barney.mdl";
|
|
|
|
netname = "Barney";
|
|
|
|
base_health = Skill_GetValue("barney_health", 35);
|
|
|
|
base_mins = [-16,-16,0];
|
|
|
|
base_maxs = [16,16,72];
|
|
|
|
m_iAlliance = MAL_FRIEND;
|
|
|
|
}
|