1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
|
/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// sentient.h: Base class of entity that can carry other entities, and use weapons.
//
#pragma once
#include "g_local.h"
#include "container.h"
#include "animate.h"
#include "vehicle.h"
extern Event EV_Sentient_Attack;
extern Event EV_Sentient_Charge;
extern Event EV_Sentient_ReleaseAttack;
extern Event EV_Sentient_GiveWeapon;
extern Event EV_Sentient_GiveAmmo;
extern Event EV_Sentient_GiveArmor;
extern Event EV_Sentient_GiveItem;
extern Event EV_Sentient_GiveTargetname;
extern Event EV_Sentient_GiveInventoryItem;
extern Event EV_Sentient_GiveHealth;
extern Event EV_Sentient_SetBloodModel;
extern Event EV_Sentient_UselessCheck;
extern Event EV_Sentient_TurnOffShadow;
extern Event EV_Sentient_TurnOnShadow;
extern Event EV_Sentient_UpdateOffsetColor;
extern Event EV_Sentient_JumpXY;
extern Event EV_Sentient_MeleeAttackStart;
extern Event EV_Sentient_MeleeAttackEnd;
extern Event EV_Sentient_BlockStart;
extern Event EV_Sentient_BlockEnd;
extern Event EV_Sentient_SetMouthAngle;
extern Event EV_Sentient_SpawnBloodyGibs;
extern Event EV_Sentient_StopOnFire;
extern Event EV_Sentient_UseItem;
extern Event EV_Sentient_UseLastWeapon;
extern Event EV_Sentient_UseWeaponClass;
extern Event EV_Sentient_ToggleItemUse;
extern Event EV_Sentient_DontDropWeapons;
extern Event EV_Sentient_ForceDropWeapon;
extern Event EV_Sentient_ForceDropHealth;
extern Event EV_Sentient_GetForceDropHealth;
extern Event EV_Sentient_GetForceDropWeapon;
// Shutup compiler
class Weapon;
class Item;
class InventoryItem;
class Ammo;
class Vehicle;
class VehicleTank;
class TurretGun;
#define MAX_ACTIVE_WEAPONS NUM_ACTIVE_WEAPONS
#define MAX_DAMAGE_MULTIPLIERS 19
#define TEAM_GERMAN 0
#define TEAM_AMERICAN 1
#define THREATBIAS_IGNOREME 0xFFFFE4C7
typedef SafePtr<Weapon> WeaponPtr;
class ActiveWeapon : public Class
{
public:
WeaponPtr weapon;
weaponhand_t hand;
ActiveWeapon();
void Archive(Archiver& arc);
};
class Sentient : public Animate
{
protected:
Container<int> inventory;
Container<Ammo *> ammo_inventory;
float LMRF;
WeaponPtr newWeapon;
int poweruptype;
int poweruptimer;
Vector offset_color;
Vector offset_delta;
float charge_start_time;
str blood_model;
SafePtr<Weapon> activeWeaponList[MAX_ACTIVE_WEAPONS];
ActiveWeapon newActiveWeapon;
WeaponPtr holsteredWeapon;
bool weapons_holstered_by_code;
ActiveWeapon lastActiveWeapon;
float m_fDamageMultipliers[MAX_DAMAGE_MULTIPLIERS];
SafePtr<Vehicle> m_pVehicle;
SafePtr<TurretGun> m_pTurret;
SafePtr<Entity> m_pLadder;
str m_sHelmetSurface1;
str m_sHelmetSurface2;
str m_sHelmetTiki;
float m_fHelmetSpeed;
bool m_bDontDropWeapons;
virtual void EventTake(Event *ev);
virtual void EventGiveAmmo(Event *ev);
virtual void EventGiveItem(Event *ev);
void EventGiveDynItem(Event *ev);
void SetBloodModel(Event *ev);
void EventUseItem(Event *ev);
virtual void EventUseWeaponClass(Event *ev);
virtual void EventGiveTargetname(Event *ev);
void EventGerman(Event *ev);
void EventAmerican(Event *ev);
void EventGetTeam(Event *ev);
virtual void ClearEnemies();
void EventGetThreatBias(Event *ev);
void EventSetThreatBias(Event *ev);
void SetDamageMult(Event *ev);
void SetupHelmet(str sHelmetTiki, float fSpeed, float fDamageMult, str sHelmetSurface1, str sHelmetSurface2);
void EventSetupHelmet(Event *ev);
void EventPopHelmet(Event *ev);
bool WearingHelmet(void);
int CheckHitLocation(int iLocation);
virtual void ArmorDamage(Event *ev);
virtual qboolean CanBlock(int meansofdeath, qboolean full_block);
void AddBloodSpurt(Vector direction);
qboolean ShouldBleed(int meansofdeath, qboolean dead);
qboolean ShouldGib(int meansofdeath, float damage);
str GetBloodSpurtName(void);
str GetBloodSplatName(void);
float GetBloodSplatSize(void);
str GetGibName(void);
virtual void TurnOffShadow(Event *ev);
virtual void TurnOnShadow(Event *ev);
virtual void WeaponKnockedFromHands(void);
void EventDropItems(Event *ev);
void EventDontDropWeapons(Event *ev);
void EventForceDropWeapon(Event *ev);
void EventForceDropHealth(Event *ev);
void EventGetForceDropWeapon(Event *ev);
void EventGetForceDropHealth(Event *ev);
void DetachAllActiveWeapons(void);
void AttachAllActiveWeapons(void);
qboolean WeaponsOut(void);
qboolean IsActiveWeapon(Weapon *weapon);
void ActivateWeapon(Weapon *weapon, weaponhand_t hand);
void ActivateLastActiveWeapon(void);
void EventActivateLastActiveWeapon(Event *ev);
void EventToggleItemUse(Event *ev);
void DeactivateWeapon(Weapon *weapon);
void DeactivateWeapon(weaponhand_t hand);
void CheckAnimations(Event *ev);
void ChargeWeapon(weaponhand_t hand, firemode_t mode);
virtual void FireWeapon(int number, firemode_t mode);
void ReleaseFireWeapon(int number, firemode_t mode);
void Link();
void Unlink();
public:
Vector mTargetPos;
float mAccuracy;
SafePtr<Sentient> m_pNextSquadMate;
SafePtr<Sentient> m_pPrevSquadMate;
Sentient *m_NextSentient;
Sentient *m_PrevSentient;
int m_Team;
int m_iAttackerCount;
SafePtr<Entity> m_pLastAttacker;
SafePtr<Sentient> m_Enemy;
float m_fPlayerSightLevel;
bool m_bIsDisguised;
bool m_bHasDisguise;
bool m_bOvercookDied;
int m_ShowPapersTime;
int m_iLastHitTime;
int m_iThreatBias;
bool m_bIsAnimal;
Vector gunoffset;
Vector eyeposition;
int viewheight;
Vector m_vViewVariation;
int means_of_death;
bool in_melee_attack;
bool in_block;
bool in_stun;
bool on_fire;
float on_fire_stop_time;
float next_catch_on_fire_time;
int on_fire_tagnums[3];
SafePtr<Entity> fire_owner;
bool attack_blocked;
float attack_blocked_time;
float max_mouth_angle;
int max_gibs;
float next_bleed_time;
bool m_bForceDropHealth;
bool m_bForceDropWeapon;
bool m_bFootOnGround_Right;
bool m_bFootOnGround_Left;
//
// Added in OPM
//
int iNextLandTime;
CLASS_PROTOTYPE(Sentient);
Sentient();
virtual ~Sentient();
virtual Vector EyePosition(void);
virtual void SetViewAngles(Vector angles);
virtual void SetTargetViewAngles(Vector angles);
virtual Vector GetViewAngles(void);
void AddViewVariation(const Vector& vVariation);
void SetMinViewVariation(const Vector& vVariation);
void SetHolsteredByCode(bool holstered);
bool CanSee(Entity *ent, float fov, float vision_distance, bool bNoEnts) override;
bool CanSee(const Vector& org, float fov, float vision_distance, bool bNoEnts) override;
virtual Vector GunPosition(void);
virtual Vector GunTarget(bool bNoCollision = false, const vec3_t position = NULL, const vec3_t forward = NULL);
void ReloadWeapon(Event *ev);
void FireWeapon(Event *ev);
void StopFireWeapon(Event *ev);
void ChargeWeapon(Event *ev);
virtual void EventForceLandmineMeasure(Event *ev);
void EventSetWeaponIdleState(Event *ev);
void EventPingForMines(Event *ev);
void ReleaseFireWeapon(Event *ev);
void ChangeWeapon(Weapon *weapon, weaponhand_t hand);
Weapon *GetActiveWeapon(weaponhand_t hand) const;
Weapon *WorstWeapon(Weapon *ignore = NULL, qboolean bGetItem = false, int iIgnoreClass = 0);
Weapon *BestWeapon(Weapon *ignore = NULL, qboolean bGetItem = false, int iIgnoreClass = 0);
Weapon *NextWeapon(Weapon *weapon);
Weapon *PreviousWeapon(Weapon *weapon);
void useWeapon(const char *weaponname, weaponhand_t hand = WEAPON_MAIN);
void useWeapon(Weapon *weapon, weaponhand_t hand = WEAPON_MAIN);
void EventUseWeapon(Event *ev);
void EventDeactivateWeapon(Event *ev);
int NumWeapons(void);
int AmmoCount(str ammo_type);
int MaxAmmoCount(str ammo_type);
int AmmoIndex(str ammo_type);
int UseAmmo(str ammo_type, int amount);
void GiveAmmo(str type, int amount, int max_amount = -1);
Ammo *FindAmmoByName(str name);
Item *giveItem(str itemname, int amount = 1);
void takeItem(const char *itemname);
void takeAmmoType(const char *ammoname);
void AddItem(Item *object);
void RemoveItem(Item *object);
void RemoveWeapons(void);
Weapon *GetWeapon(int index);
Item *FindItemByClassName(const char *classname);
Item *FindItemByModelname(const char *modelname);
Item *FindItemByExternalName(const char *externalname);
Item *FindItem(const char *itemname);
void FreeInventory(void);
void EventFreeInventory(Event *ev);
qboolean HasItem(const char *itemname);
qboolean HasWeaponClass(int iWeaponClass);
qboolean HasPrimaryWeapon(void);
qboolean HasSecondaryWeapon(void);
int NumInventoryItems(void);
Item *NextItem(Item *item);
Item *PrevItem(Item *item);
virtual void DropInventoryItems(void);
void ListInventory(void);
qboolean PowerupActive(void);
void setModel(const char *mdl);
void Archive(Archiver& arc) override;
void ArchivePersistantData(Archiver& arc);
void DoubleArmor(void);
virtual qboolean DoGib(int meansofdeath, Entity *inflictor);
void JumpXY(Event *ev);
void MeleeAttackStart(Event *ev);
void MeleeAttackEnd(Event *ev);
void BlockStart(Event *ev);
void BlockEnd(Event *ev);
void StunStart(Event *ev);
void StunEnd(Event *ev);
void SetAttackBlocked(bool blocked);
virtual void ReceivedItem(Item *item);
virtual void RemovedItem(Item *item);
virtual void AmmoAmountChanged(Ammo *ammo, int inclip = 0);
void AmmoAmountInClipChanged(str ammo_type, int amount);
void SetMaxMouthAngle(Event *ev);
void TryLightOnFire(int meansofdeath, Entity *attacker);
void OnFire(Event *ev);
void StopOnFire(Event *ev);
void SpawnBloodyGibs(Event *ev);
void SetMaxGibs(Event *ev);
virtual void GetStateAnims(Container<const char *> *c);
void SpawnEffect(str modelname, Vector pos);
bool IsNewActiveWeapon(void);
Weapon *GetNewActiveWeapon(void);
weaponhand_t GetNewActiveWeaponHand(void);
void ClearNewActiveWeapon(void);
void SetNewActiveWeapon(Weapon *weapon, weaponhand_t hand);
void Holster(qboolean putaway);
void SafeHolster(qboolean putaway);
void ActivateNewWeapon(void);
void ActivateNewWeapon(Event *ev);
void UpdateWeapons(void);
VehicleTank *GetVehicleTank(void);
void UpdateFootsteps(void);
qboolean AIDontFace() const override;
void PutawayWeapon(Event *ev);
void WeaponCommand(Event *ev);
//
// Squad stuff
//
void AssertValidSquad();
bool IsTeamMate(Sentient *pOther);
void JoinNearbySquads(float fJoinRadius = 1024.0f);
void MergeWithSquad(Sentient *pFriendly);
void DisbandSquadMate(Sentient *pExFriendly);
bool IsSquadMate(Sentient *pFriendly);
virtual bool IsDisabled() const; // Added in 2.30
Vehicle *GetVehicle() const;
void SetVehicle(Vehicle *pVehicle);
TurretGun *GetTurret() const;
void SetTurret(TurretGun *pTurret);
Entity *GetLadder() const; // Added in OPM
//
// Custom openmohaa stuff
//
void GetActiveWeap(Event *ev);
void GetNewActiveWeaponOld(Event *ev);
void GetNewActiveWeapon(Event *ev);
void GetNewActiveWeaponHand(Event *ev);
void EventClientLanding(Event *ev);
void FootstepMain(trace_t *trace, int iRunning, int iEquipment);
void Footstep(const char *szTagName, int iRunning, int iEquipment);
void LandingSound(float volume, int iEquipment);
const Container<int>& getInventory() const;
const Container<Ammo *>& getAmmoInventory() const;
};
typedef SafePtr<Sentient> SentientPtr;
extern Container<Sentient *> SentientList;
|