2020-10-17 14:30:36 +00:00
|
|
|
/*
|
2022-07-07 16:10:14 +00:00
|
|
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
2020-10-17 14:30:36 +00: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.
|
2022-07-07 16:10:14 +00:00
|
|
|
*/
|
2020-10-17 14:30:36 +00:00
|
|
|
|
2022-08-07 21:12:55 +00:00
|
|
|
enumflags
|
|
|
|
{
|
|
|
|
MONFL_CHANGED_ORIGIN_X,
|
|
|
|
MONFL_CHANGED_ORIGIN_Y,
|
|
|
|
MONFL_CHANGED_ORIGIN_Z,
|
|
|
|
MONFL_CHANGED_ANGLES_X,
|
|
|
|
MONFL_CHANGED_ANGLES_Y,
|
|
|
|
MONFL_CHANGED_ANGLES_Z,
|
|
|
|
MONFL_CHANGED_MODELINDEX,
|
|
|
|
MONFL_CHANGED_SIZE,
|
|
|
|
MONFL_CHANGED_FLAGS,
|
|
|
|
MONFL_CHANGED_SOLID,
|
|
|
|
MONFL_CHANGED_FRAME,
|
|
|
|
MONFL_CHANGED_SKIN,
|
|
|
|
MONFL_CHANGED_MOVETYPE,
|
|
|
|
MONFL_CHANGED_EFFECTS,
|
|
|
|
MONFL_CHANGED_BODY,
|
|
|
|
MONFL_CHANGED_SCALE,
|
|
|
|
MONFL_CHANGED_VELOCITY,
|
|
|
|
MONFL_CHANGED_RENDERCOLOR,
|
|
|
|
MONFL_CHANGED_RENDERAMT,
|
|
|
|
MONFL_CHANGED_RENDERMODE,
|
|
|
|
};
|
|
|
|
|
2022-01-07 03:27:08 +00:00
|
|
|
typedef enum {
|
|
|
|
ACT_RESET = 0,
|
|
|
|
ACT_IDLE = 1i,
|
|
|
|
ACT_GUARD,
|
|
|
|
ACT_WALK,
|
|
|
|
ACT_RUN,
|
|
|
|
ACT_FLY,
|
|
|
|
ACT_SWIM,
|
|
|
|
ACT_HOP,
|
|
|
|
ACT_LEAP,
|
|
|
|
ACT_FALL,
|
|
|
|
ACT_LAND,
|
|
|
|
ACT_STRAFE_LEFT,
|
|
|
|
ACT_STRAFE_RIGHT,
|
|
|
|
ACT_ROLL_LEFT,
|
|
|
|
ACT_ROLL_RIGHT,
|
|
|
|
ACT_TURN_LEFT,
|
|
|
|
ACT_TURN_RIGHT,
|
|
|
|
ACT_CROUCH,
|
|
|
|
ACT_CROUCHIDLE,
|
|
|
|
ACT_STAND,
|
|
|
|
ACT_USE,
|
|
|
|
ACT_SIGNAL1,
|
|
|
|
ACT_SIGNAL2,
|
|
|
|
ACT_SIGNAL3,
|
|
|
|
ACT_TWITCH,
|
|
|
|
ACT_COWER,
|
|
|
|
ACT_SMALL_FLINCH,
|
|
|
|
ACT_BIG_FLINCH,
|
|
|
|
ACT_RANGE_ATTACK1,
|
|
|
|
ACT_RANGE_ATTACK2,
|
|
|
|
ACT_MELEE_ATTACK1,
|
|
|
|
ACT_MELEE_ATTACK2,
|
|
|
|
ACT_RELOAD,
|
|
|
|
ACT_ARM,
|
|
|
|
ACT_DISARM,
|
|
|
|
ACT_EAT,
|
|
|
|
ACT_DIESIMPLE,
|
|
|
|
ACT_DIEBACKWARD,
|
|
|
|
ACT_DIEFORWARD,
|
|
|
|
ACT_DIEVIOLENT,
|
|
|
|
ACT_BARNACLE_HIT,
|
|
|
|
ACT_BARNACLE_PULL,
|
|
|
|
ACT_BARNACLE_CHOMP,
|
|
|
|
ACT_BARNACLE_CHEW,
|
|
|
|
ACT_SLEEP,
|
|
|
|
ACT_INSPECT_FLOOR,
|
|
|
|
ACT_INSPECT_WALL,
|
|
|
|
ACT_IDLE_ANGRY,
|
|
|
|
ACT_WALK_HURT,
|
|
|
|
ACT_RUN_HURT,
|
|
|
|
ACT_HOVER,
|
|
|
|
ACT_GLIDE,
|
|
|
|
ACT_FLY_LEFT,
|
|
|
|
ACT_FLY_RIGHT,
|
|
|
|
ACT_DETECT_SCENT,
|
|
|
|
ACT_SNIFF,
|
|
|
|
ACT_BITE,
|
|
|
|
ACT_THREAT_DISPLAY,
|
|
|
|
ACT_FEAR_DISPLAY,
|
|
|
|
ACT_EXCITED,
|
|
|
|
ACT_SPECIAL_ATTACK1,
|
|
|
|
ACT_SPECIAL_ATTACK2,
|
|
|
|
ACT_COMBAT_IDLE,
|
|
|
|
ACT_WALK_SCARED,
|
|
|
|
ACT_RUN_SCARED,
|
|
|
|
ACT_VICTORY_DANCE,
|
|
|
|
ACT_DIE_HEADSHOT,
|
|
|
|
ACT_DIE_CHESTSHOT,
|
|
|
|
ACT_DIE_GUTSHOT,
|
|
|
|
ACT_DIE_BACKSHOT,
|
|
|
|
ACT_FLINCH_HEAD,
|
|
|
|
ACT_FLINCH_CHEST,
|
|
|
|
ACT_FLINCH_STOMACH,
|
|
|
|
ACT_FLINCH_LEFTARM,
|
|
|
|
ACT_FLINCH_RIGHTARM,
|
|
|
|
ACT_FLINCH_LEFTLEG,
|
|
|
|
ACT_FLINCH_RIGHTLEG,
|
|
|
|
} monster_activity_e;
|
|
|
|
|
2020-11-24 12:55:57 +00:00
|
|
|
/* monster flags, these are defined by the level designers */
|
|
|
|
typedef enumflags
|
|
|
|
{
|
|
|
|
MSF_WAITTILLSEEN,
|
|
|
|
MSF_GAG,
|
|
|
|
MSF_MONSTERCLIP,
|
|
|
|
MSF_RESERVED1,
|
|
|
|
MSF_PRISONER,
|
|
|
|
MSF_RESERVED2,
|
2021-05-10 06:14:10 +00:00
|
|
|
MSF_IGNOREPLAYER,
|
2020-11-24 12:55:57 +00:00
|
|
|
MSF_WAITFORSCRIPT,
|
|
|
|
MSF_PREDISASTER,
|
|
|
|
MSF_FADECORPSE,
|
2021-09-16 22:41:58 +00:00
|
|
|
MSF_MULTIPLAYER,
|
2022-05-26 22:24:08 +00:00
|
|
|
MSF_FALLING,
|
|
|
|
MSF_HORDE
|
2022-07-17 07:04:01 +00:00
|
|
|
} monsterFlag_e;
|
2020-11-24 12:55:57 +00:00
|
|
|
|
2020-10-17 14:30:36 +00:00
|
|
|
/* movement states */
|
2020-11-24 12:55:57 +00:00
|
|
|
typedef enum
|
2020-10-17 14:30:36 +00:00
|
|
|
{
|
|
|
|
MONSTER_IDLE,
|
2022-07-17 07:04:01 +00:00
|
|
|
MONSTER_ALERT,
|
2020-10-17 14:30:36 +00:00
|
|
|
MONSTER_FOLLOWING,
|
|
|
|
MONSTER_CHASING,
|
|
|
|
MONSTER_AIMING,
|
|
|
|
MONSTER_DEAD,
|
|
|
|
MONSTER_GIBBED
|
2022-07-17 07:04:01 +00:00
|
|
|
} monsterState_e;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
|
|
|
/* scripted sequence states */
|
2020-11-24 12:55:57 +00:00
|
|
|
typedef enum
|
2020-10-17 14:30:36 +00:00
|
|
|
{
|
|
|
|
SEQUENCESTATE_NONE,
|
|
|
|
SEQUENCESTATE_IDLE,
|
|
|
|
SEQUENCESTATE_ACTIVE,
|
|
|
|
SEQUENCESTATE_ENDING
|
2022-07-17 07:04:01 +00:00
|
|
|
} sequenceState_e;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
|
|
|
/* alliance state */
|
2020-11-24 12:55:57 +00:00
|
|
|
typedef enum
|
2020-10-17 14:30:36 +00:00
|
|
|
{
|
|
|
|
MAL_FRIEND, /* friendly towards the player */
|
|
|
|
MAL_ENEMY, /* unfriendly towards the player */
|
|
|
|
MAL_ALIEN, /* unfriendly towards anyone but themselves */
|
|
|
|
MAL_ROGUE /* no allies, not even amongst themselves */
|
2022-07-17 07:04:01 +00:00
|
|
|
} allianceState_e;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
2022-05-02 05:45:30 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
MOVESTATE_IDLE,
|
|
|
|
MOVESTATE_WALK,
|
|
|
|
MOVESTATE_RUN
|
2022-07-17 07:04:01 +00:00
|
|
|
} movementState_e;
|
2022-05-02 05:45:30 +00:00
|
|
|
|
2020-11-24 12:55:57 +00:00
|
|
|
/* These numerations involve the m_iTriggerCondition attribute.
|
|
|
|
* Basically these conditions are being checked and triggered depending on what
|
|
|
|
* it's set to. If any of those checks are successful, we trigger our target
|
|
|
|
* under the m_strTriggerTarget attribute. */
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
MTRIG_NONE, /* nothing */
|
|
|
|
MTRIG_SEEPLAYER_ANGRY, /* we see an enemy player, that we want to harm */
|
|
|
|
MTRIG_PAIN, /* taken damage */
|
|
|
|
MTRIG_HALFHEALTH, /* lost half of our base_health */
|
|
|
|
MTRIG_DEATH, /* we have died. */
|
|
|
|
MTRIG_SQUADMEMBERDEAD, /* a squad member died */
|
|
|
|
MTRIG_SQUADLEADERDEAD, /* the squad leader died */
|
|
|
|
MTRIG_HEARNOISE, /* we hear some noise around the world. */
|
|
|
|
MTRIG_HEARENEMYPLAYER, /* we hear a player we are enemies with */
|
|
|
|
MTRIG_HEARWEAPONS, /* we hear weapons being fired */
|
|
|
|
MTRIG_SEEPLAYER, /* we see a player, don't have to be angry at him. */
|
|
|
|
MTRIG_SEEPLAYER_RELAXED, /* we see a player and we're currently attacking anything */
|
2022-07-17 07:04:01 +00:00
|
|
|
} triggerCondition_e;
|
2020-11-24 12:55:57 +00:00
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
/* FIXME: I'd like to move this into NSMonster, but our current IsFriend()
|
2020-11-24 12:55:57 +00:00
|
|
|
* check is currently only checking on a .takedamage basis. */
|
2020-10-17 14:30:36 +00:00
|
|
|
.int m_iAlliance;
|
|
|
|
|
2022-07-18 03:34:19 +00:00
|
|
|
class NSMonster:NSNavAI
|
2020-10-17 14:30:36 +00:00
|
|
|
{
|
2021-10-19 23:18:36 +00:00
|
|
|
#ifdef SERVER
|
2022-05-04 20:59:10 +00:00
|
|
|
entity m_ssLast;
|
2020-10-17 14:30:36 +00:00
|
|
|
vector oldnet_velocity;
|
|
|
|
float m_flPitch;
|
|
|
|
int m_iFlags;
|
|
|
|
vector base_mins;
|
|
|
|
vector base_maxs;
|
2020-12-12 00:54:00 +00:00
|
|
|
float base_health;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
|
|
|
/* sequences */
|
|
|
|
string m_strRouteEnded;
|
|
|
|
int m_iSequenceRemove;
|
|
|
|
int m_iSequenceState;
|
|
|
|
float m_flSequenceEnd;
|
|
|
|
float m_flSequenceSpeed;
|
|
|
|
vector m_vecSequenceAngle;
|
2022-01-22 01:24:39 +00:00
|
|
|
int m_iSequenceFlags;
|
2022-07-17 07:04:01 +00:00
|
|
|
movementState_e m_iMoveState;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
2020-11-24 12:55:57 +00:00
|
|
|
int m_iTriggerCondition;
|
|
|
|
string m_strTriggerTarget;
|
|
|
|
|
2020-10-17 14:30:36 +00:00
|
|
|
/* model events */
|
|
|
|
float m_flBaseTime;
|
|
|
|
|
|
|
|
/* attack/alliance system */
|
|
|
|
entity m_eEnemy;
|
|
|
|
float m_flAttackThink;
|
2022-07-17 07:04:01 +00:00
|
|
|
monsterState_e m_iMState;
|
|
|
|
monsterState_e m_iOldMState;
|
2020-10-17 14:30:36 +00:00
|
|
|
vector m_vecLKPos; /* last-known pos */
|
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
#endif
|
2020-10-17 14:30:36 +00:00
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
void(void) NSMonster;
|
|
|
|
|
2022-05-04 17:59:42 +00:00
|
|
|
#ifdef SERVER
|
|
|
|
/* overrides */
|
2021-10-22 18:51:51 +00:00
|
|
|
virtual void(float) Save;
|
|
|
|
virtual void(string,string) Restore;
|
|
|
|
|
2022-04-10 13:59:40 +00:00
|
|
|
virtual void(entity) Touch;
|
2020-10-17 14:30:36 +00:00
|
|
|
virtual void(void) Hide;
|
|
|
|
virtual void(void) Respawn;
|
|
|
|
virtual void(void) Pain;
|
|
|
|
virtual void(void) Death;
|
|
|
|
virtual void(void) Physics;
|
2022-07-18 03:34:19 +00:00
|
|
|
virtual void(void) RunAI;
|
2020-10-17 14:30:36 +00:00
|
|
|
virtual void(void) IdleNoise;
|
2021-09-16 22:41:58 +00:00
|
|
|
virtual void(void) FallNoise;
|
2020-10-17 14:30:36 +00:00
|
|
|
virtual void(void) Gib;
|
|
|
|
virtual void(string) Sound;
|
2020-11-24 12:55:57 +00:00
|
|
|
virtual void(string, string) SpawnKey;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
2022-07-17 07:04:01 +00:00
|
|
|
virtual bool(void) IsAlive;
|
|
|
|
virtual bool(int) IsFriend;
|
|
|
|
|
2020-10-17 14:30:36 +00:00
|
|
|
/* see/hear subsystem */
|
|
|
|
float m_flSeeTime;
|
|
|
|
virtual void(void) SeeThink;
|
|
|
|
virtual float(void) SeeFOV;
|
|
|
|
|
2022-01-28 20:31:24 +00:00
|
|
|
/* reactions */
|
|
|
|
virtual void(void) AlertNearby;
|
|
|
|
|
2022-01-26 04:07:25 +00:00
|
|
|
/* movement */
|
|
|
|
virtual float(void) GetWalkSpeed;
|
|
|
|
virtual float(void) GetChaseSpeed;
|
|
|
|
virtual float(void) GetRunSpeed;
|
|
|
|
|
2020-10-17 14:30:36 +00:00
|
|
|
/* attack system */
|
|
|
|
virtual void(void) AttackDraw;
|
|
|
|
virtual void(void) AttackHolster;
|
|
|
|
virtual void(void) AttackThink;
|
|
|
|
virtual int(void) AttackMelee;
|
|
|
|
virtual int(void) AttackRanged;
|
|
|
|
|
2022-01-24 20:27:15 +00:00
|
|
|
virtual float(void) MeleeMaxDistance;
|
2022-07-18 17:02:04 +00:00
|
|
|
virtual bool(void) MeleeCondition;
|
2022-01-24 20:27:15 +00:00
|
|
|
|
2022-07-16 22:26:07 +00:00
|
|
|
virtual bool(entity enemy) IsValidEnemy;
|
|
|
|
|
2020-10-17 14:30:36 +00:00
|
|
|
/* sequences */
|
|
|
|
virtual void(void) FreeState;
|
|
|
|
virtual void(void) FreeStateMoved;
|
2022-07-18 03:34:19 +00:00
|
|
|
virtual void(void) RouteEnded;
|
2020-10-17 14:30:36 +00:00
|
|
|
virtual void(void) WalkRoute;
|
2022-07-18 03:34:19 +00:00
|
|
|
virtual int(void) GetSequenceState;
|
2022-07-18 18:32:18 +00:00
|
|
|
virtual bool(void) InSequence;
|
2020-10-17 14:30:36 +00:00
|
|
|
|
|
|
|
/* animation cycles */
|
|
|
|
float m_flAnimTime;
|
|
|
|
virtual int(void) AnimIdle;
|
|
|
|
virtual int(void) AnimWalk;
|
|
|
|
virtual int(void) AnimRun;
|
|
|
|
virtual void(float) AnimPlay;
|
2022-05-02 05:45:30 +00:00
|
|
|
virtual void(void) AnimationUpdate;
|
2022-07-18 16:22:18 +00:00
|
|
|
virtual bool(void) InAnimation;
|
2021-09-11 22:13:24 +00:00
|
|
|
|
2022-07-17 07:04:01 +00:00
|
|
|
/* states */
|
|
|
|
virtual void(monsterState_e, monsterState_e) StateChanged;
|
|
|
|
virtual void(monsterState_e) SetState;
|
|
|
|
virtual monsterState_e(void) GetState;
|
|
|
|
|
2022-01-10 21:18:25 +00:00
|
|
|
/* TriggerTarget/Condition */
|
|
|
|
virtual int(void) GetTriggerCondition;
|
|
|
|
virtual void(void) TriggerTargets;
|
|
|
|
|
2021-09-11 22:13:24 +00:00
|
|
|
virtual float(entity, float) SendEntity;
|
2021-10-19 23:18:36 +00:00
|
|
|
#else
|
|
|
|
virtual void(void) customphysics;
|
|
|
|
virtual float(void) predraw;
|
2022-01-21 00:23:29 +00:00
|
|
|
virtual void(float,float) ReceiveEntity;
|
2021-10-19 23:18:36 +00:00
|
|
|
#endif
|
2020-10-17 14:30:36 +00:00
|
|
|
};
|
2021-10-19 23:18:36 +00:00
|
|
|
|
|
|
|
#ifdef CLIENT
|
|
|
|
string Sentences_GetSamples(string);
|
|
|
|
string Sentences_ProcessSample(string);
|
2022-07-19 22:22:15 +00:00
|
|
|
void NSMonster_ReadEntity(bool);
|
2022-01-29 00:02:00 +00:00
|
|
|
#else
|
|
|
|
void NSMonster_AlertEnemyAlliance(vector pos, float radius, int alliance);
|
2022-06-09 00:41:02 +00:00
|
|
|
entity NSMonster_FindClosestPlayer(entity);
|
|
|
|
#endif
|