From 5bf6b21649515dccc7d130e045a1cdf82fb54b88 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Sun, 2 Aug 2015 23:45:57 +0600 Subject: [PATCH] Added a new reverse the functions. Implemented recovery a virtual table in GetClassPtr after linking of self class. --- regamedll/build.gradle | 5 - regamedll/common/com_model.h | 4 +- regamedll/common/event_flags.h | 2 +- regamedll/common/hltv.h | 80 + regamedll/dlls/animating.cpp | 46 +- regamedll/dlls/animation.cpp | 30 +- regamedll/dlls/basemonster.h | 58 +- regamedll/dlls/bot/cs_bot.cpp | 6 +- regamedll/dlls/bot/cs_bot.h | 17 +- regamedll/dlls/bot/cs_bot_chatter.cpp | 117 +- regamedll/dlls/bot/cs_bot_chatter.h | 25 +- regamedll/dlls/bot/cs_bot_init.cpp | 194 +- regamedll/dlls/bot/cs_bot_learn.cpp | 3 +- regamedll/dlls/bot/cs_bot_manager.cpp | 1029 ++++- regamedll/dlls/bot/cs_bot_manager.h | 67 +- regamedll/dlls/bot/cs_bot_radio.cpp | 17 +- regamedll/dlls/bot/cs_bot_statemachine.cpp | 31 +- regamedll/dlls/bot/cs_bot_update.cpp | 56 - regamedll/dlls/career_tasks.cpp | 757 +++- regamedll/dlls/career_tasks.h | 42 +- regamedll/dlls/cbase.cpp | 25 +- regamedll/dlls/cbase.h | 99 +- regamedll/dlls/cdll_dll.h | 18 +- regamedll/dlls/client.cpp | 665 +++- regamedll/dlls/client.h | 42 +- regamedll/dlls/combat.cpp | 1038 +++-- regamedll/dlls/doors.h | 4 +- regamedll/dlls/enginecallback.h | 4 + regamedll/dlls/explode.h | 4 +- regamedll/dlls/func_break.h | 2 +- regamedll/dlls/func_tank.cpp | 8 +- regamedll/dlls/gamerules.h | 10 +- regamedll/dlls/ggrenade.cpp | 1891 +++++++--- regamedll/dlls/h_export.cpp | 4 + regamedll/dlls/hintmessage.h | 24 + regamedll/dlls/hostage/hostage.cpp | 220 +- regamedll/dlls/hostage/hostage.h | 111 +- regamedll/dlls/hostage/hostage_improv.h | 53 +- regamedll/dlls/hostage/hostage_localnav.cpp | 12 +- regamedll/dlls/hostage/hostage_localnav.h | 5 +- regamedll/dlls/hostage/hostage_states.h | 4 +- regamedll/dlls/monsters.h | 16 +- regamedll/dlls/mpstubb.cpp | 21 +- regamedll/dlls/multiplay_gamerules.cpp | 121 +- regamedll/dlls/pathcorner.cpp | 2 +- regamedll/dlls/player.cpp | 3537 ++++++++++++++---- regamedll/dlls/player.h | 203 +- regamedll/dlls/saverestore.h | 22 +- regamedll/dlls/schedule.h | 296 ++ regamedll/dlls/soundent.cpp | 55 +- regamedll/dlls/soundent.h | 8 +- regamedll/dlls/subs.cpp | 2 +- regamedll/dlls/training_gamerules.cpp | 3 +- regamedll/dlls/training_gamerules.h | 3 +- regamedll/dlls/triggers.cpp | 17 +- regamedll/dlls/unisignals.h | 4 +- regamedll/dlls/util.cpp | 10 +- regamedll/dlls/util.h | 44 +- regamedll/dlls/vector.h | 90 +- regamedll/dlls/vehicle.cpp | 5 + regamedll/dlls/weapons.h | 97 +- regamedll/dlls/wpn_shared/wpn_usp.cpp | 2 +- regamedll/engine/bspfile.h | 32 +- regamedll/engine/edict.h | 2 +- regamedll/engine/keydefs.h | 146 +- regamedll/engine/model.h | 6 +- regamedll/engine/progs.h | 4 +- regamedll/game_shared/bot/bot.cpp | 1026 ++--- regamedll/game_shared/bot/bot.h | 14 +- regamedll/game_shared/bot/bot_manager.cpp | 8 +- regamedll/game_shared/bot/bot_manager.h | 24 +- regamedll/game_shared/bot/bot_profile.cpp | 53 +- regamedll/game_shared/bot/bot_util.cpp | 47 +- regamedll/game_shared/bot/bot_util.h | 13 +- regamedll/game_shared/bot/nav_area.cpp | 137 +- regamedll/game_shared/bot/nav_area.h | 2637 +++++++------ regamedll/game_shared/bot/nav_file.cpp | 8 +- regamedll/game_shared/bot/nav_file.h | 2 + regamedll/game_shared/bot/nav_node.cpp | 4 +- regamedll/game_shared/bot/nav_node.h | 11 +- regamedll/game_shared/shared_util.h | 8 +- regamedll/hookers/6153_hooker.cpp | 856 +++-- regamedll/hookers/hooker.cpp | 64 +- regamedll/hookers/hooker.h | 4 + regamedll/hookers/memory.cpp | 104 +- regamedll/hookers/memory.h | 15 + regamedll/hookers/regamedll_debug.cpp | 12 + regamedll/hookers/regamedll_debug.h | 4 + regamedll/msvc/ReGameDLL.vcxproj | 76 +- regamedll/msvc/ReGameDLL.vcxproj.filters | 6 + regamedll/pm_shared/pm_defs.h | 4 +- regamedll/pm_shared/pm_math.h | 6 +- regamedll/pm_shared/pm_shared.cpp | 2 +- regamedll/public/keydefs.h | 144 +- regamedll/public/tier0/platform.h | 2 +- regamedll/regamedll/dlls.h | 5 +- regamedll/regamedll/platform.cpp | 4 + regamedll/regamedll/precompiled.h | 6 +- regamedll/unittests/struct_offsets_tests.cpp | 17 +- 99 files changed, 11510 insertions(+), 5390 deletions(-) create mode 100644 regamedll/common/hltv.h create mode 100644 regamedll/dlls/schedule.h diff --git a/regamedll/build.gradle b/regamedll/build.gradle index cf8ecae0..3c27ff69 100644 --- a/regamedll/build.gradle +++ b/regamedll/build.gradle @@ -168,11 +168,6 @@ void setupToolchain(NativeBinarySpec b) { cfg.extraLibs 'dl', 'm', 'stdc++', 'steam_api' } - // TODO: check it - //if (!unitTestExecutable && !mpLib) { - // cfg.singleDefines 'HOOK_GAMEDLL' - //} - if (unitTestExecutable) { cfg.singleDefines 'REGAMEDLL_UNIT_TESTS' } diff --git a/regamedll/common/com_model.h b/regamedll/common/com_model.h index feb99fab..73acc2d3 100644 --- a/regamedll/common/com_model.h +++ b/regamedll/common/com_model.h @@ -299,8 +299,8 @@ typedef struct auxvert_s float fv[3]; // viewspace x, y } auxvert_t; -#define MAX_INFO_STRING 256 -#define MAX_SCOREBOARDNAME 32 +#define MAX_INFO_STRING 256 +#define MAX_SCOREBOARDNAME 32 typedef struct player_info_s { diff --git a/regamedll/common/event_flags.h b/regamedll/common/event_flags.h index 504aba1a..1134e04d 100644 --- a/regamedll/common/event_flags.h +++ b/regamedll/common/event_flags.h @@ -50,7 +50,7 @@ #define FEV_UPDATE (1<<3) // Only send to entity specified as the invoker -#define FEV_HOSTONLY (1<<4) +#define FEV_HOSTONLY (1<<4) // Only send if the event was created on the server. #define FEV_SERVER (1<<5) diff --git a/regamedll/common/hltv.h b/regamedll/common/hltv.h new file mode 100644 index 00000000..7fafc0b7 --- /dev/null +++ b/regamedll/common/hltv.h @@ -0,0 +1,80 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef HLTV_H +#define HLTV_H +#ifdef _WIN32 +#pragma once +#endif + +#define TYPE_CLIENT 0 // client is a normal HL client (default) +#define TYPE_PROXY 1 // client is another proxy +#define TYPE_COMMENTATOR 3 // client is a commentator +#define TYPE_DEMO 4 // client is a demo file + +// sub commands of svc_hltv: +#define HLTV_ACTIVE 0 // tells client that he's an spectator and will get director commands +#define HLTV_STATUS 1 // send status infos about proxy +#define HLTV_LISTEN 2 // tell client to listen to a multicast stream + +// director command types: +#define DRC_CMD_NONE 0 // NULL director command +#define DRC_CMD_START 1 // start director mode +#define DRC_CMD_EVENT 2 // informs about director command +#define DRC_CMD_MODE 3 // switches camera modes +#define DRC_CMD_CAMERA 4 // set fixed camera +#define DRC_CMD_TIMESCALE 5 // sets time scale +#define DRC_CMD_MESSAGE 6 // send HUD centerprint +#define DRC_CMD_SOUND 7 // plays a particular sound +#define DRC_CMD_STATUS 8 // HLTV broadcast status +#define DRC_CMD_BANNER 9 // set GUI banner +#define DRC_CMD_STUFFTEXT 10 // like the normal svc_stufftext but as director command +#define DRC_CMD_CHASE 11 // chase a certain player +#define DRC_CMD_INEYE 12 // view player through own eyes +#define DRC_CMD_MAP 13 // show overview map +#define DRC_CMD_CAMPATH 14 // define camera waypoint +#define DRC_CMD_WAYPOINTS 15 // start moving camera, inetranl message + +#define DRC_CMD_LAST 15 + +// DRC_CMD_EVENT event flags +#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important) +#define DRC_FLAG_SIDE (1<<4) // +#define DRC_FLAG_DRAMATIC (1<<5) // is a dramatic scene +#define DRC_FLAG_SLOWMOTION (1<<6) // would look good in SloMo +#define DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc) +#define DRC_FLAG_INTRO (1<<8) // is a introduction scene +#define DRC_FLAG_FINAL (1<<9) // is a final scene +#define DRC_FLAG_NO_RANDOM (1<<10) // don't randomize event data + +// DRC_CMD_WAYPOINT flags +#define DRC_FLAG_STARTPATH 1 // end with speed 0.0 +#define DRC_FLAG_SLOWSTART 2 // start with speed 0.0 +#define DRC_FLAG_SLOWEND 4 // end with speed 0.0 + +#endif // HLTV_H diff --git a/regamedll/dlls/animating.cpp b/regamedll/dlls/animating.cpp index 5cfdd7df..f1d90ff3 100644 --- a/regamedll/dlls/animating.cpp +++ b/regamedll/dlls/animating.cpp @@ -21,19 +21,39 @@ TYPEDESCRIPTION (*CBaseAnimating::pm_SaveData)[5]; #endif // HOOK_GAMEDLL /* <10583> ../cstrike/dlls/animating.cpp:38 */ -IMPLEMENT_SAVERESTORE(CBaseAnimating, CBaseDelay); -//NOBODY int CBaseAnimating::Save(CSave &save) -//{ -//} - -/* <10537> ../cstrike/dlls/animating.cpp:38 */ -//NOBODY int CBaseAnimating::Restore(CRestore &restore) -//{ -//} +IMPLEMENT_SAVERESTORE(CBaseAnimating, CBaseDelay); /* <105cf> ../cstrike/dlls/animating.cpp:45 */ -NOBODY float CBaseAnimating::StudioFrameAdvance(float flInterval) +float CBaseAnimating::StudioFrameAdvance(float flInterval) { + if (flInterval == 0.0f) + { + flInterval = gpGlobals->time - pev->animtime; + + if (flInterval <= 0.001) + { + pev->animtime = gpGlobals->time; + return 0; + } + } + + if (pev->animtime == 0.0f) + flInterval = 0; + + pev->frame += flInterval * m_flFrameRate * pev->framerate; + pev->animtime = gpGlobals->time; + + if (pev->frame < 0.0 || pev->frame >= 256.0) + { + if (m_fSequenceLoops) + pev->frame -= (int)(pev->frame / 256.0) * 256.0; + else + pev->frame = (pev->frame < 0) ? 0 : 255; + + m_fSequenceFinished = TRUE; + } + + return flInterval; } /* <10605> ../cstrike/dlls/animating.cpp:77 */ @@ -119,12 +139,12 @@ NOBODY float CBaseAnimating::SetBlending(int iBlender, float flValue) } /* <1092f> ../cstrike/dlls/animating.cpp:201 */ -NOBODY void CBaseAnimating::GetBonePosition(int iBone, class Vector &origin, class Vector &angles) +NOBODY void CBaseAnimating::GetBonePosition(int iBone, Vector &origin, Vector &angles) { } /* <10984> ../cstrike/dlls/animating.cpp:208 */ -NOBODY void CBaseAnimating::GetAttachment(int iAttachment, class Vector &origin, class Vector &angles) +NOBODY void CBaseAnimating::GetAttachment(int iAttachment, Vector &origin, Vector &angles) { } @@ -141,7 +161,7 @@ NOBODY int CBaseAnimating::FindTransition(int iEndingSequence, int iGoalSequence } /* <10a5d> ../cstrike/dlls/animating.cpp:234 */ -NOXREF void CBaseAnimating::GetAutomovement(Vector &origin, class Vector &angles, float flInterval) +NOXREF void CBaseAnimating::GetAutomovement(Vector &origin, Vector &angles, float flInterval) { } diff --git a/regamedll/dlls/animation.cpp b/regamedll/dlls/animation.cpp index f8b0cf5d..939f273b 100644 --- a/regamedll/dlls/animation.cpp +++ b/regamedll/dlls/animation.cpp @@ -361,42 +361,40 @@ void AngleQuaternion(vec_t *angles, vec_t *quaternion) __m128 res = _mm_add_ps(part1, part2); _mm_storeu_ps(quaternion, res); } -#else //REGAMEDLL_FIXES +#else // REGAMEDLL_FIXES void AngleQuaternion(vec_t *angles, vec_t *quaternion) { - long double sy; // st7@1 - long double cy; // st6@1 - double sp_; // qt1@1 - long double cp; // st4@1 - float sr; // ST08_4@1 - float cr; // ST04_4@1 - float ftmp0; // ST00_4@1 - float ftmp1; // [sp+10h] [bp+4h]@1 - float ftmp2; // [sp+10h] [bp+4h]@1 + float_precision sy, cy, sp_, cp; + float_precision angle; + float sr, cr; - long double angle; + float ftmp0; + float ftmp1; + float ftmp2; - angle = angles[2] * 0.5; + angle = angles[ROLL] * 0.5; sy = sin(angle); cy = cos(angle); - angle = angles[1] * 0.5; + angle = angles[YAW] * 0.5; sp_ = sin(angle); cp = cos(angle); - angle = angles[0] * 0.5; + angle = angles[PITCH] * 0.5; sr = sin(angle); cr = cos(angle); ftmp0 = sr * cp; ftmp1 = cr * sp_; + *quaternion = ftmp0 * cy - ftmp1 * sy; quaternion[1] = ftmp1 * cy + ftmp0 * sy; + ftmp2 = cr * cp; quaternion[2] = ftmp2 * sy - sp_ * sr * cy; quaternion[3] = sp_ * sr * sy + ftmp2 * cy; } -#endif //REGAMEDLL_FIXES +#endif // REGAMEDLL_FIXES /* <15c4d> ../cstrike/dlls/animation.cpp:653 */ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt) @@ -429,7 +427,7 @@ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt) sinom = sin(cosomega); sclp = sin((1.0 - t) * omega) / sinom; - sclq = sin(omega * t) / sinom; + sclq = sin((float_precision)(omega * t)) / sinom; } else { diff --git a/regamedll/dlls/basemonster.h b/regamedll/dlls/basemonster.h index b7535097..5f337221 100644 --- a/regamedll/dlls/basemonster.h +++ b/regamedll/dlls/basemonster.h @@ -32,40 +32,52 @@ #pragma once #endif +void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore = 0, int bitsDamageType = 0); +float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity); +void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); +void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); +NOXREF char *vstr(float *v); + /* <48ecff> ../cstrike/dlls/basemonster.h:18 */ class CBaseMonster: public CBaseToggle { public: NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); NOBODY virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); NOBODY virtual int TakeHealth(float flHealth, int bitsDamageType); - NOBODY virtual void Killed(entvars_t *pevAttacker, int iGib); + virtual void Killed(entvars_t *pevAttacker, int iGib); virtual int BloodColor(void) { - return m_bloodColor; + return BloodColor_(); } virtual BOOL IsAlive(void) { - return (pev->deadflag != DEAD_DEAD); + return IsAlive_(); } - NOBODY virtual float ChangeYaw(int speed); - NOBODY virtual BOOL HasHumanGibs(void); - NOBODY virtual BOOL HasAlienGibs(void); + virtual float ChangeYaw(int speed); + virtual BOOL HasHumanGibs(void); + virtual BOOL HasAlienGibs(void); NOBODY virtual void FadeMonster(void); - NOBODY virtual void GibMonster(void); + virtual void GibMonster(void); NOBODY virtual Activity GetDeathActivity(void); virtual void BecomeDead(void); - NOBODY virtual BOOL ShouldFadeOnDeath(void); + virtual BOOL ShouldFadeOnDeath(void); NOBODY virtual int IRelationship(CBaseEntity *pTarget); - NOBODY virtual void PainSound(void) {}; - NOBODY virtual void ResetMaxSpeed(void) {}; - NOBODY virtual void ReportAIState(void) {}; + virtual void PainSound(void) {} + NOBODY virtual void ResetMaxSpeed(void) {} + NOBODY virtual void ReportAIState(void) {} virtual void MonsterInitDead(void); NOBODY virtual void Look(int iDistance); NOBODY virtual CBaseEntity *BestVisibleEnemy(void); + +#ifdef _WIN32 + NOBODY virtual BOOL FInViewCone(Vector *pOrigin); + NOBODY virtual BOOL FInViewCone(CBaseEntity *pEntity); +#else NOBODY virtual BOOL FInViewCone(CBaseEntity *pEntity); NOBODY virtual BOOL FInViewCone(Vector *pOrigin); +#endif // _WIN32 #ifdef HOOK_GAMEDLL @@ -74,6 +86,14 @@ public: int TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); int TakeHealth_(float flHealth, int bitsDamageType); void Killed_(entvars_t *pevAttacker, int iGib); + int BloodColor_(void) + { + return m_bloodColor; + } + BOOL IsAlive_(void) + { + return (pev->deadflag != DEAD_DEAD); + } float ChangeYaw_(int speed); BOOL HasHumanGibs_(void); BOOL HasAlienGibs_(void); @@ -92,14 +112,14 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void MakeIdealYaw(Vector vecTarget); + void MakeIdealYaw(Vector vecTarget); NOBODY Activity GetSmallFlinchActivity(void); - NOBODY BOOL ShouldGibMonster(int iGib); - NOBODY void CallGibMonster(void); - NOBODY BOOL FCheckAITrigger(void); - NOBODY int DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); - NOBODY float DamageForce(float damage); - NOBODY void RadiusDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType); + BOOL ShouldGibMonster(int iGib); + void CallGibMonster(void); + BOOL FCheckAITrigger(void); + int DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); + float DamageForce(float damage); + void RadiusDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType); NOXREF void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType); void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType) { diff --git a/regamedll/dlls/bot/cs_bot.cpp b/regamedll/dlls/bot/cs_bot.cpp index 3d3ae1c3..a72b70ca 100644 --- a/regamedll/dlls/bot/cs_bot.cpp +++ b/regamedll/dlls/bot/cs_bot.cpp @@ -335,8 +335,12 @@ NOBODY void CCSBot::IncreaseMorale(void) } /* <2e9824> ../cstrike/dlls/bot/cs_bot.cpp:845 */ -NOBODY void CCSBot::DecreaseMorale(void) +void CCSBot::DecreaseMorale(void) { + if (m_morale > TERRIBLE) + { + m_morale = static_cast(m_morale - 1); + } } /* <2e984c> ../cstrike/dlls/bot/cs_bot.cpp:857 */ diff --git a/regamedll/dlls/bot/cs_bot.h b/regamedll/dlls/bot/cs_bot.h index da69b227..1792b8b9 100644 --- a/regamedll/dlls/bot/cs_bot.h +++ b/regamedll/dlls/bot/cs_bot.h @@ -36,6 +36,9 @@ #include "bot/cs_bot_manager.h" #include "bot/cs_bot_chatter.h" +#define CSBOT_VERSION_MAJOR 1 +#define CSBOT_VERSION_MINOR 50 + #define FLAG_PROGRESS_DRAW 0x0 // draw status bar progress #define FLAG_PROGRESS_START 0x1 // init status bar progress #define FLAG_PROGRESS_HIDE 0x2 // hide status bar progress @@ -121,6 +124,7 @@ protected: JUMP, NUM_ATTACK_STATES } m_dodgeState; + float m_nextDodgeStateTimestamp; CountdownTimer m_repathTimer; float m_scopeTimestamp; @@ -402,7 +406,7 @@ public: NOBODY virtual bool Initialize(const BotProfile *profile); NOBODY virtual void SpawnBot(void); - NOBODY virtual void Upkeep(void); + virtual void Upkeep(void); NOBODY virtual void Update(void); NOBODY virtual void Walk(void); @@ -415,6 +419,7 @@ public: NOBODY virtual bool IsVisible(CBasePlayer *player, bool testFOV = false, unsigned char *visParts = NULL) const; virtual bool IsEnemyPartVisible(VisiblePartType part) const; + #ifdef HOOK_GAMEDLL bool Initialize_(const BotProfile *profile); @@ -436,7 +441,7 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void Disconnect(void); + void Disconnect(void); float GetCombatRange(void) const { return m_combatRange; @@ -630,7 +635,7 @@ public: return m_morale; } NOBODY void IncreaseMorale(void); - NOBODY void DecreaseMorale(void); + void DecreaseMorale(void); bool IsNoiseHeard(void) const { if (m_noiseTimestamp <= 0.0f) @@ -950,7 +955,7 @@ public: NOBODY CBasePlayer *FindMostDangerousThreat(void); NOBODY void RespondToRadioCommands(void); NOBODY bool IsRadioCommand(GameEventType event); - NOBODY void EndVoiceFeedback(bool force); + void EndVoiceFeedback(bool force = true); NOBODY CNavNode *AddNode(const Vector *destPos, const Vector *normal, NavDirType dir, CNavNode *source); NOBODY void StartLearnProcess(void); NOBODY void UpdateLearnProcess(void); @@ -963,7 +968,7 @@ public: NOBODY bool AnalyzeBetaStep(void); NOBODY void StartSaveProcess(void); NOBODY void UpdateSaveProcess(void); - NOBODY void StartNormalProcess(void); + void StartNormalProcess(void); NOBODY void BotTouch(CBaseEntity *other); private: friend class CCSBotManager; @@ -1488,7 +1493,7 @@ typedef CSGameState *(CCSBot::*GETGAMESTATE_NOTCONST)(void); #endif // HOOK_GAMEDLL NOBODY void InstallBotControl(void); -NOBODY void Bot_ServerCommand(void); +void Bot_ServerCommand(void); void Bot_RegisterCvars(void); NOBODY int GetBotFollowCount(CBasePlayer *leader); NOBODY const Vector *FindNearbyRetreatSpot(CCSBot *me, float maxRange); diff --git a/regamedll/dlls/bot/cs_bot_chatter.cpp b/regamedll/dlls/bot/cs_bot_chatter.cpp index fb8678ab..227e6e4d 100644 --- a/regamedll/dlls/bot/cs_bot_chatter.cpp +++ b/regamedll/dlls/bot/cs_bot_chatter.cpp @@ -188,18 +188,99 @@ NOBODY void BotPhrase::InitVoiceBank(int bankIndex) } /* <303917> ../cstrike/dlls/bot/cs_bot_chatter.cpp:340 */ -NOBODY char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const +char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const { -// { -// int start; // 351 -// } + if (bankIndex < 0 || bankIndex >= m_numVoiceBanks || m_count[bankIndex] == 0) + { + if (duration) + *duration = 0.0f; + + return NULL; + } + + // find phrase that meets the current criteria + int start = m_index[bankIndex]; + while (true) + { + BotSpeakableVector *speakables = m_voiceBank[bankIndex]; + int &index = m_index[bankIndex]; + +#ifdef HOOK_GAMEDLL + // TODO: temporary fix of std::vector padding + *(byte *)&speakables += 4; +#endif // HOOK_GAMEDLL + + const BotSpeakable *speak = (*speakables)[index++]; + + if (m_index[bankIndex] >= m_count[bankIndex]) + m_index[bankIndex] = 0; + + // check place criteria + // if this speakable has a place criteria, it must match to be used + // speakables with Place of ANY will match any place + // speakables with a specific Place will only be used if Place matches + // speakables with Place of UNDEFINED only match Place of UNDEFINED + if (speak->m_place == ANY_PLACE || speak->m_place == m_placeCriteria) + { + // check count criteria + // if this speakable has a count criteria, it must match to be used + // if this speakable does not have a count criteria, we dont care what the count is set to + if (speak->m_count == UNDEFINED_COUNT || speak->m_count == min(m_countCriteria, COUNT_MANY)) + { + if (duration) + *duration = speak->m_duration; + + return speak->m_phrase; + } + } + + // check if we exhausted all speakables + if (m_index[bankIndex] == start) + { + if (duration) + *duration = 0.0f; + + return NULL; + } + } + + return NULL; } +void (*pBotPhrase__Randomize)(void); + /* <30395a> ../cstrike/dlls/bot/cs_bot_chatter.cpp:395 */ -NOBODY void BotPhrase::Randomize(void) +NOBODY void __declspec(naked) BotPhrase::Randomize(void) { + __asm + { + jmp pBotPhrase__Randomize + } + +// UNTESTED +// +// for (unsigned int i = 0; i < m_voiceBank.size(); i++) // { -// int i; // 397 +// BotSpeakableVector *speakables = m_voiceBank[i]; +// +//#ifdef HOOK_GAMEDLL +// // TODO: temporary fix of std::vector padding +// *(byte *)&speakables += 4; +//#endif // HOOK_GAMEDLL +// +// BotSpeakable *firstElem = speakables->front(); +// int nSize = speakables->size(); +// +// for (unsigned int index = 1; index < nSize; index++) +// { +// // TODO: check it, need hook std rand +// int randIndex = (rand() % nSize); +// +// BotSpeakable *speakable = (*speakables)[ randIndex ]; +// +// (*speakables)[ randIndex ] = (*speakables)[ index ]; +// (*speakables)[ index ] = speakable; +// } // } } @@ -217,16 +298,22 @@ NOBODY void BotPhraseManager::OnMapChange(void) } /* <303c70> ../cstrike/dlls/bot/cs_bot_chatter.cpp:425 */ -NOBODY void BotPhraseManager::OnRoundRestart(void) +void BotPhraseManager::OnRoundRestart(void) { -// { -// const_iterator iter; // 431 -// end(list> *const this); // 433 -// Randomize(BotPhrase *const this); // 434 -// operator++(_List_const_iterator *const this); // 433 -// Randomize(BotPhrase *const this); // 437 -// operator++(_List_const_iterator *const this); // 436 -// } + // effectively reset all interval timers + m_placeCount = 0; + BotPhraseList::const_iterator iter; + + // shuffle all the speakables + for (iter = m_placeList.begin(); iter != m_placeList.end(); ++iter) + { + (*iter)->Randomize(); + } + + for (iter = m_list.begin(); iter != m_list.end(); ++iter) + { + (*iter)->Randomize(); + } } /* <30c1fc> ../cstrike/dlls/bot/cs_bot_chatter.cpp:443 */ diff --git a/regamedll/dlls/bot/cs_bot_chatter.h b/regamedll/dlls/bot/cs_bot_chatter.h index e996bb30..8ad08a42 100644 --- a/regamedll/dlls/bot/cs_bot_chatter.h +++ b/regamedll/dlls/bot/cs_bot_chatter.h @@ -35,6 +35,7 @@ #define UNDEFINED_COUNT 0xFFFF #define MAX_PLACES_PER_MAP 64 #define UNDEFINED_SUBJECT (-1) +#define COUNT_MANY 4 class CCSBot; class BotChatterInterface; @@ -200,7 +201,7 @@ public: NOBODY ~BotPhrase(void); NOBODY void InitVoiceBank(int bankIndex); - NOBODY char *GetSpeakable(int bankIndex, float *duration = NULL) const; + char *GetSpeakable(int bankIndex, float *duration = NULL) const; void ClearCriteria(void) const; void SetPlaceCriteria(PlaceCriteria place) const; @@ -227,7 +228,8 @@ public: return m_isPlace; } NOBODY void Randomize(void); -private: +//private: +public: friend class BotPhraseManager; char *m_name; @@ -236,8 +238,22 @@ private: GameEventType m_radioEvent; bool m_isImportant; +#if defined(_WIN32) && defined(HOOK_GAMEDLL) + int unknown_padding; +#endif // HOOK_GAMEDLL + mutable BotVoiceBankVector m_voiceBank; + +#if defined(_WIN32) && defined(HOOK_GAMEDLL) + int unknown_padding2; +#endif // HOOK_GAMEDLL + std::vector< int > m_count; + +#if defined(_WIN32) && defined(HOOK_GAMEDLL) + int unknown_padding3; +#endif // HOOK_GAMEDLL + mutable std::vector< int > m_index; int m_numVoiceBanks; @@ -278,7 +294,7 @@ public: NOBODY bool Initialize(const char *filename, int bankIndex); // invoked when round resets - NOBODY void OnRoundRestart(void); + void OnRoundRestart(void); // invoked when map changes NOBODY void OnMapChange(void); @@ -682,4 +698,7 @@ typedef const BotPhraseManager *(BotPhraseManager::*GET_PLACE_PLACE)(PlaceCriter #endif // HOOK_GAMEDLL +// refs +extern void (*pBotPhrase__Randomize)(void); + #endif // CS_BOT_CHATTER_H diff --git a/regamedll/dlls/bot/cs_bot_init.cpp b/regamedll/dlls/bot/cs_bot_init.cpp index d8b1d621..36c18d0d 100644 --- a/regamedll/dlls/bot/cs_bot_init.cpp +++ b/regamedll/dlls/bot/cs_bot_init.cpp @@ -8,7 +8,7 @@ NOBODY void InstallBotControl(void) } /* <333cb3> ../cstrike/dlls/bot/cs_bot_init.cpp:68 */ -NOBODY void Bot_ServerCommand(void) +void Bot_ServerCommand(void) { if (TheBots != NULL) { @@ -90,23 +90,177 @@ void Bot_RegisterCvars(void) /* <3342ac> ../cstrike/dlls/bot/cs_bot_init.cpp:137 */ NOBODY bool CCSBot::Initialize_(const BotProfile *profile) { + CBot::Initialize(profile); + + m_diedLastRound = false; + m_morale = POSITIVE; + m_navNodeList = NULL; + m_currentNode = NULL; + + m_combatRange = RANDOM_FLOAT(325, 425); + m_name[0] = '\0'; + m_safeTime = m_profile->GetAggression() * 5 + 15; + + ResetValues(); + StartNormalProcess(); + + return true; } /* <3341dc> ../cstrike/dlls/bot/cs_bot_init.cpp:167 */ NOBODY void CCSBot::ResetValues(void) { -// { -// class CCSBotManager *ctrl; // 304 -// Invalidate(CountdownTimer *const this); // 175 -// Invalidate(CountdownTimer *const this); // 188 -// { -// int w; // 206 -// } -// Invalidate(IntervalTimer *const this); // 224 -// ClearHuntArea(HuntState *const this); // 294 -// Invalidate(CountdownTimer *const this); // 289 -// Invalidate(CountdownTimer *const this); // 292 -// } + m_chatter.Reset();//TODO: Reverse me + m_gameState.Reset();//TODO: Reverse me + + m_avoid = NULL; + m_avoidTimestamp = 0.0f; + + m_hurryTimer.Invalidate(); + + m_isStuck = false; + m_stuckTimestamp = 0.0f; + m_wiggleTimestamp = 0.0f; + m_stuckJumpTimestamp = 0.0f; + + m_pathLength = 0; + m_pathIndex = 0; + + m_areaEnteredTimestamp = 0.0f; + m_currentArea = NULL; + m_lastKnownArea = NULL; + + m_avoidFriendTimer.Invalidate(); + + m_isFriendInTheWay = false; + m_isWaitingBehindFriend = false; + m_disposition = ENGAGE_AND_INVESTIGATE; + + m_enemy = NULL; + m_isWaitingToTossGrenade = false; + m_wasSafe = true; + m_nearbyEnemyCount = 0; + m_enemyPlace = 0; + m_nearbyFriendCount = 0; + + m_closestVisibleFriend = NULL; + m_closestVisibleHumanFriend = NULL; + + for (int w = 0; w < ARRAYSIZE(m_watchInfo); w++) + { + m_watchInfo[w].timestamp = 0.0f; + m_watchInfo[w].isEnemy = false; + } + + m_isEnemyVisible = false; + m_visibleEnemyParts = NONE; + + m_lastSawEnemyTimestamp = 0.0f; + m_firstSawEnemyTimestamp = 0.0f; + m_currentEnemyAcquireTimestamp = 0.0f; + + m_isLastEnemyDead = true; + + m_attacker = NULL; + m_attackedTimestamp = 0.0f; + m_enemyDeathTimestamp = 0.0f; + m_lastVictimID = 0; + m_isAimingAtEnemy = false; + + m_fireWeaponTimestamp = 0.0f; + m_equipTimer.Invalidate(); + m_isFollowing = false; + m_leader = NULL; + + m_followTimestamp = 0.0f; + m_allowAutoFollowTime = 0.0f; + + m_enemyQueueIndex = 0; + m_enemyQueueCount = 0; + m_enemyQueueAttendIndex = 0; + m_bomber = NULL; + + m_lookAroundStateTimestamp = 0.0f; + m_inhibitLookAroundTimestamp = 0.0f; + m_lookPitch = 0.0f; + m_lookPitchVel = 0.0f; + m_lookYaw = 0.0f; + m_lookYawVel = 0.0f; + m_aimOffsetTimestamp = 0.0f; + m_aimSpreadTimestamp = 0.0f; + + m_lookAtSpotState = NOT_LOOKING_AT_SPOT; + m_spotEncounter = NULL; + + m_spotCheckTimestamp = 0.0f; + m_peripheralTimestamp = 0.0f; + + m_avgVelIndex = 0; + m_avgVelCount = 0; + + if (pev) + { + m_lastOrigin = pev->origin; + } + else + m_lastOrigin = Vector(0, 0, 0); + + m_lastRadioCommand = EVENT_INVALID; + + m_lastRadioRecievedTimestamp = 0.0f; + m_lastRadioSentTimestamp = 0.0f; + m_radioSubject = NULL; + + m_noisePosition = Vector(0, 0, 0); + m_noiseTimestamp = 0.0f; + m_noiseCheckTimestamp = 0.0f; + + m_voiceFeedbackEndTimestamp = 0.0f; + + m_hostageEscortCount = 0; + m_hostageEscortCountTimestamp = 0.0f; + + m_isNoiseTravelRangeChecked = false; + m_stateTimestamp = 0.0f; + + m_task = SEEK_AND_DESTROY; + m_taskEntity = NULL; + + m_approachPointCount = 0; + m_approachPointViewPosition = Vector(0, 0, 0); + + m_checkedHidingSpotCount = 0; + m_isJumpCrouching = false; + + StandUp(); + Run(); + + m_pathLadder = NULL; + m_mustRunTimer.Invalidate(); + m_repathTimer.Invalidate(); + + m_huntState.ClearHuntArea(); + + // adjust morale - if we died, our morale decreased, + // but if we live, no adjustement (round win/loss also adjusts morale + if (m_diedLastRound) + { + DecreaseMorale(); + } + + m_diedLastRound = false; + m_isRogue = false; + + m_surpriseDelay = 0.0f; + m_surpriseTimestamp = 0.0f; + + m_goalEntity = NULL; + m_avoid = NULL; + m_enemy = NULL; + + // start in idle state + StopAttacking();//TODO: Reverse me + Idle();//TODO: Reverse me } /* <3342e4> ../cstrike/dlls/bot/cs_bot_init.cpp:336 */ @@ -124,12 +278,16 @@ NOBODY void CCSBot::RoundRespawn_(void) } /* <334332> ../cstrike/dlls/bot/cs_bot_init.cpp:378 */ -NOBODY void CCSBot::Disconnect(void) +void CCSBot::Disconnect(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 386 + EndVoiceFeedback(); + + if (m_processMode) + { + MESSAGE_BEGIN(MSG_ALL, gmsgBotProgress); + WRITE_BYTE(FLAG_PROGRESS_HIDE); + MESSAGE_END(); + } } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/bot/cs_bot_learn.cpp b/regamedll/dlls/bot/cs_bot_learn.cpp index 7ca770bc..9ee1e53c 100644 --- a/regamedll/dlls/bot/cs_bot_learn.cpp +++ b/regamedll/dlls/bot/cs_bot_learn.cpp @@ -274,6 +274,7 @@ NOBODY void CCSBot::UpdateSaveProcess(void) } /* <344e24> ../cstrike/dlls/bot/cs_bot_learn.cpp:554 */ -NOBODY void CCSBot::StartNormalProcess(void) +void CCSBot::StartNormalProcess(void) { + m_processMode = PROCESS_NORMAL; } diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp index 3effaa29..d0a5bc71 100644 --- a/regamedll/dlls/bot/cs_bot_manager.cpp +++ b/regamedll/dlls/bot/cs_bot_manager.cpp @@ -41,6 +41,7 @@ float CCSBotManager::m_flNextCVarCheck; bool CCSBotManager::m_isMapDataLoaded; bool CCSBotManager::m_isLearningMap; bool CCSBotManager::m_isAnalysisRequested; +NavEditCmdType CCSBotManager::m_editCmd; #else // HOOK_GAMEDLL @@ -80,6 +81,7 @@ float (*CCSBotManager::pm_flNextCVarCheck); bool (*CCSBotManager::pm_isMapDataLoaded); bool (*CCSBotManager::pm_isLearningMap); bool (*CCSBotManager::pm_isAnalysisRequested); +NavEditCmdType (*CCSBotManager::pm_editCmd); #endif // HOOK_GAMEDLL @@ -110,14 +112,32 @@ NOBODY CCSBotManager::CCSBotManager(void) } /* <36b22a> ../cstrike/dlls/bot/cs_bot_manager.cpp:111 */ -NOBODY void CCSBotManager::RestartRound_(void) +void CCSBotManager::RestartRound_(void) { -// { -// float const defenseRushChance; // 129 -// SetLooseBomb(CCSBotManager *const this, -// class CBaseEntity *bomb); // 116 -// ResetRadioMessageTimestamps(CCSBotManager *const this); // 122 -// } + // extend + CBotManager::RestartRound(); + + SetLooseBomb(NULL); + m_isBombPlanted = false; + + m_bombDefuser = NULL; + m_earliestBombPlantTimestamp = gpGlobals->time + RANDOM_FLOAT(10, 30); + + IMPLEMENT_ARRAY(m_editCmd) = EDIT_NONE; + + ResetRadioMessageTimestamps(); + m_lastSeenEnemyTimestamp = -9999.9f; + m_roundStartTimestamp = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime"); + + // randomly decide if defensive team wants to "rush" as a whole + const float defenseRushChance = 33.3f; // 25.0f; + m_isDefenseRushing = (RANDOM_FLOAT(0, 100) <= defenseRushChance) ? true : false; + + TheBotPhrases->OnRoundRestart(); + + m_isRoundOver = false; + m_isRespawnStarted = false; + m_canRespawn = true; } /* <36aebc> ../cstrike/dlls/bot/cs_bot_manager.cpp:142 */ @@ -167,134 +187,587 @@ NOBODY bool CCSBotManager::IsOnOffense(CBasePlayer *player) const } /* <36a3b6> ../cstrike/dlls/bot/cs_bot_manager.cpp:331 */ -NOBODY void CCSBotManager::ServerActivate_(void) +void CCSBotManager::ServerActivate_(void) { + DestroyNavigationMap(); + IMPLEMENT_ARRAY(m_isMapDataLoaded) = false; -} + m_zoneCount = 0; + m_gameScenario = SCENARIO_DEATHMATCH; -/* <36afa3> ../cstrike/dlls/bot/cs_bot_manager.cpp:368 */ -NOBODY void CCSBotManager::ServerDeactivate_(void) -{ + ValidateMapData(); + RestartRound(); + IMPLEMENT_ARRAY(m_isLearningMap) = false; + IMPLEMENT_ARRAY(m_isAnalysisRequested) = false; + + m_bServerActive = true; + AddServerCommands(); + + TheBotPhrases->m_placeCount = 0; } /* <36afcd> ../cstrike/dlls/bot/cs_bot_manager.cpp:369 */ -NOBODY void CCSBotManager::AddServerCommand_(const char *cmd) +void CCSBotManager::AddServerCommand_(const char *cmd) { +#if defined(HOOK_GAMEDLL) && !defined(REGAMEDLL_UNIT_TESTS) + ADD_SERVER_COMMAND((char *)cmd, (xcommand_t)GetOriginalFuncAddrOrDefault("_Z17Bot_ServerCommandv", (void *)Bot_ServerCommand)); +#else + ADD_SERVER_COMMAND((char *)cmd, Bot_ServerCommand); +#endif // HOOK_GAMEDLL } /* <36b0e0> ../cstrike/dlls/bot/cs_bot_manager.cpp:375 */ -NOBODY void CCSBotManager::AddServerCommands_(void) +void CCSBotManager::AddServerCommands_(void) { -// { -// bool fFirstTime; // 377 -// } -// AddServerCommands(CCSBotManager *const this); // 375 + static bool fFirstTime = true; + + if (!fFirstTime) + return; + + fFirstTime = false; + + if (UTIL_IsGame("czero")) + { + AddServerCommand("bot_about"); + AddServerCommand("bot_add"); + AddServerCommand("bot_add_t"); + AddServerCommand("bot_add_ct"); + AddServerCommand("bot_kill"); + AddServerCommand("bot_kick"); + AddServerCommand("bot_knives_only"); + AddServerCommand("bot_pistols_only"); + AddServerCommand("bot_snipers_only"); + AddServerCommand("bot_all_weapons"); + AddServerCommand("entity_dump"); + AddServerCommand("bot_nav_delete"); + AddServerCommand("bot_nav_split"); + AddServerCommand("bot_nav_merge"); + AddServerCommand("bot_nav_mark"); + AddServerCommand("bot_nav_begin_area"); + AddServerCommand("bot_nav_end_area"); + AddServerCommand("bot_nav_connect"); + AddServerCommand("bot_nav_disconnect"); + AddServerCommand("bot_nav_splice"); + AddServerCommand("bot_nav_crouch"); + AddServerCommand("bot_nav_jump"); + AddServerCommand("bot_nav_precise"); + AddServerCommand("bot_nav_no_jump"); + AddServerCommand("bot_nav_analyze"); + AddServerCommand("bot_nav_strip"); + AddServerCommand("bot_nav_save"); + AddServerCommand("bot_nav_load"); + AddServerCommand("bot_nav_use_place"); + AddServerCommand("bot_nav_place_floodfill"); + AddServerCommand("bot_nav_place_pick"); + AddServerCommand("bot_nav_toggle_place_mode"); + AddServerCommand("bot_nav_toggle_place_painting"); + AddServerCommand("bot_goto_mark"); + AddServerCommand("bot_memory_usage"); + AddServerCommand("bot_nav_mark_unnamed"); + AddServerCommand("bot_nav_warp"); + AddServerCommand("bot_nav_corner_select"); + AddServerCommand("bot_nav_corner_raise"); + AddServerCommand("bot_nav_corner_lower"); + AddServerCommand("bot_nav_check_consistency"); + } +} + +/* <36b2ac> ../cstrike/dlls/bot/cs_bot_manager.cpp:413 */ +void CCSBotManager::ServerDeactivate_(void) +{ + m_bServerActive = false; +} + +/* <36b5fa> ../cstrike/dlls/bot/cs_bot_manager.cpp:415 */ +void CCSBotManager::ClientDisconnect_(CBasePlayer *pPlayer) +{ + if (!pPlayer || !pPlayer->IsBot()) + return; + + CCSBot *pBot = static_cast(pPlayer); + entvars_t *temp = VARS(pPlayer->edict()); + + pBot->Disconnect(); + + if (pPlayer->pev->classname) + RemoveEntityHashValue(pPlayer->pev, STRING(pPlayer->pev->classname), CLASSNAME); + + FREE_PRIVATE(pPlayer->edict()); + + CBasePlayer *player = GetClassPtr((CBasePlayer *)temp); + AddEntityHashValue(player->pev, STRING(player->pev->classname), CLASSNAME); + player->pev->flags = FL_DORMANT; } /* <36b714> ../cstrike/dlls/bot/cs_bot_manager.cpp:464 */ -NOBODY void PrintAllEntities(void) +void PrintAllEntities(void) { -// { -// edict_t *edict; // 466 -// { -// int i; // 468 -// } -// } + for (int i = 1; i < gpGlobals->maxEntities; i++) + { + edict_t *edict = INDEXENT(i); + + if (!edict || FStringNull(edict->v.classname)) + continue; + + CONSOLE_ECHO(" %s\n", STRING(edict->v.classname)); + } } /* <36ace2> ../cstrike/dlls/bot/cs_bot_manager.cpp:484 */ -NOBODY void CCSBotManager::ServerCommand_(const char *pcmd) +void CCSBotManager::ServerCommand_(const char *pcmd) { -// { -// const char *msg; // 496 -// char buffer; // 498 -// } -// { -// bool killThemAll; // 518 -// { -// int iIndex; // 523 -// { -// class CBasePlayer *pPlayer; // 525 -// const char *name; // 533 -// } -// } -// } -// { -// bool kickThemAll; // 548 -// { -// int iIndex; // 553 -// { -// class CBasePlayer *pPlayer; // 555 -// const char *name; // 563 -// } -// } -// } -// { -// char filename; // 696 -// } -// { -// const BotPhraseList *placeList; // 716 -// int i; // 717 -// { -// const_iterator iter; // 718 -// } -// } -// { -// const BotPhraseList *placeList; // 733 -// const class BotPhrase *found; // 734 -// bool isAmbiguous; // 735 -// { -// const_iterator iter; // 736 -// } -// } -// { -// class CNavArea *area; // 789 -// { -// class CBaseEntity *pEntity; // 792 -// { -// class CBasePlayer *playerOrBot; // 797 -// { -// class CCSBot *bot; // 801 -// } -// } -// } -// } -// { -// unsigned int encounterMem; // 829 -// { -// iterator iter; // 830 -// { -// class CNavArea *area; // 832 -// { -// iterator siter; // 834 -// { -// class SpotEncounter se; // 838 -// } -// } -// } -// } -// } + if (!m_bServerActive || !UTIL_IsGame("czero")) + return; + + char buffer[400]; + const char *msg = CMD_ARGV(1); + + if (FStrEq(pcmd, "bot_about")) + { + Q_sprintf(buffer, "\n--------------------------------------------------------------------------\nThe Official Counter-Strike Bot V%d.%02d\nCreated by Michael S. Booth\nWeb: www.turtlerockstudios.com\\csbot\nE-mail: csbot@turtlerockstudios.com\n--------------------------------------------------------------------------\n\n", CSBOT_VERSION_MAJOR, CSBOT_VERSION_MINOR); + + CONSOLE_ECHO(buffer); + HintMessageToAllPlayers(buffer); + } + else if (FStrEq(pcmd, "bot_add")) + { + BotAddCommand(BOT_TEAM_ANY); + } + else if (FStrEq(pcmd, "bot_add_t")) + { + BotAddCommand(BOT_TEAM_T); + } + else if (FStrEq(pcmd, "bot_add_ct")) + { + BotAddCommand(BOT_TEAM_CT); + } + else if (FStrEq(pcmd, "bot_kill")) + { + bool killThemAll; + if (CMD_ARGC() == 1 || FStrEq(msg, "all")) + killThemAll = true; + else + killThemAll = false; + + for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( iIndex ); + + if (pPlayer == NULL) + continue; + + if (FNullEnt(pPlayer->pev)) + continue; + + const char *name = STRING(pPlayer->pev->netname); + + if (FStrEq(name, "")) + continue; + + if (pPlayer->IsBot()) + { + if (killThemAll || FStrEq(name, msg)) + { + pPlayer->TakeDamage(pPlayer->pev, pPlayer->pev, 9999.9f, DMG_CRUSH); + } + } + } + } + else if (FStrEq(pcmd, "bot_kick")) + { + bool kickThemAll; + if (CMD_ARGC() == 1 || FStrEq(msg, "all")) + kickThemAll = true; + else + kickThemAll = false; + + for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( iIndex ); + + if (pPlayer == NULL) + continue; + + if (FNullEnt(pPlayer->pev)) + continue; + + const char *name = STRING(pPlayer->pev->netname); + + if (FStrEq(name, "")) + continue; + + if (pPlayer->IsBot()) + { + if (kickThemAll || FStrEq(name, msg)) + { + SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", name)); + CVAR_SET_FLOAT("bot_quota", cv_bot_quota.value - 1); + } + } + } + + if (kickThemAll || cv_bot_quota.value < 0.0f) + { + CVAR_SET_FLOAT("bot_quota", 0); + } + } + else if (FStrEq(pcmd, "bot_knives_only")) + { + CVAR_SET_FLOAT("bot_allow_pistols", 0); + CVAR_SET_FLOAT("bot_allow_shotguns", 0); + CVAR_SET_FLOAT("bot_allow_sub_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_rifles", 0); + CVAR_SET_FLOAT("bot_allow_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_grenades", 0); + CVAR_SET_FLOAT("bot_allow_snipers", 0); + CVAR_SET_FLOAT("bot_allow_shield", 0); + } + else if (FStrEq(pcmd, "bot_pistols_only")) + { + CVAR_SET_FLOAT("bot_allow_pistols", 1); + CVAR_SET_FLOAT("bot_allow_shotguns", 0); + CVAR_SET_FLOAT("bot_allow_sub_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_rifles", 0); + CVAR_SET_FLOAT("bot_allow_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_grenades", 0); + CVAR_SET_FLOAT("bot_allow_snipers", 0); + CVAR_SET_FLOAT("bot_allow_shield", 0); + } + else if (FStrEq(pcmd, "bot_snipers_only")) + { + CVAR_SET_FLOAT("bot_allow_pistols", 1); + CVAR_SET_FLOAT("bot_allow_shotguns", 0); + CVAR_SET_FLOAT("bot_allow_sub_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_rifles", 0); + CVAR_SET_FLOAT("bot_allow_machine_guns", 0); + CVAR_SET_FLOAT("bot_allow_grenades", 0); + CVAR_SET_FLOAT("bot_allow_snipers", 1); + CVAR_SET_FLOAT("bot_allow_shield", 0); + } + else if (FStrEq(pcmd, "bot_all_weapons")) + { + CVAR_SET_FLOAT("bot_allow_pistols", 1); + CVAR_SET_FLOAT("bot_allow_shotguns", 1); + CVAR_SET_FLOAT("bot_allow_sub_machine_guns", 1); + CVAR_SET_FLOAT("bot_allow_rifles", 1); + CVAR_SET_FLOAT("bot_allow_machine_guns", 1); + CVAR_SET_FLOAT("bot_allow_grenades", 1); + CVAR_SET_FLOAT("bot_allow_snipers", 1); + CVAR_SET_FLOAT("bot_allow_shield", 1); + } + else if (FStrEq(pcmd, "entity_dump")) + { + PrintAllEntities(); + } + else if (FStrEq(pcmd, "bot_nav_delete") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_DELETE; + } + else if (FStrEq(pcmd, "bot_nav_split") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_SPLIT; + } + else if (FStrEq(pcmd, "bot_nav_merge") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_MERGE; + } + else if (FStrEq(pcmd, "bot_nav_mark") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_MARK; + } + else if (FStrEq(pcmd, "bot_nav_begin_area") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_BEGIN_AREA; + } + else if (FStrEq(pcmd, "bot_nav_end_area") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_END_AREA; + } + else if (FStrEq(pcmd, "bot_nav_connect") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_CONNECT; + } + else if (FStrEq(pcmd, "bot_nav_disconnect") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_DISCONNECT; + } + else if (FStrEq(pcmd, "bot_nav_splice") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_SPLICE; + } + else if (FStrEq(pcmd, "bot_nav_crouch") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_CROUCH; + } + else if (FStrEq(pcmd, "bot_nav_jump") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_JUMP; + } + else if (FStrEq(pcmd, "bot_nav_precise") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_PRECISE; + } + else if (FStrEq(pcmd, "bot_nav_no_jump") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_NO_JUMP; + } + else if (FStrEq(pcmd, "bot_nav_analyze") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_isAnalysisRequested) = true; + } + else if (FStrEq(pcmd, "bot_nav_strip")) + { + StripNavigationAreas();// TODO: reverse me + } + else if (FStrEq(pcmd, "bot_nav_save")) + { + GET_GAME_DIR(buffer); + buffer[ Q_strlen(buffer) ] = '\\'; + + Q_strcat(buffer, CBotManager::GetNavMapFilename()); + + if (SaveNavigationMap(buffer))// TODO: reverse me + CONSOLE_ECHO("Navigation map '%s' saved.\n", buffer); + else + CONSOLE_ECHO("ERROR: Cannot save navigation map '%s'.\n", buffer); + } + else if (FStrEq(pcmd, "bot_nav_load")) + { + ValidateMapData(); + } + else if (FStrEq(pcmd, "bot_nav_use_place")) + { + if (CMD_ARGC() == 1) + { + int i = 0; + const BotPhraseList *placeList = TheBotPhrases->GetPlaceList(); + + for (BotPhraseList::const_iterator iter = placeList->begin(); iter != placeList->end(); ++iter, i++) + { + if ((*iter)->GetID() == GetNavPlace()) + CONSOLE_ECHO("--> %-26s", (*iter)->GetName()); + else + CONSOLE_ECHO("%-30s", (*iter)->GetName()); + + if (!(i % 3)) + CONSOLE_ECHO("\n"); + } + CONSOLE_ECHO("\n"); + } + else + { + const BotPhraseList *placeList = TheBotPhrases->GetPlaceList(); + const BotPhrase *found = NULL; + bool isAmbiguous = false; + + for (BotPhraseList::const_iterator iter = placeList->begin(); iter != placeList->end(); ++iter) + { + if (!Q_strnicmp((*iter)->GetName(), msg, Q_strlen(msg))) + { + if (!Q_strcmp((*iter)->GetName(), msg)) + { + found = (*iter); + break; + } + + if (found != NULL) + isAmbiguous = true; + else + found = (*iter); + } + } + + if (isAmbiguous) + { + CONSOLE_ECHO("Ambiguous\n"); + return; + } + + if (found != NULL) + { + CONSOLE_ECHO("Current place set to '%s'\n", found->GetName()); + m_navPlace = found->GetID(); + } + } + } + else if (FStrEq(pcmd, "bot_nav_toggle_place_mode") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_TOGGLE_PLACE_MODE; + } + else if (FStrEq(pcmd, "bot_nav_place_floodfill") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_PLACE_FLOODFILL; + } + else if (FStrEq(pcmd, "bot_nav_place_pick") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_PLACE_PICK; + } + else if (FStrEq(pcmd, "bot_nav_toggle_place_painting") ) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_TOGGLE_PLACE_PAINTING; + } + else if (FStrEq(pcmd, "bot_goto_mark") ) + { + // tell the first bot we find to go to our marked area + CNavArea *area = GetMarkedArea();// TODO: reverse me + if (area != NULL) + { + CBaseEntity *pEntity = NULL; + while ((pEntity = UTIL_FindEntityByClassname(pEntity, "player")) != NULL) + { + if (!pEntity->IsPlayer()) + continue; + + if ((pEntity->pev->flags & FL_DORMANT) == FL_DORMANT) + continue; + + CBasePlayer *playerOrBot = GetClassPtr((CBasePlayer *)pEntity->pev); + + if (playerOrBot->IsBot()) + { + CCSBot *bot = reinterpret_cast(playerOrBot); + bot->MoveTo(&area->m_center, FASTEST_ROUTE);// TODO: reverse me + return; + } + } + } + } + else if (FStrEq(pcmd, "bot_memory_usage") ) + { + CONSOLE_ECHO("Memory usage:\n"); + CONSOLE_ECHO(" %d bytes per bot\b", sizeof(CCSBot)); + CONSOLE_ECHO(" %d Navigation Areas @ %d bytes each = %d bytes\n", + TheNavAreaGrid.GetNavAreaCount(), + sizeof(CNavArea), + TheNavAreaGrid.GetNavAreaCount() * sizeof(CNavArea)); + CONSOLE_ECHO(" %d Hiding Spots @ %d bytes each = %d bytes\n", + TheHidingSpotList.size(), + sizeof(HidingSpot), + sizeof(HidingSpot) * TheHidingSpotList.size()); + + unsigned int encounterMem = 0; + for (NavAreaList::iterator iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + { + CNavArea *area = (*iter); + + for (SpotEncounterList::iterator siter = area->m_spotEncounterList.begin(); siter != area->m_spotEncounterList.end(); ++siter) + { + // TODO: Fix me + SpotEncounter se = (*siter); + + encounterMem += sizeof(SpotEncounter); + encounterMem += sizeof(SpotOrder) * se.spotList.size(); + } + } + + CONSOLE_ECHO(" Encounter Spot data = %d bytes\n", encounterMem); + } + else if (FStrEq(pcmd, "bot_nav_mark_unnamed")) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_MARK_UNNAMED; + } + else if (FStrEq(pcmd, "bot_nav_warp")) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_WARP_TO_MARK; + } + else if (FStrEq(pcmd, "bot_nav_corner_select")) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_SELECT_CORNER; + } + else if (FStrEq(pcmd, "bot_nav_corner_raise")) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_RAISE_CORNER; + } + else if (FStrEq(pcmd, "bot_nav_corner_lower")) + { + IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_LOWER_CORNER; + } + else if (FStrEq(pcmd, "bot_nav_check_consistency")) + { + if (CMD_ARGC() != 2) + { + CONSOLE_ECHO("usage: bot_nav_check_consistency \n"); + return; + } + + SanityCheckNavigationMap(msg);// TODO: reverse me + } } /* <36c3c2> ../cstrike/dlls/bot/cs_bot_manager.cpp:903 */ NOBODY bool CCSBotManager::BotAddCommand(BotProfileTeamType team, bool isFromConsole) { -// { -// const class BotProfile *profile; // 913 -// GetDifficultyLevel(void); // 958 -// { -// enum TeamName defaultTeam; // 947 -// } -// { -// class CHalfLifeMultiplay *mp; // 918 -// bool ignoreHumans; // 919 -// GetProfile(const class BotProfileManager *const this, -// const char *name, -// enum BotProfileTeamType team); // 927 -// } -// } - return false; + if (IMPLEMENT_ARRAY(m_isLearningMap) || ENG_CHECK_PARM("-nobots", NULL)) + return false; + + const BotProfile *profile = NULL; + + if (!isFromConsole || CMD_ARGC() < 2) + { + if (team == BOT_TEAM_ANY) + { + // if team not specified, check cv_bot_join_team cvar for preference + if (!Q_stricmp(cv_bot_join_team.string, "T")) + team = BOT_TEAM_T; + + else if (!Q_stricmp(cv_bot_join_team.string, "CT")) + team = BOT_TEAM_CT; + else + { + TeamName defaultTeam = SelectDefaultTeam(); + + if (defaultTeam == TERRORIST) + team = BOT_TEAM_T; + + else if (defaultTeam == CT) + team = BOT_TEAM_CT; + } + } + + // try to add a bot by name + profile = TheBotProfiles->GetRandomProfile(GetDifficultyLevel(), team); + + if (profile == NULL) + { + CONSOLE_ECHO("All bot profiles at this difficulty level are in use.\n"); + return true; + } + } + else + { + // in career, ignore humans + bool ignoreHumans = false; + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp && mp->IsCareer()) + ignoreHumans = true; + + if (UTIL_IsNameTaken(CMD_ARGV(1), ignoreHumans)) + { + CONSOLE_ECHO("Error - %s is already in the game.\n", CMD_ARGV(1)); + return true; + } + + profile = TheBotProfiles->GetProfile(CMD_ARGV(1), team); + if (profile == NULL) + { + CONSOLE_ECHO("Error - no profile for '%s' exists.\n", CMD_ARGV(1)); + return true; + } + } + + // create the bot + if (CCSBotManager::AddBot(profile, team)) // TODO: Reverse me + { + if (isFromConsole) + { + // increase the bot quota to account for manually added bot + CVAR_SET_FLOAT("bot_quota", cv_bot_quota.value + 1); + } + } + + return true; } /* <36d10f> ../cstrike/dlls/bot/cs_bot_manager.cpp:979 */ @@ -322,77 +795,266 @@ NOBODY void CCSBotManager::MonitorBotCVars(void) } /* <36b780> ../cstrike/dlls/bot/cs_bot_manager.cpp:1109 */ -NOBODY void CCSBotManager::ValidateMapData(void) +void CCSBotManager::ValidateMapData(void) { -// { -// class CBaseEntity *entity; // 1135 -// int i; // 1136 -// { -// bool found; // 1144 -// bool isLegacy; // 1145 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1159 -// Vector(Vector *const this, -// const Vector &v); // 1189 -// Instance(edict_t *pent); // 1139 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1147 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1153 -// operator+(const Vector *const this, -// const Vector &v); // 1189 -// operator/(const Vector *const this, -// float fl); // 1189 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1165 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1171 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 1178 -// } -// { -// class Zone *zone; // 1230 -// float const zFudge; // 1249 -// { -// float const legacyRange; // 1234 -// } -// { -// iterator iter; // 1255 -// { -// class CNavArea *area; // 1257 -// const class Extent *areaExtent; // 1258 -// } -// operator++(_List_iterator *const this); // 1255 -// } -// } -// edict(CBaseEntity *const this); // 1208 -// FNullEnt(const edict_t *pent); // 1208 -// } + if (IMPLEMENT_ARRAY(m_isMapDataLoaded) || !UTIL_IsGame("czero")) + { + return; + } + + IMPLEMENT_ARRAY(m_isMapDataLoaded) = true; + + // TODO: Reverse me + if (LoadNavigationMap()) + { + CONSOLE_ECHO("Failed to load navigation map.\n"); + return; + } + + CONSOLE_ECHO("Navigation map loaded.\n"); + + m_zoneCount = 0; + m_gameScenario = SCENARIO_DEATHMATCH; + + // Search all entities in the map and set the game type and + // store all zones (bomb target, etc). + + CBaseEntity *entity = NULL; + int i; + + for (i = 1; i < gpGlobals->maxEntities; i++) + { + entity = CBaseEntity::Instance(INDEXENT(i)); + + if (entity == NULL) + continue; + + bool found = false; + bool isLegacy = false; + + if (FClassnameIs(entity->pev, "func_bomb_target")) + { + found = true; + isLegacy = false; + + m_gameScenario = SCENARIO_DEFUSE_BOMB; + } + else if (FClassnameIs(entity->pev, "info_bomb_target")) + { + found = true; + isLegacy = true; + + m_gameScenario = SCENARIO_DEFUSE_BOMB; + } + else if (FClassnameIs(entity->pev, "func_hostage_rescue")) + { + found = true; + isLegacy = false; + + m_gameScenario = SCENARIO_RESCUE_HOSTAGES; + } + else if (FClassnameIs(entity->pev, "info_hostage_rescue")) + { + found = true; + isLegacy = true; + + m_gameScenario = SCENARIO_RESCUE_HOSTAGES; + } + else if (FClassnameIs(entity->pev, "hostage_entity")) + { + // some very old maps (ie: cs_assault) use info_player_start + // as rescue zones, so set the scenario if there are hostages + // in the map + m_gameScenario = SCENARIO_RESCUE_HOSTAGES; + } + else if (FClassnameIs(entity->pev, "func_vip_safetyzone")) + { + found = true; + isLegacy = false; + + m_gameScenario = SCENARIO_ESCORT_VIP; + } + + if (found) + { + if (m_zoneCount < MAX_ZONES) + { + if (isLegacy) + m_zone[ m_zoneCount ].m_center = entity->pev->origin; + else + m_zone[ m_zoneCount ].m_center = (entity->pev->absmax + entity->pev->absmin) / 2.0f; + + m_zone[ m_zoneCount ].m_isLegacy = isLegacy; + m_zone[ m_zoneCount ].m_index = m_zoneCount; + m_zone[ m_zoneCount ].m_entity = entity; + + ++m_zoneCount; + } + else + CONSOLE_ECHO("Warning: Too many zones, some will be ignored.\n"); + } + } + + // If there are no zones and the scenario is hostage rescue, + // use the info_player_start entities as rescue zones. + if (m_zoneCount == 0 && m_gameScenario == SCENARIO_RESCUE_HOSTAGES) + { + entity = NULL; + + while ((entity = UTIL_FindEntityByClassname(entity, "info_player_start")) != NULL) + { + if (FNullEnt(entity->edict())) + break; + + if (m_zoneCount < MAX_ZONES) + { + m_zone[ m_zoneCount ].m_center = entity->pev->origin; + m_zone[ m_zoneCount ].m_isLegacy = true; + m_zone[ m_zoneCount ].m_index = m_zoneCount; + m_zone[ m_zoneCount ].m_entity = entity; + + ++m_zoneCount; + } + else + CONSOLE_ECHO("Warning: Too many zones, some will be ignored.\n"); + } + } + + // Collect nav areas that overlap each zone + for (i = 0; i < m_zoneCount; i++) + { + Zone *zone = &m_zone[i]; + + if (zone->m_isLegacy) + { + const float legacyRange = 256.0f; + + zone->m_extent.lo.x = zone->m_center.x - legacyRange; + zone->m_extent.lo.y = zone->m_center.y - legacyRange; + zone->m_extent.lo.z = zone->m_center.z - legacyRange; + + zone->m_extent.hi.x = zone->m_center.x + legacyRange; + zone->m_extent.hi.y = zone->m_center.y + legacyRange; + zone->m_extent.hi.z = zone->m_center.z + legacyRange; + } + else + { + zone->m_extent.lo = zone->m_entity->pev->absmin; + zone->m_extent.hi = zone->m_entity->pev->absmax; + } + + // ensure Z overlap + const float zFudge = 50.0f; + + zone->m_areaCount = 0; + zone->m_extent.lo.z -= zFudge; + zone->m_extent.hi.z += zFudge; + + // build a list of nav areas that overlap this zone + for (NavAreaList::iterator iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + { + CNavArea *area = (*iter); + const Extent *areaExtent = area->GetExtent(); + + if (areaExtent->hi.x >= zone->m_extent.lo.x && areaExtent->lo.x <= zone->m_extent.hi.x + && areaExtent->hi.y >= zone->m_extent.lo.y && areaExtent->lo.y <= zone->m_extent.hi.y + && areaExtent->hi.z >= zone->m_extent.lo.z && areaExtent->lo.z <= zone->m_extent.hi.z) + { + // area overlaps zone + zone->m_area[ zone->m_areaCount++ ] = area; + + if (zone->m_areaCount == MAX_ZONE_NAV_AREAS) + { + break; + } + } + } + } } - -NOBODY void CCSBotManager::ClientDisconnect_(CBasePlayer *pPlayer) -{ - -} +void (*pCCSBotManager__AddBot)(void); /* <36c2b2> ../cstrike/dlls/bot/cs_bot_manager.cpp:1278 */ -NOBODY bool CCSBotManager::AddBot(BotProfile *profile, BotProfileTeamType team) +NOBODY bool __declspec(naked) CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team) { -// { -// class CHalfLifeMultiplay *mp; // 1285 -// class CCSBot *pBot; // 1286 -// int nTeamSlot; // 1287 -// { -// int nJoinedTeam; // 1329 -// edict(CBaseEntity *const this); // 1331 -// edict(CBaseEntity *const this); // 1337 -// entindex(CBaseEntity *const this); // 1337 -// { -// int skin; // 1348 -// } -// } -// } + __asm + { + jmp pCCSBotManager__AddBot + } + + //if (!UTIL_IsGame("czero")) + // return false; + + //CHalfLifeMultiplay *mp = g_pGameRules; + + //int nTeamSlot = UNASSIGNED; + // + //if (team == BOT_TEAM_ANY) + //{ + // // if team not specified, check cv_bot_join_team cvar for preference + // if (!Q_stricmp(cv_bot_join_team.string, "T")) + // nTeamSlot = TERRORIST; + + // else if (!Q_stricmp(cv_bot_join_team.string, "CT")) + // nTeamSlot = CT; + //} + //else if (team == BOT_TEAM_CT) + // nTeamSlot = CT; + + //else if (team == BOT_TEAM_T) + // nTeamSlot = TERRORIST; + + //if (nTeamSlot == UNASSIGNED) + //{ + // nTeamSlot = SelectDefaultTeam(); + //} + + //if (nTeamSlot == UNASSIGNED || mp->TeamFull(nTeamSlot)) + //{ + // CONSOLE_ECHO("Could not add bot to the game: Team is full\n"); + // return false; + //} + + //if (mp->TeamStacked(nTeamSlot, UNASSIGNED)) + //{ + // CONSOLE_ECHO("Could not add bot to the game: Team is stacked (to disable this check, set mp_limitteams and mp_autoteambalance to zero and restart the round).\n"); + // return false; + //} + + //CCSBot *pBot = CreateBot(profile); + //if (pBot == NULL) + //{ + // return false; + //} + + ////int nJoinedTeam; + //ClientPutInServer(pBot->edict()); + //SET_CLIENT_KEY_VALUE(pBot->entindex(), GET_INFO_BUFFER(pBot->edict()), "*bot", "1"); + + //pBot->m_iMenu = Menu_ChooseTeam; + //pBot->m_iJoiningState = PICKINGTEAM; + + //if (HandleMenu_ChooseTeam(pBot, nTeamSlot))//TODO: Reverse me + //{ + // int skin = profile->GetSkin(); + + // if (!skin) + // skin = 6;// MODEL_GIGN? + + // HandleMenu_ChooseAppearance(pBot, skin);//TODO: Reverse me + + // if (IS_DEDICATED_SERVER()) + // { + // UTIL_DPrintf("Added bot %s to server\n", STRING(pBot->pev->netname)); + // } + + // return true; + //} + + //SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", STRING(pBot->pev->netname))); + //CONSOLE_ECHO("Could not add bot to the game.\n"); + + //return false; } /* <36bb90> ../cstrike/dlls/bot/cs_bot_manager.cpp:1375 */ @@ -501,7 +1163,7 @@ void CCSBotManager::SetLooseBomb(CBaseEntity *bomb) m_looseBomb = bomb; if (bomb) - m_looseBombArea = TheNavAreaGrid.GetNearestNavArea( &bomb->pev->origin ); + m_looseBombArea = TheNavAreaGrid.GetNearestNavArea(&bomb->pev->origin); else m_looseBombArea = NULL; } @@ -540,14 +1202,15 @@ NOBODY void CCSBotManager::SetRadioMessageTimestamp(GameEventType event, int tea } /* <36bf06> ../cstrike/dlls/bot/cs_bot_manager.cpp:1690 */ -NOBODY void CCSBotManager::ResetRadioMessageTimestamps(void) +void CCSBotManager::ResetRadioMessageTimestamps(void) { -// { -// int t; // 1692 -// { -// int m; // 1694 -// } -// } + for (int t = 0; t < ARRAYSIZE(m_radioMsgTimestamp[0]); t++) + { + for (int m = 0; m < ARRAYSIZE(m_radioMsgTimestamp); m++) + { + m_radioMsgTimestamp[m][t] = 0.0f; + } + } } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/bot/cs_bot_manager.h b/regamedll/dlls/bot/cs_bot_manager.h index c4d114a5..6756733d 100644 --- a/regamedll/dlls/bot/cs_bot_manager.h +++ b/regamedll/dlls/bot/cs_bot_manager.h @@ -66,11 +66,12 @@ #define cv_bot_chatter (*pcv_bot_chatter) #define cv_bot_profile_db (*pcv_bot_profile_db) -#define m_flNextCVarCheck (*pm_flNextCVarCheck) -#define m_isMapDataLoaded (*pm_isMapDataLoaded) +//#define m_flNextCVarCheck (*pm_flNextCVarCheck) +//#define m_isMapDataLoaded (*pm_isMapDataLoaded) +//#define m_editCmd (*pm_editCmd) -#define m_isLearningMap (*pm_isLearningMap) -#define m_isAnalysisRequested (*pm_isAnalysisRequested) +//#define m_isLearningMap (*pm_isLearningMap) +//#define m_isAnalysisRequested (*pm_isAnalysisRequested) #endif // HOOK_GAMEDLL @@ -111,20 +112,20 @@ class CCSBotManager: public CBotManager public: CCSBotManager(void); public: - NOBODY virtual void ClientDisconnect(CBasePlayer *pPlayer); + virtual void ClientDisconnect(CBasePlayer *pPlayer); NOBODY virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd); - NOBODY virtual void ServerActivate(void); - NOBODY virtual void ServerDeactivate(void); + virtual void ServerActivate(void); + virtual void ServerDeactivate(void); NOBODY virtual void ServerCommand(const char *pcmd); - NOBODY virtual void AddServerCommand(const char *cmd); - NOBODY virtual void AddServerCommands(void); + virtual void AddServerCommand(const char *cmd); + virtual void AddServerCommands(void); - NOBODY virtual void RestartRound(void); + virtual void RestartRound(void); NOBODY virtual void StartFrame(void); - virtual void OnEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); NOBODY virtual unsigned int GetPlayerPriority(CBasePlayer *player) const; NOBODY virtual bool IsImportantPlayer(CBasePlayer *player); @@ -145,28 +146,28 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void ValidateMapData(void); + void ValidateMapData(void); bool IsLearningMap(void) { - return m_isLearningMap; + return IMPLEMENT_ARRAY(m_isLearningMap); } void SetLearningMapFlag(void) { - m_isLearningMap = true; + IMPLEMENT_ARRAY(m_isLearningMap) = true; } bool IsAnalysisRequested(void) { - return m_isAnalysisRequested; + return IMPLEMENT_ARRAY(m_isAnalysisRequested); } void RequestAnalysis(void) { - m_isAnalysisRequested = true; + IMPLEMENT_ARRAY(m_isAnalysisRequested) = true; } void AckAnalysisRequest(void) { - m_isAnalysisRequested = false; + IMPLEMENT_ARRAY(m_isAnalysisRequested) = false; } - BotDifficultyType GetDifficultyLevel(void) + static BotDifficultyType GetDifficultyLevel(void) { if (cv_bot_difficulty.value < 0.9f) return BOT_EASY; @@ -202,6 +203,7 @@ public: bool m_isLegacy; int m_index; Extent m_extent; + };/* size: 116, cachelines: 2, members: 7 */ const Zone *GetZone(int i) const @@ -295,7 +297,7 @@ public: NOBODY float GetRadioMessageTimestamp(GameEventType event, int teamID); NOBODY float GetRadioMessageInterval(GameEventType event, int teamID); NOBODY void SetRadioMessageTimestamp(GameEventType event, int teamID); - NOBODY void ResetRadioMessageTimestamps(void); + void ResetRadioMessageTimestamps(void); // return the last time anyone has seen an enemy float GetLastSeenEnemyTimestamp(void) const @@ -386,18 +388,18 @@ public: NOBODY static void MonitorBotCVars(void); NOBODY static void MaintainBotQuota(void); - NOBODY static bool AddBot(BotProfile *profile, BotProfileTeamType team); - NOBODY static bool BotAddCommand(BotProfileTeamType team, bool isFromConsole); + NOBODY static bool AddBot(const BotProfile *profile, BotProfileTeamType team); + NOBODY static bool BotAddCommand(BotProfileTeamType team, bool isFromConsole = true); #ifndef HOOK_GAMEDLL private: #else public: #endif // HOOK_GAMEDLL - static float m_flNextCVarCheck; - static bool m_isMapDataLoaded; - static bool m_isLearningMap; - static bool m_isAnalysisRequested; + static float IMPLEMENT_ARRAY(m_flNextCVarCheck); + static bool IMPLEMENT_ARRAY(m_isMapDataLoaded); + static bool IMPLEMENT_ARRAY(m_isLearningMap); + static bool IMPLEMENT_ARRAY(m_isAnalysisRequested); #ifdef HOOK_GAMEDLL private: #endif // HOOK_GAMEDLL @@ -417,7 +419,15 @@ private: float m_roundStartTimestamp; bool m_isDefenseRushing; - static NavEditCmdType m_editCmd; +#ifndef HOOK_GAMEDLL +private: +#else +public: +#endif // HOOK_GAMEDLL + static NavEditCmdType IMPLEMENT_ARRAY(m_editCmd); +#ifdef HOOK_GAMEDLL +private: +#endif // HOOK_GAMEDLL unsigned int m_navPlace; CountdownTimer m_respawnTimer; @@ -439,7 +449,7 @@ inline CCSBotManager *TheCSBots(void) return reinterpret_cast(TheBots); } -NOBODY void PrintAllEntities(void); +void PrintAllEntities(void); NOBODY void UTIL_DrawBox(Extent *extent, int lifetime, int red, int green, int blue); #ifdef HOOK_GAMEDLL @@ -449,4 +459,7 @@ typedef const CCSBotManager::Zone *(CCSBotManager::*GET_ZONE_VECTOR)(const Vecto #endif // HOOK_GAMEDLL +// refs +extern void (*pCCSBotManager__AddBot)(void); + #endif // CS_BOT_MANAGER_H diff --git a/regamedll/dlls/bot/cs_bot_radio.cpp b/regamedll/dlls/bot/cs_bot_radio.cpp index e8a500a8..f6c3ca04 100644 --- a/regamedll/dlls/bot/cs_bot_radio.cpp +++ b/regamedll/dlls/bot/cs_bot_radio.cpp @@ -15,14 +15,17 @@ NOBODY void CCSBot::StartVoiceFeedback(float duration) } /* <3a3a32> ../cstrike/dlls/bot/cs_bot_radio.cpp:241 */ -NOBODY void CCSBot::EndVoiceFeedback(bool force) +void CCSBot::EndVoiceFeedback(bool force) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 249 -// edict(CBaseEntity *const this); // 251 -// ENTINDEX(edict_t *pEdict); // 251 + if (!force && !m_voiceFeedbackEndTimestamp) + return; + + m_voiceFeedbackEndTimestamp = 0; + + MESSAGE_BEGIN(MSG_ALL, gmsgBotVoice); + WRITE_BYTE(0); + WRITE_BYTE(ENTINDEX(edict())); + MESSAGE_END(); } /* <3a3bcd> ../cstrike/dlls/bot/cs_bot_radio.cpp:259 */ diff --git a/regamedll/dlls/bot/cs_bot_statemachine.cpp b/regamedll/dlls/bot/cs_bot_statemachine.cpp index a3fa4230..d6f213e5 100644 --- a/regamedll/dlls/bot/cs_bot_statemachine.cpp +++ b/regamedll/dlls/bot/cs_bot_statemachine.cpp @@ -3,14 +3,29 @@ /* <3b3a2a> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:16 */ NOBODY void CCSBot::SetState(BotState *state) { -// StopAttacking(CCSBot *const this); // 22 + PrintIfWatched("SetState: %s -> %s\n", (m_state != NULL) ? m_state->GetName() : "NULL", state->GetName()); + + if (m_isAttacking) + { + StopAttacking(); + } + + if (m_state) + { + m_state->OnExit(this); + } + + state->OnEnter(this); + + m_state = state; + m_stateTimestamp = gpGlobals->time; } /* <3b3ab4> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:34 */ NOBODY void CCSBot::Idle(void) { -// SetTask(CCSBot::Idle(// enum TaskType task, -// class CBaseEntity *entity); // 36 + SetTask(SEEK_AND_DESTROY); + SetState(&m_idleState); } /* <3b3afa> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:41 */ @@ -208,7 +223,15 @@ NOBODY void CCSBot::Attack(CBasePlayer *victim) /* <3b4416> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:366 */ NOBODY void CCSBot::StopAttacking(void) { -// Idle(CCSBot *const this); // 374 + PrintIfWatched("ATTACK END\n"); + m_attackState.OnExit(this);//TODO: Reverse me + m_isAttacking = false; + + // if we are following someone, go to the Idle state after the attack to decide whether we still want to follow + if (IsFollowing()) + { + Idle(); + } } /* <3b447d> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:378 */ diff --git a/regamedll/dlls/bot/cs_bot_update.cpp b/regamedll/dlls/bot/cs_bot_update.cpp index d7d77de9..9cfa70f7 100644 --- a/regamedll/dlls/bot/cs_bot_update.cpp +++ b/regamedll/dlls/bot/cs_bot_update.cpp @@ -339,59 +339,3 @@ void CCSBot::Update(void) } #endif // HOOK_GAMEDLL - - - - - - - - - - - //m_aimSpot = m_enemy->pev->origin; - - //if (GetProfile()->GetSkill() > 0.5f) - //{ - // const float k = 3.0f; - // m_aimSpot = (m_enemy->pev->velocity - pev->velocity) * g_flBotCommandInterval * k + m_enemy->pev->origin; - // //printf2(__FUNCTION__":: iNum - %d | %f", iNum++, GetProfile()->GetSkill()); - //} - - //if (IsUsingAWP() || IsUsingShotgun() || IsUsingMachinegun() || GetProfile()->GetSkill() < 0.8f || (IsActiveWeaponRecoilHigh() && !IsUsingPistol() && !IsUsingSniperRifle())) - //{ - // if (IsEnemyPartVisible( CHEST )) - // { - // m_aimSpot.z -= feetOffset * 0.25f; - // goto LABEL_41; - // } - //} - - //if (IsEnemyPartVisible( CHEST )) - //{ - // m_aimSpot.z -= feetOffset * 0.5f; - //} - //else if (IsEnemyPartVisible( HEAD )) - //{ - // //goto LABEL_41; - //} - //else if (IsEnemyPartVisible( LEFT_SIDE )) - //{ - // Vector2D to = (m_enemy->pev->origin - pev->origin).Make2D(); - // to.NormalizeInPlace(); - - // m_aimSpot.x -= to.y * 16.0f; - // m_aimSpot.y += to.x * 16.0f; - // m_aimSpot.z -= feetOffset * 0.5f; - //} - //else if (IsEnemyPartVisible( RIGHT_SIDE )) - //{ - // Vector2D to = (m_enemy->pev->origin - pev->origin).Make2D(); - // to.NormalizeInPlace(); - - // m_aimSpot.x += to.y * 16.0f; - // m_aimSpot.y -= to.x * 16.0f; - // m_aimSpot.z -= feetOffset * 0.5f; - //} - //else // FEET - // m_aimSpot.z -= (feetOffset + feetOffset); \ No newline at end of file diff --git a/regamedll/dlls/career_tasks.cpp b/regamedll/dlls/career_tasks.cpp index 3d9c42a8..42c2250f 100644 --- a/regamedll/dlls/career_tasks.cpp +++ b/regamedll/dlls/career_tasks.cpp @@ -7,182 +7,474 @@ CCareerTaskManager *TheCareerTasks = NULL; -#else +const TaskInfo taskInfo[] = +{ + { "defuse", EVENT_BOMB_DEFUSED, &CCareerTask::NewTask }, + { "plant", EVENT_BOMB_PLANTED, &CCareerTask::NewTask }, + { "rescue", EVENT_HOSTAGE_RESCUED, &CCareerTask::NewTask }, + { "killall", EVENT_KILL_ALL, &CCareerTask::NewTask }, + { "kill", EVENT_KILL, &CCareerTask::NewTask }, + { "killwith", EVENT_KILL, &CCareerTask::NewTask }, + { "killblind", EVENT_KILL_FLASHBANGED, &CCareerTask::NewTask }, + { "killvip", EVENT_KILL, &CCareerTask::NewTask }, + { "headshot", EVENT_HEADSHOT, &CCareerTask::NewTask }, + { "headshotwith", EVENT_HEADSHOT, &CCareerTask::NewTask }, + { "winfast", EVENT_ROUND_WIN, &CCareerTask::NewTask }, + { "rescue", EVENT_HOSTAGE_RESCUED, &CCareerTask::NewTask }, + { "rescueall", EVENT_ALL_HOSTAGES_RESCUED, &CCareerTask::NewTask }, + { "injure", EVENT_PLAYER_TOOK_DAMAGE, &CCareerTask::NewTask }, + { "injurewith", EVENT_PLAYER_TOOK_DAMAGE, &CCareerTask::NewTask }, + { "killdefuser", EVENT_KILL, &CCareerTask::NewTask }, + { "stoprescue", EVENT_KILL, &CCareerTask::NewTask }, + { "defendhostages", EVENT_ROUND_WIN, &CCareerTask::NewTask }, + { "hostagessurvive", EVENT_ROUND_WIN, &CCareerTask::NewTask }, + { "preventdefuse", EVENT_ROUND_WIN, &CPreventDefuseTask::NewTask }, + { NULL, EVENT_INVALID, &CCareerTask::NewTask } +}; + +#else // HOOK_GAMEDLL CCareerTaskManager *TheCareerTasks; +const TaskInfo taskInfo[21]; #endif // HOOK_GAMEDLL /* <1ef647> ../cstrike/dlls/career_tasks.cpp:133 */ -NOBODY CCareerTask *CPreventDefuseTask::NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) +CCareerTask *CPreventDefuseTask::NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) { -// CPreventDefuseTask(// const char *taskName, -// enum GameEventType event, -// const char *weaponName, -// int n, -// bool mustLive, -// bool crossRounds, -// int id, -// bool isComplete); // 135 + CPreventDefuseTask *pNewTask = new CPreventDefuseTask(taskName, event, weaponName, n, mustLive, crossRounds, id, isComplete); + + pNewTask->m_bombPlantedThisRound = false; + pNewTask->m_defuseStartedThisRound = false; + + return (CCareerTask *)pNewTask; } /* <1ef5db> ../cstrike/dlls/career_tasks.cpp:139 */ -NOBODY CPreventDefuseTask::CPreventDefuseTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) +CPreventDefuseTask::CPreventDefuseTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) { - //CCareerTask(taskName, event, weaponName, n, mustLive, crossRounds, id, isComplete); + CCareerTask(taskName, event, weaponName, n, mustLive, crossRounds, id, isComplete); + + m_bombPlantedThisRound = false; + m_defuseStartedThisRound = false; } /* <1ef296> ../cstrike/dlls/career_tasks.cpp:147 */ -NOBODY void CPreventDefuseTask::Reset(void) +void CPreventDefuseTask::Reset_(void) { + m_bombPlantedThisRound = false; + m_defuseStartedThisRound = false; + + CCareerTask::Reset(); } /* <1efbf8> ../cstrike/dlls/career_tasks.cpp:156 */ -NOBODY void CPreventDefuseTask::OnEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CPreventDefuseTask::OnEvent_(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) { -// OnEvent(CPreventDefuseTask *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 156 + if (IsComplete()) + return; + + if (event == EVENT_BOMB_PLANTED) + { + m_bombPlantedThisRound = true; + } + else if (event == EVENT_BOMB_DEFUSING) + { + m_defuseStartedThisRound = true; + } + + CCareerTask::OnEvent(event, pAttacker, pVictim); + + if (event >= EVENT_ROUND_DRAW && event <= EVENT_ROUND_LOSS) + { + m_bombPlantedThisRound = false; + m_defuseStartedThisRound = false; + } } /* <1ef4e1> ../cstrike/dlls/career_tasks.cpp:186 */ -NOBODY CCareerTask *CCareerTask::NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) +CCareerTask *CCareerTask::NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) { + CCareerTask *pTask = new CCareerTask(taskName, event, weaponName, n, mustLive, crossRounds, id, isComplete); + return pTask; } /* <1ef43f> ../cstrike/dlls/career_tasks.cpp:192 */ -NOBODY CCareerTask::CCareerTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) +CCareerTask::CCareerTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 217 + m_isComplete = isComplete; + m_event = event; + m_eventsNeeded = n; + + m_name = taskName; + m_eventsSeen = 0; + m_mustLive = mustLive; + m_crossRounds = crossRounds; + m_diedThisRound = false; + m_id = id; + m_weaponId = AliasToWeaponID(weaponName); + m_weaponClassId = AliasToWeaponClass(weaponName); + + m_rescuer = (Q_stricmp(taskName, "stoprescue") == 0); + m_defuser = (Q_stricmp(taskName, "killdefuser") == 0); + m_vip = (Q_stricmp(taskName, "killvip") == 0); + + if (event == EVENT_ALL_HOSTAGES_RESCUED) + { + m_mustLive = true; + m_crossRounds = false; + } + + if (m_isComplete) + { + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_id); + MESSAGE_END(); + } } /* <1ef211> ../cstrike/dlls/career_tasks.cpp:240 */ -NOBODY void CCareerTask::Reset(void) +void CCareerTask::Reset_(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 244 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 248 + m_eventsSeen = 0; + m_isComplete = false; + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKUNDONE"); + WRITE_BYTE(m_id); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKPART"); + WRITE_BYTE(m_id); + WRITE_SHORT(m_eventsSeen); + MESSAGE_END(); } /* <1ef74c> ../cstrike/dlls/career_tasks.cpp:256 */ -NOBODY void CCareerTask::SendPartialNotification(void) +void CCareerTask::SendPartialNotification(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 258 + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKPART"); + WRITE_BYTE(m_id); + WRITE_SHORT(m_eventsSeen); + MESSAGE_END(); + + UTIL_LogPrintf("Career Task Partial %d %d\n", m_id, m_eventsSeen); } /* <1efc6c> ../cstrike/dlls/career_tasks.cpp:268 */ -NOBODY void CCareerTask::OnWeaponKill(int weaponId, int weaponClassId, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CCareerTask::OnWeaponKill(int weaponId, int weaponClassId, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) { -// { -// int hostages; // 298 -// class CBaseEntity *hostageEntity; // 299 -// { -// class CHostage *hostage; // 303 -// IsFollowingSomeone(CHostage *const this); // 304 -// IsValid(CHostage *const this); // 306 -// } -// } -// SendPartialNotification(CCareerTask *const this); // 341 + if (m_isComplete || m_event != EVENT_KILL && (m_event != EVENT_HEADSHOT || !headshot)) + { + return; + } + + if (!pVictim || (m_defuser && !pVictim->m_bIsDefusing) || (m_vip && !pVictim->m_bIsVIP)) + { + return; + } + + if (m_rescuer) + { + int hostages_ = 0; + CBaseEntity *hostageEntity = NULL; + + while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) + { + CHostage *hostage = (CHostage *)hostageEntity; + + if (!hostage || hostage->pev->takedamage != DAMAGE_YES) + continue; + + if (hostage->m_improv) + { + if (!hostage->IsFollowingSomeone()) + continue; + } + else if (!hostage->m_hTargetEnt || hostage->m_State != CHostage::FOLLOW) + continue; + + if (hostage->IsValid() && hostage->m_target == pAttacker) + ++hostages_; + } + + if (!hostages_) + return; + } + + if (m_weaponId == WEAPON_SHIELDGUN) + { + if (!killerHasShield) + return; + } + else if (m_weaponId) + { + if (m_weaponId != weaponId) + return; + } + else if (m_weaponClassId) + { + if (m_weaponClassId != weaponClassId) + return; + } + + ++m_eventsSeen; + SendPartialNotification(); } /* <1efe16> ../cstrike/dlls/career_tasks.cpp:348 */ -NOBODY void CCareerTask::OnWeaponInjury(int weaponId, int weaponClassId, bool attackerHasShield, CBasePlayer *pAttacker) +void CCareerTask::OnWeaponInjury(int weaponId, int weaponClassId, bool attackerHasShield, CBasePlayer *pAttacker) { -// SendPartialNotification(CCareerTask *const this); // 379 + if (m_isComplete || m_event != EVENT_PLAYER_TOOK_DAMAGE) + { + return; + } + + if (m_weaponId == WEAPON_SHIELDGUN) + { + if (!attackerHasShield) + return; + } + else if (m_weaponId) + { + if (m_weaponId != weaponId) + return; + } + else if (m_weaponClassId) + { + if (m_weaponClassId != weaponClassId) + return; + } + + ++m_eventsSeen; + SendPartialNotification(); } /* <1ef79d> ../cstrike/dlls/career_tasks.cpp:385 */ -NOBODY void CCareerTask::OnEvent(GameEventType event, CBasePlayer *pVictim, CBasePlayer *pAttacker) +void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlayer *pAttacker) { -// { -// int hostages; // 411 -// class CBaseEntity *hostageEntity; // 412 -// { -// class CHostage *hostage; // 416 -// IsFollowingSomeone(CHostage *const this); // 417 -// IsValid(CHostage *const this); // 419 -// } -// } -// GetRoundElapsedTime(CCareerTaskManager *const this); // 515 -// { -// int hostages; // 494 -// class CBaseEntity *hostageEntity; // 495 -// { -// class CHostage *hostage; // 499 -// IsDead(CHostage *const this); // 500 -// } -// } -// { -// int hostages; // 460 -// class CBaseEntity *hostageEntity; // 461 -// { -// class CHostage *hostage; // 465 -// IsValid(CHostage *const this); // 466 -// } -// SendPartialNotification(CCareerTask *const this); // 476 -// } -// SendPartialNotification(CCareerTask *const this); // 535 -// SendPartialNotification(CCareerTask *const this); // 611 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 545 -// GetRoundElapsedTime(CCareerTaskManager *const this); // 559 -// SetFinishedTaskTime(CCareerTaskManager *const this, -// int val); // 559 -// SendPartialNotification(CCareerTask *const this); // 571 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 587 -// GetRoundElapsedTime(CCareerTaskManager *const this); // 596 -// SetFinishedTaskTime(CCareerTaskManager *const this, -// int val); // 596 + if (m_isComplete) + return; + + if (event == m_event) + { + if ((m_defuser && !pAttacker->m_bIsDefusing) || (m_vip && !pAttacker->m_bIsVIP)) + return; + + if (m_rescuer) + { + int hostages_ = 0; + CBaseEntity *hostageEntity = NULL; + + while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) + { + CHostage *hostage = (CHostage *)hostageEntity; + + if (!hostage || hostage->pev->takedamage != DAMAGE_YES) + continue; + + if (hostage->m_improv) + { + if (!hostage->IsFollowingSomeone()) + continue; + } + else if (!hostage->m_hTargetEnt || hostage->m_State != CHostage::FOLLOW) + continue; + + if (hostage->IsValid() && hostage->m_target == pAttacker) + ++hostages_; + } + + if (!hostages_) + return; + } + + if ((m_event != EVENT_KILL || (!m_weaponId && !m_weaponClassId)) + && (m_event != EVENT_HEADSHOT || (!m_weaponId && !m_weaponClassId)) + && (m_event != EVENT_PLAYER_TOOK_DAMAGE || (!m_weaponId && !m_weaponClassId))) + { + + if (m_event == EVENT_ROUND_WIN) + { + if (!Q_strcmp(m_name, "defendhostages")) + { + int hostages_ = 0; + CBaseEntity *hostageEntity = NULL; + + while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) + { + CHostage *hostage = (CHostage *)hostageEntity; + + if (!hostage || hostage->IsValid()) + continue; + + if (hostage->pev->deadflag != DEAD_DEAD) + ++hostages_; + } + + if (!hostages_) + { + ++m_eventsSeen; + SendPartialNotification(); + } + } + else if (!Q_strcmp(m_name, "hostagessurvive")) + { + int hostages_ = 0; + CBaseEntity *hostageEntity = NULL; + + while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) + { + CHostage *hostage = (CHostage *)hostageEntity; + + if (hostage && hostage->IsDead()) + ++hostages_; + } + + if (!hostages_) + { + ++m_eventsSeen; + SendPartialNotification(); + } + } + else if (!Q_strcmp(m_name, "winfast")) + { + if (m_eventsNeeded >= (int)TheCareerTasks->GetRoundElapsedTime()) + { + m_eventsSeen = m_eventsNeeded; + SendPartialNotification(); + } + } + else if (IsTaskCompletableThisRound()) + SendPartialNotification(); + } + } + } + + if (event == m_event && !m_mustLive && (m_eventsSeen >= m_eventsNeeded) && IsTaskCompletableThisRound()) + { + CBasePlayer *player = UTIL_GetLocalPlayer(); + EMIT_SOUND(ENT(player->pev), CHAN_VOICE, "events/task_complete.wav", VOL_NORM, ATTN_NORM); + m_isComplete = true; + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_id); + MESSAGE_END(); + + if (TheTutor) + TheTutor->OnEvent(EVENT_CAREER_TASK_DONE); + + UTIL_LogPrintf("Career Task Done %d\n", m_id); + + if (m_event == EVENT_ROUND_WIN && !Q_strcmp(m_name, "winfast")) + { + TheCareerTasks->SetFinishedTaskTime( TheCareerTasks->GetRoundElapsedTime() ); + player->SyncRoundTimer(); + } + + return; + } + else if (event >= EVENT_ROUND_DRAW) + { + if (event > EVENT_ROUND_LOSS) + { + if (event == EVENT_DIE && (m_mustLive || m_crossRounds)) + { + m_eventsSeen = 0; + SendPartialNotification(); + m_diedThisRound = true; + } + } + else if (m_mustLive) + { + CBasePlayer *player = UTIL_GetLocalPlayer(); + + if (m_eventsSeen >= m_eventsNeeded && !m_diedThisRound && IsTaskCompletableThisRound()) + { + EMIT_SOUND(ENT(player->pev), CHAN_VOICE, "events/task_complete.wav", VOL_NORM, ATTN_NORM); + + m_isComplete = true; + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_id); + MESSAGE_END(); + + UTIL_LogPrintf("Career Task Done %d\n", m_id); + + if (m_event == EVENT_ROUND_WIN && !Q_strcmp(m_name, "winfast")) + { + TheCareerTasks->SetFinishedTaskTime( TheCareerTasks->GetRoundElapsedTime() ); + player->SyncRoundTimer(); + } + + if (TheTutor) + TheTutor->OnEvent(EVENT_CAREER_TASK_DONE); + } + + m_diedThisRound = false; + if (m_mustLive) + { + m_eventsSeen = 0; + SendPartialNotification(); + } + } + } } /* <1efeed> ../cstrike/dlls/career_tasks.cpp:623 */ -NOBODY void CCareerTaskManager::Create(void) +void CCareerTaskManager::Create(void) { -// CCareerTaskManager(CCareerTaskManager *const this); // 631 + if (TheCareerTasks != NULL) + { + TheCareerTasks->Reset(); + return; + } + + TheCareerTasks = new CCareerTaskManager; } /* <1eff77> ../cstrike/dlls/career_tasks.cpp:636 */ -NOBODY CCareerTaskManager::CCareerTaskManager(void) +CCareerTaskManager::CCareerTaskManager(void) { -// list(list> *const this); // 636 + m_taskTime = 0; + Reset(); } /* <1effeb> ../cstrike/dlls/career_tasks.cpp:643 */ -NOBODY void CCareerTaskManager::Reset(bool deleteTasks) +void CCareerTaskManager::Reset(bool deleteTasks) { -// { -// CareerTaskListIt it; // 647 -// operator++(_List_iterator *const this); // 647 -// } -// clear(list> *const this); // 651 -// { -// CareerTaskListIt it; // 656 -// { -// class CCareerTask *pTask; // 658 -// } -// operator++(_List_iterator *const this); // 656 -// } + if (deleteTasks) + { + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + delete (*it); + } + + m_tasks.clear(); + m_nextId = 0; + } + else + { + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + CCareerTask *pTask = (*it); + pTask->Reset(); + } + } + + m_finishedTaskTime = 0; + m_finishedTaskRound = 0; + m_shouldLatchRoundEndMessage = false; + + m_roundStartTime = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime"); } /* <1f014e> ../cstrike/dlls/career_tasks.cpp:671 */ -NOBODY void CCareerTaskManager::SetFinishedTaskTime(int val) +void CCareerTaskManager::SetFinishedTaskTime(int val) { CHalfLifeMultiplay *mp = g_pGameRules; @@ -191,139 +483,198 @@ NOBODY void CCareerTaskManager::SetFinishedTaskTime(int val) } /* <1f018b> ../cstrike/dlls/career_tasks.cpp:679 */ -NOBODY void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, int eventCount, bool mustLive, bool crossRounds, bool isComplete) +void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, int eventCount, bool mustLive, bool crossRounds, bool isComplete) { -// { -// int i; // 683 -// push_back(list> *const this, -// const value_type &__x); // 696 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 714 + ++m_nextId; + + for (int i = 0; i < ARRAYSIZE(taskInfo); i++) + { + const TaskInfo *pTaskInfo = &taskInfo[ i ]; + + if (pTaskInfo->taskName != NULL) + { + if (!Q_stricmp(pTaskInfo->taskName, taskName)) + { + CCareerTask *newTask = pTaskInfo->factory + ( + pTaskInfo->taskName, + pTaskInfo->event, + weaponName, + eventCount, + mustLive, + crossRounds, + m_nextId, + isComplete + ); + + m_tasks.push_back(newTask); + + if (pTaskInfo->event == EVENT_ROUND_WIN && Q_strcmp(taskName, "winfast")) + { + m_taskTime = eventCount; + + if (isComplete) + m_finishedTaskTime = eventCount; + } + + return; + } + } + } + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_nextId); + MESSAGE_END(); } /* <1f0381> ../cstrike/dlls/career_tasks.cpp:721 */ -NOBODY void CCareerTaskManager::HandleEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CCareerTaskManager::HandleEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) { -// { -// CareerTaskListIt it; // 741 -// operator++(_List_iterator *const this); // 741 -// } + if (event == EVENT_ROUND_START) + m_roundStartTime = gpGlobals->time; + + else if ((event <= EVENT_ROUND_LOSS && event >= EVENT_ROUND_DRAW) && m_shouldLatchRoundEndMessage) + { + m_roundEndMessage = event; + return; + } + + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + (*it)->OnEvent(event, pAttacker, pVictim); + } } /* <1f0462> ../cstrike/dlls/career_tasks.cpp:748 */ -NOBODY void CCareerTaskManager::HandleWeaponKill(int weaponId, int weaponClassId, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CCareerTaskManager::HandleWeaponKill(int weaponId, int weaponClassId, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) { -// { -// CareerTaskListIt it; // 750 -// operator++(_List_iterator *const this); // 750 -// } + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + (*it)->OnWeaponKill(weaponId, weaponClassId, headshot, killerHasShield, pAttacker, pVictim); + } } /* <1f04ed> ../cstrike/dlls/career_tasks.cpp:757 */ -NOBODY void CCareerTaskManager::HandleEnemyKill(bool wasBlind, const char *weaponName, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CCareerTaskManager::HandleEnemyKill(bool wasBlind, const char *weaponName, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim) { -// HandleWeaponKill(CCareerTaskManager *const this, -// int weaponId, -// int weaponClassId, -// bool headshot, -// bool killerHasShield, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 759 -// HandleEvent(CCareerTaskManager *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 760 -// HandleEvent(CCareerTaskManager *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 764 -// HandleEvent(CCareerTaskManager *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 762 + HandleWeaponKill(AliasToWeaponID(weaponName), AliasToWeaponClass(weaponName), headshot, killerHasShield, pAttacker, pVictim); + + HandleEvent(EVENT_KILL, pAttacker, pVictim); + + if (headshot) + { + HandleEvent(EVENT_HEADSHOT, pAttacker, pVictim); + } + if (wasBlind) + { + HandleEvent(EVENT_KILL_FLASHBANGED, pAttacker, pVictim); + } } /* <1f079c> ../cstrike/dlls/career_tasks.cpp:768 */ -NOBODY void CCareerTaskManager::HandleWeaponInjury(int weaponId, int weaponClassId, bool attackerHasShield, CBasePlayer *pAttacker) +void CCareerTaskManager::HandleWeaponInjury(int weaponId, int weaponClassId, bool attackerHasShield, CBasePlayer *pAttacker) { -// { -// CareerTaskListIt it; // 770 -// operator++(_List_iterator *const this); // 770 -// } + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + (*it)->OnWeaponInjury(weaponId, weaponClassId, attackerHasShield, pAttacker); + } } /* <1f0815> ../cstrike/dlls/career_tasks.cpp:777 */ -NOBODY void CCareerTaskManager::HandleEnemyInjury(const char *weaponName, bool attackerHasShield, CBasePlayer *pAttacker) +void CCareerTaskManager::HandleEnemyInjury(const char *weaponName, bool attackerHasShield, CBasePlayer *pAttacker) { -// HandleWeaponInjury(CCareerTaskManager *const this, -// int weaponId, -// int weaponClassId, -// bool attackerHasShield, -// class CBasePlayer *pAttacker); // 779 -// HandleEvent(CCareerTaskManager *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 780 + HandleWeaponInjury(AliasToWeaponID(weaponName), AliasToWeaponClass(weaponName), attackerHasShield, pAttacker); + HandleEvent(EVENT_PLAYER_TOOK_DAMAGE); } /* <1f094e> ../cstrike/dlls/career_tasks.cpp:784 */ -NOBODY void CCareerTaskManager::HandleDeath(int team, CBasePlayer *pAttacker) +void CCareerTaskManager::HandleDeath(int team, CBasePlayer *pAttacker) { -// { -// int enemyTeam; // 786 -// int numEnemies; // 790 -// { -// int i; // 791 -// { -// class CBasePlayer *pPlayer; // 793 -// } -// } -// HandleEvent(CCareerTaskManager *const this, -// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 801 -// } + int enemyTeam = (Q_strcmp(humans_join_team.string, "CT") != 0) ? CT : TERRORIST; + int numEnemies = 0; + + if (enemyTeam != team) + return; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i ); + + if (pPlayer && pPlayer->m_iTeam == enemyTeam && pPlayer->IsAlive()) + ++numEnemies; + } + + if (!numEnemies) + { + HandleEvent(EVENT_KILL_ALL); + } } /* <1f0a5d> ../cstrike/dlls/career_tasks.cpp:805 */ -NOBODY bool CCareerTaskManager::AreAllTasksComplete(void) +bool CCareerTaskManager::AreAllTasksComplete(void) { -// { -// CareerTaskListIt it; // 807 -// operator++(_List_iterator *const this); // 807 -// } + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + if (!(*it)->IsComplete()) + return false; + } + + return true; } /* <1f0abc> ../cstrike/dlls/career_tasks.cpp:818 */ -NOBODY int CCareerTaskManager::GetNumRemainingTasks(void) +int CCareerTaskManager::GetNumRemainingTasks(void) { -// { -// int ret; // 820 -// { -// CareerTaskListIt it; // 821 -// operator++(_List_iterator *const this); // 821 -// } -// } + int ret = 0; + for (CareerTaskListIt it = m_tasks.begin(); it != m_tasks.end(); ++it) + { + if (!(*it)->IsComplete()) + ret++; + } + + return ret; } /* <1f0b33> ../cstrike/dlls/career_tasks.cpp:832 */ float CCareerTaskManager::GetRoundElapsedTime(void) { - return gpGlobals->time - m_roundStartTime; + return (gpGlobals->time - m_roundStartTime); } /* <1f0b56> ../cstrike/dlls/career_tasks.cpp:838 */ -NOBODY void CCareerTaskManager::LatchRoundEndMessage(void) +void CCareerTaskManager::LatchRoundEndMessage(void) { + m_shouldLatchRoundEndMessage = true; } /* <1f0b81> ../cstrike/dlls/career_tasks.cpp:844 */ -NOBODY void CCareerTaskManager::UnlatchRoundEndMessage(void) +void CCareerTaskManager::UnlatchRoundEndMessage(void) { -// HandleEvent(CCareerTaskManager::UnlatchRoundEndMessage(// enum GameEventType event, -// class CBasePlayer *pAttacker, -// class CBasePlayer *pVictim); // 847 + m_shouldLatchRoundEndMessage = false; + HandleEvent(m_roundEndMessage); } + +#ifdef HOOK_GAMEDLL + +void CCareerTask::OnEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) +{ + OnEvent_(event, pAttacker, pVictim); +} + +void CCareerTask::Reset(void) +{ + Reset_(); +} + +void CPreventDefuseTask::OnEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) +{ + OnEvent_(event, pAttacker, pVictim); +} + +void CPreventDefuseTask::Reset(void) +{ + Reset_(); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/career_tasks.h b/regamedll/dlls/career_tasks.h index f532fe46..854fc7c0 100644 --- a/regamedll/dlls/career_tasks.h +++ b/regamedll/dlls/career_tasks.h @@ -44,9 +44,21 @@ public: virtual void OnEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim); virtual void Reset(void); virtual bool IsTaskCompletableThisRound(void) + { + return IsTaskCompletableThisRound_(); + } + +#ifdef HOOK_GAMEDLL + + void OnEvent_(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim); + void Reset_(void); + bool IsTaskCompletableThisRound_(void) { return true; } + +#endif // HOOK_GAMEDLL + public: static CCareerTask *NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete); @@ -70,7 +82,10 @@ public: { return m_weaponClassId; } - bool IsValidFor(CBasePlayer *pPlayer); + bool IsValidFor(CBasePlayer *pPlayer)//! + { + return true; + } void SendPartialNotification(void); private: @@ -105,13 +120,13 @@ public: public: static void Create(void); - void Reset(bool deleteTasks); + void Reset(bool deleteTasks = true); void AddTask(const char *taskName, const char *weaponName, int eventCount, bool mustLive, bool crossRounds, bool isComplete); - void HandleEvent(GameEventType event, class CBasePlayer *pAttacker, CBasePlayer *pVictim); + void HandleEvent(GameEventType event, CBasePlayer *pAttacker = NULL, CBasePlayer *pVictim = NULL); void HandleEnemyKill(bool wasBlind, const char *weaponName, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim); void HandleWeaponKill(int weaponId, int weaponClassId, bool headshot, bool killerHasShield, CBasePlayer *pAttacker, CBasePlayer *pVictim); - void HandleDeath(int team, CBasePlayer *pAttacker); + void HandleDeath(int team, CBasePlayer *pAttacker = NULL); void HandleWeaponInjury(int weaponId, int weaponClassId, bool attackerHasShield, CBasePlayer *pAttacker); void HandleEnemyInjury(const char *weaponName, bool attackerHasShield, CBasePlayer *pAttacker); @@ -123,7 +138,6 @@ public: return m_taskTime; } void SetFinishedTaskTime(int val); - int GetFinishedTaskTime(void) { return m_finishedTaskTime; @@ -136,7 +150,6 @@ public: { return &m_tasks; } - void LatchRoundEndMessage(void); void UnlatchRoundEndMessage(void); @@ -158,8 +171,8 @@ private: bool m_shouldLatchRoundEndMessage; };/* size: 36, cachelines: 1, members: 8 */ - -typedef CCareerTask *(*TaskFactoryFunction)(const char *, GameEventType, const char *, int, bool, bool, int, bool); + +typedef CCareerTask *(*TaskFactoryFunction)(const char *taskName, GameEventType event, const char *weaponName, int eventCount, bool mustLive, bool crossRounds, int nextId, bool isComplete); struct TaskInfo { @@ -178,10 +191,21 @@ public: virtual void OnEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim); virtual void Reset(void); virtual bool IsTaskCompletableThisRound(void) + { + return IsTaskCompletableThisRound_(); + } + +#ifdef HOOK_GAMEDLL + + void OnEvent_(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim); + void Reset_(void); + bool IsTaskCompletableThisRound_(void) { return m_bombPlantedThisRound && !m_defuseStartedThisRound; } +#endif // HOOK_GAMEDLL + public: static CCareerTask *NewTask(const char *taskName, GameEventType event, const char *weaponName, int n, bool mustLive, bool crossRounds, int id, bool isComplete); @@ -194,9 +218,11 @@ protected: #ifdef HOOK_GAMEDLL #define TheCareerTasks (*pTheCareerTasks) +#define taskInfo (*ptaskInfo) #endif // HOOK_GAMEDLL extern CCareerTaskManager *TheCareerTasks; +extern const TaskInfo taskInfo[21]; #endif // CAREER_TASK_H diff --git a/regamedll/dlls/cbase.cpp b/regamedll/dlls/cbase.cpp index 4ed96cca..5bc41f50 100644 --- a/regamedll/dlls/cbase.cpp +++ b/regamedll/dlls/cbase.cpp @@ -744,10 +744,29 @@ NOBODY int CBaseEntity::IsDormant(void) } /* <30221> ../cstrike/dlls/cbase.cpp:1069 */ -NOBODY BOOL CBaseEntity::IsInWorld_(void) +BOOL CBaseEntity::IsInWorld_(void) { -// IsInWorld(CBaseEntity *const this); // 1069 - return FALSE; + // position + if (pev->origin.x >= 4096.0 || pev->origin.y >= 4096.0 || pev->origin.z >= 4096.0) + { + return FALSE; + } + if (pev->origin.x <= -4096.0 || pev->origin.y <= -4096.0 || pev->origin.z <= -4096.0) + { + return FALSE; + } + + // speed + if (pev->velocity.x >= 2000.0 || pev->velocity.y >= 2000.0 || pev->velocity.z >= 2000.0) + { + return FALSE; + } + if (pev->velocity.x <= -2000.0 || pev->velocity.y <= -2000.0 || pev->velocity.z <= -2000.0) + { + return FALSE; + } + + return TRUE; } /* <31c8c> ../cstrike/dlls/cbase.cpp:1089 */ diff --git a/regamedll/dlls/cbase.h b/regamedll/dlls/cbase.h index bfcc29f6..53eba1fe 100644 --- a/regamedll/dlls/cbase.h +++ b/regamedll/dlls/cbase.h @@ -103,7 +103,7 @@ #define bits_CAP_MELEE_ATTACK1 (1<<13) #define bits_CAP_MELEE_ATTACK2 (1<<14) #define bits_CAP_FLY (1<<15) -#define bits_CAP_DOORS_GROUP (bits_CAP_USE|bits_CAP_AUTO_DOORS|bits_CAP_OPEN_DOORS) +#define bits_CAP_DOORS_GROUP (bits_CAP_USE | bits_CAP_AUTO_DOORS | bits_CAP_OPEN_DOORS) #define DMG_GENERIC 0 #define DMG_CRUSH (1<<0) @@ -132,13 +132,14 @@ #define DMG_SLOWFREEZE (1<<22) #define DMG_MORTAR (1<<23) #define DMG_EXPLOSION (1<<24) -#define DMG_GIB_CORPSE (DMG_CRUSH|DMG_FALL|DMG_BLAST|DMG_SONIC|DMG_CLUB) -#define DMG_SHOWNHUD (DMG_POISON|DMG_ACID|DMG_FREEZE|DMG_SLOWFREEZE|DMG_DROWN|DMG_BURN|DMG_SLOWBURN|DMG_NERVEGAS|DMG_RADIATION|DMG_SHOCK) +#define DMG_GIB_CORPSE (DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB) +#define DMG_SHOWNHUD (DMG_POISON | DMG_ACID | DMG_FREEZE | DMG_SLOWFREEZE | DMG_DROWN | DMG_BURN | DMG_SLOWBURN | DMG_NERVEGAS | DMG_RADIATION | DMG_SHOCK) -#define SF_NORESPAWN (1<<30) +#define SF_NORESPAWN (1 << 30) -#define PARALYZE_DURATION 2 -#define PARALYZE_DAMAGE 1.0f +#define AIRTIME 12 // lung full of air lasts this many seconds +#define PARALYZE_DURATION 2 // number of 2 second intervals to take damage +#define PARALYZE_DAMAGE 1.0f // damage to take each 2 second interval #define NERVEGAS_DURATION 2 #define NERVEGAS_DAMAGE 5.0f @@ -349,8 +350,11 @@ public: { return CLASS_NONE; } - virtual void DeathNotice(entvars_t *pevChild) {} - NOBODY virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); + virtual void DeathNotice(entvars_t *pevChild) + { + return DeathNotice_(pevChild); + } + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); NOBODY virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); virtual int TakeHealth(float flHealth, int bitsDamageType); NOBODY virtual void Killed(entvars_t *pevAttacker, int iGib); @@ -373,25 +377,25 @@ public: } virtual int GetToggleState(void) { - return TS_AT_TOP; + return GetToggleState_(); } - virtual void AddPoints(int score, BOOL bAllowNegativeScore) {} - virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore) {} + virtual void AddPoints(int score, BOOL bAllowNegativeScore) {} // __stdcall + virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore) {} // __stdcall virtual BOOL AddPlayerItem(CBasePlayerItem *pItem) { return FALSE; } - virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem) + virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem) // __stdcall { return FALSE; } - virtual int GiveAmmo(int iAmount, char *szName, int iMax) + virtual int GiveAmmo(int iAmount, char *szName, int iMax) // __stdcall { return -1; } virtual float GetDelay(void) { - return 0.0f; + return GetDelay_(); } virtual int IsMoving(void) { @@ -426,7 +430,7 @@ public: { return FStrEq(STRING(targetname),STRING(pev->targetname)); } - NOBODY virtual BOOL IsInWorld(void); + virtual BOOL IsInWorld(void); virtual BOOL IsPlayer(void) { return FALSE; @@ -483,19 +487,48 @@ public: } virtual Vector BodyTarget(const Vector &posSrc) { - return Center(); + return BodyTarget_(posSrc); } virtual int Illumination(void) { return GETENTITYILLUM(ENT(pev)); } + +#ifdef _WIN32 + NOBODY virtual BOOL FVisible(Vector &vecOrigin); + NOBODY virtual BOOL FVisible(CBaseEntity *pEntity); +#else NOBODY virtual BOOL FVisible(CBaseEntity *pEntity); NOBODY virtual BOOL FVisible(Vector &vecOrigin); +#endif // _WIN32 #ifdef HOOK_GAMEDLL int Save_(CSave &save); int Restore_(CRestore &restore); + void DeathNotice_(entvars_t *pevChild) { } + void TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); + int TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); + int TakeHealth_(float flHealth, int bitsDamageType); + void Killed_(entvars_t *pevAttacker, int iGib); + void TraceBleed_(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); + int GetToggleState_(void) + { + return TS_AT_TOP; + } + float GetDelay_(void) + { + return 0.0f; + } + int DamageDecal_(int bitsDamageType); + BOOL IsInWorld_(void); + CBaseEntity *GetNextTarget_(void); + Vector BodyTarget_(const Vector &posSrc) + { + return Center(); + } + BOOL FVisible_(CBaseEntity *pEntity); + BOOL FVisible_(Vector &vecOrigin); #endif // HOOK_GAMEDLL @@ -533,9 +566,9 @@ public: { return (CBaseEntity *)GET_PRIVATE(pent ? pent : ENT(0)); } - static CBaseEntity *Instance(entvars_t *pevit) + static CBaseEntity *Instance(entvars_t *pev) { - return Instance(ENT(pevit)); + return Instance(ENT(pev)); } static CBaseEntity *Instance(int offset) { @@ -614,21 +647,6 @@ public: int m_iSwing; bool has_disconnected; -#ifdef HOOK_GAMEDLL - - void TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); - int TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); - int TakeHealth_(float flHealth, int bitsDamageType); - void Killed_(entvars_t *pevAttacker, int iGib); - void TraceBleed_(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); - int DamageDecal_(int bitsDamageType); - BOOL IsInWorld_(void); - CBaseEntity *GetNextTarget_(void); - BOOL FVisible_(CBaseEntity *pEntity); - BOOL FVisible_(Vector &vecOrigin); - -#endif // HOOK_GAMEDLL - };/* size: 152, cachelines: 3, members: 35 */ /* <48d2a5> ../cstrike/dlls/cbase.h:273 */ @@ -741,7 +759,7 @@ class CBaseAnimating: public CBaseDelay public: NOBODY virtual int Save(CSave &save); NOBODY virtual int Restore(CRestore &restore); - virtual void HandleAnimEvent(MonsterEvent_t *pEvent) { } + virtual void HandleAnimEvent(MonsterEvent_t *pEvent) {} #ifdef HOOK_GAMEDLL @@ -752,7 +770,7 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY float StudioFrameAdvance(float flInterval = 0.0f); + float StudioFrameAdvance(float flInterval = 0.0f); BOOL GetSequenceFlags(void); int LookupActivity(int activity); NOBODY int LookupActivityHeaviest(int activity); @@ -1041,10 +1059,13 @@ public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[1]; int m_preset; + };/* size: 156, cachelines: 3, members: 3 */ -template T *GetClassPtr(T *a) +template +T *GetClassPtr(T *a) { + T *backup = a; entvars_t *pev = (entvars_t *)a; if (!pev) pev = VARS(CREATE_ENTITY()); @@ -1053,6 +1074,11 @@ template T *GetClassPtr(T *a) { a = new(pev) T; a->pev = pev; + +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) + VirtualTableInit((void *)a, stripClass(typeid(T).name())); +#endif // _WIN32 && HOOK_GAMEDLL + } return a; } @@ -1102,5 +1128,6 @@ typedef CBaseEntity *(CBaseEntity::*CBASE_ISTANCE_INT)(int); //Refs extern int (*pDispatchSpawn)(edict_t *); +extern void (*pCGib__SpawnHeadGib)(void); #endif // CBASE_H diff --git a/regamedll/dlls/cdll_dll.h b/regamedll/dlls/cdll_dll.h index b1c6562b..d3e83df1 100644 --- a/regamedll/dlls/cdll_dll.h +++ b/regamedll/dlls/cdll_dll.h @@ -39,9 +39,9 @@ #define DEFAULT_FOV 90 // the default field of view -#define HIDEHUD_WEAPONS (1<<0) -#define HIDEHUD_FLASHLIGHT (1<<1) -#define HIDEHUD_ALL (1<<2) +#define HIDEHUD_WEAPONS (1<<0) +#define HIDEHUD_FLASHLIGHT (1<<1) +#define HIDEHUD_ALL (1<<2) #define HIDEHUD_HEALTH (1<<3) #define HIDEHUD_TIMER (1<<4) #define HIDEHUD_MONEY (1<<5) @@ -78,6 +78,18 @@ #define DATA_IUSER3_INBOMBZONE (1<<2) #define DATA_IUSER3_HOLDINGSHIELD (1<<3) +#define VGUI_MENU_TEAM 2 +#define VGUI_MENU_MAPBRIEFING 4 +#define VGUI_MENU_CLASS_T 26 +#define VGUI_MENU_CLASS_CT 27 +#define VGUI_MENU_BUY 28 +#define VGUI_MENU_BUY_PISTOL 29 +#define VGUI_MENU_BUY_SHOTGUN 30 +#define VGUI_MENU_BUY_RIFLE 31 +#define VGUI_MENU_BUY_SUBMACHINEGUN 32 +#define VGUI_MENU_BUY_MACHINEGUN 33 +#define VGUI_MENU_BUY_ITEM 34 + #define MAX_AMMO_TYPES 32 // ??? #define MAX_AMMO_SLOTS 32 // not really slots diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 5ffe838f..28559eb7 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -8,7 +8,7 @@ //float g_flTimeLimit = 0; //float g_flResetTime = 0; -//bool g_bClientPrintEnable = true; +bool g_bClientPrintEnable = true; char *sPlayerModelFiles[] = { @@ -58,11 +58,13 @@ static entity_field_alias_t custom_entity_field_alias[] = { "animtime", 0 }, } +static int g_serveractive = 0; + #else //float g_flTimeLimit; //float g_flResetTime; -//bool g_bClientPrintEnable; +bool g_bClientPrintEnable; char *sPlayerModelFiles[12]; bool g_skipCareerInitialSpawn; @@ -70,6 +72,7 @@ bool g_skipCareerInitialSpawn; entity_field_alias_t entity_field_alias[6]; entity_field_alias_t player_field_alias[3]; entity_field_alias_t custom_entity_field_alias[9]; +int g_serveractive; #endif // HOOK_GAMEDLL @@ -78,51 +81,120 @@ unsigned short m_usResetDecals; unsigned short g_iShadowSprite; /* <47b45> ../cstrike/dlls/client.cpp:76 */ -NOBODY int CMD_ARGC_(void) +NOXREF int CMD_ARGC_(void) { -// { -// int i; // 80 -// } + UNTESTED + + if (!UseBotArgs) + return CMD_ARGC(); + + int i = 0; + + while (BotArgs[i]) + i++; + + return i; } /* <47b84> ../cstrike/dlls/client.cpp:90 */ -NOBODY const char *CMD_ARGV_(int i) +NOXREF const char *CMD_ARGV_(int i) { + UNTESTED + + if (!UseBotArgs) + return CMD_ARGV(i); + + if (i < 4) + return BotArgs[i]; + + return NULL; } /* <47eac> ../cstrike/dlls/client.cpp:180 */ -NOBODY void set_suicide_frame(entvars_t *pev) +NOXREF void set_suicide_frame(entvars_t *pev) { -// FStrEq(const char *sz1, -// const char *sz2); // 182 + if (!FStrEq(STRING(pev->model), "models/player.mdl")) + return; + + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_TOSS; + pev->deadflag = DEAD_DEAD; + pev->nextthink = -1; } /* <47a58> ../cstrike/dlls/client.cpp:192 */ -NOBODY inline void TeamChangeUpdate(CBasePlayer *player, int team_id) +NOXREF void TeamChangeUpdate(CBasePlayer *player, int team_id) { + UNTESTED + // { // int t; // 194 // } + MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo); + WRITE_BYTE(player->entindex()); + switch (team_id) + { + case CT: + WRITE_STRING("CT"); + break; + case TERRORIST: + WRITE_STRING("TERRORIST"); + break; + case SPECTATOR: + WRITE_STRING("SPECTATOR"); + break; + default: + WRITE_STRING("UNASSIGNED"); + break; + } + MESSAGE_END(); + + if (team_id != UNASSIGNED) + player->SetScoreboardAttributes(); } /* <4731f> ../cstrike/dlls/client.cpp:222 */ -NOBODY inline void BlinkAccount(CBasePlayer *player, int numBlinks) +NOXREF void BlinkAccount(CBasePlayer *player, int numBlinks) { + MESSAGE_BEGIN(MSG_ONE, gmsgBlinkAcct, NULL, player->pev); + WRITE_BYTE(numBlinks); + MESSAGE_END(); } /* <47efd> ../cstrike/dlls/client.cpp:236 */ -NOBODY BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) +BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) { + return g_pGameRules->ClientConnected(pEntity, pszName, pszAddress, szRejectReason); } /* <47f5b> ../cstrike/dlls/client.cpp:255 */ -NOBODY void ClientDisconnect(edict_t *pEntity) +void ClientDisconnect(edict_t *pEntity) { -// { -// class CBasePlayer *pPlayer; // 257 -// class CSound *pSound; // 276 -// Instance(edict_t *pent); // 257 -// } + CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pEntity); + + if (!g_fGameOver) + { + UTIL_ClientPrintAll(HUD_PRINTNOTIFY, "#Game_disconnected", STRING(pEntity->v.netname)); + CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(pEntity)); + + if (pSound) + pSound->Reset(); + + pEntity->v.takedamage = DAMAGE_NO; + pEntity->v.solid = SOLID_NOT; + pEntity->v.flags = FL_DORMANT; + + if (pPlayer) + pPlayer->SetThink(NULL); + + UTIL_SetOrigin(&pEntity->v, pEntity->v.origin); + g_pGameRules->ClientDisconnected(pEntity); + } + + if (pPlayer && pPlayer->IsBot()) + { + TheBots->ClientDisconnect(pPlayer); + } } /* <4c477> ../cstrike/dlls/client.cpp:306 */ @@ -148,90 +220,240 @@ void respawn(entvars_t *pev, BOOL fCopyCorpse) } /* <48013> ../cstrike/dlls/client.cpp:347 */ -NOBODY void ClientKill(edict_t *pEntity) +void ClientKill(edict_t *pEntity) { -// { -// entvars_t *pev; // 349 -// class CHalfLifeMultiplay *mp; // 350 -// class CBasePlayer *pl; // 352 -// Instance(entvars_t *pev); // 352 -// IsObserver(CBasePlayer *const this); // 354 -// } + entvars_t *pev = &pEntity->v; + CHalfLifeMultiplay *mp = g_pGameRules; + CBasePlayer *pl = (CBasePlayer *)CBasePlayer::Instance(pev); + + if (pl->IsObserver()) + return; + + if (pl->m_iJoiningState != JOINED) + return; + + if (gpGlobals->time >= pl->m_fNextSuicideTime) + { + pl->m_LastHitGroup = 0; + pl->m_fNextSuicideTime = gpGlobals->time + 1; + pEntity->v.health = 0; + pl->Killed(pev, GIB_NEVER); + + if (mp->m_pVIP == pl) + mp->m_iConsecutiveVIP = 10; + } } /* <47a8a> ../cstrike/dlls/client.cpp:379 */ -NOBODY void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText) +void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText) { + MESSAGE_BEGIN(MSG_ONE, gmsgShowMenu, NULL, pPlayer->pev); + WRITE_SHORT(bitsValidSlots); + WRITE_CHAR(nDisplayTime); + WRITE_BYTE(fNeedMore); + WRITE_STRING(pszText); + MESSAGE_END(); } /* <4735f> ../cstrike/dlls/client.cpp:390 */ -NOBODY void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu) +void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu) { + if (pPlayer->m_bVGUIMenus || MenuType > VGUI_MENU_BUY_ITEM) + { + MESSAGE_BEGIN(MSG_ONE, gmsgVGUIMenu, NULL, pPlayer->pev); + WRITE_BYTE(MenuType); + WRITE_SHORT(BitMask); + WRITE_CHAR(-1); + WRITE_BYTE(0); + WRITE_STRING(" "); + MESSAGE_END(); + } + else + ShowMenu(pPlayer, BitMask, -1, 0, szOldMenu); } /* <4c3c5> ../cstrike/dlls/client.cpp:414 */ -NOBODY int CountTeams(void) +NOXREF int CountTeams(void) { -// { -// int iNumCT; // 416 -// int iNumTerrorist; // 416 -// class CBaseEntity *pPlayer; // 421 -// class CBasePlayer *player; // 422 -// edict(CBaseEntity *const this); // 425 -// FNullEnt(const edict_t *pent); // 425 -// } + int iNumCT = 0, iNumTerrorist = 0; + CBaseEntity *pPlayer = NULL; + + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + + if (player->m_iTeam == UNASSIGNED) + continue; + + if (player->pev->flags & FL_DORMANT) + continue; + + if (player->m_iTeam == SPECTATOR) + continue; + + if (player->m_iTeam == CT) + iNumCT++; + + else if (player->m_iTeam == TERRORIST) + iNumTerrorist++; + } + + return iNumCT - iNumTerrorist; } /* <4c2be> ../cstrike/dlls/client.cpp:443 */ -NOBODY void ListPlayers(CBasePlayer *current) +void ListPlayers(CBasePlayer *current) { -// { -// class CBaseEntity *pPlayer; // 445 -// class CBasePlayer *player; // 446 -// char message; // 447 -// char cNumber; // 448 -// int iUserID; // 449 -// edict(CBaseEntity *const this); // 454 -// FNullEnt(const edict_t *pent); // 454 -// edict(CBaseEntity *const this); // 460 -// } + char message[120], cNumber[12]; + Q_strcpy(message, ""); + + CBaseEntity *pPlayer = NULL; + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + if (pPlayer->pev->flags & FL_DORMANT) + continue; + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + int iUserID = GETPLAYERUSERID(ENT(player->pev)); + + Q_sprintf(cNumber, "%d", iUserID); + Q_strcpy(message, "\n"); + Q_strcat(message, cNumber); + Q_strcat(message, " : "); + Q_strcat(message, STRING(player->pev->netname)); + + ClientPrint(current->pev, HUD_PRINTCONSOLE, message); + } + + ClientPrint(current->pev, HUD_PRINTCONSOLE, "\n"); } /* <4c200> ../cstrike/dlls/client.cpp:475 */ -NOBODY int CountTeamPlayers(int iTeam) +int CountTeamPlayers(int iTeam) { -// { -// class CBaseEntity *pPlayer; // 477 -// int i; // 478 -// } + CBaseEntity *pPlayer = NULL; + int i = 0; + + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + if (pPlayer->pev->flags & FL_DORMANT) + continue; + + if (GetClassPtr((CBasePlayer *)pPlayer->pev)->m_iTeam == iTeam) + i++; + } + + return i; } /* <4c4ef> ../cstrike/dlls/client.cpp:494 */ -NOBODY void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer) +void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer) { -// { -// class CBaseEntity *pTempEntity; // 500 -// class CBasePlayer *pTempPlayer; // 501 -// int iValidVotes; // 502 -// int iVoteID; // 503 -// int iVotesNeeded; // 504 -// float fKickPercent; // 505 -// int iTeamCount; // 507 -// CountTeamPlayers(int iTeam); // 507 -// edict(CBaseEntity *const this); // 560 -// FNullEnt(const edict_t *pent); // 560 -// edict(CBaseEntity *const this); // 517 -// FNullEnt(const edict_t *pent); // 517 -// } + CBaseEntity *pTempEntity; + CBasePlayer *pTempPlayer; + int iValidVotes; + int iVoteID; + int iVotesNeeded; + float fKickPercent; + + if (!pVotingPlayer || !pKickPlayer) + return; + + int iTeamCount = CountTeamPlayers(pVotingPlayer->m_iTeam); + + if (iTeamCount < 3) + return; + + iValidVotes = 0; + pTempEntity = NULL; + iVoteID = pVotingPlayer->m_iCurrentKickVote; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (!pTempPlayer || pTempPlayer->m_iTeam == UNASSIGNED) + continue; + + if (pTempPlayer->m_iTeam == pVotingPlayer->m_iTeam && pTempPlayer->m_iCurrentKickVote == iVoteID) + iValidVotes++; + } + + if (kick_percent.value < 0) + CVAR_SET_STRING("mp_kickpercent", "0.0"); + + else if (kick_percent.value > 1) + CVAR_SET_STRING("mp_kickpercent", "1.0"); + + iVotesNeeded = iValidVotes; + fKickPercent = (iTeamCount * kick_percent.value + 0.5); + + if (iVotesNeeded >= (int)fKickPercent) + { + UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Game_kicked", STRING(pKickPlayer->pev->netname)); + SERVER_COMMAND(UTIL_VarArgs("kick # %d\n", iVoteID)); + pTempEntity = NULL; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (!pTempPlayer || pTempPlayer->m_iTeam == UNASSIGNED) + continue; + + if (pTempPlayer->m_iTeam == pVotingPlayer->m_iTeam && pTempPlayer->m_iCurrentKickVote == iVoteID) + pTempPlayer->m_iCurrentKickVote = 0; + } + } } /* <48298> ../cstrike/dlls/client.cpp:580 */ -NOBODY TeamName SelectDefaultTeam(void) +TeamName SelectDefaultTeam(void) { -// { -// enum TeamName team; // 582 -// class CHalfLifeMultiplay *mp; // 583 -// } + TeamName team = UNASSIGNED; + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp->m_iNumTerrorist < mp->m_iNumCT) + team = TERRORIST; + else if (mp->m_iNumTerrorist > mp->m_iNumCT) + team = CT; + + else if (mp->m_iNumCTWins > mp->m_iNumTerroristWins) + team = TERRORIST; + + else if (mp->m_iNumCTWins < mp->m_iNumTerroristWins) + team = CT; + else + team = RANDOM_LONG(0, 1) ? TERRORIST : CT; + + if (mp->TeamFull(team)) + { + if (team == TERRORIST) + team = CT; + else + team = TERRORIST; + + if (mp->TeamFull(team)) + return UNASSIGNED; + } + + return team; + } /* <473a3> ../cstrike/dlls/client.cpp:638 */ @@ -246,31 +468,123 @@ void CheckStartMoney(void) } /* <4c084> ../cstrike/dlls/client.cpp:661 */ -NOBODY void ClientPutInServer(edict_t *pEntity) +void ClientPutInServer(edict_t *pEntity) { -// { -// class CBasePlayer *pPlayer; // 663 -// class CBaseEntity *Target; // 664 -// Vector CamAngles; // 665 -// class CHalfLifeMultiplay *mp; // 666 -// entvars_t *pev; // 668 -// char sName; // 777 -// CheckStartMoney(void); // 696 -// { -// char *pApersand; // 781 -// } -// operator-(const Vector *const this, -// const Vector &v); // 761 -// Normalize(const Vector *const this); // 762 -// } + entvars_t *pev = &pEntity->v; + CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev); + CHalfLifeMultiplay *mp = g_pGameRules; + + pPlayer->SetCustomDecalFrames(-1); + pPlayer->SetPrefsFromUserinfo(GET_INFO_BUFFER(pEntity)); + + if (!mp->IsMultiplayer()) + { + pPlayer->Spawn(); + return; + } + + pPlayer->m_bNotKilled = true; + pPlayer->m_iIgnoreGlobalChat = IGNOREMSG_NONE; + pPlayer->m_iTeamKills = 0; + pPlayer->m_bJustConnected = true; + pPlayer->Spawn(); + pPlayer->m_bTeamChanged = false; + pPlayer->m_iNumSpawns = 0; + + CheckStartMoney(); + + pPlayer->m_iAccount = (int)startmoney.value; + pPlayer->m_fGameHUDInitialized = FALSE; + pPlayer->m_flDisplayHistory &= ~DHF_ROUND_STARTED; + pPlayer->pev->flags |= FL_SPECTATOR; + pPlayer->pev->solid = SOLID_NOT; + pPlayer->pev->movetype = MOVETYPE_NOCLIP; + pPlayer->pev->effects = EF_NODRAW; + pPlayer->pev->effects |= EF_NOINTERP; + pPlayer->pev->takedamage = DAMAGE_NO; + pPlayer->pev->deadflag = DEAD_DEAD; + pPlayer->pev->velocity = g_vecZero; + pPlayer->pev->punchangle = g_vecZero; + pPlayer->m_iJoiningState = READINGLTEXT; + pPlayer->m_iTeam = UNASSIGNED; + pPlayer->pev->fixangle = 1; + pPlayer->m_iModelName = MODEL_URBAN; + pPlayer->m_bContextHelp = true; + pPlayer->m_bHasNightVision = false; + pPlayer->m_iHostagesKilled = 0; + pPlayer->m_iMapVote = 0; + pPlayer->m_iCurrentKickVote = 0; + pPlayer->m_fDeadTime = 0; + pPlayer->has_disconnected = false; + pPlayer->m_iMenu = Menu_OFF; + pPlayer->ClearAutoBuyData(); + pPlayer->m_rebuyString = NULL; + + SET_CLIENT_MAXSPEED(ENT(pPlayer->pev), 1); + SET_MODEL(ENT(pPlayer->pev), "models/player.mdl"); + + pPlayer->SetThink(NULL); + + CBaseEntity *Target = UTIL_FindEntityByClassname(NULL, "trigger_camera"); + pPlayer->m_pIntroCamera = Target; + + if (mp && mp->m_bMapHasCameras == 2) + mp->m_bMapHasCameras = (Target != NULL); + + if (pPlayer->m_pIntroCamera) + Target = UTIL_FindEntityByTargetname(NULL, STRING(pPlayer->m_pIntroCamera->pev->target)); + + if (pPlayer->m_pIntroCamera && Target) + { + Vector CamAngles = UTIL_VecToAngles((Target->pev->origin - pPlayer->m_pIntroCamera->pev->origin).Normalize()); + CamAngles.x = -CamAngles.x; + + UTIL_SetOrigin(pPlayer->pev, pPlayer->m_pIntroCamera->pev->origin); + + pPlayer->pev->angles = CamAngles; + pPlayer->pev->v_angle = pPlayer->pev->angles; + + pPlayer->m_fIntroCamTime = gpGlobals->time + 6; + pPlayer->pev->view_ofs = g_vecZero; + } + else + { + pPlayer->m_iTeam = CT; + + if (mp) + { + mp->GetPlayerSpawnSpot(pPlayer); + } + + pPlayer->m_iTeam = UNASSIGNED; + pPlayer->pev->v_angle = g_vecZero; + pPlayer->pev->angles = gpGlobals->v_forward; + } + + TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, (CBaseEntity *)pPlayer); + pPlayer->m_iJoiningState = SHOWLTEXT; + + static char sName[128]; + Q_strcpy(sName, STRING(pPlayer->pev->netname)); + + for (char *pApersand = sName; pApersand && *pApersand != '\0'; pApersand++) + { + if (*pApersand == '%') + *pApersand = ' '; + } + + UTIL_ClientPrintAll(HUD_PRINTNOTIFY, "#Game_connected", (sName[0] != '\0') ? sName : ""); } /* <478f7> ../cstrike/dlls/client.cpp:792 */ -NOBODY int Q_strlen_(const char *str) +int Q_strlen_(const char *str) { -// { -// int count; // 794 -// } + int count = 0; + if (str && *str) + { + while (str[count++ + 1]); + } + return count; } /* <4bbff> ../cstrike/dlls/client.cpp:814 */ @@ -337,14 +651,37 @@ NOBODY void Host_Say(edict_t *pEntity, int teamonly) /* <4865e> ../cstrike/dlls/client.cpp:1160 */ NOBODY inline void DropSecondary(CBasePlayer *pPlayer) { -// { -// class CBasePlayerWeapon *pWeapon; // 1166 -// } + UNTESTED + + if (pPlayer->HasShield()) + { + // TODO: check out + if (pPlayer->HasShield() && pPlayer->m_bShieldDrawn && pPlayer->m_pActiveItem != NULL) + ((CBasePlayerWeapon *)pPlayer->m_pActiveItem)->SecondaryAttack(); + + pPlayer->m_bShieldDrawn = false; + } + + CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ]; + + if (pWeapon != NULL) + { + pPlayer->DropPlayerItem(STRING(pWeapon->pev->classname)); + } + } /* <473db> ../cstrike/dlls/client.cpp:1182 */ -NOBODY void DropPrimary(CBasePlayer *pPlayer) +void DropPrimary(CBasePlayer *pPlayer) { + if (pPlayer->HasShield()) + { + pPlayer->DropShield(); + return; + } + + if (pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]) + pPlayer->DropPlayerItem(STRING(pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]->pev->classname)); } /* <483a2> ../cstrike/dlls/client.cpp:1197 */ @@ -449,9 +786,15 @@ NOBODY void BuyItem(CBasePlayer *pPlayer, int iSlot) // } } +void (*pHandleMenu_ChooseAppearance)(void); + /* <48d40> ../cstrike/dlls/client.cpp:1998 */ -NOBODY void HandleMenu_ChooseAppearance(CBasePlayer *player, int slot) +NOBODY void __declspec(naked) HandleMenu_ChooseAppearance(CBasePlayer *player, int slot) { + __asm + { + jmp pHandleMenu_ChooseAppearance + } // { // class CHalfLifeMultiplay *mp; // 2000 // class appearance; // 2007 @@ -461,9 +804,15 @@ NOBODY void HandleMenu_ChooseAppearance(CBasePlayer *player, int slot) // } } +void (*pHandleMenu_ChooseTeam)(void); + /* <48e4b> ../cstrike/dlls/client.cpp:2214 */ -NOBODY BOOL HandleMenu_ChooseTeam(CBasePlayer *player, int slot) +NOBODY BOOL __declspec(naked) HandleMenu_ChooseTeam(CBasePlayer *player, int slot) { + __asm + { + jmp pHandleMenu_ChooseTeam + } // { // class CHalfLifeMultiplay *mp; // 2216 // enum TeamName team; // 2217 @@ -927,31 +1276,91 @@ NOBODY void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) } /* <4a378> ../cstrike/dlls/client.cpp:4362 */ -NOBODY void ServerDeactivate(void) +void ServerDeactivate(void) { + // It's possible that the engine will call this function more times than is necessary + // Therefore, only run it one time for each call to ServerActivate + if (g_serveractive != 1) + { + return; + } + + g_serveractive = 0; + + // Peform any shutdown operations here... + g_pGameRules->ServerDeactivate(); + CLocalNav::Reset(); + TheBots->ServerDeactivate(); + + if (g_pHostages) + { + g_pHostages->ServerDeactivate(); + } } /* <4a392> ../cstrike/dlls/client.cpp:4400 */ -NOBODY void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { -// { -// int i; // 4402 -// class CBaseEntity *pClass; // 4403 -// } + int i; + CBaseEntity *pClass; + + // Every call to ServerActivate should be matched by a call to ServerDeactivate + g_serveractive = 1; + EmptyEntityHashTable(); + + // Clients have not been initialized yet + for (i = 0; i < edictCount; i++) + { + edict_t *pEdict = &pEdictList[i]; + + if (pEdict->free) + continue; + + // Clients aren't necessarily initialized until ClientPutInServer() + if (i < clientMax || !pEdict->pvPrivateData) + continue; + + pClass = CBaseEntity::Instance(pEdict); + + // Activate this entity if it's got a class & isn't dormant + if (pClass && !(pClass->pev->flags & FL_DORMANT)) + { + AddEntityHashValue(&pEdict->v, STRING(pEdict->v.classname), CLASSNAME); + pClass->Activate(); + } + else + ALERT(at_console, "Can't instance %s\n", STRING(pEdict->v.classname)); + } + + // Link user messages here to make sure first client can get them... + LinkUserMessages(); + WriteSigonMessages(); + + if (g_pGameRules) + { + g_pGameRules->CheckMapConditions(); + } + + TheBots->ServerActivate(); + + if (g_pHostages) + { + g_pHostages->ServerActivate(); + } } /* <4a404> ../cstrike/dlls/client.cpp:4459 */ -NOBODY void PlayerPreThink(edict_t *pEntity) +void PlayerPreThink(edict_t *pEntity) { -// { -// entvars_t *pev; // 4461 -// class CBasePlayer *pPlayer; // 4462 -// GET_PRIVATE(edict_t *pent); // 4462 -// } + entvars_t *pev = &pEntity->v; + CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity); + + if (pPlayer) + pPlayer->PreThink(); } /* <4a47c> ../cstrike/dlls/client.cpp:4475 */ -NOBODY void PlayerPostThink(edict_t *pEntity) +void PlayerPostThink(edict_t *pEntity) { entvars_t *pev = &pEntity->v; CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity); @@ -1529,10 +1938,10 @@ NOXREF void ResetPlayerPVS(edict_t *client, int clientnum) { PLAYERPVSSTATUS *pvs = &g_PVSStatus[clientnum]; - memset(pvs, 0, sizeof(*pvs)); + Q_memset(pvs, 0, sizeof(*pvs)); pvs->headnode = client->headnode; pvs->num_leafs = client->num_leafs; - memcpy(pvs->leafnums, client->leafnums, sizeof(pvs->leafnums)); + Q_memcpy(pvs->leafnums, client->leafnums, sizeof(pvs->leafnums)); } /* <4aae8> ../cstrike/dlls/client.cpp:5240 */ @@ -1636,7 +2045,7 @@ int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *ho UTIL_UnsetGroupTrace(); } - memset(state, 0, sizeof(*state)); + Q_memset(state, 0, sizeof(*state)); state->number = e; state->entityType = ENTITY_NORMAL; @@ -1646,12 +2055,12 @@ int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *ho state->animtime = (int)(1000.0 * ent->v.animtime) / 1000.0; - memcpy(state->origin, ent->v.origin, sizeof(float) * 3); - memcpy(state->angles, ent->v.angles, sizeof(float) * 3); - memcpy(state->mins, ent->v.mins, sizeof(float) * 3); - memcpy(state->maxs, ent->v.maxs, sizeof(float) * 3); - memcpy(state->startpos, ent->v.startpos, sizeof(float) * 3); - memcpy(state->endpos, ent->v.endpos, sizeof(float) * 3); + Q_memcpy(state->origin, ent->v.origin, sizeof(float) * 3); + Q_memcpy(state->angles, ent->v.angles, sizeof(float) * 3); + Q_memcpy(state->mins, ent->v.mins, sizeof(float) * 3); + Q_memcpy(state->maxs, ent->v.maxs, sizeof(float) * 3); + Q_memcpy(state->startpos, ent->v.startpos, sizeof(float) * 3); + Q_memcpy(state->endpos, ent->v.endpos, sizeof(float) * 3); state->impacttime = ent->v.impacttime; state->starttime = ent->v.starttime; @@ -1700,7 +2109,7 @@ int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *ho if (player) { - memcpy(state->basevelocity, ent->v.basevelocity, sizeof(float) * 3); + Q_memcpy(state->basevelocity, ent->v.basevelocity, sizeof(float) * 3); state->weaponmodel = MODEL_INDEX( STRING(ent->v.weaponmodel) ); state->gaitsequence = ent->v.gaitsequence; @@ -1956,7 +2365,7 @@ int GetWeaponData(edict_s *player, struct weapon_data_s *info) entvars_t *pev = &player->v; CBasePlayer *pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); - memset(info, 0, sizeof(weapon_data_t) * MAX_WEAPONS); + Q_memset(info, 0, sizeof(weapon_data_t) * MAX_WEAPONS); if (!pl) return 1; @@ -1972,7 +2381,7 @@ int GetWeaponData(edict_s *player, struct weapon_data_s *info) if (gun && gun->UseDecrement()) { ItemInfo II; - memset(&II, 0, sizeof(II)); + Q_memset(&II, 0, sizeof(II)); gun->GetItemInfo(&II); if (II.iId >= 0 && II.iId < MAX_WEAPONS) @@ -2099,7 +2508,7 @@ void UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientd if (pl->m_pActiveItem != NULL) { ItemInfo II; - memset(&II, 0, sizeof(II)); + Q_memset(&II, 0, sizeof(II)); CBasePlayerWeapon *gun = reinterpret_cast< CBasePlayerWeapon * >(pl->m_pActiveItem->GetWeaponPtr()); @@ -2183,7 +2592,7 @@ void CreateInstancedBaselines(void) int iret = 0; entity_state_t state; - memset(&state, 0, sizeof( state )); + Q_memset(&state, 0, sizeof( state )); // Create any additional baselines here for things like grendates, etc. // iret = ENGINE_INSTANCE_BASELINE( pc->pev->classname, &state ); @@ -2196,7 +2605,7 @@ void CreateInstancedBaselines(void) int InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message) { // Server doesn't care? - if (CVAR_GET_FLOAT( "mp_consistency" ) != 1) + if (CVAR_GET_FLOAT("mp_consistency") != 1) return 0; // Default behavior is to kick the player diff --git a/regamedll/dlls/client.h b/regamedll/dlls/client.h index d529323f..8dff2d5d 100644 --- a/regamedll/dlls/client.h +++ b/regamedll/dlls/client.h @@ -78,7 +78,7 @@ typedef struct //#define g_flTimeLimit (*pg_flTimeLimit) //#define g_flResetTime (*pg_flResetTime) -//#define g_bClientPrintEnable (*pg_bClientPrintEnable) +#define g_bClientPrintEnable (*pg_bClientPrintEnable) #define g_PVSStatus (*pg_PVSStatus) #define m_usResetDecals (*pm_usResetDecals) @@ -88,6 +88,7 @@ typedef struct #define entity_field_alias (*pentity_field_alias) #define player_field_alias (*pplayer_field_alias) #define custom_entity_field_alias (*pcustom_entity_field_alias) +#define g_serveractive (*pg_serveractive) #endif // HOOK_GAMEDLL @@ -105,29 +106,32 @@ extern bool g_skipCareerInitialSpawn; extern entity_field_alias_t entity_field_alias[6]; extern entity_field_alias_t player_field_alias[3]; extern entity_field_alias_t custom_entity_field_alias[9]; +extern int g_serveractive; #endif // HOOK_GAMEDLL extern unsigned short m_usResetDecals; extern unsigned short g_iShadowSprite; -NOBODY int CMD_ARGC_(void); -NOBODY const char *CMD_ARGV_(int i); -NOBODY void set_suicide_frame(entvars_t *pev); -NOBODY BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason); -NOBODY void ClientDisconnect(edict_t *pEntity); +NOXREF int CMD_ARGC_(void); +NOXREF const char *CMD_ARGV_(int i); +NOXREF void set_suicide_frame(entvars_t *pev); +NOXREF void TeamChangeUpdate(CBasePlayer *player, int team_id); +NOXREF void BlinkAccount(CBasePlayer *player, int numBlinks); +BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason); +void ClientDisconnect(edict_t *pEntity); void respawn(entvars_t *pev, BOOL fCopyCorpse = FALSE); -NOBODY void ClientKill(edict_t *pEntity); -NOBODY void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText); -NOBODY void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu); -NOBODY int CountTeams(void); +void ClientKill(edict_t *pEntity); +void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText); +void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu); +NOXREF C_DLLEXPORT int CountTeams(void); NOBODY void ListPlayers(CBasePlayer *current); -NOBODY int CountTeamPlayers(int iTeam); -NOBODY void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer); -NOBODY TeamName SelectDefaultTeam(void); +C_DLLEXPORT int CountTeamPlayers(int iTeam); +void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer); +TeamName SelectDefaultTeam(void); void CheckStartMoney(void); -NOBODY void ClientPutInServer(edict_t *pEntity); -NOBODY int Q_strlen_(const char *str); +void ClientPutInServer(edict_t *pEntity); +int Q_strlen_(const char *str); NOBODY void Host_Say(edict_t *pEntity, int teamonly); NOBODY void DropPrimary(CBasePlayer *pPlayer); NOBODY bool CanBuyThis(CBasePlayer *pPlayer, int iWeapon); @@ -152,9 +156,9 @@ NOBODY BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszComman NOBODY void ClientCommand(edict_t *pEntity); NOBODY void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); NOBODY void ServerDeactivate(void); -NOBODY void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); -NOBODY void PlayerPreThink(edict_t *pEntity); -NOBODY void PlayerPostThink(edict_t *pEntity); +void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); +void PlayerPreThink(edict_t *pEntity); +void PlayerPostThink(edict_t *pEntity); void ParmsNewLevel(void); NOBODY void ParmsChangeLevel(void); NOBODY void StartFrame(void); @@ -191,5 +195,7 @@ int AllowLagCompensation(void); // refs extern void (*pClientCommand)(edict_t *pEntity); +extern void (*pHandleMenu_ChooseAppearance)(void); +extern void (*pHandleMenu_ChooseTeam)(void); #endif // CLIENT_H diff --git a/regamedll/dlls/combat.cpp b/regamedll/dlls/combat.cpp index e5a94c93..734047d8 100644 --- a/regamedll/dlls/combat.cpp +++ b/regamedll/dlls/combat.cpp @@ -50,84 +50,172 @@ NOBODY void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cG // } } +void (*pCGib__SpawnHeadGib)(void); + /* <5ff7f> ../cstrike/dlls/combat.cpp:132 */ -NOBODY void CGib::SpawnHeadGib(entvars_t *pevVictim) +void __declspec(naked) CGib::SpawnHeadGib(entvars_t *pevVictim) { -// { -// class CGib *pGib; // 134 -// GetClassPtr(CGib *a); // 134 -// { -// edict_t *pentPlayer; // 151 -// operator+(const Vector *const this, -// const Vector &v); // 149 -// { -// entvars_t *pevPlayer; // 156 -// operator+(const Vector *const this, -// const Vector &v); // 159 -// operator-(const Vector *const this, -// const Vector &v); // 159 -// Normalize(const Vector *const this); // 159 -// } -// edict(CBaseEntity *const this); // 151 -// Instance(entvars_t *pev); // 172 -// operator*(const Vector *const this, -// float fl); // 184 -// operator*(const Vector *const this, -// float fl); // 176 -// operator*(const Vector *const this, -// float fl); // 180 -// } -// LimitVelocity(CGib *const this); // 187 -// } -} - -void (*pCGib__SpawnRandomGibs)(entvars_t *pevVictim, int cGibs, int human); - -/* <606c8> ../cstrike/dlls/combat.cpp:190 */ -NOBODY void __declspec(naked) CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human) -{ - // TODO: Reverse me! __asm { - jmp pCGib__SpawnRandomGibs + jmp pCGib__SpawnHeadGib + } +} + +/* <606c8> ../cstrike/dlls/combat.cpp:190 */ +void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human) +{ + int cSplat; + for (cSplat = 0; cSplat < cGibs; cSplat++) + { + CGib *pGib = GetClassPtr((CGib *)NULL); + + if (g_Language == LANGUAGE_GERMAN) + { + pGib->Spawn("models/germangibs.mdl"); + pGib->pev->body = RANDOM_LONG(0, GERMAN_GIB_COUNT - 1); + } + else + { + if (human) + { + // human pieces + pGib->Spawn("models/hgibs.mdl"); + // start at one to avoid throwing random amounts of skulls (0th gib) + pGib->pev->body = RANDOM_LONG(1, HUMAN_GIB_COUNT - 1); + } + else + { + // aliens + pGib->Spawn("models/agibs.mdl"); + pGib->pev->body = RANDOM_LONG(0, ALIEN_GIB_COUNT - 1); + } + } + + if (pevVictim) + { + // spawn the gib somewhere in the monster's bounding volume + pGib->pev->origin.x = pevVictim->absmin.x + pevVictim->size.x * (RANDOM_FLOAT(0, 1)); + pGib->pev->origin.y = pevVictim->absmin.y + pevVictim->size.y * (RANDOM_FLOAT(0, 1)); + // absmin.z is in the floor because the engine subtracts 1 to enlarge the box + pGib->pev->origin.z = pevVictim->absmin.z + pevVictim->size.z * (RANDOM_FLOAT(0, 1)) + 1; + + // make the gib fly away from the attack vector + pGib->pev->velocity = g_vecAttackDir * -1; + + // mix in some noise + pGib->pev->velocity.x += RANDOM_FLOAT(-0.25, 0.25); + pGib->pev->velocity.y += RANDOM_FLOAT(-0.25, 0.25); + pGib->pev->velocity.z += RANDOM_FLOAT(-0.25, 0.25); + + pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT(300, 400); + + pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200); + pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300); + + // copy owner's blood color + pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); + + if (pevVictim->health > -50) + pGib->pev->velocity = pGib->pev->velocity * 0.7; + + else if (pevVictim->health > -200) + pGib->pev->velocity = pGib->pev->velocity * 2; + else + pGib->pev->velocity = pGib->pev->velocity * 4; + + pGib->pev->solid = SOLID_BBOX; + UTIL_SetSize(pGib->pev, Vector(0, 0, 0), Vector(0, 0, 0)); + } + pGib->LimitVelocity(); } } /* <5f58a> ../cstrike/dlls/combat.cpp:263 */ -NOBODY BOOL CBaseMonster::HasHumanGibs_(void) +BOOL CBaseMonster::HasHumanGibs_(void) { -// { -// int myClass; // 265 -// } + int myClass = Classify(); + + if (myClass == CLASS_HUMAN_MILITARY + || myClass == CLASS_PLAYER_ALLY + || myClass == CLASS_HUMAN_PASSIVE + || myClass == CLASS_PLAYER) + return TRUE; + + return FALSE; } /* <5f5ca> ../cstrike/dlls/combat.cpp:278 */ -NOBODY BOOL CBaseMonster::HasAlienGibs_(void) +BOOL CBaseMonster::HasAlienGibs_(void) { -// { -// int myClass; // 280 -// } + int myClass = Classify(); + if (myClass == CLASS_ALIEN_MILITARY + || myClass == CLASS_ALIEN_MONSTER + || myClass == CLASS_ALIEN_PASSIVE + || myClass == CLASS_INSECT + || myClass == CLASS_ALIEN_PREDATOR + || myClass == CLASS_ALIEN_PREY) + return TRUE; + + return FALSE; } /* <5f60a> ../cstrike/dlls/combat.cpp:295 */ -NOBODY void CBaseMonster::FadeMonster_(void) +void CBaseMonster::FadeMonster_(void) { -// StopAnimation(CBaseMonster *const this); // 297 -// SUB_StartFadeOut(CBaseEntity *const this); // 303 + StopAnimation(); + + pev->velocity = g_vecZero; + pev->movetype = MOVETYPE_NONE; + pev->avelocity = g_vecZero; + pev->animtime = gpGlobals->time; + pev->effects |= EF_NOINTERP; + + SUB_StartFadeOut(); } /* <60a59> ../cstrike/dlls/combat.cpp:310 */ -NOBODY void CBaseMonster::GibMonster_(void) +void CBaseMonster::GibMonster_(void) { -// { -// TraceResult tr; // 312 -// BOOL gibbed; // 313 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 315 -// } + TraceResult tr; + BOOL gibbed = FALSE; + + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "common/bodysplat.wav", VOL_NORM, ATTN_NORM); + + // only humans throw skulls !!!UNDONE - eventually monsters will have their own sets of gibs + if (HasHumanGibs()) + { + // Only the player will ever get here + if (CVAR_GET_FLOAT("violence_hgibs") != 0) + { + CGib::SpawnHeadGib(pev); + + // throw some human gibs. + CGib::SpawnRandomGibs(pev, 4, 1); + } + gibbed = TRUE; + } + else if (HasAlienGibs()) + { + // Should never get here, but someone might call it directly + if (CVAR_GET_FLOAT("violence_agibs") != 0) + { + // Throw alien gibs + CGib::SpawnRandomGibs(pev, 4, 0); + } + gibbed = TRUE; + } + + if (!IsPlayer()) + { + if (gibbed) + { + // don't remove players! + SetThink(&CBaseMonster::SUB_Remove); + pev->nextthink = gpGlobals->time; + } + else + FadeMonster(); + } } /* <5f65e> ../cstrike/dlls/combat.cpp:355 */ @@ -183,42 +271,105 @@ void CBaseMonster::BecomeDead_(void) } /* <5f8cc> ../cstrike/dlls/combat.cpp:542 */ -NOBODY BOOL CBaseMonster::ShouldGibMonster(int iGib) +BOOL CBaseMonster::ShouldGibMonster(int iGib) { + if ((iGib == GIB_NORMAL && pev->health < GIB_HEALTH_VALUE) || (iGib == GIB_ALWAYS)) + return TRUE; + + return FALSE; } /* <5f8f8> ../cstrike/dlls/combat.cpp:551 */ -NOBODY void CBaseMonster::CallGibMonster(void) +void CBaseMonster::CallGibMonster(void) { -// { -// BOOL fade; // 553 -// } + BOOL fade = FALSE; + + if (HasHumanGibs()) + { + if (CVAR_GET_FLOAT("violence_hgibs") == 0) + fade = TRUE; + } + else if (HasAlienGibs()) + { + if (CVAR_GET_FLOAT("violence_agibs") == 0) + fade = TRUE; + } + + // do something with the body. while monster blows up + pev->solid = SOLID_NOT; + pev->takedamage = DAMAGE_NO; + + if (fade) + { + FadeMonster(); + } + else + { + // make the model invisible. + pev->effects = EF_NODRAW; + GibMonster(); + } + + pev->deadflag = DEAD_DEAD; + FCheckAITrigger(); + + // don't let the status bar glitch for players.with <0 health. + if (pev->health < -99.0f) + { + pev->health = 0; + } + + if (ShouldFadeOnDeath() && !fade) + UTIL_Remove(this); } /* <5f938> ../cstrike/dlls/combat.cpp:598 */ -NOBODY void CBaseMonster::Killed_(entvars_t *pevAttacker, int iGib) +void CBaseMonster::Killed_(entvars_t *pevAttacker, int iGib) { -// { -// unsigned int cCount; // 600 -// BOOL fDone; // 601 -// class CBaseEntity *pOwner; // 619 -// HasMemory(CBaseMonster *const this, -// int iMemory); // 603 -// ShouldGibMonster(CBaseMonster *const this, -// int iGib); // 605 -// Remember(CBaseMonster *const this, -// int iMemory); // 610 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 613 -// SetConditions(CBaseMonster *const this, -// int iConditions); // 616 -// Instance(edict_t *pent); // 619 -// ShouldGibMonster(CBaseMonster *const this, -// int iGib); // 625 -// } + unsigned int cCount = 0; + BOOL fDone = FALSE; + + if (HasMemory(bits_MEMORY_KILLED)) + { + if (ShouldGibMonster(iGib)) + CallGibMonster(); + return; + } + + Remember(bits_MEMORY_KILLED); + + // clear the deceased's sound channels.(may have been firing or reloading when killed) + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "common/null.wav", VOL_NORM, ATTN_NORM); + m_IdealMonsterState = MONSTERSTATE_DEAD; + // Make sure this condition is fired too (TakeDamage breaks out before this happens on death) + SetConditions(bits_COND_LIGHT_DAMAGE); + + // tell owner ( if any ) that we're dead.This is mostly for MonsterMaker functionality. + CBaseEntity *pOwner = CBaseEntity::Instance(pev->owner); + if (pOwner) + { + pOwner->DeathNotice(pev); + } + + if (ShouldGibMonster(iGib)) + { + CallGibMonster(); + return; + } + else if (pev->flags & FL_MONSTER) + { + SetTouch(NULL); + BecomeDead(); + } + + // don't let the status bar glitch for players.with <0 health. + if (pev->health < -99) + { + pev->health = 0; + } + + //pev->enemy = ENT( pevAttacker );//why? (sjb) + m_IdealMonsterState = MONSTERSTATE_DEAD; } /* <5e84e> ../cstrike/dlls/combat.cpp:652 */ @@ -306,17 +457,33 @@ void CGib::BounceGibTouch(CBaseEntity *pOther) } } +// Sticky gib puts blood on the wall and stays put. + /* <5ed6d> ../cstrike/dlls/combat.cpp:761 */ -NOBODY void CGib::StickyGibTouch(CBaseEntity *pOther) +void CGib::StickyGibTouch(CBaseEntity *pOther) { -// { -// class Vector vecSpot; // 763 -// TraceResult tr; // 764 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 769 -// } -// StickyGibTouch(CGib *const this, -// class CBaseEntity *pOther); // 761 + Vector vecSpot; + TraceResult tr; + + SetThink(&CBaseEntity::SUB_Remove); + pev->nextthink = gpGlobals->time + 10; + + if (!FClassnameIs(pOther->pev, "worldspawn")) + { + pev->nextthink = gpGlobals->time; + return; + } + + vecSpot = pev->origin + pev->velocity * 32; + + UTIL_TraceLine(pev->origin, vecSpot, ignore_monsters, ENT(pev), &tr); + UTIL_BloodDecalTrace(&tr, m_bloodColor); + + pev->velocity = tr.vecPlaneNormal * -1; + pev->angles = UTIL_VecToAngles(pev->velocity); + pev->velocity = g_vecZero; + pev->avelocity = g_vecZero; + pev->movetype = MOVETYPE_NONE; } /* <5fb0b> ../cstrike/dlls/combat.cpp:789 */ @@ -371,170 +538,500 @@ int CBaseMonster::TakeHealth_(float flHealth, int bitsDamageType) return CBaseEntity::TakeHealth(flHealth, bitsDamageType); } +// The damage is coming from inflictor, but get mad at attacker +// This should be the only function that ever reduces health. +// bitsDamageType indicates the type of damage sustained, ie: DMG_SHOCK +// +// Time-based damage: only occurs while the monster is within the trigger_hurt. +// When a monster is poisoned via an arrow etc it takes all the poison damage at once. + /* <60d7a> ../cstrike/dlls/combat.cpp:845 */ -NOBODY int CBaseMonster::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CBaseMonster::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { -// { -// float flTake; // 847 -// class Vector vecDir; // 848 -// FNullEnt(entvars_t *pev); // 872 -// { -// class CBaseEntity *pInflictor; // 874 -// Instance(entvars_t *pev); // 874 -// operator-(const Vector *const this, -// const Vector &v); // 877 -// operator-(const Vector *const this, -// const Vector &v); // 877 -// Normalize(const Vector *const this); // 877 -// Normalize(const Vector *const this); // 878 -// } -// FNullEnt(entvars_t *pev); // 939 -// Vector(Vector *const this, -// const Vector &v); // 957 -// SetConditions(CBaseMonster *const this, -// int iConditions); // 964 -// SetConditions(CBaseMonster *const this, -// int iConditions); // 969 -// SetConditions(CBaseMonster *const this, -// int iConditions); // 912 -// operator*(const Vector *const this, -// float fl); // 954 -// operator+(const Vector *const this, -// const Vector &v); // 954 -// HasConditions(CBaseMonster *const this, -// int iConditions); // 947 -// } + float flTake; + Vector vecDir; + + if (pev->takedamage == DAMAGE_NO) + return 0; + + if (!IsAlive()) + { + return DeadTakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType);// Reverse me + } + + if (pev->deadflag == DEAD_NO) + { + // no pain sound during death animation. + PainSound(); + } + + //!!!LATER - make armor consideration here! + flTake = flDamage; + + // set damage type sustained + m_bitsDamageType |= bitsDamageType; + + // grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit). + vecDir = Vector(0, 0, 0); + + if (!FNullEnt(pevInflictor)) + { + CBaseEntity *pInflictor = CBaseEntity::Instance(pevInflictor); + + if (pInflictor) + { + vecDir = (pInflictor->Center() - Vector(0, 0, 10) - Center()).Normalize(); + vecDir = g_vecAttackDir = vecDir.Normalize(); + } + } + + // add to the damage total for clients, which will be sent as a single + // message at the end of the frame + // TODO: remove after combining shotgun blasts? + if (IsPlayer()) + { + if (pevInflictor) + pev->dmg_inflictor = ENT(pevInflictor); + + pev->dmg_take += flTake; + } + + pev->health -= flTake; + + if (m_MonsterState == MONSTERSTATE_SCRIPT) + { + SetConditions(bits_COND_LIGHT_DAMAGE); + return 0; + } + + if (pev->health <= 0.0f) + { + g_pevLastInflictor = pevInflictor; + + if (bitsDamageType & DMG_ALWAYSGIB) + Killed(pevAttacker, GIB_ALWAYS); + + else if (bitsDamageType & DMG_NEVERGIB) + Killed(pevAttacker, GIB_NEVER); + else + Killed(pevAttacker, GIB_NORMAL); + + g_pevLastInflictor = NULL; + return 0; + } + if ((pev->flags & FL_MONSTER) && !FNullEnt(pevAttacker)) + { + if (pevAttacker->flags & (FL_MONSTER | FL_CLIENT)) + { + if (pevInflictor) + { + if (m_hEnemy == NULL || pevInflictor == m_hEnemy->pev || !HasConditions(bits_COND_SEE_ENEMY)) + m_vecEnemyLKP = pevInflictor->origin; + } + else + m_vecEnemyLKP = pev->origin + (g_vecAttackDir * 64); + + MakeIdealYaw(m_vecEnemyLKP); + + if (flDamage > 20.0f) + SetConditions(bits_COND_LIGHT_DAMAGE); + + if (flDamage >= 20.0f) + SetConditions(bits_COND_HEAVY_DAMAGE); + } + } + + return 1; } +// DeadTakeDamage - takedamage function called when a monster's corpse is damaged. + /* <60b32> ../cstrike/dlls/combat.cpp:981 */ -NOBODY int CBaseMonster::DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CBaseMonster::DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { -// { -// class Vector vecDir; // 983 -// FNullEnt(entvars_t *pev); // 987 -// { -// class CBaseEntity *pInflictor; // 989 -// Instance(entvars_t *pev); // 989 -// operator-(const Vector *const this, -// const Vector &v); // 992 -// operator-(const Vector *const this, -// const Vector &v); // 992 -// Normalize(const Vector *const this); // 992 -// Normalize(const Vector *const this); // 993 -// } -// } + // grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit). + Vector vecDir = Vector(0, 0, 0); + + if (!FNullEnt(pevInflictor)) + { + CBaseEntity *pInflictor = CBaseEntity::Instance(pevInflictor); + if (pInflictor) + { + vecDir = (pInflictor->Center() - Vector(0, 0, 10) - Center()).Normalize(); + vecDir = g_vecAttackDir = vecDir.Normalize(); + } + } + +// turn this back on when the bounding box issues are resolved. +#if 0 + + pev->flags &= ~FL_ONGROUND; + pev->origin.z += 1; + + // let the damage scoot the corpse around a bit. + if (!FNullEnt(pevInflictor) && (pevAttacker->solid != SOLID_TRIGGER)) + { + pev->velocity = pev->velocity + vecDir * -DamageForce(flDamage); + } + +#endif + + // kill the corpse if enough damage was done to destroy the corpse and the damage is of a type that is allowed to destroy the corpse. + if (bitsDamageType & DMG_GIB_CORPSE) + { + if (pev->health <= flDamage) + { + pev->health = -50; + Killed(pevAttacker, GIB_ALWAYS); + return 0; + } + + // Accumulate corpse gibbing damage, so you can gib with multiple hits + pev->health -= flDamage * 0.1; + } + + return 1; } /* <61120> ../cstrike/dlls/combat.cpp:1027 */ -NOBODY float CBaseMonster::DamageForce(float damage) +float CBaseMonster::DamageForce(float damage) { -// { -// float force; // 1029 -// } + float_precision force = damage * ((32 * 32 * 72.0) / (pev->size.x * pev->size.y * pev->size.z)) * 5; + + if (force > 1000.0) + { + force = 1000.0; + } + return force; } /* <61174> ../cstrike/dlls/combat.cpp:1044 */ -NOBODY void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType) -{ -// { -// class CBaseEntity *pEntity; // 1046 -// TraceResult tr; // 1047 -// float flAdjustedDamage; // 1048 -// float falloff; // 1048 -// class Vector vecSpot; // 1049 -// float flRadius; // 1050 -// int bInWater; // 1058 -// edict(CBaseEntity *const this); // 1085 -// { -// TraceResult tr2; // 1088 -// class Vector vecLOS; // 1110 -// float flDot; // 1111 -// float fadeTime; // 1120 -// float fadeHold; // 1120 -// int alpha; // 1121 -// class CBasePlayer *pPlayer; // 1137 -// float currentHoldTime; // 1140 -// operator-(const Vector *const this, -// const Vector &v); // 1102 -// Length(const Vector *const this); // 1102 -// operator+(const Vector *const this, -// const Vector &v); // 1115 -// operator-(const Vector *const this, -// const Vector &v); // 1115 -// DotProduct(const Vector &a, -// const Vector &b); // 1117 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 1157 -// { -// int i; // 1160 -// { -// class CBasePlayer *pObserver;// 1162 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 1166 -// } -// } -// } -// } +void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType) +{ + CBaseEntity *pEntity = NULL; + TraceResult tr; + float flAdjustedDamage, falloff; + Vector vecSpot; + float flRadius = 1500; + + if (flRadius) + falloff = flDamage / flRadius; + else + falloff = 1; + + int bInWater = (UTIL_PointContents(vecSrc) == CONTENTS_WATER); + + vecSrc.z += 1; + + while ((pEntity = UTIL_FindEntityInSphere(pEntity, vecSrc, 1500.0)) != NULL) + { + TraceResult tr2; + Vector vecLOS; + float flDot; + float fadeTime; + float fadeHold; + int alpha; + CBasePlayer *pPlayer; + float currentHoldTime; + + if (!pEntity->IsPlayer()) + continue; + + pPlayer = (CBasePlayer *)pEntity; + + if (pPlayer->pev->takedamage == DAMAGE_NO || pPlayer->pev->deadflag != DEAD_NO) + continue; + + if (bInWater && pPlayer->pev->waterlevel == 0) + continue; + + if (!bInWater && pPlayer->pev->waterlevel == 3) + continue; + + vecSpot = pPlayer->BodyTarget(vecSrc); + UTIL_TraceLine(vecSrc, vecSpot, dont_ignore_monsters, ENT(pevInflictor), &tr); + + if (tr.flFraction != 1.0f && tr.pHit != pPlayer->pev->pContainingEntity) + continue; + + UTIL_TraceLine(vecSpot, vecSrc, dont_ignore_monsters, tr.pHit, &tr2); + + if (tr2.flFraction >= 1.0) + { + if (tr.fStartSolid) + { + tr.vecEndPos = vecSrc; + tr.flFraction = 0; + } + + flAdjustedDamage = flDamage - (vecSrc - tr.vecEndPos).Length() * falloff; + + if (flAdjustedDamage < 0) + flAdjustedDamage = 0; + + UTIL_MakeVectors(pPlayer->pev->v_angle); + vecLOS = vecSrc - pPlayer->EarPosition(); + flDot = DotProduct(vecLOS, gpGlobals->v_forward); + + if (flDot < 0) + { + alpha = 200; + fadeTime = flAdjustedDamage * 1.75; + fadeHold = flAdjustedDamage / 3.5; + } + else + { + alpha = 255; + fadeTime = flAdjustedDamage * 3; + fadeHold = flAdjustedDamage / 1.5; + } + + currentHoldTime = pPlayer->m_blindStartTime + pPlayer->m_blindHoldTime - gpGlobals->time; + + if (currentHoldTime > 0.0 && alpha == 255) + fadeHold += currentHoldTime; + + if (pPlayer->m_blindStartTime != 0.0f && pPlayer->m_blindFadeTime != 0.0f) + { + if ((pPlayer->m_blindStartTime + pPlayer->m_blindFadeTime + pPlayer->m_blindHoldTime) > gpGlobals->time) + { + if (pPlayer->m_blindFadeTime > fadeTime) + fadeTime = pPlayer->m_blindFadeTime; + + if (pPlayer->m_blindAlpha >= alpha) + alpha = pPlayer->m_blindAlpha; + } + } + + UTIL_ScreenFade(pPlayer, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pObserver = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!pObserver || !pObserver->IsObservingPlayer(pPlayer)) + continue; + + if (!fadetoblack.value) + UTIL_ScreenFade(pPlayer, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0); + } + + pPlayer->Blind(fadeTime * 0.33, fadeHold, fadeTime, alpha); + + if (TheBots) + { + TheBots->OnEvent(EVENT_PLAYER_BLINDED_BY_FLASHBANG, pPlayer); + } + } + } } /* <5f042> ../cstrike/dlls/combat.cpp:1185 */ -NOBODY void GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity) +float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity) { -// { -// float retval; // 1187 -// TraceResult tr; // 1189 -// floatconst topOfHead; // 1204 -// class Vector spot; // 1216 -// class Vector2D dir; // 1232 -// floatconst standFeet; // 1205 -// floatconst crouchFeet; // 1206 -// class Vector2D perp; // 1234 -// floatconst edgeOffset; // 1235 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 1216 -// NormalizeInPlace(Vector2D *const this); // 1233 -// } + float retval = 0.0f; + TraceResult tr; + Vector spot; + Vector2D dir; + Vector2D perp; + + const float topOfHead = 25.0f; + const float standFeet = 34.0f; + const float crouchFeet = 14.0f; + const float edgeOffset = 13.0f; + + if (!entity->IsPlayer()) + { + UTIL_TraceLine(vecSrc, entity->pev->origin, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval = 1.0f; + + return retval; + } + + UTIL_TraceLine(vecSrc, entity->pev->origin, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval += 0.4f; + + spot = entity->pev->origin + Vector(0, 0, topOfHead); + UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval += 0.2f; + + spot = entity->pev->origin; + if (entity->pev->flags & FL_DUCKING) + spot.z -= crouchFeet; + else + spot.z -= standFeet; + + UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval += 0.2f; + + dir = (entity->pev->origin - vecSrc).Make2D(); + dir.NormalizeInPlace(); + + perp.x = -dir.y * edgeOffset; + perp.y = dir.x * edgeOffset; + + spot = entity->pev->origin + Vector(perp.x, perp.y, 0); + + UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval += 0.1; + + spot = entity->pev->origin - Vector(perp.x, perp.y, 0); + + UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr); + + if (tr.flFraction == 1.0f) + retval += 0.1; + + return retval; } /* <5dc27> ../cstrike/dlls/combat.cpp:1262 */ -NOBODY void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) +void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) { -// { -// class CBaseEntity *pEntity; // 1264 -// TraceResult tr; // 1265 -// float flAdjustedDamage; // 1266 -// float falloff; // 1266 -// class Vector vecSpot; // 1267 -// int bInWater; // 1275 -// { -// bool useLOS; // 1300 -// float damageRatio; // 1305 -// float length; // 1308 -// } -// } + CBaseEntity *pEntity = NULL; + TraceResult tr; + float flAdjustedDamage, falloff; + Vector vecSpot; + + if (flRadius) + falloff = flDamage / flRadius; + else + falloff = 1.0; + + int bInWater = (UTIL_PointContents(vecSrc) == CONTENTS_WATER); + + // in case grenade is lying on the ground + vecSrc.z += 1; + + if (!pevAttacker) + pevAttacker = pevInflictor; + + // iterate on all entities in the vicinity. + while ((pEntity = UTIL_FindEntityInSphere(pEntity, vecSrc, flRadius)) != NULL) + { + if (pEntity->pev->takedamage != DAMAGE_NO) + { + // UNDONE: this should check a damage mask, not an ignore + if (iClassIgnore != CLASS_NONE && pEntity->Classify() == iClassIgnore) + continue; + + // blast's don't tavel into or out of water + if (bInWater && pEntity->pev->waterlevel == 0) + continue; + + if (!bInWater && pEntity->pev->waterlevel == 3) + continue; + + bool useLOS = false; + float damageRatio = 1.0f; + + if ((bitsDamageType & DMG_EXPLOSION) && UTIL_IsGame("czero")) + { + useLOS = true; + damageRatio = GetAmountOfPlayerVisible(vecSrc, pEntity); + } + + float length = (vecSrc - pEntity->pev->origin).Length(); + + if (useLOS) + { + if (!flRadius) + flRadius = flDamage; + + if (!flDamage) + flRadius = 0; + + flAdjustedDamage = (flRadius - length) * (flRadius - length) * 1.25 / (flRadius * flRadius) * (damageRatio * flDamage) * 1.5; + } + else + flAdjustedDamage = flDamage - length * falloff; + + if (flAdjustedDamage < 0) + flAdjustedDamage = 0; + + pEntity->TakeDamage(pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType); + } + } } /* <5dcf9> ../cstrike/dlls/combat.cpp:1349 */ -NOBODY void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) +void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) { -// { -// class CBaseEntity *pEntity; // 1351 -// TraceResult tr; // 1352 -// float flAdjustedDamage; // 1353 -// float falloff; // 1353 -// class Vector vecSpot; // 1354 -// int bInWater; // 1362 -// } + CBaseEntity *pEntity = NULL; + TraceResult tr; + float flAdjustedDamage, falloff; + Vector vecSpot; + + if (flRadius) + falloff = flDamage / flRadius; + else + falloff = 1; + + int bInWater = (UTIL_PointContents(vecSrc) == CONTENTS_WATER); + + vecSrc.z += 1; + + if (!pevAttacker) + pevAttacker = pevInflictor; + + while ((pEntity = UTIL_FindEntityInSphere(pEntity, vecSrc, flRadius)) != NULL) + { + if (pEntity->pev->takedamage != DAMAGE_NO) + { + if (iClassIgnore != CLASS_NONE && pEntity->Classify() == iClassIgnore) + continue; + + if (bInWater && !pEntity->pev->waterlevel) + continue; + + if (!bInWater && pEntity->pev->waterlevel == 3) + continue; + + vecSpot = pEntity->BodyTarget(vecSrc); + UTIL_TraceLine(vecSrc, vecSpot, dont_ignore_monsters, ENT(pevInflictor), &tr); + + if (tr.flFraction == 1.0f || tr.pHit == pEntity->edict()) + { + if (tr.fStartSolid) + { + tr.vecEndPos = vecSrc; + tr.flFraction = 0; + } + + flAdjustedDamage = flDamage - (vecSrc - pEntity->pev->origin).Length() * falloff; + + if (flAdjustedDamage < 0) + flAdjustedDamage = 0; + + else if (flAdjustedDamage > 75) + flAdjustedDamage = 75; + + if (tr.flFraction == 1.0f) + pEntity->TakeDamage(pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType); + + else + { + ClearMultiDamage(); + pEntity->TraceAttack(pevInflictor, flAdjustedDamage, (tr.vecEndPos - vecSrc).Normalize(), &tr, bitsDamageType); + ApplyMultiDamage(pevInflictor, pevAttacker); + } + } + } + } } /* <5e0d2> ../cstrike/dlls/combat.cpp:1442 */ -NOBODY void CBaseMonster::RadiusDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType) +void CBaseMonster::RadiusDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType) { if (flDamage > 80) ::RadiusDamage(pev->origin, pevInflictor, pevAttacker, flDamage, flDamage * 3.5, iClassIgnore, bitsDamageType); @@ -626,37 +1123,68 @@ NOBODY BOOL CBaseEntity::FVisible_(Vector &vecOrigin) } /* <5e872> ../cstrike/dlls/combat.cpp:1600 */ -NOBODY void CBaseEntity::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBaseEntity::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { -// { -// class Vector vecOrigin; // 1602 -// operator*(const Vector *const this, -// float fl); // 1602 -// { -// int blood; // 1608 -// Vector(Vector *const this, -// const Vector &v); // 1612 -// Vector(Vector *const this, -// const Vector &v); // 1613 -// } -// operator-(const Vector *const this, -// const Vector &v); // 1602 -// } + Vector vecOrigin = ptr->vecEndPos - vecDir * 4; + + if (pev->takedamage == DAMAGE_YES) + { + AddMultiDamage(pevAttacker, this, flDamage, bitsDamageType); + + int blood = BloodColor(); + if (blood != DONT_BLEED) + { + // a little surface blood. + SpawnBlood(vecOrigin, blood, flDamage); + TraceBleed(flDamage, vecDir, ptr, bitsDamageType); + } + } } /* <61ce5> ../cstrike/dlls/combat.cpp:1647 */ -NOBODY void CBaseMonster::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBaseMonster::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { -// { -// class Vector vecOrigin; // 1684 -// int blood; // 1687 -// operator*(const Vector *const this, -// float fl); // 1684 -// operator-(const Vector *const this, -// const Vector &v); // 1684 -// Vector(Vector *const this, -// const Vector &v); // 1691 -// } + Vector vecOrigin = ptr->vecEndPos - vecDir * 4; + + if (pev->takedamage == DAMAGE_YES) + { + m_LastHitGroup = ptr->iHitgroup; + + switch (ptr->iHitgroup) + { + case HITGROUP_GENERIC: + break; + case HITGROUP_HEAD: + flDamage *= 3; + break; + case HITGROUP_CHEST: + case HITGROUP_STOMACH: + flDamage *= 1.5; + break; + case HITGROUP_LEFTARM: + case HITGROUP_RIGHTARM: + flDamage *= 1.0; + break; + case HITGROUP_LEFTLEG: + case HITGROUP_RIGHTLEG: + flDamage *= 0.75; + break; + case HITGROUP_SHIELD: + flDamage = 0; + break; + default: + break; + } + + AddMultiDamage(pevAttacker, this, flDamage, bitsDamageType); + + int blood = BloodColor(); + if (blood != DONT_BLEED) + { + // a little surface blood. + SpawnBlood(vecOrigin, blood, flDamage); + } + } } /* <61df9> ../cstrike/dlls/combat.cpp:1704 */ diff --git a/regamedll/dlls/doors.h b/regamedll/dlls/doors.h index 6fa33725..eed1d0d1 100644 --- a/regamedll/dlls/doors.h +++ b/regamedll/dlls/doors.h @@ -37,11 +37,11 @@ #define BUTTON_SOUNDWAIT 0.5 #define SF_DOOR_ROTATE_Y 0 -#define SF_DOOR_START_OPEN 1 +#define SF_DOOR_START_OPEN 1 #define SF_DOOR_ROTATE_BACKWARDS 2 #define SF_DOOR_PASSABLE 8 #define SF_DOOR_ONEWAY 16 -#define SF_DOOR_NO_AUTO_RETURN 32 +#define SF_DOOR_NO_AUTO_RETURN 32 #define SF_DOOR_ROTATE_Z 64 #define SF_DOOR_ROTATE_X 128 #define SF_DOOR_USE_ONLY 256 // door must be opened by player's use button. diff --git a/regamedll/dlls/enginecallback.h b/regamedll/dlls/enginecallback.h index e39eb920..de93921f 100644 --- a/regamedll/dlls/enginecallback.h +++ b/regamedll/dlls/enginecallback.h @@ -85,7 +85,9 @@ extern enginefuncs_t g_engfuncs; #define ADD_SERVER_COMMAND (*g_engfuncs.pfnAddServerCommand) #define SET_CLIENT_LISTENING (*g_engfuncs.pfnVoice_SetClientListening) #define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) +#define GET_APPROX_WAVE_PLAY_LEN (*g_engfuncs.pfnGetApproxWavePlayLen) #define IS_CAREER_MATCH (*g_engfuncs.pfnIsCareerMatch) +#define ENG_CHECK_PARM (*g_engfuncs.pfnEngCheckParm) /* <472a4> ../cstrike/dlls/enginecallback.h:77 */ inline void MESSAGE_BEGIN(int msg_dest, int msg_type, const float *pOrigin = NULL, edict_t *ed = NULL) @@ -146,6 +148,8 @@ inline void *GET_PRIVATE(edict_t *pent) #define FREE_FILE (*g_engfuncs.pfnFreeFile) #define COMPARE_FILE_TIME (*g_engfuncs.pfnCompareFileTime) #define GET_GAME_DIR (*g_engfuncs.pfnGetGameDir) +#define SET_CLIENT_MAXSPEED (*g_engfuncs.pfnSetClientMaxspeed) +#define CREATE_FAKE_CLIENT (*g_engfuncs.pfnCreateFakeClient) #define PLAYER_RUN_MOVE (*g_engfuncs.pfnRunPlayerMove) #define NUMBER_OF_ENTITIES (*g_engfuncs.pfnNumberOfEntities) #define GET_INFO_BUFFER (*g_engfuncs.pfnGetInfoKeyBuffer) diff --git a/regamedll/dlls/explode.h b/regamedll/dlls/explode.h index 5a020d73..aca5562e 100644 --- a/regamedll/dlls/explode.h +++ b/regamedll/dlls/explode.h @@ -32,8 +32,8 @@ #pragma once #endif -#define SF_ENVEXPLOSION_NODAMAGE (1<<0) // when set, ENV_EXPLOSION will not actually inflict damage -#define SF_ENVEXPLOSION_REPEATABLE (1<<1) // can this entity be refired? +#define SF_ENVEXPLOSION_NODAMAGE (1<<0) // when set, ENV_EXPLOSION will not actually inflict damage +#define SF_ENVEXPLOSION_REPEATABLE (1<<1) // can this entity be refired? #define SF_ENVEXPLOSION_NOFIREBALL (1<<2) // don't draw the fireball #define SF_ENVEXPLOSION_NOSMOKE (1<<3) // don't draw the smoke #define SF_ENVEXPLOSION_NODECAL (1<<4) // don't make a scorch mark diff --git a/regamedll/dlls/func_break.h b/regamedll/dlls/func_break.h index 5ae09bf5..e7ef5297 100644 --- a/regamedll/dlls/func_break.h +++ b/regamedll/dlls/func_break.h @@ -33,7 +33,7 @@ #endif // this many shards spawned when breakable objects break; -#define NUM_SHARDS 6 +#define NUM_SHARDS 6 typedef enum { diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 75f9d974..ddc002be 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -555,10 +555,10 @@ void CFuncTank::Fire(const Vector &barrelEnd, const Vector &forward, entvars_t * Fire_(barrelEnd, forward, pevAttacker); } -//void CFuncTank::Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) -//{ -// Fire_(barrelEnd, forward, pevAttacker); -//} +void CFuncTankGun::Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +{ + Fire_(barrelEnd, forward, pevAttacker); +} void CFuncTankLaser::KeyValue(KeyValueData *pkvd) { diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index 81aae5c2..8065acab 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -272,7 +272,7 @@ public: NOBODY virtual void InitHUD(CBasePlayer *pl); NOBODY virtual void ClientDisconnected(edict_t *pClient); NOBODY virtual void UpdateGameMode(CBasePlayer *pPlayer); - NOBODY virtual float FlPlayerFallDamage(CBasePlayer *pPlayer); + virtual float FlPlayerFallDamage(CBasePlayer *pPlayer); NOBODY virtual BOOL FPlayerCanTakeDamage(CBasePlayer *pPlayer, CBaseEntity *pAttacker); NOBODY virtual void PlayerSpawn(CBasePlayer *pPlayer); NOBODY virtual void PlayerThink(CBasePlayer *pPlayer); @@ -411,7 +411,7 @@ public: return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; } NOBODY BOOL TeamFull(int team_id); - NOBODY BOOL TeamStacked(int newTeam_id, int curTeam_id); + BOOL TeamStacked(int newTeam_id, int curTeam_id); NOBODY bool IsVIPQueueEmpty(void); NOBODY bool AddToVIPQueue(CBasePlayer *toAdd); NOBODY void PickNextVIP(void); @@ -423,8 +423,8 @@ public: NOBODY void DisplayMaps(CBasePlayer *player, int iVote); NOBODY void ResetAllMapVotes(void); NOBODY void ProcessMapVote(CBasePlayer *player, int iVote); - NOBODY BOOL IsThereABomber(void); - NOBODY BOOL IsThereABomb(void); + BOOL IsThereABomber(void); + BOOL IsThereABomb(void); NOBODY bool IsMatchStarted(void); NOBODY void SendMOTDToClient(edict_t *client); private: @@ -624,7 +624,7 @@ NOBODY void SV_Career_Restart_f(void); NOBODY void SV_Career_EndRound_f(void); NOBODY void SV_CareerAddTask_f(void); NOBODY void SV_CareerMatchLimit_f(void); -NOBODY void Broadcast(void); +void Broadcast(const char *sentence); char *GetTeam(int teamNo); NOBODY void EndRoundMessage(const char *sentence, int event); NOBODY void ReadMultiplayCvars(CHalfLifeMultiplay *mp); diff --git a/regamedll/dlls/ggrenade.cpp b/regamedll/dlls/ggrenade.cpp index f235e929..c14a298f 100644 --- a/regamedll/dlls/ggrenade.cpp +++ b/regamedll/dlls/ggrenade.cpp @@ -1,659 +1,1360 @@ -#include "precompiled.h" - -/* -* Globals initialization +#include "precompiled.h" + +/* +* Globals initialization */ #ifndef HOOK_GAMEDLL -TYPEDESCRIPTION CGrenade::m_SaveData[] = -{ - DEFINE_FIELD(CGrenade, m_fAttenu, FIELD_FLOAT), - DEFINE_FIELD(CGrenade, m_flNextFreq, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_flC4Blow, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_flNextFreqInterval, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_flNextBeep, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_flDefuseCountDown, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_flNextBlink, FIELD_TIME), - DEFINE_FIELD(CGrenade, m_pentCurBombTarget, FIELD_EDICT), - DEFINE_FIELD(CGrenade, m_sBeepName, FIELD_POINTER), - DEFINE_FIELD(CGrenade, m_bIsC4, FIELD_BOOLEAN), - DEFINE_FIELD(CGrenade, m_bStartDefuse, FIELD_BOOLEAN), - DEFINE_FIELD(CGrenade, m_SGSmoke, FIELD_INTEGER), - DEFINE_FIELD(CGrenade, m_bJustBlew, FIELD_BOOLEAN), - DEFINE_FIELD(CGrenade, m_bLightSmoke, FIELD_BOOLEAN), - DEFINE_FIELD(CGrenade, m_usEvent, FIELD_INTEGER), +TYPEDESCRIPTION CGrenade::m_SaveData[] = +{ + DEFINE_FIELD(CGrenade, m_fAttenu, FIELD_FLOAT), + DEFINE_FIELD(CGrenade, m_flNextFreq, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_flC4Blow, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_flNextFreqInterval, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_flNextBeep, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_flDefuseCountDown, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_flNextBlink, FIELD_TIME), + DEFINE_FIELD(CGrenade, m_pentCurBombTarget, FIELD_EDICT), + DEFINE_FIELD(CGrenade, m_sBeepName, FIELD_POINTER), + DEFINE_FIELD(CGrenade, m_bIsC4, FIELD_BOOLEAN), + DEFINE_FIELD(CGrenade, m_bStartDefuse, FIELD_BOOLEAN), + DEFINE_FIELD(CGrenade, m_SGSmoke, FIELD_INTEGER), + DEFINE_FIELD(CGrenade, m_bJustBlew, FIELD_BOOLEAN), + DEFINE_FIELD(CGrenade, m_bLightSmoke, FIELD_BOOLEAN), + DEFINE_FIELD(CGrenade, m_usEvent, FIELD_INTEGER), }; #else // HOOK_GAMEDLL TYPEDESCRIPTION (*CGrenade::pm_SaveData)[15]; -#endif // HOOK_GAMEDLL - +#endif // HOOK_GAMEDLL + /* ../cstrike/dlls/ggrenade.cpp:52 */ -LINK_ENTITY_TO_CLASS(grenade, CGrenade); - +LINK_ENTITY_TO_CLASS(grenade, CGrenade); + /* ../cstrike/dlls/ggrenade.cpp:60 */ void CGrenade::Explode(Vector vecSrc, Vector vecAim) { -// { -// TraceResult tr; // 62 -// operator+(const Vector *const this, -// const Vector &v); // 63 -// } -} - + TraceResult tr; + UTIL_TraceLine(pev->origin, pev->origin + Vector(0, 0, -32), ignore_monsters, ENT(pev), &tr); + Explode(&tr, DMG_BLAST); +} + +// UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution. + /* ../cstrike/dlls/ggrenade.cpp:69 */ void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType) { -// { -// float flRndSound; // 71 -// int iContents; // 84 -// entvars_t *pevOwner; // 133 -// VARS(edict_t *pent); // 135 -// Instance(edict_t *pent); // 140 -// Vector(Vector *const this, -// const Vector &v); // 145 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 161 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 163 -// { -// int sparkCount; // 179 -// { -// int i; // 180 -// } -// } -// operator*(const Vector *const this, -// float fl); // 81 -// operator*(const Vector *const this, -// float fl); // 81 -// operator+(const Vector *const this, -// const Vector &v); // 81 -// } -} - + float flRndSound; // sound randomizer + + pev->model = iStringNull; // invisible + pev->solid = SOLID_NOT; // intangible + pev->takedamage = DAMAGE_NO; + + // Pull out of the wall a bit + if (pTrace->flFraction != 1.0f) + { + pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); + } + + int iContents = UTIL_PointContents(pev->origin); + CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); + + entvars_t *pevOwner; + if (pev->owner) + pevOwner = VARS(pev->owner); + else + pevOwner = NULL; + + TheBots->OnEvent(EVENT_FLASHBANG_GRENADE_EXPLODED, CBaseEntity::Instance(pev->owner), (CBaseEntity *)&pev->origin); + + // can't traceline attack owner if this is set + pev->owner = NULL; + + RadiusFlash(pev->origin, pev, pevOwner, 4, CLASS_NONE, bitsDamageType); + + if (RANDOM_FLOAT(0, 1) < 0.5) + UTIL_DecalTrace(pTrace, DECAL_SCORCH1); + else + UTIL_DecalTrace(pTrace, DECAL_SCORCH2); + + // TODO: unused + flRndSound = RANDOM_FLOAT(0, 1); + + switch (RANDOM_LONG(0, 1)) + { + case 0: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-2.wav", 0.55, ATTN_NORM); + break; + case 1: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-1.wav", 0.55, ATTN_NORM); + break; + } + + pev->effects |= EF_NODRAW; + SetThink(&CGrenade::Smoke); + pev->velocity = g_vecZero; + pev->nextthink = gpGlobals->time + 0.3; + + if (iContents != CONTENTS_WATER) + { + int sparkCount = RANDOM_LONG(0, 3); + + for (int i = 0; i < sparkCount; i++) + Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); + } +} + /* ../cstrike/dlls/ggrenade.cpp:186 */ void CGrenade::Explode2(TraceResult *pTrace, int bitsDamageType) { -// { -// float flRndSound; // 188 -// class CHalfLifeMultiplay *mp; // 189 -// int iContents; // 218 -// entvars_t *pevOwner; // 273 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 233 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 221 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 245 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 257 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 269 -// VARS(edict_t *pent); // 275 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 289 -// edict(CBaseEntity *const this); // 292 -// ENTINDEX(edict_t *pEdict); // 292 -// { -// int sparkCount; // 322 -// { -// int i; // 323 -// } -// } -// operator*(const Vector *const this, -// float fl); // 215 -// operator*(const Vector *const this, -// float fl); // 215 -// operator+(const Vector *const this, -// const Vector &v); // 215 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 310 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 312 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 311 -// } -} - + float flRndSound; // sound randomizer + CHalfLifeMultiplay *mp = g_pGameRules; + + pev->model = iStringNull; // invisible + pev->solid = SOLID_NOT; // intangible + pev->takedamage = DAMAGE_NO; + + UTIL_ScreenShake(pTrace->vecEndPos, 25, 150, 1, 3000); + + mp->m_bTargetBombed = true; + + if (mp->IsCareer()) + { + TheCareerTasks->LatchRoundEndMessage(); + } + + m_bJustBlew = true; + mp->CheckWinConditions(); + + if (pTrace->flFraction != 1.0f) + { + pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); + } + + int iContents = UTIL_PointContents(pev->origin); + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SPRITE); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z - 10); + WRITE_SHORT(g_sModelIndexFireball3); + WRITE_BYTE((pev->dmg - 275) * 0.6); + WRITE_BYTE(150); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SPRITE); + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(-10, 10)); + WRITE_SHORT(g_sModelIndexFireball2); + WRITE_BYTE((pev->dmg - 275) * 0.6); + WRITE_BYTE(150); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SPRITE); + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(-10, 10)); + WRITE_SHORT(g_sModelIndexFireball3); + WRITE_BYTE((pev->dmg - 275) * 0.6); + WRITE_BYTE(150); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SPRITE); + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-512, 512)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(-10, 10)); + WRITE_SHORT(g_sModelIndexFireball); + WRITE_BYTE((pev->dmg - 275) * 0.6); + WRITE_BYTE(17); + MESSAGE_END(); + + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/c4_explode1.wav", VOL_NORM, 0.25); + CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); + + entvars_t *pevOwner; + if (pev->owner) + pevOwner = VARS(pev->owner); + else + pevOwner = NULL; + + pev->owner = NULL; + RadiusDamage(pev, pevOwner, mp->m_flBombRadius, CLASS_NONE, bitsDamageType); + + if (mp->IsCareer()) + { + TheCareerTasks->UnlatchRoundEndMessage(); + } + + // tell director about it + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); // command length in bytes + WRITE_BYTE(DRC_CMD_EVENT); // explode event + WRITE_SHORT(ENTINDEX(edict())); // index number of primary entity + WRITE_SHORT(0); // index number of secondary entity + WRITE_LONG(15 | DRC_FLAG_FINAL); // eventflags (priority and flags) + MESSAGE_END(); + + if (RANDOM_FLOAT(0, 1) < 0.5) + UTIL_DecalTrace(pTrace, DECAL_SCORCH1); + else + UTIL_DecalTrace(pTrace, DECAL_SCORCH2); + + // TODO: unused + flRndSound = RANDOM_FLOAT(0, 1); + + switch (RANDOM_LONG(0, 2)) + { + case 0: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris1.wav", 0.55, ATTN_NORM); + break; + case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris2.wav", 0.55, ATTN_NORM); + break; + case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris3.wav", 0.55, ATTN_NORM); + break; + } + + pev->effects |= EF_NODRAW; + SetThink(&CGrenade::Smoke2); + pev->velocity = g_vecZero; + pev->nextthink = gpGlobals->time + 0.85; + + if (iContents != CONTENTS_WATER) + { + int sparkCount = RANDOM_LONG(0, 3); + + for (int i = 0; i < sparkCount; i++) + Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); + } +} + /* ../cstrike/dlls/ggrenade.cpp:330 */ void CGrenade::Explode3(TraceResult *pTrace, int bitsDamageType) { -// { -// float flRndSound; // 332 -// entvars_t *pevOwner; // 371 -// float damage; // 382 -// int sparkCount; // 415 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 345 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 358 -// VARS(edict_t *pent); // 373 -// Instance(edict_t *pent); // 378 -// { -// int i; // 416 -// } -// operator*(const Vector *const this, -// float fl); // 342 -// operator*(const Vector *const this, -// float fl); // 342 -// operator+(const Vector *const this, -// const Vector &v); // 342 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 405 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 407 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 406 -// } -} - + float flRndSound; // sound randomizer + //float damage; + + pev->model = iStringNull; // invisible + pev->solid = SOLID_NOT; // intangible + pev->takedamage = DAMAGE_NO; + + if (pTrace->flFraction != 1.0f) + { + pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); + } + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_EXPLOSION); // This makes a dynamic light and the explosion sprites/sound + WRITE_COORD(pev->origin.x); // Send to PAS because of the sound + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z + 20); + WRITE_SHORT(g_sModelIndexFireball3); + WRITE_BYTE(25); // scale * 10 + WRITE_BYTE(30); // framerate + WRITE_BYTE(TE_EXPLFLAG_NONE); // flags + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_EXPLOSION); // This makes a dynamic light and the explosion sprites/sound + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-64, 64)); // Send to PAS because of the sound + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-64, 64)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(30, 35)); + WRITE_SHORT(g_sModelIndexFireball2); + WRITE_BYTE(30); // scale * 10 + WRITE_BYTE(30); // framerate + WRITE_BYTE(TE_EXPLFLAG_NONE); // flags + MESSAGE_END(); + + CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); + + entvars_t *pevOwner; + if (pev->owner) + pevOwner = VARS(pev->owner); + else + pevOwner = NULL; + + TheBots->OnEvent(EVENT_HE_GRENADE_EXPLODED, CBaseEntity::Instance(pev->owner)); + + pev->owner = NULL; + RadiusDamage(pev, pevOwner, pev->dmg, CLASS_NONE, bitsDamageType); + + if (RANDOM_FLOAT(0, 1) < 0.5) + UTIL_DecalTrace(pTrace, DECAL_SCORCH1); + else + UTIL_DecalTrace(pTrace, DECAL_SCORCH2); + + // TODO: unused + flRndSound = RANDOM_FLOAT(0, 1); + + switch (RANDOM_LONG(0, 2)) + { + case 0: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris1.wav", 0.55, ATTN_NORM); + break; + case 1: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris2.wav", 0.55, ATTN_NORM); + break; + case 2: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris3.wav", 0.55, ATTN_NORM); + break; + } + + pev->effects |= EF_NODRAW; + SetThink(&CGrenade::Smoke3_C); + pev->velocity = g_vecZero; + pev->nextthink = gpGlobals->time + 0.55; + int sparkCount = RANDOM_LONG(0, 3); + + for (int i = 0; i < sparkCount; i++) + Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); +} + /* ../cstrike/dlls/ggrenade.cpp:420 */ -void CGrenade::SG_Explode(TraceResult *pTrace, int bitsDamageType) +NOXREF void CGrenade::SG_Explode(TraceResult *pTrace, int bitsDamageType) { -// { -// float flRndSound; // 422 -// int iContents; // 435 -// entvars_t *pevOwner; // 438 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 458 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 460 -// { -// int sparkCount; // 467 -// { -// int i; // 468 -// } -// } -// operator*(const Vector *const this, -// float fl); // 432 -// operator*(const Vector *const this, -// float fl); // 432 -// operator+(const Vector *const this, -// const Vector &v); // 432 -// } -} - + float flRndSound; // sound randomizer + //entvars_t *pevOwner; + + pev->model = iStringNull; // invisible + pev->solid = SOLID_NOT; // intangible + + pev->takedamage = DAMAGE_NO; + + if (pTrace->flFraction != 1.0f) + { + pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); + } + + int iContents = UTIL_PointContents(pev->origin); + CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); + + // can't traceline attack owner if this is set + pev->owner = NULL; + + if (RANDOM_FLOAT(0, 1) < 0.5) + UTIL_DecalTrace(pTrace, DECAL_SCORCH1); + else + UTIL_DecalTrace(pTrace, DECAL_SCORCH2); + + // TODO: unused + flRndSound = RANDOM_FLOAT(0, 1); + + switch (RANDOM_LONG(0, 1)) + { + case 0: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-2.wav", 0.55, ATTN_NORM); + break; + case 1: + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-1.wav", 0.55, ATTN_NORM); + break; + } + + pev->effects |= EF_NODRAW; + SetThink(&CGrenade::Smoke); + pev->velocity = g_vecZero; + pev->nextthink = gpGlobals->time + 0.1; + + if (iContents != CONTENTS_WATER) + { + int sparkCount = RANDOM_LONG(0, 3); + + for (int i = 0; i < sparkCount; i++) + Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); + } +} + /* ../cstrike/dlls/ggrenade.cpp:475 */ void CGrenade::Smoke3_C(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 484 -// operator+(const Vector *const this, -// const Vector &v); // 480 -// operator-(const Vector *const this, -// const Vector &v); // 480 -} - + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SMOKE); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z - 5); + WRITE_SHORT(g_sModelIndexSmoke); + WRITE_BYTE(35 + RANDOM_FLOAT(0, 10)); // scale * 10 + WRITE_BYTE(5); // framerate + MESSAGE_END(); + } + + UTIL_Remove(this); +} + /* ../cstrike/dlls/ggrenade.cpp:497 */ void CGrenade::Smoke3_B(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 506 -// operator+(const Vector *const this, -// const Vector &v); // 502 -// operator-(const Vector *const this, -// const Vector &v); // 502 -} - + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SMOKE); + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-128, 128)); + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-128, 128)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(-10, 10)); + WRITE_SHORT(g_sModelIndexSmoke); + WRITE_BYTE(15 + RANDOM_FLOAT(0, 10)); // scale * 10 + WRITE_BYTE(10); // framerate + MESSAGE_END(); + } + + pev->nextthink = gpGlobals->time + 0.15; + SetThink(&CGrenade::Smoke3_A); +} + /* ../cstrike/dlls/ggrenade.cpp:520 */ void CGrenade::Smoke3_A(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 529 -// operator+(const Vector *const this, -// const Vector &v); // 525 -// operator-(const Vector *const this, -// const Vector &v); // 525 + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SMOKE); + WRITE_COORD(pev->origin.x + RANDOM_FLOAT(-128, 128)); + WRITE_COORD(pev->origin.y + RANDOM_FLOAT(-128, 128)); + WRITE_COORD(pev->origin.z + RANDOM_FLOAT(-10, 10)); + WRITE_SHORT(g_sModelIndexSmoke); + WRITE_BYTE(15 + RANDOM_FLOAT(0, 10)); // scale * 10 + WRITE_BYTE(12); // framerate + MESSAGE_END(); + } } - + /* ../cstrike/dlls/ggrenade.cpp:544 */ void CGrenade::Smoke2(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 553 -// operator+(const Vector *const this, -// const Vector &v); // 549 -// operator-(const Vector *const this, -// const Vector &v); // 549 -} - + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SMOKE); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT(g_sModelIndexSmoke); + WRITE_BYTE(150); // scale * 10 + WRITE_BYTE(8); // framerate + MESSAGE_END(); + } + + UTIL_Remove(this); +} + /* ../cstrike/dlls/ggrenade.cpp:567 */ void CGrenade::Smoke(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 575 -// operator+(const Vector *const this, -// const Vector &v); // 571 -// operator-(const Vector *const this, -// const Vector &v); // 571 -} - + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_SMOKE); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT(g_sModelIndexSmoke); + WRITE_BYTE(25); // scale * 10 + WRITE_BYTE(6); // framerate + MESSAGE_END(); + } + + UTIL_Remove(this); +} + /* ../cstrike/dlls/ggrenade.cpp:591 */ void CGrenade::SG_Smoke(void) { -// { -// int iMaxSmokePuffs; // 632 -// float flSmokeInterval; // 633 -// { -// Vector origin; // 599 -// Vector angle; // 599 -// float x_old; // 605 -// float y_old; // 605 -// float R_angle; // 605 -// operator*(const Vector *const this, -// float fl); // 603 -// } -// operator+(const Vector *const this, -// const Vector &v); // 595 -// operator-(const Vector *const this, -// const Vector &v); // 595 -// } -} - + int iMaxSmokePuffs = 100; + float flSmokeInterval; + + if (UTIL_PointContents(pev->origin) == CONTENTS_WATER) + { + UTIL_Bubbles(pev->origin - Vector(64, 64, 64), pev->origin + Vector(64, 64, 64), 100); + } + else + { + Vector origin, angle; + float_precision x_old, y_old, R_angle; + + UTIL_MakeVectors(pev->angles); + + origin = gpGlobals->v_forward * RANDOM_FLOAT(3, 8); + + flSmokeInterval = RANDOM_FLOAT(1.5, 3.5) * iMaxSmokePuffs; + + R_angle = m_angle / (180.00433335 / M_PI); + + x_old = cos((float_precision)R_angle); + y_old = sin((float_precision)R_angle); + + angle.x = origin.x * x_old - origin.y * y_old; + angle.y = origin.x * y_old + origin.y * x_old; + + m_angle = (m_angle + 30) % 360; + + PLAYBACK_EVENT_FULL(0, NULL, m_usEvent, 0, pev->origin, m_vSmokeDetonate, angle.x, angle.y, flSmokeInterval, 4, m_bLightSmoke, 6); + } + + if (m_SGSmoke <= 20) + { + pev->nextthink = gpGlobals->time + 1.0; + SetThink(&CGrenade::SG_Smoke); + ++m_SGSmoke; + } + else + { + pev->effects |= EF_NODRAW; + TheBots->RemoveGrenade(this); + UTIL_Remove(this); + } +} + /* ../cstrike/dlls/ggrenade.cpp:664 */ void CGrenade::Killed_(entvars_t *pevAttacker, int iGib) { -// Detonate(CGrenade *const this); // 666 -} - + Detonate(); +} + +// Timed grenade, this think is called when time runs out. + /* ../cstrike/dlls/ggrenade.cpp:671 */ void CGrenade::DetonateUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -} - + SetThink(&CGrenade::Detonate); + pev->nextthink = gpGlobals->time; +} + /* ../cstrike/dlls/ggrenade.cpp:677 */ void CGrenade::PreDetonate(void) { -} - + CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin, 400, 0.3); + + SetThink(&CGrenade::Detonate); + pev->nextthink = gpGlobals->time + 1; +} + /* ../cstrike/dlls/ggrenade.cpp:686 */ void CGrenade::Detonate(void) { -// { -// TraceResult tr; // 688 -// Vector vecSpot; // 689 -// operator+(const Vector *const this, -// const Vector &v); // 691 -// operator+(const Vector *const this, -// const Vector &v); // 692 -// } -} - + TraceResult tr; + Vector vecSpot; // trace starts here! + + vecSpot = pev->origin + Vector(0, 0, 8); + UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -40), ignore_monsters, ENT(pev), &tr); + Explode(&tr, DMG_BLAST); +} + /* ../cstrike/dlls/ggrenade.cpp:698 */ void CGrenade::SG_Detonate(void) { -// { -// TraceResult tr; // 700 -// Vector vecSpot; // 701 -// edict_t *pentFind; // 713 -// operator+(const Vector *const this, -// const Vector &v); // 703 -// operator+(const Vector *const this, -// const Vector &v); // 704 -// Instance(edict_t *pent); // 707 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 710 -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 714 -// FNullEnt(const edict_t *pent); // 715 -// { -// class CBaseEntity *pEnt; // 717 -// Instance(edict_t *pent); // 717 -// { -// float fDistance; // 720 -// operator-(const Vector *const this, -// const Vector &v); // 722 -// Length(const Vector *const this); // 722 -// } -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 727 -// } -// } -} + TraceResult tr; + Vector vecSpot; + edict_t *pentFind = NULL; + + vecSpot = pev->origin + Vector(0, 0, 8); + + UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -40), ignore_monsters, ENT(pev), &tr); + + TheBots->OnEvent(EVENT_SMOKE_GRENADE_EXPLODED, CBaseEntity::Instance(pev->owner)); + TheBots->AddGrenade(WEAPON_SMOKEGRENADE, this); + + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/sg_explode.wav", VOL_NORM, ATTN_NORM); + + while ((pentFind = FIND_ENTITY_BY_CLASSNAME(pentFind, "grenade")) != NULL) + { + if (FNullEnt(pentFind)) + break; + + CBaseEntity *pEnt = CBaseEntity::Instance(pentFind); + + if (pEnt) + { + //float_precision + float fDistance = (pEnt->pev->origin - pev->origin).Length(); + + if (fDistance != 0.0f && fDistance <= 250.0f) + { + if (gpGlobals->time > pEnt->pev->dmgtime) + { + m_bLightSmoke = true; + } + } + } + } + + m_bDetonated = true; + PLAYBACK_EVENT_FULL(0, NULL, m_usEvent, 0, pev->origin, (float *)&g_vecZero, 0, 0, 0, 1, m_bLightSmoke, FALSE); + m_vSmokeDetonate = pev->origin; + + pev->velocity.x = RANDOM_FLOAT(-175, 175); + pev->velocity.y = RANDOM_FLOAT(-175, 175); + pev->velocity.z = RANDOM_FLOAT(250, 350); + + pev->nextthink = gpGlobals->time + 0.1; + SetThink(&CGrenade::SG_Smoke); +} /* ../cstrike/dlls/ggrenade.cpp:752 */ void CGrenade::Detonate2(void) { -// { -// TraceResult tr; // 754 -// Vector vecSpot; // 755 -// Explode2(CGrenade *const this, -// TraceResult *pTrace, -// int bitsDamageType); // 760 -// operator+(const Vector *const this, -// const Vector &v); // 757 -// operator+(const Vector *const this, -// const Vector &v); // 758 -// } -} + TraceResult tr; + Vector vecSpot;// trace starts here! + + vecSpot = pev->origin + Vector(0, 0, 8); + + UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -40), ignore_monsters, ENT(pev), &tr); + Explode2(&tr, DMG_BLAST); +} /* ../cstrike/dlls/ggrenade.cpp:764 */ void CGrenade::Detonate3(void) { -// { -// TraceResult tr; // 766 -// Vector vecSpot; // 767 -// operator+(const Vector *const this, -// const Vector &v); // 769 -// operator+(const Vector *const this, -// const Vector &v); // 770 -// Explode3(CGrenade *const this, -// TraceResult *pTrace, -// int bitsDamageType); // 772 -// } -} - + TraceResult tr; + Vector vecSpot;// trace starts here! + + vecSpot = pev->origin + Vector(0, 0, 8); + UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -40), ignore_monsters, ENT(pev), &tr); + Explode3(&tr, DMG_EXPLOSION); +} + +// Contact grenade, explode when it touches something + /* ../cstrike/dlls/ggrenade.cpp:780 */ void CGrenade::ExplodeTouch(CBaseEntity *pOther) { -// { -// TraceResult tr; // 782 -// Vector vecSpot; // 783 -// edict(CBaseEntity *const this); // 785 -// Normalize(const Vector *const this); // 787 -// operator*(const Vector *const this, -// float fl); // 787 -// operator-(const Vector *const this, -// const Vector &v); // 787 -// Normalize(const Vector *const this); // 788 -// operator*(const Vector *const this, -// float fl); // 788 -// operator+(const Vector *const this, -// const Vector &v); // 788 -// } -} - + TraceResult tr; + Vector vecSpot; // trace starts here! + + pev->enemy = pOther->edict(); + + vecSpot = pev->origin - pev->velocity.Normalize() * 32; + UTIL_TraceLine(vecSpot, vecSpot + pev->velocity.Normalize() * 64, ignore_monsters, ENT(pev), &tr); + Explode(&tr, DMG_BLAST); +} + /* ../cstrike/dlls/ggrenade.cpp:794 */ void CGrenade::DangerSoundThink(void) { -// DangerSoundThink(CGrenade *const this); // 794 -} - + if (!IsInWorld()) + { + UTIL_Remove(this); + return; + } + + CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, pev->velocity.Length(), 0.2); + pev->nextthink = gpGlobals->time + 0.2; + + if (pev->waterlevel != 0) + { + pev->velocity = pev->velocity * 0.5; + } +} + /* ../cstrike/dlls/ggrenade.cpp:812 */ void CGrenade::BounceTouch(CBaseEntity *pOther) { -// { -// Vector vecTestVelocity; // 824 -// Length(const Vector *const this); // 871 -// operator*(const Vector *const this, -// float fl); // 820 -// operator*(const Vector *const this, -// float fl); // 848 -// Length(const Vector *const this); // 833 -// ENT(EOFFSET eoffset); // 865 -// } -} - + // don't hit the guy that launched this grenade + if (pOther->edict() == pev->owner) + return; + + if (FClassnameIs(pOther->pev, "func_breakable") && pOther->pev->rendermode != kRenderNormal) + { + pev->velocity = pev->velocity * -2; + return; + } + + Vector vecTestVelocity; + + // this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical + // or thrown very far tend to slow down too quickly for me to always catch just by testing velocity. + // trimming the Z velocity a bit seems to help quite a bit. + vecTestVelocity = pev->velocity; + vecTestVelocity.z *= 0.7; + + if (!m_fRegisteredSound && vecTestVelocity.Length() <= 60) + { + // grenade is moving really slow. It's probably very close to where it will ultimately stop moving. + // go ahead and emit the danger sound. + + // register a radius louder than the explosion, so we make sure everyone gets out of the way + CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4, 0.3); + m_fRegisteredSound = TRUE; + } + + if (pev->flags & FL_ONGROUND) + { + // add a bit of static friction + pev->velocity = pev->velocity * 0.8; + pev->sequence = RANDOM_LONG(1, 1); // TODO: what? + } + else + { + if (m_iBounceCount < 5) + { + // play bounce sound + BounceSound(); + } + + if (m_iBounceCount >= 10) + { + pev->groundentity = ENT(0); + pev->flags |= FL_ONGROUND; + pev->velocity = g_vecZero; + } + + ++m_iBounceCount; + } + + pev->framerate = pev->velocity.Length() / 200; + + if (pev->framerate > 1) + { + pev->framerate = 1; + } + else if (pev->framerate < 0.5) + { + pev->framerate = 0; + } +} + /* ../cstrike/dlls/ggrenade.cpp:880 */ void CGrenade::SlideTouch(CBaseEntity *pOther) { -// edict(CBaseEntity *const this); // 883 -// operator*(const Vector *const this, -// float fl); // 891 -} - + // don't hit the guy that launched this grenade + if (pOther->edict() == pev->owner) + return; + + if (pev->flags & FL_ONGROUND) + { + // add a bit of static friction + pev->velocity = pev->velocity * 0.95; + } + else + { + BounceSound(); + } +} + /* ../cstrike/dlls/ggrenade.cpp:904 */ void CGrenade::BounceSound_(void) { -// BounceSound(CGrenade *const this); // 904 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 907 -} - + if (pev->dmg > 50) + { + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/he_bounce-1.wav", 0.25, ATTN_NORM); + return; + } + + switch (RANDOM_LONG(0, 2)) + { + case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit1.wav", 0.25, ATTN_NORM); + break; + case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit2.wav", 0.25, ATTN_NORM); + break; + case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit3.wav", 0.25, ATTN_NORM); + break; + } +} + /* ../cstrike/dlls/ggrenade.cpp:919 */ void CGrenade::TumbleThink(void) { -// TumbleThink(CGrenade *const this); // 919 -} - + if (!IsInWorld()) + { + UTIL_Remove(this); + return; + } + + StudioFrameAdvance(); + pev->nextthink = gpGlobals->time + 0.1; + + if (pev->dmgtime - 1 < gpGlobals->time) + { + CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * (pev->dmgtime - gpGlobals->time), 400, 0.1); + } + + if (pev->dmgtime <= gpGlobals->time) + { + if (pev->dmg <= 40) + { + SetThink(&CGrenade::Detonate); + } + else + SetThink(&CGrenade::Detonate3); + } + + if (pev->waterlevel != 0) + { + pev->velocity = pev->velocity * 0.5; + pev->framerate = 0.2; + } +} + /* ../cstrike/dlls/ggrenade.cpp:949 */ void CGrenade::SG_TumbleThink(void) { -// operator*(const Vector ::SG_TumbleThink(// float fl); // 978 -// operator*(const Vector *const this, -// float fl); // 960 -// operator*(const Vector *const this, -// float fl); // 968 -// operator+(const Vector *const this, -// const Vector &v); // 968 -} - + if (!IsInWorld()) + { + UTIL_Remove(this); + return; + } + + if (pev->flags & FL_ONGROUND) + { + pev->velocity = pev->velocity * 0.95; + } + + StudioFrameAdvance(); + pev->nextthink = gpGlobals->time + 0.1; + + if (pev->dmgtime - 1 < gpGlobals->time) + { + CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * (pev->dmgtime - gpGlobals->time), 400, 0.1); + } + + if (pev->dmgtime <= gpGlobals->time) + { + if (pev->flags & FL_ONGROUND) + { + SetThink(&CGrenade::SG_Detonate); + } + } + + if (pev->waterlevel != 0) + { + pev->velocity = pev->velocity * 0.5; + pev->framerate = 0.2; + } +} + /* ../cstrike/dlls/ggrenade.cpp:985 */ void CGrenade::Spawn_(void) { -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 989 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 994 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 994 -} + m_iBounceCount = 0; + pev->movetype = MOVETYPE_BOUNCE; + + if (pev->classname) + RemoveEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + + MAKE_STRING_CLASS("grenade", pev); + AddEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + + m_bIsC4 = false; + pev->solid = SOLID_BBOX; + + SET_MODEL(ENT(pev), "models/grenade.mdl"); + UTIL_SetSize(pev, Vector( 0, 0, 0), Vector(0, 0, 0)); + + pev->dmg = 30; + m_fRegisteredSound = FALSE; +} /* ../cstrike/dlls/ggrenade.cpp:1000 */ -void ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity) +NOXREF CGrenade *CGrenade::ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity) { -// { -// class CGrenade *pGrenade; // 1002 -// GetClassPtr(CGrenade *a); // 1002 -// } + CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL); + pGrenade->Spawn(); + + // contact grenades arc lower + pGrenade->pev->gravity = 0.5; // lower gravity since grenade is aerodynamic and engine doesn't know it. + + UTIL_SetOrigin(pGrenade->pev, vecStart); + pGrenade->pev->velocity = vecVelocity; + pGrenade->pev->angles = UTIL_VecToAngles(pGrenade->pev->velocity); + pGrenade->pev->owner = ENT(pevOwner); + + // make monsters afaid of it while in the air + pGrenade->SetThink(&CGrenade::DangerSoundThink); + pGrenade->pev->nextthink = gpGlobals->time; + + // Tumble in air + pGrenade->pev->avelocity.x = RANDOM_FLOAT(-100, -500); + + // Explode on contact + pGrenade->SetTouch(&CGrenade::ExplodeTouch); + + pGrenade->pev->dmg = gSkillData.plrDmgM203Grenade; + pGrenade->m_bJustBlew = true; + return pGrenade; } /* ../cstrike/dlls/ggrenade.cpp:1028 */ -void ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, short unsigned int usEvent) +CGrenade *CGrenade::ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent) { -// { -// class CGrenade *pGrenade; // 1030 -// GetClassPtr(CGrenade *a); // 1030 -// operator*(const Vector *const this, -// float fl); // 1033 -// } -} - + CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL); + pGrenade->Spawn(); + + UTIL_SetOrigin(pGrenade->pev, vecStart); + pGrenade->pev->velocity = vecVelocity; + pGrenade->pev->angles = pevOwner->angles; + pGrenade->pev->owner = ENT(pevOwner); + + pGrenade->m_usEvent = usEvent; + + pGrenade->SetTouch(&CGrenade::BounceTouch); + + pGrenade->pev->dmgtime = gpGlobals->time + time; + pGrenade->SetThink(&CGrenade::TumbleThink); + pGrenade->pev->nextthink = gpGlobals->time + 0.1; + + pGrenade->pev->sequence = RANDOM_LONG(3, 6); + pGrenade->pev->framerate = 1.0; + + pGrenade->m_bJustBlew = true; + + pGrenade->pev->gravity = 0.55; + pGrenade->pev->friction = 0.7; + + pGrenade->m_iTeam = iTeam; + + SET_MODEL(ENT(pGrenade->pev), "models/w_hegrenade.mdl"); + pGrenade->pev->dmg = 100; + + return pGrenade; +} + /* ../cstrike/dlls/ggrenade.cpp:1069 */ -void ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time) +CGrenade *CGrenade::ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time) { -// { -// class CGrenade *pGrenade; // 1071 -// GetClassPtr(CGrenade *a); // 1071 -// } -} - + CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL); + pGrenade->Spawn(); + + UTIL_SetOrigin(pGrenade->pev, vecStart); + pGrenade->pev->velocity = vecVelocity; + pGrenade->pev->angles = pevOwner->angles; + pGrenade->pev->owner = ENT(pevOwner); + + // Bounce if touched + pGrenade->SetTouch(&CGrenade::BounceTouch); + + // Take one second off of the desired detonation time and set the think to PreDetonate. PreDetonate + // will insert a DANGER sound into the world sound list and delay detonation for one second so that + // the grenade explodes after the exact amount of time specified in the call to ShootTimed(). + + pGrenade->pev->dmgtime = gpGlobals->time + time; + pGrenade->SetThink(&CGrenade::TumbleThink); + pGrenade->pev->nextthink = gpGlobals->time + 0.1; + + if (time < 0.1) + { + pGrenade->pev->nextthink = gpGlobals->time; + pGrenade->pev->velocity = Vector(0, 0, 0); + } + + pGrenade->pev->sequence = RANDOM_LONG(3, 6); + pGrenade->pev->framerate = 1.0; + + pGrenade->m_bJustBlew = true; + + pGrenade->pev->gravity = 0.5; + pGrenade->pev->friction = 0.8; + + SET_MODEL(ENT(pGrenade->pev), "models/w_flashbang.mdl"); + pGrenade->pev->dmg = 35; + + return pGrenade; +} + /* ../cstrike/dlls/ggrenade.cpp:1113 */ void CGrenade::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// class CBasePlayer *player; // 1118 -// } -// Use(CGrenade *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 1113 -} - + if (!m_bIsC4) + return; + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pActivator->pev); + + if (player->m_iTeam != CT) + { + return; + } + + if (m_bStartDefuse) + { + m_fNextDefuse = gpGlobals->time + 0.5; + return; + } + + SET_CLIENT_MAXSPEED(player->edict(), 1); + TheBots->OnEvent(EVENT_BOMB_DEFUSING, pActivator); + + if (g_pGameRules->IsCareer()) + { + TheCareerTasks->HandleEvent(EVENT_BOMB_DEFUSING); + } + + if (player->m_bHasDefuser) + { + UTIL_LogPrintf("\"%s<%i><%s>\" triggered \"Begin_Bomb_Defuse_With_Kit\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict())); + + ClientPrint(player->pev, HUD_PRINTCENTER, "#Defusing_Bomb_With_Defuse_Kit"); + EMIT_SOUND(ENT(player->pev), CHAN_ITEM, "weapons/c4_disarm.wav", VOL_NORM, ATTN_NORM); + + player->m_bIsDefusing = true; + m_pBombDefuser = pActivator; + m_bStartDefuse = true; + m_flDefuseCountDown = gpGlobals->time + 5; + m_fNextDefuse = gpGlobals->time + 0.5; + player->SetProgressBarTime(5); + } + else + { + UTIL_LogPrintf("\"%s<%i><%s>\" triggered \"Begin_Bomb_Defuse_Without_Kit\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict())); + + ClientPrint(player->pev, HUD_PRINTCENTER, "#Defusing_Bomb_Without_Defuse_Kit"); + EMIT_SOUND(ENT(player->pev), CHAN_ITEM, "weapons/c4_disarm.wav", VOL_NORM, ATTN_NORM); + + player->m_bIsDefusing = true; + m_pBombDefuser = pActivator; + m_bStartDefuse = true; + m_flDefuseCountDown = gpGlobals->time + 10; + m_fNextDefuse = gpGlobals->time + 0.5; + player->SetProgressBarTime(10); + } +} + /* ../cstrike/dlls/ggrenade.cpp:1178 */ -void ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecAngles) +CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecAngles) { -// { -// class CGrenade *pGrenade; // 1180 -// class CBasePlayer *owner; // 1227 -// GetClassPtr(CGrenade *a); // 1180 -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 1182 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 1190 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 1190 -// Instance(edict_t *pent); // 1227 -// } -} - + CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL); + pGrenade->pev->movetype = MOVETYPE_TOSS; + + if (pGrenade->pev->classname) + RemoveEntityHashValue(pGrenade->pev, STRING(pGrenade->pev->classname), CLASSNAME); + + MAKE_STRING_CLASS("grenade", pGrenade->pev); + AddEntityHashValue(pGrenade->pev, STRING(pGrenade->pev->classname), CLASSNAME); + + pGrenade->pev->solid = SOLID_BBOX; + + // Change this to satchel charge model + SET_MODEL(ENT(pGrenade->pev), "models/w_c4.mdl"); + + UTIL_SetSize(pGrenade->pev, Vector(-3, -6, 0), Vector(3, 6, 8)); + + pGrenade->pev->dmg = 100; + UTIL_SetOrigin(pGrenade->pev, vecStart); + pGrenade->pev->velocity = g_vecZero; + pGrenade->pev->angles = vecAngles; + pGrenade->pev->owner = ENT(pevOwner); + + // Detonate in "time" seconds + pGrenade->SetThink(&CGrenade::C4Think); + pGrenade->SetTouch(&CGrenade::C4Touch); + pGrenade->pev->spawnflags = SF_DETONATE; + + pGrenade->pev->nextthink = gpGlobals->time + 0.1; + pGrenade->m_flC4Blow = gpGlobals->time + g_pGameRules->m_iC4Timer; + pGrenade->m_flNextFreqInterval = (g_pGameRules->m_iC4Timer / 4); + pGrenade->m_flNextFreq = gpGlobals->time; + + pGrenade->m_iCurWave = 0; + pGrenade->m_fAttenu = 0; + pGrenade->m_sBeepName = NULL; + pGrenade->m_flNextBeep = gpGlobals->time + 0.5; + pGrenade->m_bIsC4 = true; + pGrenade->m_fNextDefuse = 0; + pGrenade->m_bStartDefuse = false; + pGrenade->m_flNextBlink = gpGlobals->time + 2; + + pGrenade->pev->friction = 0.9; + pGrenade->m_bJustBlew = false; + + CBasePlayer *owner = reinterpret_cast(CBasePlayer::Instance(pevOwner)); + + if (owner && owner->IsPlayer()) + { + pGrenade->m_pentCurBombTarget = owner->m_pentCurBombTarget; + } + else + pGrenade->m_pentCurBombTarget = NULL; + + return pGrenade; +} + /* ../cstrike/dlls/ggrenade.cpp:1238 */ -void ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, short unsigned int usEvent) +CGrenade *CGrenade::ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent) { -// { -// class CGrenade *pGrenade; // 1240 -// GetClassPtr(CGrenade *a); // 1240 -// } -} - + CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL); + pGrenade->Spawn(); + + UTIL_SetOrigin(pGrenade->pev, vecStart); + pGrenade->pev->velocity = vecVelocity; + pGrenade->pev->angles = pevOwner->angles; + pGrenade->pev->owner = ENT(pevOwner); + pGrenade->m_usEvent = usEvent; + pGrenade->m_bLightSmoke = false; + pGrenade->m_bDetonated = false; + pGrenade->SetTouch(&CGrenade::BounceTouch); + pGrenade->pev->dmgtime = gpGlobals->time + time; + pGrenade->SetThink(&CGrenade::SG_TumbleThink); + pGrenade->pev->nextthink = gpGlobals->time + 0.1; + + if (time < 0.1) + { + pGrenade->pev->nextthink = gpGlobals->time; + pGrenade->pev->velocity = Vector(0, 0, 0); + } + + pGrenade->pev->sequence = RANDOM_LONG(3, 6); + pGrenade->pev->framerate = 1; + pGrenade->m_bJustBlew = true; + pGrenade->pev->gravity = 0.5; + pGrenade->pev->friction = 0.8; + pGrenade->m_SGSmoke = 0; + + SET_MODEL(ENT(pGrenade->pev), "models/w_smokegrenade.mdl"); + pGrenade->pev->dmg = 35; + + return pGrenade; +} + /* ../cstrike/dlls/ggrenade.cpp:1284 */ void AnnounceFlashInterval(float interval, float offset) { + if (!UTIL_IsGame("czero")) + return; + + MESSAGE_BEGIN(MSG_ALL, gmsgScenarioIcon); + WRITE_BYTE(1); + WRITE_STRING("bombticking"); + WRITE_BYTE(255); + WRITE_SHORT((short)interval); // interval + WRITE_SHORT((short)offset); + MESSAGE_END(); } /* ../cstrike/dlls/ggrenade.cpp:1300 */ void CGrenade::C4Think(void) { -// { -// class CBasePlayer *pBombOwner; // 1394 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1379 -// { -// class CBaseEntity *pBombTarget; // 1387 -// Instance(edict_t *pent); // 1387 -// Instance(edict_t *pent); // 1390 -// } -// Instance(edict_t *pent); // 1394 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1401 -// } -// GET_PRIVATE(edict_t *pent); // 1417 -// { -// int iOnGround; // 1419 -// GET_PRIVATE(edict_t *pent); // 1428 -// GET_PRIVATE(edict_t *pent); // 1429 -// GET_PRIVATE(edict_t *pent); // 1432 -// } -// GET_PRIVATE(edict_t *pent); // 1444 -// GET_PRIVATE(edict_t *pent); // 1447 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1453 -// edict(CBaseEntity *const this); // 1456 -// ENTINDEX(edict_t *pEdict); // 1456 -// edict(CBaseEntity *const this); // 1465 -// edict(CBaseEntity *const this); // 1465 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 1470 -// GET_PRIVATE(edict_t *pent); // 1476 -// GET_PRIVATE(edict_t *pent); // 1477 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1479 -// { -// class CBasePlayer *pPlayer; // 1485 -// GET_PRIVATE(edict_t *pent); // 1485 -// } -// GET_PRIVATE(edict_t *pent); // 1494 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1497 -// GET_PRIVATE(edict_t *pent); // 1510 -// GET_PRIVATE(edict_t *pent); // 1512 -// GET_PRIVATE(edict_t *pent); // 1513 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 1348 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1358 -// AnnounceFlashInterval(float interval, -// float offset); // 1334 -// AnnounceFlashInterval(float interval, -// float offset); // 1339 -// AnnounceFlashInterval(float interval, -// float offset); // 1329 -// AnnounceFlashInterval(float interval, -// float offset); // 1324 -// AnnounceFlashInterval(float interval, -// float offset); // 1319 + if (!IsInWorld()) + { + UTIL_Remove(this); + return; + } + + pev->nextthink = gpGlobals->time + 0.12; + + if (gpGlobals->time >= m_flNextFreq) + { + m_flNextFreq = gpGlobals->time + m_flNextFreqInterval; + m_flNextFreqInterval *= 0.9; + + switch (m_iCurWave) + { + case 0: + m_sBeepName = "weapons/c4_beep1.wav"; + m_fAttenu = 1.5; + + AnnounceFlashInterval(139); + break; + case 1: + m_sBeepName = "weapons/c4_beep2.wav"; + m_fAttenu = 1.0; + + AnnounceFlashInterval(69, 10); + break; + case 2: + m_sBeepName = "weapons/c4_beep3.wav"; + m_fAttenu = 0.8; + + AnnounceFlashInterval(40); + break; + case 3: + m_sBeepName = "weapons/c4_beep4.wav"; + m_fAttenu = 0.5; + + AnnounceFlashInterval(30); + break; + case 4: + m_sBeepName = "weapons/c4_beep5.wav"; + m_fAttenu = 0.2; + + AnnounceFlashInterval(20); + break; + } + ++m_iCurWave; + } + + if (gpGlobals->time >= m_flNextBeep) + { + m_flNextBeep = gpGlobals->time + 1.4; + EMIT_SOUND(ENT(pev), CHAN_VOICE, m_sBeepName, VOL_NORM, m_fAttenu); + + TheBots->OnEvent(EVENT_BOMB_BEEP, this); + } + + if (gpGlobals->time >= m_flNextBlink) + { + m_flNextBlink = gpGlobals->time + 2; + + MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_GLOWSPRITE); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z + 5); + WRITE_SHORT(g_sModelIndexC4Glow); + WRITE_BYTE(1); + WRITE_BYTE(3); + WRITE_BYTE(255); + MESSAGE_END(); + } + + if (gpGlobals->time >= m_flC4Blow) + { + TheBots->OnEvent(EVENT_BOMB_EXPLODED); + + MESSAGE_BEGIN(MSG_ALL, gmsgScenarioIcon); + WRITE_BYTE(0); + MESSAGE_END(); + + if (m_pentCurBombTarget) + { + CBaseEntity *pBombTarget = CBaseEntity::Instance(m_pentCurBombTarget); + + if (pBombTarget) + { + pBombTarget->Use(CBaseEntity::Instance(pev->owner), this, USE_TOGGLE, 0); + } + } + + CBasePlayer *pBombOwner = (CBasePlayer *)CBaseEntity::Instance(pev->owner); + if (pBombOwner) + { + pBombOwner->pev->frags += 3; + } + + MESSAGE_BEGIN(MSG_ALL, gmsgBombPickup); + MESSAGE_END(); + + g_pGameRules->m_bBombDropped = false; + + if (pev->waterlevel != 0) + UTIL_Remove(this); + else + SetThink(&CGrenade::Detonate2); + } + + if (m_bStartDefuse) + { + CBasePlayer *pPlayer = (CBasePlayer *)((CBaseEntity *)m_pBombDefuser); + + if (pPlayer != NULL && gpGlobals->time < m_flDefuseCountDown) + { + int iOnGround = ((m_pBombDefuser->pev->flags & FL_ONGROUND) == FL_ONGROUND); + + if (gpGlobals->time > m_fNextDefuse || !iOnGround) + { + if (!iOnGround) + { + ClientPrint(m_pBombDefuser->pev, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground"); + } + + pPlayer->ResetMaxSpeed(); + pPlayer->m_bIsDefusing = false; + pPlayer->SetProgressBarTime(0); + + m_pBombDefuser = NULL; + m_bStartDefuse = false; + m_flDefuseCountDown = 0; + + TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED); + } + } + else + { + if (pPlayer != NULL && m_pBombDefuser->pev->deadflag == DEAD_NO) + { + Broadcast("BOMBDEF"); + TheBots->OnEvent(EVENT_BOMB_DEFUSED, (CBaseEntity *)m_pBombDefuser); + + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); + WRITE_BYTE(DRC_CMD_EVENT); + WRITE_SHORT(ENTINDEX(m_pBombDefuser->edict())); + WRITE_SHORT(0); + WRITE_LONG(15 | DRC_FLAG_FINAL | DRC_FLAG_FACEPLAYER | DRC_FLAG_DRAMATIC); + MESSAGE_END(); + + UTIL_LogPrintf("\"%s<%i><%s>\" triggered \"Defused_The_Bomb\"\n", + STRING(m_pBombDefuser->pev->netname), + GETPLAYERUSERID(m_pBombDefuser->edict()), + GETPLAYERAUTHID(m_pBombDefuser->edict())); + + UTIL_EmitAmbientSound(ENT(pev), pev->origin, "weapons/c4_beep5.wav", 0, ATTN_NONE, SND_STOP, 0); + EMIT_SOUND(ENT(m_pBombDefuser->pev), CHAN_WEAPON, "weapons/c4_disarmed.wav", VOL_NORM, ATTN_NORM); + UTIL_Remove(this); + + m_bJustBlew = true; + + pPlayer->ResetMaxSpeed(); + pPlayer->m_bIsDefusing = false; + + MESSAGE_BEGIN(MSG_ALL, gmsgScenarioIcon); + WRITE_BYTE(0); + MESSAGE_END(); + + if (g_pGameRules->IsCareer()) + { + if (!pPlayer->IsBot()) + { + TheCareerTasks->HandleEvent(EVENT_BOMB_DEFUSED, pPlayer); + } + } + + g_pGameRules->m_bBombDefused = true; + g_pGameRules->CheckWinConditions(); + + m_pBombDefuser->pev->frags += 3; + + MESSAGE_BEGIN(MSG_ALL, gmsgBombPickup); + MESSAGE_END(); + + g_pGameRules->m_bBombDropped = FALSE; + m_pBombDefuser = NULL; + m_bStartDefuse = false; + } + else + { + if (pPlayer != NULL) + { + pPlayer->ResetMaxSpeed(); + pPlayer->m_bIsDefusing = false; + } + + m_bStartDefuse = false; + m_pBombDefuser = NULL; + + TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED); + } + } + } } /* ../cstrike/dlls/ggrenade.cpp:1523 */ @@ -663,24 +1364,38 @@ void CGrenade::C4Touch(CBaseEntity *pOther) } /* ../cstrike/dlls/ggrenade.cpp:1528 */ -void CGrenade::UseSatchelCharges(entvars_t *pevOwner, SATCHELCODE code) +NOXREF void CGrenade::UseSatchelCharges(entvars_t *pevOwner, SATCHELCODE code) { -// { -// edict_t *pentFind; // 1530 -// edict_t *pentOwner; // 1531 -// class CBaseEntity *pOwner; // 1536 -// Instance(entvars_t *pev); // 1536 -// edict(CBaseEntity *const this); // 1538 -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 1540 -// FNullEnt(const edict_t *pent); // 1541 -// { -// class CBaseEntity *pEnt; // 1543 -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 1554 -// Instance(edict_t *pent); // 1543 -// } -// } + edict_t *pentFind; + edict_t *pentOwner; + + if (!pevOwner) + return; + + CBaseEntity *pOwner = CBaseEntity::Instance(pevOwner); + + pentOwner = pOwner->edict(); + + pentFind = FIND_ENTITY_BY_CLASSNAME(NULL, "grenade"); + while (!FNullEnt(pentFind)) + { + CBaseEntity *pEnt = Instance(pentFind); + + if (pEnt != NULL) + { + if ((pEnt->pev->spawnflags & SF_DETONATE) && pEnt->pev->owner == pentOwner) + { + if (code == SATCHEL_DETONATE) + pEnt->Use(pOwner, pOwner, USE_ON, 0); + else + { + // SATCHEL_RELEASE + pEnt->pev->owner = NULL; + } + } + } + pentFind = FIND_ENTITY_BY_CLASSNAME(pentFind, "grenade"); + } } /* ../cstrike/dlls/ggrenade.cpp:1579 */ @@ -688,34 +1403,34 @@ IMPLEMENT_SAVERESTORE(CGrenade, CBaseMonster); #ifdef HOOK_GAMEDLL -void CGrenade::Spawn(void) -{ - Spawn_(); -} - -int CGrenade::Save(CSave &save) -{ - Save_(save); -} - -int CGrenade::Restore(CRestore &restore) -{ - Restore_(restore); -} - -void CGrenade::Killed(entvars_t *pevAttacker, int iGib) -{ - Killed_(pevAttacker, iGib); -} - -void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) -{ - Use_(pActivator, pCaller, useType, value); -} - -void CGrenade::BounceSound(void) -{ - BounceSound_(); +void CGrenade::Spawn(void) +{ + Spawn_(); } -#endif // HOOK_GAMEDLL \ No newline at end of file +int CGrenade::Save(CSave &save) +{ + Save_(save); +} + +int CGrenade::Restore(CRestore &restore) +{ + Restore_(restore); +} + +void CGrenade::Killed(entvars_t *pevAttacker, int iGib) +{ + Killed_(pevAttacker, iGib); +} + +void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +{ + Use_(pActivator, pCaller, useType, value); +} + +void CGrenade::BounceSound(void) +{ + BounceSound_(); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/h_export.cpp b/regamedll/dlls/h_export.cpp index 7e048aca..dded6d4e 100644 --- a/regamedll/dlls/h_export.cpp +++ b/regamedll/dlls/h_export.cpp @@ -8,4 +8,8 @@ C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pEnginefuncsTable,globalv { memcpy(&g_engfuncs, pEnginefuncsTable, sizeof(enginefuncs_t)); gpGlobals = pGlobals; + +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) + Regamedll_Game_Init(); +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS } diff --git a/regamedll/dlls/hintmessage.h b/regamedll/dlls/hintmessage.h index 41fd851d..19d5f98e 100644 --- a/regamedll/dlls/hintmessage.h +++ b/regamedll/dlls/hintmessage.h @@ -32,6 +32,30 @@ #pragma once #endif +#define DHF_ROUND_STARTED (1<<1) +#define DHF_HOSTAGE_SEEN_FAR (1<<2) +#define DHF_HOSTAGE_SEEN_NEAR (1<<3) +#define DHF_HOSTAGE_USED (1<<4) +#define DHF_HOSTAGE_INJURED (1<<5) +#define DHF_HOSTAGE_KILLED (1<<6) +#define DHF_FRIEND_SEEN (1<<7) +#define DHF_ENEMY_SEEN (1<<8) +#define DHF_FRIEND_INJURED (1<<9) +#define DHF_FRIEND_KILLED (1<<10) +#define DHF_ENEMY_KILLED (1<<11) +#define DHF_BOMB_RETRIEVED (1<<12) +#define DHF_AMMO_EXHAUSTED (1<<15) +#define DHF_IN_TARGET_ZONE (1<<16) +#define DHF_IN_RESCUE_ZONE (1<<17) +#define DHF_IN_ESCAPE_ZONE (1<<18) +#define DHF_IN_VIPSAFETY_ZONE (1<<19) +#define DHF_NIGHTVISION (1<<20) +#define DHF_HOSTAGE_CTMOVE (1<<21) +#define DHF_SPEC_DUCK (1<<22) + +#define DHM_ROUND_CLEAR (DHF_ROUND_STARTED | DHF_HOSTAGE_KILLED | DHF_FRIEND_KILLED | DHF_BOMB_RETRIEVED) +#define DHM_CONNECT_CLEAR (DHF_HOSTAGE_SEEN_FAR | DHF_HOSTAGE_SEEN_NEAR | DHF_HOSTAGE_USED | DHF_HOSTAGE_INJURED | DHF_FRIEND_SEEN | DHF_ENEMY_SEEN | DHF_FRIEND_INJURED | DHF_ENEMY_KILLED | DHF_AMMO_EXHAUSTED | DHF_IN_TARGET_ZONE | DHF_IN_RESCUE_ZONE | DHF_IN_ESCAPE_ZONE | DHF_IN_VIPSAFETY_ZONE | DHF_HOSTAGE_CTMOVE | DHF_SPEC_DUCK) + class CHintMessage { public: diff --git a/regamedll/dlls/hostage/hostage.cpp b/regamedll/dlls/hostage/hostage.cpp index b664f8be..8199c026 100644 --- a/regamedll/dlls/hostage/hostage.cpp +++ b/regamedll/dlls/hostage/hostage.cpp @@ -625,9 +625,155 @@ NOBODY CHostageManager::CHostageManager(void) } /* <45e39b> ../cstrike/dlls/hostage/hostage.cpp:1456 */ -NOBODY void CHostageManager::ServerActivate(void) +void CHostageManager::ServerActivate(void) { + m_hostageCount = 0; + CBaseEntity *pEntity = NULL; + while ((pEntity = UTIL_FindEntityByClassname(pEntity, "hostage_entity")) != NULL) + { + AddHostage((CHostage *)pEntity); + } + + if (UTIL_IsGame("czero")) + { + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/getouttahere.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/illfollow.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/letsdoit.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/letsgo.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/letshurry.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/letsmove.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/okletsgo.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_START_FOLLOW, "hostage/huse/youlead.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_STOP_FOLLOW, "hostage/hunuse/comeback.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_STOP_FOLLOW, "hostage/hunuse/dontleaveme.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_STOP_FOLLOW, "hostage/hunuse/illstayhere.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_STOP_FOLLOW, "hostage/hunuse/notleaveme.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_STOP_FOLLOW, "hostage/hunuse/yeahillstay.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/donthurtme1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/donthurtme2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/dontkill.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/endpeace.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/nevernegotiate.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/nottellanything.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/surrender.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/whatdoyou.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_INTIMIDATED, "hostage/hseenbyt/whyareyou.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hseenbyt/donthurtme1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hseenbyt/donthurtme2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hseenbyt/dontkill.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hseenbyt/dontkill.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/illgoback1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/illgoback2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/okokgoing.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/okokgoing2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/sorry1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/sorry2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RETREAT, "hostage/hretreat/sorry3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain4.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain5.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PAIN, "hostage/hpain/hpain6.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/awwcrap1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/awwcrap2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/getdown1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/getdown2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/getdown3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/lookout1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/lookout2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/lookshooting1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/lookshooting2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/lookshooting3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/ohgod1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, "hostage/hreactions/ohgod2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/awwcrap1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/awwcrap2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/deargod1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/deargod2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/deargod3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/ohgod1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/ohgod2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/ohno1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/ohno2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/awww2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SCARED_OF_MURDER, "hostage/hreactions/awww4.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_LOOK_OUT, "hostage/hreactions/awwcrap1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_LOOK_OUT, "hostage/hreactions/awwcrap2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_LOOK_OUT, "hostage/hreactions/lookout1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_LOOK_OUT, "hostage/hreactions/lookout2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/areyousave.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/getmeoutta1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/getmeoutta2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/imahostage.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/rescueme1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/rescueme2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_PLEASE_RESCUE_ME, "hostage/hseenbyct/theyregonna.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, "hostage/hseenbyct/areyousave.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, "hostage/hseenbyct/getmeoutta1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, "hostage/hseenbyct/getmeoutta2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, "hostage/hseenbyct/rescueme1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, "hostage/hseenbyct/rescueme2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SEE_RESCUE_ZONE, "hostage/hseezone/almostouttahere.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SEE_RESCUE_ZONE, "hostage/hseezone/almostthere.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SEE_RESCUE_ZONE, "hostage/hseezone/keepgoing.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SEE_RESCUE_ZONE, "hostage/hseezone/notfar.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/alldead.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/goodnews.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/outtahere.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/over1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/over2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/over3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/over4.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/over5.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CTS_WIN, "hostage/hctwin/relief.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_TERRORISTS_WIN, "hostage/htwin/doomed.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_TERRORISTS_WIN, "hostage/htwin/godno.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_TERRORISTS_WIN, "hostage/htwin/nowwhat.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_TERRORISTS_WIN, "hostage/htwin/ohman.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_TERRORISTS_WIN, "hostage/htwin/ohno.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/finally.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/finallysafe.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/thankyou.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/wemadeit1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/wemadeit2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_RESCUED, "hostage/hrescued/wemadeit3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_NEARBY, "hostage/hwarn/becareful1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_NEARBY, "hostage/hwarn/becareful2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_NEARBY, "hostage/hwarn/stillaround1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_NEARBY, "hostage/hwarn/stillaround2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_SPOTTED, "hostage/hwarn/lookout1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_SPOTTED, "hostage/hwarn/lookout2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_SPOTTED, "hostage/hwarn/overthere1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_WARN_SPOTTED, "hostage/hwarn/overthere2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CALL_TO_RESCUER, "hostage/hwavect/helpme1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CALL_TO_RESCUER, "hostage/hwavect/helpme2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CALL_TO_RESCUER, "hostage/hwavect/hey1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CALL_TO_RESCUER, "hostage/hwavect/hey2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_CALL_TO_RESCUER, "hostage/hwavect/overhere1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough3.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough4.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough5.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_COUGH, "hostage/hsmoke/cough6.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_BLINDED, "hostage/hflash/cantsee.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_BLINDED, "hostage/hflash/myeyes.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SAW_HE_GRENADE, "hostage/hgrenade/grenade1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SAW_HE_GRENADE, "hostage/hgrenade/grenade2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SAW_HE_GRENADE, "hostage/hgrenade/run.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_SAW_HE_GRENADE, "hostage/hgrenade/watchout.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_DEATH_CRY, "hostage/hdie/hdeath1.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_DEATH_CRY, "hostage/hdie/hdeath2.wav"); + m_chatter.AddSound(HOSTAGE_CHATTER_DEATH_CRY, "hostage/hdie/hdeath3.wav"); + } +} + +/* <45e3a2> ../cstrike/dlls/hostage/hostage.cpp:1624 */ +void CHostageManager::ServerDeactivate(void) +{ + ; } /* <45e3f7> ../cstrike/dlls/hostage/hostage.cpp:1631 */ @@ -639,11 +785,25 @@ NOBODY void CHostageManager::RestartRound(void) } /* <45e43d> ../cstrike/dlls/hostage/hostage.cpp:1640 */ -NOBODY void CHostageManager::AddHostage(CHostage *hostage) +void CHostageManager::AddHostage(CHostage *hostage) { -// { -// int i; // 1646 -// } + if (m_hostageCount >= MAX_HOSTAGES) + return; + + int i; + for (i = 0; i < m_hostageCount; i++) + { + if (m_hostage[i] == hostage) + { + break; + } + } + + if (i == m_hostageCount) + { + m_hostage[m_hostageCount] = hostage; + m_hostageCount++; + } } /* <45e47f> ../cstrike/dlls/hostage/hostage.cpp:1657 */ @@ -692,32 +852,48 @@ void CHostageManager::OnEvent(GameEventType event, CBaseEntity *entity, CBaseEnt } /* <45e6b8> ../cstrike/dlls/hostage/hostage.cpp:1726 */ -NOBODY SimpleChatter::SimpleChatter(void) +SimpleChatter::SimpleChatter(void) { -// { -// int i; // 1728 -// } + for (int i = 0; i < ARRAYSIZE(m_chatter); i++) + { + m_chatter[i].count = 0; + m_chatter[i].index = 0; + m_chatter[i].needsShuffle = false; + } } /* <45e6f0> ../cstrike/dlls/hostage/hostage.cpp:1737 */ -NOBODY SimpleChatter::~SimpleChatter(void) +SimpleChatter::~SimpleChatter(void) { -// { -// int i; // 1739 -// { -// int f; // 1741 -// } -// } + for (int i = 0; i < ARRAYSIZE(m_chatter); i++) + { + for (int f = 0; f < m_chatter[i].count; f++) + { + if (m_chatter[i].file[f].filename) + { + delete[] m_chatter[i].file[f].filename; + } + } + } } /* <45e736> ../cstrike/dlls/hostage/hostage.cpp:1752 */ -NOBODY void SimpleChatter::AddSound(HostageChatterType type, char *filename) +void SimpleChatter::AddSound(HostageChatterType type, char *filename) { -// { -// class ChatterSet *chatter; // 1754 -// char actualFilename; // 1758 -// CloneString(const char *str); // 1756 -// } + ChatterSet *chatter; + char actualFilename[128]; + + chatter = &m_chatter[ type ]; + + Q_snprintf(actualFilename, sizeof(actualFilename), "sound\\%s", filename); + + chatter->file[ chatter->count ].filename = CloneString(filename); + chatter->file[ chatter->count ].duration = (double)GET_APPROX_WAVE_PLAY_LEN(actualFilename) / 1000.0; + + chatter->needsShuffle = true; + chatter->count++; + + PRECACHE_SOUND(filename); } /* <45e8c7> ../cstrike/dlls/hostage/hostage.cpp:1773 */ diff --git a/regamedll/dlls/hostage/hostage.h b/regamedll/dlls/hostage/hostage.h index ce734af2..95f33d46 100644 --- a/regamedll/dlls/hostage/hostage.h +++ b/regamedll/dlls/hostage/hostage.h @@ -31,15 +31,19 @@ #ifdef _WIN32 #pragma once #endif + +#include "hostage/hostage_improv.h" #define MAX_NODES 100 -#define MAX_HOSTAGES 20 +#define MAX_HOSTAGES 12 +#define MAX_HOSTAGES_NAV 20 #define HOSTAGE_STEPSIZE 26.0 class CHostage; class CLocalNav; class CHostageImprov; +class CHostageManager; enum HostageChatterType { @@ -67,6 +71,22 @@ enum HostageChatterType NUM_HOSTAGE_CHATTER_TYPES, }; +#ifdef HOOK_GAMEDLL + +#define g_pHostages (*pg_pHostages) +#define g_iHostageNumber (*pg_iHostageNumber) + +#define cv_hostage_debug (*pcv_hostage_debug) +#define cv_hostage_stop (*pcv_hostage_stop) + +#endif // HOOK_GAMEDLL + +extern CHostageManager *g_pHostages; +extern int g_iHostageNumber; + +extern cvar_t cv_hostage_debug; +extern cvar_t cv_hostage_stop; + /* <4858e5> ../cstrike/dlls/hostage/hostage.h:32 */ class CHostage: public CBaseMonster { @@ -109,14 +129,26 @@ public: NOBODY void Wiggle(void); void PreThink(void); - NOBODY bool IsFollowingSomeone(void);// + NOBODY bool IsFollowingSomeone(void) + { + UNTESTED + return ((CHostageImprov *)m_improv)->IsFollowing(); + } NOBODY CBaseEntity *GetLeader(void);// NOBODY bool IsFollowing(const CBaseEntity *entity) { return (entity == m_hTargetEnt && m_State == FOLLOW); } - NOBODY bool IsValid(void);// - NOBODY bool IsDead(void);// + NOBODY bool IsValid(void) + { + UNTESTED + return (pev->takedamage == DAMAGE_YES); + } + NOBODY bool IsDead(void) + { + UNTESTED + return (pev->deadflag == DEAD_DEAD); + } NOBODY bool IsAtHome(void);// NOBODY const Vector *GetHomePosition(void);// @@ -162,7 +194,7 @@ public: state m_State; Vector m_vStart; Vector m_vStartAngles; - Vector m_vPathToFollow[ MAX_HOSTAGES ]; + Vector m_vPathToFollow[20]; int m_iWaypoint; CBasePlayer *m_target; CLocalNav *m_LocalNav; @@ -222,16 +254,17 @@ private: };/* size: 5628, cachelines: 88, members: 1 */ +/* <45b018> ../cstrike/dlls/hostage/hostage.h:247 */ class CHostageManager { public: CHostageManager(void); - NOBODY void ServerActivate(void); - void ServerDeactivate(void) { }; + void ServerActivate(void); + void ServerDeactivate(void); NOBODY void RestartRound(void); - NOBODY void AddHostage(CHostage *hostage); + void AddHostage(CHostage *hostage); SimpleChatter *GetChatter(void) { return &m_chatter; @@ -261,28 +294,60 @@ public: return close; } + template< + typename T + > + bool ForEachHostage(T &func) + { + UNTESTED + + for (int i = 0; i < m_hostageCount; i++) + { + CHostage *pHostage = m_hostage[ i ]; + + if (pHostage->deadflag != DEAD_NO || pHostage->takedamage != DAMAGE_YES) + continue; + + if (!pHostage->m_improv) + break; + + if (func(pHostage)) + return true; + } + return false; + } + private: - CHostage *m_hostage[12]; + CHostage *m_hostage[ MAX_HOSTAGES ]; int m_hostageCount; SimpleChatter m_chatter; };/* size: 5680, cachelines: 89, members: 3 */ -#ifdef HOOK_GAMEDLL -#define g_pHostages (*pg_pHostages) -#define g_iHostageNumber (*pg_iHostageNumber) - -#define cv_hostage_debug (*pcv_hostage_debug) -#define cv_hostage_stop (*pcv_hostage_stop) - -#endif // HOOK_GAMEDLL - -extern CHostageManager *g_pHostages; -extern int g_iHostageNumber; - -extern cvar_t cv_hostage_debug; -extern cvar_t cv_hostage_stop; +///* <470134> ../cstrike/dlls/hostage/hostage.h:293 */ +//inline void CHostageManager::ForEachHostage(KeepPersonalSpace &func) +//{ +//// { +//// int i; // 295 +//// } +//} +// +///* <46fbe8> ../cstrike/dlls/hostage/hostage.h:293 */ +//inline void CHostageManager::ForEachHostage(CheckAhead &func) +//{ +//// { +//// int i; // 295 +//// } +//} +// +///* <46fb04> ../cstrike/dlls/hostage/hostage.h:293 */ +//inline void CHostageManager::ForEachHostage(CheckWayFunctor &func) +//{ +//// { +//// int i; // 295 +//// } +//} void Hostage_RegisterCVars(void); NOBODY void InstallHostageManager(void); diff --git a/regamedll/dlls/hostage/hostage_improv.h b/regamedll/dlls/hostage/hostage_improv.h index ab99fb74..427a1b3b 100644 --- a/regamedll/dlls/hostage/hostage_improv.h +++ b/regamedll/dlls/hostage/hostage_improv.h @@ -32,6 +32,11 @@ #pragma once #endif +#include "hostage/hostage_states.h" + +class CHostage; +enum HostageChatterType; + class CHostageImprov: public CImprov { public: @@ -46,6 +51,17 @@ public: //~CImprov(); // 49 }; + virtual void OnMoveToSuccess(const Vector &goal) + { + //if (m_behavior.IsState(NULL)) + // IImprovEvent::OnMoveToSuccess(goal); + } + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason); + virtual void OnInjury(float amount) + { + //m_behavior.Update(); + //m_lastInjuryTimer.Start(); + } virtual bool IsAlive(void) const; virtual void MoveTo(const Vector &goal); virtual void LookAt(const Vector &target); @@ -151,18 +167,7 @@ public: virtual void OnUpdate(float deltaT); virtual void OnUpkeep(float deltaT); virtual void OnReset(void); - virtual void OnMoveToSuccess(const Vector &goal) - { - //if (m_behavior.IsState(NULL)) - // IImprovEvent::OnMoveToSuccess(goal); - } - virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason); - virtual void OnInjury(float amount) - { - //m_behavior.Update(); - //m_lastInjuryTimer.Start(); - } - virtual void OnGameEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + virtual void OnGameEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); virtual void OnTouch(CBaseEntity *other); public: @@ -179,7 +184,10 @@ public: SCARED, TERRIFIED, }; - + //{ + // UNTESTED + // return m_behavior.IsState(&m_followState); + //} void FaceOutwards(void); bool IsFriendInTheWay(void); void SetKnownGoodPosition(const Vector &pos); @@ -199,9 +207,17 @@ public: CNavPath *GetPath(void); CNavPathFollower *GetPathFollower(void); void Idle(void); - bool IsIdle(void); + bool IsIdle(void) + { + UNTESTED + return m_behavior.IsState(&m_idleState); + } void Follow(CBasePlayer *leader); - bool IsFollowing(const CBaseEntity *leader); + bool IsFollowing(const CBaseEntity *leader = NULL) + { + UNTESTED + return m_behavior.IsState(&m_followState); + } void Escape(void); bool IsEscaping(void); void Retreat(void); @@ -370,9 +386,12 @@ class CheckAhead { public: /* <47046f> ../cstrike/dlls/hostage/hostage_improv.cpp:525 */ - bool operator()(class CheckAhead *, class CBaseEntity *) + bool operator()(CBaseEntity *entity) { - +// Vector to; // 530 +// float range; // 531 +// float const closeRange; // 533 +// float const aheadTolerance; // 537 } /* <46f597> ../cstrike/dlls/hostage/hostage_improv.cpp:546 */ bool IsBlocked(void) diff --git a/regamedll/dlls/hostage/hostage_localnav.cpp b/regamedll/dlls/hostage/hostage_localnav.cpp index 954c304a..79b8fb59 100644 --- a/regamedll/dlls/hostage/hostage_localnav.cpp +++ b/regamedll/dlls/hostage/hostage_localnav.cpp @@ -7,24 +7,24 @@ float CLocalNav::s_flStepSize; int CLocalNav::qptr; -EHANDLE CLocalNav::_queue[ MAX_HOSTAGES ]; +EHANDLE CLocalNav::_queue[ MAX_HOSTAGES_NAV ]; int CLocalNav::tot_inqueue; float CLocalNav::nodeval; float CLocalNav::flNextCvarCheck; float CLocalNav::flLastThinkTime; -EHANDLE CLocalNav::hostages[ MAX_HOSTAGES ]; +EHANDLE CLocalNav::hostages[ MAX_HOSTAGES_NAV ]; int CLocalNav::tot_hostages; #else float (*CLocalNav::ps_flStepSize); int (*CLocalNav::pqptr); -EHANDLE (*CLocalNav::pqueue)[ MAX_HOSTAGES ]; +EHANDLE (*CLocalNav::pqueue)[ MAX_HOSTAGES_NAV ]; int (*CLocalNav::ptot_inqueue); float (*CLocalNav::pnodeval); float (*CLocalNav::pflNextCvarCheck); float (*CLocalNav::pflLastThinkTime); -EHANDLE (*CLocalNav::phostages)[ MAX_HOSTAGES ]; +EHANDLE (*CLocalNav::phostages)[ MAX_HOSTAGES_NAV ]; int (*CLocalNav::ptot_hostages); #endif // HOOK_GAMEDLL @@ -749,7 +749,7 @@ void CLocalNav::Think(void) { while (tot_inqueue > 0) { - if (++qptr == MAX_HOSTAGES) + if (++qptr == MAX_HOSTAGES_NAV) qptr = 0; tot_inqueue--; @@ -770,7 +770,7 @@ void CLocalNav::Think(void) { CHostage *pHostage = GetClassPtr((CHostage *)hostage->pev); - if (++qptr == MAX_HOSTAGES) + if (++qptr == MAX_HOSTAGES_NAV) qptr = 0; tot_inqueue--; diff --git a/regamedll/dlls/hostage/hostage_localnav.h b/regamedll/dlls/hostage/hostage_localnav.h index b8fe9747..8e191254 100644 --- a/regamedll/dlls/hostage/hostage_localnav.h +++ b/regamedll/dlls/hostage/hostage_localnav.h @@ -48,6 +48,7 @@ typedef struct localnode_s byte bDepth; BOOL fSearched; node_index_t nindexParent; + } localnode_t; /* size: 32, cachelines: 1, members: 6 */ @@ -113,13 +114,13 @@ private: #endif // HOOK_GAMEDLL static float s_flStepSize; - static EHANDLE _queue[ MAX_HOSTAGES ]; + static EHANDLE _queue[ MAX_HOSTAGES_NAV ]; static int qptr; static int tot_inqueue; static float nodeval; static float flNextCvarCheck; static float flLastThinkTime; - static EHANDLE hostages[ MAX_HOSTAGES ]; + static EHANDLE hostages[ MAX_HOSTAGES_NAV ]; static int tot_hostages; #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/hostage/hostage_states.h b/regamedll/dlls/hostage/hostage_states.h index 3234aed3..0203971c 100644 --- a/regamedll/dlls/hostage/hostage_states.h +++ b/regamedll/dlls/hostage/hostage_states.h @@ -32,6 +32,8 @@ #pragma once #endif +class CHostageImprov; + /* <46f85d> ../cstrike/dlls/hostage/hostage_states.h:16 */ class HostageState: public SimpleState, public IImprovEvent { @@ -63,8 +65,8 @@ public: } void UpdateStationaryAnimation(CHostageImprov *improv) { }; -};/* size: 16, cachelines: 1, members: 2 */ +};/* size: 16, cachelines: 1, members: 2 */ /* <46fccf> ../cstrike/dlls/hostage/hostage_states.h:38 */ class HostageIdleState: public HostageState diff --git a/regamedll/dlls/monsters.h b/regamedll/dlls/monsters.h index e897d9e6..d7e9dd57 100644 --- a/regamedll/dlls/monsters.h +++ b/regamedll/dlls/monsters.h @@ -34,16 +34,16 @@ #include "skill.h" -#define LOCALMOVE_INVALID 0 // move is not possible +#define LOCALMOVE_INVALID 0 // move is not possible #define LOCALMOVE_INVALID_DONT_TRIANGULATE 1 // move is not possible, don't try to triangulate #define LOCALMOVE_VALID 2 // move is possible -#define SF_MONSTER_WAIT_TILL_SEEN 1 // spawnflag that makes monsters wait until player can see them before attacking. -#define SF_MONSTER_GAG 2 // no idle noises from this monster +#define SF_MONSTER_WAIT_TILL_SEEN 1 // spawnflag that makes monsters wait until player can see them before attacking. +#define SF_MONSTER_GAG 2 // no idle noises from this monster #define SF_MONSTER_HITMONSTERCLIP 4 #define SF_MONSTER_PRISONER 16 // monster won't attack anyone, no one will attacke him. -#define SF_MONSTER_WAIT_FOR_SCRIPT 128 //spawnflag that makes monsters wait to check for attacking until the script is done or they've been attacked +#define SF_MONSTER_WAIT_FOR_SCRIPT 128 //spawnflag that makes monsters wait to check for attacking until the script is done or they've been attacked #define SF_MONSTER_PREDISASTER 256 //this is a predisaster scientist or barney. Influences how they speak. #define SF_MONSTER_FADECORPSE 512 // Fade out corpse after death #define SF_MONSTER_FALL_TO_GROUND 0x80000000 @@ -60,7 +60,7 @@ #define R_AL -2 // (ALLY) pals. Good alternative to R_NO when applicable. #define R_FR -1 // (FEAR)will run -#define R_NO 0 // (NO RELATIONSHIP) disregard +#define R_NO 0 // (NO RELATIONSHIP) disregard #define R_DL 1 // (DISLIKE) will attack #define R_HT 2 // (HATE)will attack this character instead of any visible DISLIKEd characters #define R_NM 3 // (NEMESIS) A monster Will ALWAYS attack its nemsis, no matter what @@ -128,11 +128,11 @@ public: public: void Spawn(const char *szGibModel); void EXPORT BounceGibTouch(CBaseEntity *pOther); - NOBODY void EXPORT StickyGibTouch(CBaseEntity *pOther); + void EXPORT StickyGibTouch(CBaseEntity *pOther); void EXPORT WaitTillLand(void); void LimitVelocity(void); public: - NOBODY static void SpawnHeadGib(entvars_t *pevVictim); + static void SpawnHeadGib(entvars_t *pevVictim); static void SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human); NOBODY static void SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cGibs); public: @@ -158,7 +158,5 @@ public: return baseClass::ScheduleFromName(pName);\ return pSchedule;\ } -// refs -extern void (*pCGib__SpawnRandomGibs)(entvars_t *pevVictim, int cGibs, int human); #endif // MONSTERS_H diff --git a/regamedll/dlls/mpstubb.cpp b/regamedll/dlls/mpstubb.cpp index 5e6d50c8..ba078bb0 100644 --- a/regamedll/dlls/mpstubb.cpp +++ b/regamedll/dlls/mpstubb.cpp @@ -47,16 +47,26 @@ int CGraph::FindNearestNode(const Vector &vecOrigin, CBaseEntity *pEntity) /* ../cstrike/dlls/mpstubb.cpp:45 */ float CBaseMonster::ChangeYaw_(int speed) { + return 0.0f; } /* ../cstrike/dlls/mpstubb.cpp:46 */ void CBaseMonster::MakeIdealYaw(Vector vecTarget) { + ; } /* ../cstrike/dlls/mpstubb.cpp:49 */ -void CBaseMonster::CorpseFallThink(void) +NOBODY void CBaseMonster::CorpseFallThink(void) { + if (pev->flags & FL_ONGROUND) + { + SetThink(NULL); + SetSequenceBox(); + UTIL_SetOrigin(pev, pev->origin); + } + else + pev->nextthink = gpGlobals->time + 0.1; } /* ../cstrike/dlls/mpstubb.cpp:62 */ @@ -85,20 +95,23 @@ void CBaseMonster::MonsterInitDead_(void) /* ../cstrike/dlls/mpstubb.cpp:89 */ BOOL CBaseMonster::ShouldFadeOnDeath_(void) { + return FALSE; } /* ../cstrike/dlls/mpstubb.cpp:94 */ BOOL CBaseMonster::FCheckAITrigger(void) { + return FALSE; } /* ../cstrike/dlls/mpstubb.cpp:99 */ void CBaseMonster::KeyValue_(KeyValueData *pkvd) { + CBaseToggle::KeyValue(pkvd); } /* ../cstrike/dlls/mpstubb.cpp:104 */ -int CBaseMonster::IRelationship_(CBaseEntity *pTarget) +NOBODY int CBaseMonster::IRelationship_(CBaseEntity *pTarget) { // { // int const iEnemy; // 106 @@ -106,7 +119,7 @@ int CBaseMonster::IRelationship_(CBaseEntity *pTarget) } /* ../cstrike/dlls/mpstubb.cpp:140 */ -void CBaseMonster::Look_(int iDistance) +NOBODY void CBaseMonster::Look_(int iDistance) { // { // int iSighted; // 142 @@ -129,7 +142,7 @@ void CBaseMonster::Look_(int iDistance) } /* ../cstrike/dlls/mpstubb.cpp:220 */ -CBaseEntity *CBaseMonster::BestVisibleEnemy_(void) +NOBODY CBaseEntity *CBaseMonster::BestVisibleEnemy_(void) { // { // class CBaseEntity *pReturn; // 222 diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index eda84d37..9d586587 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -145,17 +145,24 @@ NOBODY void CMapInfo::Spawn_(void) } /* <114673> ../cstrike/dlls/multiplay_gamerules.cpp:288 */ -//void info_map_parameters(entvars_t *pev) -//{ -// GetClassPtr(CMapInfo *a); // 288 -//} +LINK_ENTITY_TO_CLASS(info_map_parameters, CMapInfo); /* <11474f> ../cstrike/dlls/multiplay_gamerules.cpp:331 */ -NOBODY void Broadcast(const char *sentence) +void Broadcast(const char *sentence) { -// { -// char text; // 333 -// } + char text[32]; + + if (!sentence) + return; + + Q_strcpy(text, "%!MRAD_"); + Q_strcat(text, UTIL_VarArgs("%s", sentence)); + + MESSAGE_BEGIN(MSG_BROADCAST, gmsgSendAudio); + WRITE_BYTE(0); + WRITE_STRING(text); + WRITE_SHORT(100); + MESSAGE_END(); } /* <111767> ../cstrike/dlls/multiplay_gamerules.cpp:348 */ @@ -651,34 +658,94 @@ NOBODY void CHalfLifeMultiplay::RestartRound_(void) // } } -/* <114d20> ../cstrike/dlls/multiplay_gamerules.cpp:2097 */ -NOBODY BOOL CHalfLifeMultiplay::IsThereABomb(void) +/* <114ca3> ../cstrike/dlls/multiplay_gamerules.cpp:2073 */ +BOOL CHalfLifeMultiplay::IsThereABomber(void) { -// { -// class CGrenade *pC4; // 2099 -// class CBaseEntity *pWeaponC4; // 2100 -// BOOL bFoundBomb; // 2101 -// } + CBasePlayer *pPlayer = NULL; + + while ((pPlayer = (CBasePlayer *)UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + if (pPlayer->m_iTeam != CT && pPlayer->IsBombGuy()) + return TRUE; + } + + return FALSE; + } -/* <114ca3> ../cstrike/dlls/multiplay_gamerules.cpp:2073 */ -NOBODY BOOL CHalfLifeMultiplay::IsThereABomber(void) +/* <114d20> ../cstrike/dlls/multiplay_gamerules.cpp:2097 */ +BOOL CHalfLifeMultiplay::IsThereABomb(void) { -// { -// class CBasePlayer *pPlayer; // 2075 -// edict(CBaseEntity *const this); // 2079 -// FNullEnt(const edict_t *pent); // 2079 -// } + CGrenade *pC4 = NULL; + CBaseEntity *pWeaponC4 = NULL; + BOOL bFoundBomb = FALSE; + + while ((pWeaponC4 = UTIL_FindEntityByClassname(pWeaponC4, "grenade")) != NULL) + { + if (!pWeaponC4) + continue; + + pC4 = (CGrenade *)pWeaponC4; + + if (pC4->m_bIsC4) + { + bFoundBomb = TRUE; + break; + } + } + + if (bFoundBomb || (UTIL_FindEntityByClassname(NULL, "weapon_c4")) != NULL) + return TRUE; + + return FALSE; + } /* <114d83> ../cstrike/dlls/multiplay_gamerules.cpp:2129 */ -NOBODY BOOL CHalfLifeMultiplay::TeamFull(int team_id) +BOOL CHalfLifeMultiplay::TeamFull(int team_id) { + switch (team_id) + { + case TERRORIST: + return (m_iNumTerrorist >= m_iSpawnPointCount_Terrorist); + case CT: + return (m_iNumCT >= m_iSpawnPointCount_CT); + } + + return FALSE; } /* <114dbb> ../cstrike/dlls/multiplay_gamerules.cpp:2144 */ -NOBODY BOOL CHalfLifeMultiplay::TeamStacked(int newTeam_id, int curTeam_id) +BOOL CHalfLifeMultiplay::TeamStacked(int newTeam_id, int curTeam_id) { + if (newTeam_id == curTeam_id) + return FALSE; + + if (!m_iLimitTeams) + return FALSE; + + switch (newTeam_id) + { + case TERRORIST: + { + if (curTeam_id != UNASSIGNED && curTeam_id != SPECTATOR) + return ((m_iNumTerrorist + 1) > (m_iNumCT + m_iLimitTeams - 1)); + else + return ((m_iNumTerrorist + 1) > (m_iNumCT + m_iLimitTeams)); + } + case CT: + { + if (curTeam_id != UNASSIGNED && curTeam_id != SPECTATOR) + return ((m_iNumCT + 1) > (m_iNumTerrorist + m_iLimitTeams - 1)); + else + return ((m_iNumCT + 1) > (m_iNumTerrorist + m_iLimitTeams)); + } + } + + return FALSE; } /* <114e2b> ../cstrike/dlls/multiplay_gamerules.cpp:2214 */ @@ -1101,8 +1168,10 @@ NOBODY void CHalfLifeMultiplay::ClientDisconnected_(edict_t *pClient) } /* <112a05> ../cstrike/dlls/multiplay_gamerules.cpp:3428 */ -NOBODY float CHalfLifeMultiplay::FlPlayerFallDamage_(CBasePlayer *pPlayer) +float CHalfLifeMultiplay::FlPlayerFallDamage_(CBasePlayer *pPlayer) { + pPlayer->m_flFallVelocity -= PLAYER_MAX_SAFE_FALL_SPEED; + return pPlayer->m_flFallVelocity * DAMAGE_FOR_FALL_SPEED * 1.25; } /* <112a3d> ../cstrike/dlls/multiplay_gamerules.cpp:3436 */ @@ -1256,7 +1325,7 @@ NOBODY void CHalfLifeMultiplay::DeathNotice_(CBasePlayer *pVictim, entvars_t *pK } /* <112b2e> ../cstrike/dlls/multiplay_gamerules.cpp:3916 */ -void CHalfLifeMultiplay::PlayerGotWeapon_(CBasePlayer *pPlayer, class CBasePlayerItem *pWeapon) +void CHalfLifeMultiplay::PlayerGotWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { ; } diff --git a/regamedll/dlls/pathcorner.cpp b/regamedll/dlls/pathcorner.cpp index c06b516c..d7cc2c31 100644 --- a/regamedll/dlls/pathcorner.cpp +++ b/regamedll/dlls/pathcorner.cpp @@ -121,7 +121,7 @@ NOBODY CPathTrack *CPathTrack::ValidPath(CPathTrack *ppath, int testFlag) } /* <122745> ../cstrike/dlls/pathcorner.cpp:198 */ -NOBODY void CPathTrack::Project(CPathTrack *pstart, class CPathTrack *pend, Vector *origin, float dist) +NOBODY void CPathTrack::Project(CPathTrack *pstart, CPathTrack *pend, Vector *origin, float dist) { // { // Vector dir; // 202 diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 2657777a..6bc9a6f1 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -138,8 +138,7 @@ TYPEDESCRIPTION CBasePlayer::m_playerSaveData[] = DEFINE_FIELD(CBasePlayer, m_iJoiningState, FIELD_INTEGER), }; -//TODO: check it m_side - for restrict to team? CT changed to TERRORIST, and on the contrary? -WeaponStruct g_weaponStruct[MAX_WEAPONS] = +WeaponStruct g_weaponStruct[ MAX_WEAPONS ] = { { 0, 0, 0, 0, 0 }, @@ -285,7 +284,7 @@ char *(*CDeadHEV::pm_szPoses)[4]; int gEvilImpulse101; char g_szMapBriefingText[512]; -//entvars_t *g_pevLastInflictor; +entvars_t *g_pevLastInflictor; CBaseEntity *g_pLastSpawn; CBaseEntity *g_pLastCTSpawn; CBaseEntity *g_pLastTerroristSpawn; @@ -626,7 +625,9 @@ void CBasePlayer::SetPlayerModel(BOOL HasC4) model = "urban"; if (Q_strcmp(GET_KEY_VALUE(infobuffer, "model"), model)) + { SET_CLIENT_KEY_VALUE(entindex(), infobuffer, "model", model); + } } /* <15f129> ../cstrike/dlls/player.cpp:659 */ @@ -689,16 +690,15 @@ void CBasePlayer::Radio(const char *msg_id, const char *msg_verbose, short pitch BOOL bSend = FALSE; CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pEntity->pev); - // TODO: check out! checking used is here pEntity or pPlayer? if (pEntity->IsPlayer()) { if (pEntity->IsDormant()) continue; - if (pPlayer && pPlayer->m_iTeam == m_iTeam) + if (pEntity && pPlayer->m_iTeam == m_iTeam) bSend = TRUE; } - else if (pPlayer) + else if (pEntity) { int iSpecMode = IsObserver(); @@ -856,18 +856,18 @@ int TrainSpeed(int iSpeed, int iMax) } /* <153c8e> ../cstrike/dlls/player.cpp:902 */ -NOXREF void CBasePlayer::DeathSound(void) +void CBasePlayer::DeathSound(void) { switch (RANDOM_LONG(1, 4)) { - case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die1.wav", VOL_NORM, ATTN_NORM); - break; - case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die2.wav", VOL_NORM, ATTN_NORM); - break; - case 3: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die3.wav", VOL_NORM, ATTN_NORM); - break; - case 4: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/death6.wav", VOL_NORM, ATTN_NORM); - break; + case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die1.wav", VOL_NORM, ATTN_NORM); + break; + case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die2.wav", VOL_NORM, ATTN_NORM); + break; + case 3: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/die3.wav", VOL_NORM, ATTN_NORM); + break; + case 4: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/death6.wav", VOL_NORM, ATTN_NORM); + break; } } @@ -1051,9 +1051,7 @@ const char *GetWeaponName(entvars_t *pevInflictor, entvars_t *pKiller) if (pKiller->flags & FL_CLIENT) { -#ifndef REGAMEDLL_FIXES //int killer_index = ENTINDEX(ENT(pKiller)); unused! -#endif // REGAMEDLL_FIXES if (pevInflictor) { @@ -1087,7 +1085,7 @@ const char *GetWeaponName(entvars_t *pevInflictor, entvars_t *pKiller) } /* <14e061> ../cstrike/dlls/player.cpp:1214 */ -void LogAttack(CBasePlayer *pAttacker, class CBasePlayer *pVictim, int teamAttack, int healthHit, int armorHit, int newHealth, int newArmor, const char *killer_weapon_name) +void LogAttack(CBasePlayer *pAttacker, CBasePlayer *pVictim, int teamAttack, int healthHit, int armorHit, int newHealth, int newArmor, const char *killer_weapon_name) { int detail = logdetail.value; @@ -1119,176 +1117,441 @@ void LogAttack(CBasePlayer *pAttacker, class CBasePlayer *pVictim, int teamAttac } } +// Take some damage. +// NOTE: each call to TakeDamage with bitsDamageType set to a time-based damage +// type will cause the damage time countdown to be reset. Thus the ongoing effects of poison, radiation +// etc are implemented with subsequent calls to TakeDamage using DMG_GENERIC. + /* <15dff9> ../cstrike/dlls/player.cpp:1241 */ -NOBODY int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) -{ -// { -// int fTookDamage; // 1243 -// float flRatio; // 1244 -// float flBonus; // 1245 -// float flHealthPrev; // 1246 -// int iGunType; // 1247 -// float flShieldRatio; // 1248 -// int teamAttack; // 1251 -// int armorHit; // 1251 -// class CBasePlayer *pAttack; // 1252 -// class CBaseEntity *pAttacker; // 1452 -// class CBaseEntity *attacker; // 1472 -// int i; // 1662 -// { -// float fTookDamage; // 1386 -// { -// class CGrenade *pGrenade; // 1290 -// class CBaseEntity *temp; // 1291 -// GetClassPtr(CBaseEntity *a); // 1291 -// GetClassPtr(CGrenade *a); // 1295 -// edict(CBaseEntity *const this); // 1299 -// Instance(entvars_t *pev); // 1312 -// } -// FNullEnt(const edict_t *pent); // 1318 -// IsArmored(CBasePlayer *const this, -// int nHitGroup); // 1324 -// { -// float flNew; // 1326 -// float flArmor; // 1327 -// { -// int oldValue; // 1343 -// } -// } -// LogAttack(CBasePlayer *pAttacker, -// class CBasePlayer *pVictim, -// int teamAttack, -// int healthHit, -// int armorHit, -// int newHealth, -// int newArmor, -// const char *killer_weapon_name); // 1384 -// { -// class CHalfLifeMultiplay *mp; // 1395 -// { -// int i; // 1398 -// { -// class CBasePlayer *pPlayer; // 1400 -// { -// bool killedByHumanPlayer; // 1403 -// } -// } -// } -// } -// { -// int i; // 1414 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1420 -// edict(CBaseEntity *const this); // 1423 -// ENTINDEX(edict_t *pEdict); // 1423 -// ENTINDEX(edict_t *pEdict); // 1424 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1429 -// edict(CBaseEntity *const this); // 1430 -// ENTINDEX(edict_t *pEdict); // 1430 -// { -// int i; // 1434 -// { -// class CBasePlayer *pPlayer; // 1436 -// edict(CBaseEntity *const this); // 1440 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1440 -// } -// } -// operator-(const class Vector *const this, -// const class Vector &v); // 1320 -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 1372 -// } -// Instance(entvars_t *pev); // 1452 -// GetClassPtr(CBaseEntity *a); // 1472 -// { -// class CBasePlayer *player; // 1475 -// { -// class CBaseEntity *pBasePlayer; // 1496 -// class CBasePlayer *basePlayer; // 1497 -// edict(CBaseEntity *const this); // 1500 -// FNullEnt(const edict_t *pent); // 1500 -// } -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 1484 -// ShouldDoLargeFlinch(CBasePlayer *const this, -// int nHitGroup, -// int nGunType); // 1557 -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 1579 -// Length(const class Vector *const this); // 1559 -// { -// class Vector attack_velocity; // 1561 -// operator-(const class Vector *const this, -// const class Vector &v); // 1563 -// Normalize(const class Vector *const this); // 1564 -// operator+(const class Vector *const this, -// const class Vector &v); // 1568 -// } -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 1570 -// } -// IsArmored(CBasePlayer *const this, -// int nHitGroup); // 1587 -// { -// float flNew; // 1589 -// float flArmor; // 1590 -// { -// int oldValue; // 1604 -// } -// } -// LogAttack(CBasePlayer *pAttacker, -// class CBasePlayer *pVictim, -// int teamAttack, -// int healthHit, -// int armorHit, -// int newHealth, -// int newArmor, -// const char *killer_weapon_name); // 1630 -// { -// class CHalfLifeMultiplay *mp; // 1643 -// { -// int i; // 1646 -// { -// class CBasePlayer *pPlayer; // 1648 -// { -// bool killedByHumanPlayer; // 1651 -// } -// } -// } -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1670 -// edict(CBaseEntity *const this); // 1673 -// ENTINDEX(edict_t *pEdict); // 1673 -// ENTINDEX(edict_t *pEdict); // 1674 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1679 -// edict(CBaseEntity *const this); // 1680 -// ENTINDEX(edict_t *pEdict); // 1680 -// { -// class CBasePlayer *pPlayer; // 1686 -// edict(CBaseEntity *const this); // 1690 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1690 -// } -// } +int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +{ + int fTookDamage; + float flRatio = ARMOR_RATIO; + float flBonus = ARMOR_BONUS; + //float flHealthPrev = pev->health; + int iGunType = 0; + float flShieldRatio = 0; + int teamAttack = FALSE; + int armorHit = 0; + CBasePlayer *pAttack = NULL; + CBaseEntity *pAttacker = NULL; + //CBaseEntity *attacker = NULL; // unused + + if (bitsDamageType & (DMG_EXPLOSION | DMG_BLAST | DMG_FALL)) + m_LastHitGroup = HITGROUP_GENERIC; + + else if (m_LastHitGroup == HITGROUP_SHIELD && (bitsDamageType & DMG_BULLET)) + return 0; + + if (HasShield()) + flShieldRatio = 0.2; + + if (m_bIsVIP) + flRatio *= 0.5; + + if (bitsDamageType & (DMG_EXPLOSION | DMG_BLAST)) + { + if (!IsAlive()) + { + return 0; + } + + if (bitsDamageType & DMG_EXPLOSION) + { + CBaseEntity *temp = GetClassPtr((CBaseEntity *)pevInflictor); + + if (!Q_strcmp(STRING(temp->pev->classname), "grenade")) + { + CGrenade *pGrenade = GetClassPtr((CGrenade *)pevInflictor); + + if (CVAR_GET_FLOAT("mp_friendlyfire")) + { + if (pGrenade->m_iTeam == m_iTeam) + teamAttack = TRUE; + + pAttack = reinterpret_cast(CBasePlayer::Instance( pevAttacker )); + } + else if (pGrenade->m_iTeam == m_iTeam && (&edict()->v != pevAttacker)) + { + return 0; + } + } + } + + if (!FNullEnt(ENT(pevInflictor))) + m_vBlastVector = pev->origin - pevInflictor->origin; + + if (pev->armorvalue != 0.0f && IsArmored(m_LastHitGroup)) + { + float_precision flNew = flRatio * flDamage; + float_precision flArmor = (flDamage - flNew) * flBonus; + + // Does this use more armor than we have? + if (flArmor > pev->armorvalue) + { + flNew = flDamage - pev->armorvalue; + armorHit = flArmor; + pev->armorvalue = 0; + } + else + { + int oldValue = pev->armorvalue; + + if (flArmor < 0.0) + flArmor = 1.0; + + pev->armorvalue -= flArmor; + armorHit = oldValue - pev->armorvalue; + } + + flDamage = flNew; + + if (pev->armorvalue <= 0.0) + m_iKevlar = ARMOR_TYPE_EMPTY; + + Pain(m_LastHitGroup, true); + } + else + Pain(m_LastHitGroup, false); + + m_lastDamageAmount = flDamage; + + if (pev->health > flDamage) + { + SetAnimation(PLAYER_FLINCH); + Pain(m_LastHitGroup, false); + } + else + { + if (bitsDamageType & DMG_BLAST) + m_bKilledByBomb = true; + + else if (bitsDamageType & DMG_EXPLOSION) + m_bKilledByGrenade = true; + } + + LogAttack(pAttack, this, teamAttack, (int)flDamage, armorHit, pev->health - flDamage, pev->armorvalue, GetWeaponName(pevInflictor, pevAttacker)); + fTookDamage = CBaseMonster::TakeDamage(pevInflictor, pevAttacker, (int)flDamage, bitsDamageType); + + if (fTookDamage > 0) + { + CHalfLifeMultiplay *mp = g_pGameRules; + + if (TheBots) + TheBots->OnEvent(EVENT_PLAYER_TOOK_DAMAGE, this, pAttack); + + if (mp->IsCareer()) + { + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i ); + + if (!pPlayer) + continue; + + bool killedByHumanPlayer = (!pPlayer->IsBot() && pPlayer->pev == pevAttacker && pPlayer->m_iTeam != m_iTeam); + + if (killedByHumanPlayer) + { + TheCareerTasks->HandleEnemyInjury(GetWeaponName(pevInflictor, pevAttacker), pPlayer->HasShield(), pPlayer); + } + } + } + } + + { + // reset damage time countdown for each type of time based damage player just sustained + for (int i = 0; i < CDMG_TIMEBASED; i++) + { + if (bitsDamageType & (DMG_PARALYZE << i)) + m_rgbTimeBasedDamage[i] = 0; + } + } + + // tell director about it + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); // command length in bytes + WRITE_BYTE(DRC_CMD_EVENT); // take damage event + WRITE_SHORT(ENTINDEX(edict())); // index number of primary entity + WRITE_SHORT(ENTINDEX(ENT(pevInflictor))); // index number of secondary entity + WRITE_LONG(5); // eventflags (priority and flags) + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_BYTE((int)max(pev->health, 0) | (1<<7)); + MESSAGE_END(); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!pPlayer || pPlayer->m_hObserverTarget != this) + continue; + + MESSAGE_BEGIN(MSG_ONE, gmsgSpecHealth, NULL, pPlayer->edict()); + WRITE_BYTE((int)max(pev->health, 0)); + MESSAGE_END(); + } + + return fTookDamage; + } + + pAttacker = CBaseEntity::Instance(pevAttacker); + + if (!g_pGameRules->FPlayerCanTakeDamage(this, pAttacker) && Q_strcmp("grenade", STRING(pevInflictor->classname))) + { + // Refuse the damage + return 0; + } + + if (bitsDamageType & DMG_BLAST && g_pGameRules->IsMultiplayer()) + { + // blasts damage armor more. + flBonus *= 2; + } + + // Already dead + if (!IsAlive()) + return 0; + + pAttacker = GetClassPtr((CBaseEntity *)pevAttacker); + + if (pAttacker->IsPlayer()) + { + pAttack = GetClassPtr((CBasePlayer *)pevAttacker); + + if (pAttack != this && pAttack->m_iTeam == m_iTeam) + { + // TODO: this->m_flDisplayHistory!! + if (!(m_flDisplayHistory & DHF_FRIEND_INJURED)) + { + m_flDisplayHistory |= DHF_FRIEND_INJURED; + pAttack->HintMessage("#Hint_try_not_to_injure_teammates"); + } + + teamAttack = TRUE; + if (gpGlobals->time > pAttack->m_flLastAttackedTeammate + 0.6) + { + CBaseEntity *pBasePlayer = NULL; + while ((pBasePlayer = UTIL_FindEntityByClassname(pBasePlayer, "player")) != NULL) + { + if (FNullEnt(pBasePlayer->edict())) + break; + + CBasePlayer *basePlayer = GetClassPtr((CBasePlayer *)pBasePlayer->pev); + + if (basePlayer->m_iTeam == m_iTeam) + ClientPrint(basePlayer->pev, HUD_PRINTTALK, "#Game_teammate_attack", STRING(pAttack->pev->netname)); + } + + pAttack->m_flLastAttackedTeammate = gpGlobals->time; + } + } + + if (pAttack->m_iTeam == m_iTeam) + flDamage *= 0.35; + + iGunType = pAttack->m_pActiveItem->m_iId; + + if (pAttack->m_pActiveItem) + { + flRatio += flShieldRatio; + switch (iGunType) + { + case WEAPON_AUG: + case WEAPON_M4A1: + flRatio *= 1.4; + break; + case WEAPON_AWP: + flRatio *= 1.95; + break; + case WEAPON_G3SG1: + flRatio *= 1.65; + break; + case WEAPON_SG550: + flRatio *= 1.45; + break; + case WEAPON_M249: + flRatio *= 1.5; + break; + case WEAPON_ELITE: + flRatio *= 1.05; + break; + case WEAPON_DEAGLE: + flRatio *= 1.5; + break; + case WEAPON_GLOCK18: + flRatio *= 1.05; + break; + case WEAPON_FIVESEVEN: + case WEAPON_P90: + flRatio *= 1.5; + break; + case WEAPON_MAC10: + flRatio *= 0.95; + break; + case WEAPON_P228: + flRatio *= 1.25; + break; + case WEAPON_SCOUT: + case WEAPON_KNIFE: + flRatio *= 1.7; + break; + case WEAPON_FAMAS: + case WEAPON_SG552: + flRatio *= 1.4; + break; + case WEAPON_GALIL: + case WEAPON_AK47: + flRatio *= 1.55; + break; + } + } + + if (!ShouldDoLargeFlinch(m_LastHitGroup, iGunType)) + { + m_flVelocityModifier = 0.5f; + + if (m_LastHitGroup == HITGROUP_HEAD) + m_bHighDamage = (flDamage > 60); + else + m_bHighDamage = (flDamage > 20); + + SetAnimation(PLAYER_FLINCH); + } + else + { + if (pev->velocity.Length() < 300) + { + Vector attack_velocity = (pev->origin - pAttack->pev->origin).Normalize() * 170; + pev->velocity = pev->velocity + attack_velocity; + + m_flVelocityModifier = 0.65f; + } + SetAnimation(PLAYER_LARGE_FLINCH); + } + } + + // keep track of amount of damage last sustained + m_lastDamageAmount = flDamage; + + // Armor + // armor doesn't protect against fall or drown damage! + if (pev->armorvalue != 0.0f && !(bitsDamageType & (DMG_DROWN | DMG_FALL)) && IsArmored(m_LastHitGroup)) + { + float_precision flNew = flRatio * flDamage; + float_precision flArmor = (flDamage - flNew) * flBonus; + + // Does this use more armor than we have? + if (flArmor > pev->armorvalue) + { + armorHit = flArmor; + flArmor = pev->armorvalue; + flArmor *= (1 / flBonus); + flNew = flDamage - flArmor; + pev->armorvalue = 0; + } + else + { + int oldValue = pev->armorvalue; + + if (flArmor < 0.0) + flArmor = 1.0; + + pev->armorvalue -= flArmor; + armorHit = oldValue - pev->armorvalue; + } + + flDamage = flNew; + + if (pev->armorvalue <= 0.0f) + m_iKevlar = ARMOR_TYPE_EMPTY; + + Pain(m_LastHitGroup, true); + } + else + Pain(m_LastHitGroup, false); + + LogAttack(pAttack, this, teamAttack, flDamage, armorHit, pev->health - flDamage, pev->armorvalue, GetWeaponName(pevInflictor, pevAttacker)); + + // this cast to INT is critical!!! If a player ends up with 0.5 health, the engine will get that + // as an int (zero) and think the player is dead! (this will incite a clientside screentilt, etc) + fTookDamage = CBaseMonster::TakeDamage(pevInflictor, pevAttacker, (int)flDamage, bitsDamageType); + + if (fTookDamage > 0) + { + CHalfLifeMultiplay *mp = g_pGameRules; + + if (TheBots) + { + TheBots->OnEvent(EVENT_PLAYER_TOOK_DAMAGE, this, pAttack); + } + + if (mp->IsCareer()) + { + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i ); + + if (!pPlayer) + continue; + + bool killedByHumanPlayer = (!pPlayer->IsBot() && pPlayer->pev == pevAttacker && pPlayer->m_iTeam != m_iTeam); + + if (killedByHumanPlayer) + { + TheCareerTasks->HandleEnemyInjury(GetWeaponName(pevInflictor, pevAttacker), pPlayer->HasShield(), pPlayer); + } + } + } + } + + { + // reset damage time countdown for each type of time based damage player just sustained + for (int i = 0; i < CDMG_TIMEBASED; i++) + { + if (bitsDamageType & (DMG_PARALYZE << i)) + m_rgbTimeBasedDamage[i] = 0; + } + } + + // tell director about it + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); // command length in bytes + WRITE_BYTE(DRC_CMD_EVENT); // take damage event + WRITE_SHORT(ENTINDEX(edict())); // index number of primary entity + WRITE_SHORT(ENTINDEX(ENT(pevInflictor))); // index number of secondary entity + WRITE_LONG(5); // eventflags (priority and flags) + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_BYTE((int)max(pev->health, 0) | (1<<7)); + MESSAGE_END(); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i ); + + if (!pPlayer) + continue; + + if (pPlayer->m_hObserverTarget == this) + { + MESSAGE_BEGIN(MSG_ONE, gmsgSpecHealth, NULL, pPlayer->edict()); + WRITE_BYTE((int)max(pev->health, 0)); + MESSAGE_END(); + } + } + + // Save this so we can report it to the client + m_bitsHUDDamage = -1; + + // make sure the damage bits get resent + m_bitsDamageType |= bitsDamageType; + + return fTookDamage; } /* <1516a0> ../cstrike/dlls/player.cpp:1706 */ @@ -1329,7 +1592,7 @@ void CBasePlayer::PackDeadPlayerItems(void) bool bShieldDropped = false; if (HasShield()) { - DropShield(TRUE); + DropShield(); bShieldDropped = true; } @@ -1765,7 +2028,7 @@ void VIP_SafetyZoneIcon_Clear(CBasePlayer *player) } /* <154417> ../cstrike/dlls/player.cpp:2282 */ -NOXREF void CBasePlayer::SendFOV(int fov) +void CBasePlayer::SendFOV(int fov) { pev->fov = (float_precision)fov; m_iClientFOV = fov; @@ -1777,128 +2040,306 @@ NOXREF void CBasePlayer::SendFOV(int fov) } /* <160a1a> ../cstrike/dlls/player.cpp:2300 */ -NOBODY void CBasePlayer::Killed_(entvars_t *pevAttacker, int iGib) +void CBasePlayer::Killed_(entvars_t *pevAttacker, int iGib) { -// { -// class CSound *pSound; // 2302 -// Instance(entvars_t *pev); // 2310 -// { -// class CBaseEntity *pAttackerEntity; // 2374 -// class CBasePlayer *pAttacker; // 2375 -// bool killerHasShield; // 2378 -// bool wasBlind; // 2380 -// Instance(entvars_t *pev); // 2374 -// HasShield(CBasePlayer *const this); // 2378 -// { -// class CCSBot *pBot; // 2383 -// IsBlind(const class CBasePlayer *const this); // 2384 -// } -// { -// int i; // 2386 -// { -// class CBasePlayer *pPlayer; // 2388 -// { -// bool killedByHumanPlayer; // 2391 -// } -// } -// } -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2405 -// { -// int i; // 2411 -// { -// class CBasePlayer *pObserver; // 2413 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2416 -// } -// } -// edict(CBaseEntity *const this); // 2431 -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 2439 -// { -// class CSmokeGrenade *pSmoke; // 2461 -// Vector(Vector *const this, -// const Vector &v); // 2462 -// operator+(const Vector *const this, -// const Vector &v); // 2462 -// } -// Vector(Vector *const this, -// const Vector &v); // 2455 -// operator+(const Vector *const this, -// const Vector &v); // 2455 -// { -// class CHEGrenade *pHEGrenade; // 2448 -// Vector(Vector *const this, -// const Vector &v); // 2449 -// operator+(const Vector *const this, -// const Vector &v); // 2449 -// } -// { -// int gmsgADStop; // 2489 -// ENTINDEX(edict_t *pEdict); // 2486 -// ENTINDEX(edict_t *pEdict); // 2487 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2490 -// } -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 2480 -// operator-(const Vector *const this); // 2535 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2545 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2550 -// SendFOV(CBasePlayer *const this, -// int fov); // 2556 -// BuyZoneIcon_Clear(CBasePlayer *player); // 2588 -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 2618 -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 2599 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2575 -// SendItemStatus(CBasePlayer *pPlayer); // 2579 -// operator*(const Vector *const this, -// float fl); // 2508 -// operator*(const Vector *const this, -// float fl); // 2515 -// operator*(const Vector *const this, -// float fl); // 2532 -// Length(const Vector *const this); // 2525 -// Length(const Vector *const this); // 2525 -// operator/(const Vector *const this, -// float fl); // 2525 -// operator*(const Vector *const this, -// float fl); // 2525 -// Length(const Vector *const this); // 2526 -// Length(const Vector *const this); // 2520 -// Length(const Vector *const this); // 2520 -// operator/(const Vector *const this, -// float fl); // 2520 -// operator*(const Vector *const this, -// float fl); // 2520 -// operator/(const Vector *const this, -// float fl); // 2520 -// Length(const Vector *const this); // 2521 -// } + m_canSwitchObserverModes = false; + + if (m_LastHitGroup == HITGROUP_HEAD) + m_bHeadshotKilled = true; + + CBaseEntity *pAttackerEntity = CBaseEntity::Instance(pevAttacker); + + TheBots->OnEvent(EVENT_PLAYER_DIED, this, pAttackerEntity); + + if (g_pGameRules->IsCareer()) + { + bool killerHasShield = false; + bool wasBlind = false; + + if (!IsBot()) + { + TheCareerTasks->HandleEvent(EVENT_DIE, NULL, this); + } + TheCareerTasks->HandleDeath(m_iTeam, this); + + if (!m_bKilledByBomb) + { + CBasePlayer *pAttacker = (CBasePlayer *)CBaseEntity::Instance(pevAttacker); + + if (pAttacker->HasShield()) + killerHasShield = true; + + CCSBot *pBot = reinterpret_cast(this); + if (pBot->IsBot() && pBot->IsBlind()) + { + wasBlind = true; + } + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!pPlayer) + continue; + + bool killedByHumanPlayer = (!pPlayer->IsBot() && pPlayer->pev == pevAttacker && pPlayer->m_iTeam != m_iTeam); + + if (killedByHumanPlayer) + { + TheCareerTasks->HandleEnemyKill(wasBlind, GetWeaponName(g_pevLastInflictor, pevAttacker), m_bHeadshotKilled, killerHasShield, this, pPlayer); + } + } + } + } + + if (!m_bKilledByBomb) + { + g_pGameRules->PlayerKilled(this, pevAttacker, g_pevLastInflictor); + } + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pev); + WRITE_BYTE(0); + MESSAGE_END(); + + m_bNightVisionOn = false; + + for (int i = 1; i <= gpGlobals->maxClients; ++i) + { + CBasePlayer *pObserver = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!pObserver) + continue; + + if (pObserver->IsObservingPlayer(this)) + { + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pObserver->pev); + WRITE_BYTE(0); + MESSAGE_END(); + + pObserver->m_bNightVisionOn = false; + } + } + + if (m_pTank != NULL) + { + m_pTank->Use(this, this, USE_OFF, 0); + m_pTank = NULL; + } + + CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict())); + + if (pSound) + { + pSound->Reset(); + } + + SetAnimation(PLAYER_DIE); + + if (m_pActiveItem && m_pActiveItem->m_pPlayer) + { + switch (m_pActiveItem->m_iId) + { + case WEAPON_HEGRENADE: + { + CHEGrenade *pHEGrenade = (CHEGrenade *)m_pActiveItem; + if ((pev->button & IN_ATTACK) && m_rgAmmo[ pHEGrenade->m_iPrimaryAmmoType ]) + { + CGrenade::ShootTimed2(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5, m_iTeam, pHEGrenade->m_usCreateExplosion); + } + break; + } + case WEAPON_FLASHBANG: + { + if ((pev->button & IN_ATTACK) && m_rgAmmo[ ((CBasePlayerWeapon *)m_pActiveItem)->m_iPrimaryAmmoType ]) + { + CGrenade::ShootTimed(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5); + } + break; + } + case WEAPON_SMOKEGRENADE: + { + CSmokeGrenade *pSmoke = (CSmokeGrenade *)m_pActiveItem; + if ((pev->button & IN_ATTACK) && m_rgAmmo[ pSmoke->m_iPrimaryAmmoType ]) + { + CGrenade::ShootSmokeGrenade(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5, pSmoke->m_usCreateSmoke); + } + break; + } + } + } + + pev->modelindex = m_modelIndexPlayer; + pev->deadflag = DEAD_DYING; + pev->movetype = MOVETYPE_TOSS; + pev->takedamage = DAMAGE_NO; + + pev->gamestate = 1; + m_bShieldDrawn = false; + + pev->flags &= ~FL_ONGROUND; + + if (fadetoblack.value == 0.0) + { + pev->iuser1 = OBS_CHASE_FREE; + pev->iuser2 = ENTINDEX(edict()); + pev->iuser3 = ENTINDEX(ENT(pevAttacker)); + + m_hObserverTarget = UTIL_PlayerByIndex(pev->iuser3); + + MESSAGE_BEGIN(MSG_ONE, gmsgADStop, NULL, pev); + MESSAGE_END(); + } + else + UTIL_ScreenFade(this, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); + + SetScoreboardAttributes(); + + if (m_iThrowDirection) + { + switch (m_iThrowDirection) + { + case THROW_FORWARD: + { + UTIL_MakeVectors(pev->angles); + + pev->velocity = gpGlobals->v_forward * RANDOM_FLOAT(100, 200); + pev->velocity.z = RANDOM_FLOAT(50, 100); + + break; + } + case THROW_BACKWARD: + { + UTIL_MakeVectors(pev->angles); + + pev->velocity = gpGlobals->v_forward * RANDOM_FLOAT(-100, -200); + pev->velocity.z = RANDOM_FLOAT(50, 100); + + break; + } + case THROW_HITVEL: + { + if (FClassnameIs(pevAttacker, "player")) + { + UTIL_MakeVectors(pevAttacker->angles); + + pev->velocity = gpGlobals->v_forward * RANDOM_FLOAT(200, 300); + pev->velocity.z = RANDOM_FLOAT(200, 300); + } + + break; + } + case THROW_BOMB: + { + pev->velocity = m_vBlastVector * (1 / m_vBlastVector.Length()) * (2300 - m_vBlastVector.Length()) * 0.25; + pev->velocity.z = (2300 - m_vBlastVector.Length()) / 2.75; + + break; + } + case THROW_GRENADE: + { + pev->velocity = m_vBlastVector * (1 / m_vBlastVector.Length()) * (500 - m_vBlastVector.Length()); + pev->velocity.z = (350 - m_vBlastVector.Length()) * 1.5; + + break; + } + case THROW_HITVEL_MINUS_AIRVEL: + { + if (FClassnameIs(pevAttacker, "player")) + { + UTIL_MakeVectors(pevAttacker->angles); + pev->velocity = gpGlobals->v_forward * RANDOM_FLOAT(200, 300); + } + + break; + } + default: + break; + } + + pev->angles.y = UTIL_VecToAngles(-pev->velocity).y; + pev->v_angle.y = pev->angles.y; + + m_iThrowDirection = THROW_NONE; + } + + SetSuitUpdate(NULL, FALSE, 0); + m_iClientHealth = 0; + + MESSAGE_BEGIN(MSG_ONE, gmsgHealth, NULL, pev); + WRITE_BYTE(m_iClientHealth); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgCurWeapon, NULL, pev); + WRITE_BYTE(0); + WRITE_BYTE(0xFF); + WRITE_BYTE(0xFF); + MESSAGE_END(); + + SendFOV(0); + + g_pGameRules->CheckWinConditions(); + m_bNotKilled = false; + + if (m_bHasC4) + { + DropPlayerItem("weapon_c4"); + SetProgressBarTime(0); + } + else if (m_bHasDefuser) + { + m_bHasDefuser = false; + pev->body = 0; + + GiveNamedItem("item_thighpack"); + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("defuser"); + MESSAGE_END(); + + SendItemStatus(this); + } + + if (m_bIsDefusing) + { + SetProgressBarTime(0); + } + + m_bIsDefusing = false; + + BuyZoneIcon_Clear(this); + + SetThink(&CBasePlayer::PlayerDeathThink); + pev->nextthink = gpGlobals->time + 0.1; + pev->solid = SOLID_NOT; + + if (m_bPunishedForTK) + { + m_bPunishedForTK = false; + HintMessage("#Hint_cannot_play_because_tk", TRUE, TRUE); + } + + if ((pev->health < -9000 && iGib != GIB_NEVER) || iGib == GIB_ALWAYS) + { + pev->solid = SOLID_NOT; + GibMonster(); + pev->effects |= EF_NODRAW; + + g_pGameRules->CheckWinConditions(); + + return; + } + + DeathSound(); + + pev->angles.x = 0; + pev->angles.z = 0; + + if (!(m_flDisplayHistory & DHF_SPEC_DUCK)) + { + HintMessage("#Spec_Duck", TRUE, TRUE); + m_flDisplayHistory |= DHF_SPEC_DUCK; + } } /* <154478> ../cstrike/dlls/player.cpp:2625 */ @@ -2472,47 +2913,125 @@ void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim) } /* <1544f4> ../cstrike/dlls/player.cpp:3264 */ -NOBODY void CBasePlayer::WaterMove(void) +void CBasePlayer::WaterMove(void) { -// { -// int air; // 3266 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3285 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3287 -// VARS(EOFFSET eoffset); // 3322 -// VARS(EOFFSET eoffset); // 3322 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3356 -// VARS(EOFFSET eoffset); // 3363 -// VARS(EOFFSET eoffset); // 3363 -// VARS(EOFFSET eoffset); // 3368 -// VARS(EOFFSET eoffset); // 3368 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3355 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3354 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 3353 -// } + int air; + + if (pev->movetype == MOVETYPE_NOCLIP || pev->movetype == MOVETYPE_NONE) + return; + + if (pev->health < 0.0f) + return; + + // waterlevel 0 - not in water + // waterlevel 1 - feet in water + // waterlevel 2 - waist in water + // waterlevel 3 - head in water + + if (pev->waterlevel != 3) + { + // not underwater + + // play 'up for air' sound + if (pev->air_finished < gpGlobals->time) + EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/pl_wade1.wav", VOL_NORM, ATTN_NORM); + + else if (pev->air_finished < gpGlobals->time + 9) + EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/pl_wade2.wav", VOL_NORM, ATTN_NORM); + + pev->air_finished = gpGlobals->time + AIRTIME; + pev->dmg = 2; + + // if we took drowning damage, give it back slowly + if (m_idrowndmg > m_idrownrestored) + { + // set drowning damage bit. hack - dmg_drownrecover actually + // makes the time based damage code 'give back' health over time. + // make sure counter is cleared so we start count correctly. + + // NOTE: this actually causes the count to continue restarting + // until all drowning damage is healed. + m_rgbTimeBasedDamage[ itbd_DrownRecover ] = 0; + m_bitsDamageType |= DMG_DROWNRECOVER; + m_bitsDamageType &= ~DMG_DROWN; + + } + } + else + { + // fully under water + // stop restoring damage while underwater + m_rgbTimeBasedDamage[ itbd_DrownRecover ] = 0; + m_bitsDamageType &= ~DMG_DROWNRECOVER; + + // drown! + if (gpGlobals->time > pev->air_finished) + { + if (gpGlobals->time > pev->pain_finished) + { + // take drowning damage + pev->dmg += 1; + + if (pev->dmg > 5) + pev->dmg = 5; + + TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), pev->dmg, DMG_DROWN); + pev->pain_finished = gpGlobals->time + 1; + + // track drowning damage, give it back when + // player finally takes a breath + m_idrowndmg += pev->dmg; + } + } + else + m_bitsDamageType &= ~(DMG_DROWNRECOVER | DMG_DROWN); + } + + if (!pev->waterlevel) + { + if (pev->flags & FL_INWATER) + pev->flags &= ~FL_INWATER; + + return; + } + + // make bubbles + air = (int)(pev->air_finished - gpGlobals->time); + + if (!RANDOM_LONG(0, 0x1f) && RANDOM_LONG(0, AIRTIME - 1) >= air) + { + switch (RANDOM_LONG(0, 3)) + { + case 0: + EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_swim1.wav", 0.8, ATTN_NORM); + break; + case 1: + EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_swim2.wav", 0.8, ATTN_NORM); + break; + case 2: + EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_swim3.wav", 0.8, ATTN_NORM); + break; + case 3: + EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_swim4.wav", 0.8, ATTN_NORM); + break; + } + } + + if (pev->watertype == CONTENT_LAVA) // do damage + { + if (pev->dmgtime < gpGlobals->time) + TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), pev->waterlevel * 10, DMG_BURN); + } + else if (pev->watertype == CONTENT_SLIME) // do damage + { + pev->dmgtime = gpGlobals->time + 1; + TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), pev->waterlevel * 4, DMG_ACID); + } + if (!(pev->flags & FL_INWATER)) + { + pev->flags |= FL_INWATER; + pev->dmgtime = 0; + } } /* <15493f> ../cstrike/dlls/player.cpp:3380 */ @@ -2545,23 +3064,78 @@ NOXREF void CBasePlayer::ThrowWeapon(char *pszItemName) LINK_ENTITY_TO_CLASS(weapon_shield, CWShield); /* <151962> ../cstrike/dlls/player.cpp:3426 */ -NOBODY void CWShield::Spawn(void) +void CWShield::Spawn_(void) { + pev->movetype = MOVETYPE_TOSS; + pev->solid = SOLID_TRIGGER; + + UTIL_SetSize(pev, g_vecZero, g_vecZero); + SET_MODEL(ENT(pev), "models/w_shield.mdl"); } /* <152e95> ../cstrike/dlls/player.cpp:3436 */ -NOBODY void CWShield::Touch(CBaseEntity *pOther) +void CWShield::Touch_(CBaseEntity *pOther) { -// { -// class CBasePlayer *pPlayer; // 3457 -// } -// Touch(CWShield *const this, -// class CBaseEntity *pOther); // 3436 + if (!pOther->IsPlayer()) + return; + + CBasePlayer *pPlayer = (CBasePlayer *)pOther; + + if (pPlayer->pev->deadflag != DEAD_NO) + return; + + if (m_hEntToIgnoreTouchesFrom != NULL && pPlayer == (CBasePlayer *)((CBaseEntity *)m_hEntToIgnoreTouchesFrom)) + { + if (m_flTimeToIgnoreTouches > gpGlobals->time) + return; + + m_hEntToIgnoreTouchesFrom = NULL; + } + + if (!pPlayer->m_bHasPrimary) + { + if (pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ] != NULL && pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ]->m_iId == WEAPON_ELITE) + return; + + if (pPlayer->m_pActiveItem) + { + if (!pPlayer->m_pActiveItem->CanHolster()) + return; + } + + if (!pPlayer->m_bIsVIP) + { + pPlayer->GiveShield(); + + EMIT_SOUND(edict(), CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM); + UTIL_Remove(this); + + pev->nextthink = gpGlobals->time + 0.1; + } + } } /* <154a43> ../cstrike/dlls/player.cpp:3480 */ -NOBODY void CBasePlayer::GiveShield(bool bDeploy) +void CBasePlayer::GiveShield(bool bDeploy) { + m_bOwnsShield = true; + m_bHasPrimary = true; + + if (m_pActiveItem != NULL) + { + CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)m_pActiveItem; + + if (bDeploy) + { + if (m_rgAmmo[ pWeapon->m_iPrimaryAmmoType ] > 0) + pWeapon->Holster(); + + if (!pWeapon->Deploy()) + pWeapon->RetireWeapon(); + } + } + + pev->gamestate = 0; } /* <154a70> ../cstrike/dlls/player.cpp:3504 */ @@ -2663,7 +3237,7 @@ NOXREF void CBasePlayer::ThrowPrimary(void) ThrowWeapon("weapon_galil"); ThrowWeapon("weapon_famas"); - DropShield(true); + DropShield(); } /* <154b6d> ../cstrike/dlls/player.cpp:3624 */ @@ -2827,101 +3401,328 @@ void CBasePlayer::MakeVIP(void) } /* <154fe5> ../cstrike/dlls/player.cpp:3785 */ -NOBODY void CBasePlayer::JoiningThink(void) +void CBasePlayer::JoiningThink(void) { -// { -// class CHalfLifeMultiplay *mp; // 3787 -// { -// class CHalfLifeMultiplay *MPRules; // 3843 -// RemoveLevelText(CBasePlayer *const this); // 3815 -// { -// edict_t *pentSpawnSpot; // 3861 -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 3857 -// VARS(edict_t *pent); // 3862 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3866 -// Vector(Vector *const this, -// const Vector &v); // 3862 -// Vector(Vector *const this, -// const Vector &v); // 3862 -// entindex(CBaseEntity *const this); // 3867 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3878 -// entindex(CBaseEntity *const this); // 3879 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3884 -// edict(CBaseEntity *const this); // 3885 -// ENTINDEX(edict_t *pEdict); // 3885 -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 3894 -// } -// ResetMenu(CBasePlayer *const this); // 3794 -// SendItemStatus(CBasePlayer *pPlayer); // 3806 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 3798 -// AddAccount(CBasePlayer *const this, -// int amount, -// bool bTrackChange); // 3850 -// } -// { -// class CBaseEntity *Target; // 3919 -// Vector CamAngles; // 3920 -// operator-(const Vector *const this, -// const Vector &v); // 3935 -// Normalize(const Vector *const this); // 3936 -// } -// } + switch (m_iJoiningState) + { + case JOINED: + { + return; + } + case SHOWLTEXT: + { + ResetMenu(); + m_iJoiningState = SHOWTEAMSELECT; + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("defuser"); + MESSAGE_END(); + + m_bHasDefuser = false; + m_fLastMovement = gpGlobals->time; + m_bMissionBriefing = false; + + SendItemStatus(this); + break; + } + case READINGLTEXT: + { + if (m_afButtonPressed & (IN_ATTACK | IN_ATTACK2 | IN_JUMP)) + { + m_afButtonPressed &= ~(IN_ATTACK | IN_ATTACK2 | IN_JUMP); + + RemoveLevelText(); + m_iJoiningState = SHOWTEAMSELECT; + } + + break; + } + case GETINTOGAME: + { + CHalfLifeMultiplay *mp = g_pGameRules; + + m_bNotKilled = false; + m_iIgnoreGlobalChat = IGNOREMSG_NONE; + + m_iTeamKills = 0; + m_iFOV = DEFAULT_FOV; + + Q_memset(&m_rebuyStruct, 0, sizeof(m_rebuyStruct)); + + m_bIsInRebuy = false; + m_bJustConnected = false; + m_fLastMovement = gpGlobals->time; + + ResetMaxSpeed(); + m_iJoiningState = JOINED; + + if (mp->m_bMapHasEscapeZone && m_iTeam == CT) + { + m_iAccount = 0; + CheckStartMoney(); + AddAccount(startmoney.value); + } + + if (mp->FPlayerCanRespawn(this)) + { + // TODO: Reverse me + Spawn(); + + mp->CheckWinConditions(); + + if (!mp->m_fTeamCount && mp->m_bMapHasBombTarget && !mp->IsThereABomber() && !mp->IsThereABomb()) + { + mp->GiveC4(); + } + if (m_iTeam == TERRORIST) + { + mp->m_iNumEscapers++; + } + } + else + { + pev->deadflag = DEAD_RESPAWNABLE; + + if (pev->classname) + { + RemoveEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + } + + MAKE_STRING_CLASS("player", pev); + AddEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + + pev->flags &= (FL_PROXY | FL_FAKECLIENT); + pev->flags |= (FL_SPECTATOR | FL_CLIENT); + + edict_t *pentSpawnSpot = mp->GetPlayerSpawnSpot(this); + StartObserver(pev->origin, VARS(pentSpawnSpot)->angles); + + mp->CheckWinConditions(); + + MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo); + WRITE_BYTE(entindex()); + switch (m_iTeam) + { + case CT: + WRITE_STRING("CT"); + break; + case TERRORIST: + WRITE_STRING("TERRORIST"); + break; + case SPECTATOR: + WRITE_STRING("SPECTATOR"); + break; + default: + WRITE_STRING("UNASSIGNED"); + break; + } + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgLocation); + WRITE_BYTE(entindex()); + WRITE_STRING(""); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_SHORT((short)pev->frags); + WRITE_SHORT(m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(m_iTeam); + MESSAGE_END(); + + if (!(m_flDisplayHistory & DHF_SPEC_DUCK)) + { + HintMessage("#Spec_Duck", TRUE, TRUE); + m_flDisplayHistory |= DHF_SPEC_DUCK; + } + } + return; + } + } + + if (m_pIntroCamera && gpGlobals->time >= m_fIntroCamTime) + { + m_pIntroCamera = UTIL_FindEntityByClassname(m_pIntroCamera, "trigger_camera"); + + if (!m_pIntroCamera) + { + m_pIntroCamera = UTIL_FindEntityByClassname(NULL, "trigger_camera"); + } + + CBaseEntity *Target = UTIL_FindEntityByTargetname(NULL, STRING(m_pIntroCamera->pev->target)); + + if (Target) + { + Vector CamAngles = UTIL_VecToAngles((Target->pev->origin - m_pIntroCamera->pev->origin).Normalize()); + + CamAngles.x = -CamAngles.x; + UTIL_SetOrigin(pev, m_pIntroCamera->pev->origin); + + pev->angles = CamAngles; + pev->v_angle = pev->angles; + + pev->velocity = g_vecZero; + pev->punchangle = g_vecZero; + + pev->fixangle = 1; + pev->view_ofs = g_vecZero; + m_fIntroCamTime = gpGlobals->time + 6; + } + else + m_pIntroCamera = NULL; + } } /* <16076f> ../cstrike/dlls/player.cpp:3952 */ -NOBODY void CBasePlayer::Disappear(void) +void CBasePlayer::Disappear(void) { -// { -// class CSound *pSound; // 3954 -// edict(CBaseEntity *const this); // 3964 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 3987 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 3992 -// SendFOV(CBasePlayer *const this, -// int fov); // 3998 -// BuyZoneIcon_Clear(CBasePlayer *player); // 4026 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 4017 -// SendItemStatus(CBasePlayer *pPlayer); // 4021 -// } + if (m_pTank != NULL) + { + m_pTank->Use(this, this, USE_OFF, 0); + m_pTank = NULL; + } + + CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict())); + + if (pSound) + pSound->Reset(); + + m_fSequenceFinished = TRUE; + pev->modelindex = m_modelIndexPlayer; + pev->view_ofs = Vector(0, 0, -8); + pev->deadflag = DEAD_DYING; + pev->solid = SOLID_NOT; + pev->flags &= ~FL_ONGROUND; + + SetSuitUpdate(NULL, FALSE, 0); + + m_iClientHealth = 0; + MESSAGE_BEGIN(MSG_ONE, gmsgHealth, NULL, pev); + WRITE_BYTE(m_iClientHealth); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgCurWeapon, NULL, pev); + WRITE_BYTE(0); + WRITE_BYTE(0xFF); + WRITE_BYTE(0xFF); + MESSAGE_END(); + + SendFOV(0); + + g_pGameRules->CheckWinConditions(); + m_bNotKilled = false; + + if (m_bHasC4) + { + DropPlayerItem("weapon_c4"); + } + else if (m_bHasDefuser) + { + m_bHasDefuser = false; + pev->body = 0; + GiveNamedItem("item_thighpack"); + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("defuser"); + MESSAGE_END(); + + SendItemStatus(this); + } + + SetProgressBarTime(0); + BuyZoneIcon_Clear(this); + + SetThink(&CBasePlayer::PlayerDeathThink); + pev->nextthink = gpGlobals->time + 0.1; + + pev->angles.x = 0; + pev->angles.z = 0; } /* <15f83d> ../cstrike/dlls/player.cpp:4039 */ -NOBODY void CBasePlayer::PlayerDeathThink(void) +void CBasePlayer::PlayerDeathThink(void) { -// { -// float flForward; // 4041 -// BOOL fAnyButtonDown; // 4088 -// HasWeapons(CBasePlayer *const this); // 4056 -// StopAnimation(CBaseMonster *const this); // 4084 -// Length(const Vector *const this); // 4049 -// Normalize(const Vector *const this); // 4053 -// operator*(float fl, -// const Vector &v); // 4053 -// } + if (m_iJoiningState != JOINED) + return; + + if (pev->flags & FL_ONGROUND) + { + float flForward = pev->velocity.Length() - 20; + + if (flForward <= 0) + pev->velocity = g_vecZero; + else + pev->velocity = flForward * pev->velocity.Normalize(); + } + + if (HasWeapons()) + { + // we drop the guns here because weapons that have an area effect and can kill their user + // will sometimes crash coming back from CBasePlayer::Killed() if they kill their owner because the + // player class sometimes is freed. It's safer to manipulate the weapons once we know + // we aren't calling into any of their code anymore through the player pointer. + PackDeadPlayerItems(); + } + + if (pev->modelindex && !m_fSequenceFinished && pev->deadflag == DEAD_DYING) + { + StudioFrameAdvance(); + return; + } + + // once we're done animating our death and we're on the ground, we want to set movetype to None so our dead body won't do collisions and stuff anymore + // this prevents a bug where the dead body would go to a player's head if he walked over it while the dead player was clicking their button to respawn + if (pev->movetype != MOVETYPE_NONE && (pev->flags & FL_ONGROUND)) + pev->movetype = MOVETYPE_NONE; + + if (pev->deadflag == DEAD_DYING) + { + m_fDeadTime = gpGlobals->time; + pev->deadflag = DEAD_DEAD; + } + + StopAnimation(); + pev->effects |= EF_NOINTERP; + + BOOL fAnyButtonDown = (pev->button & ~IN_SCORE); + + // if the player has been dead for one second longer than allowed by forcerespawn, + // forcerespawn isn't on. Send the player off to an intermission camera until they + // choose to respawn. + if (g_pGameRules->IsMultiplayer()) + { + if (gpGlobals->time > m_fDeadTime + 3.0 && !(m_afPhysicsFlags & PFLAG_OBSERVER)) + { + SpawnClientSideCorpse(); + StartDeathCam(); // go to dead camera. + } + } + + // wait for all buttons released + if (pev->deadflag == DEAD_DEAD && m_iTeam != UNASSIGNED && m_iTeam != SPECTATOR) + { + if (fAnyButtonDown) + return; + + if (g_pGameRules->FPlayerCanRespawn(this)) + { + pev->deadflag = DEAD_RESPAWNABLE; + + if (g_pGameRules->IsMultiplayer()) + g_pGameRules->CheckWinConditions(); + } + + pev->nextthink = gpGlobals->time + 0.1; + } + else if (pev->deadflag == DEAD_RESPAWNABLE) + { + respawn(pev, FALSE); + pev->button = 0; + pev->nextthink = -1; + } } /* <153042> ../cstrike/dlls/player.cpp:4134 */ @@ -2953,34 +3754,25 @@ void CBasePlayer::RoundRespawn_(void) } /* <155577> ../cstrike/dlls/player.cpp:4172 */ -NOXREF void CBasePlayer::StartDeathCam(void) +void CBasePlayer::StartDeathCam(void) { if (pev->view_ofs == g_vecZero) + { + // don't accept subsequent attempts to StartDeathCam() return; + } StartObserver(pev->origin, pev->angles); if (TheBots) + { TheBots->OnEvent(EVENT_DEATH_CAMERA_START, this); + } } /* <155616> ../cstrike/dlls/player.cpp:4190 */ -NOBODY void CBasePlayer::StartObserver(Vector vecPosition, Vector vecViewAngle) -{ -// { -// int iFirstTime; // 4194 -// class CHalfLifeMultiplay *mp; // 4246 -// entindex(CBaseEntity *const this); // 4199 - -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 4262 -// edict(CBaseEntity *const this); // 4263 -// ENTINDEX(edict_t *pEdict); // 4263 -// edict(CBaseEntity *const this); // 4250 -// } - +void CBasePlayer::StartObserver(Vector vecPosition, Vector vecViewAngle) +{ // clear any clientside entities attached to this player MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); WRITE_BYTE(TE_KILLPLAYERATTACHMENTS); @@ -3132,7 +3924,7 @@ void CBasePlayer::PlayerUse(void) m_afPhysicsFlags |= PFLAG_ONTRAIN; m_iTrain = TrainSpeed(pTrain->pev->speed, pTrain->pev->impulse); - m_iTrain |= (TRAIN_NEW | TRAIN_OFF); + m_iTrain |= TRAIN_NEW; if (pTrain->Classify() == CLASS_VEHICLE) { @@ -3255,39 +4047,91 @@ void CBasePlayer::PlayerUse(void) } /* <155f41> ../cstrike/dlls/player.cpp:4486 */ -NOBODY void CBasePlayer::HostageUsed(void) +void CBasePlayer::HostageUsed(void) { -// HintMessage(CBasePlayer::HostageUsed(// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 4493 -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 4497 + if (m_flDisplayHistory & DHF_HOSTAGE_USED) + return; + + if (m_iTeam == TERRORIST) + HintMessage("#Hint_use_hostage_to_stop_him"); + + else if (m_iTeam == CT) + HintMessage("#Hint_lead_hostage_to_rescue_point"); + + m_flDisplayHistory |= DHF_HOSTAGE_USED; } /* <153f69> ../cstrike/dlls/player.cpp:4507 */ -NOBODY void CBasePlayer::Jump_(void) +void CBasePlayer::Jump_(void) { -// { -// Vector vecWallCheckDir; // 4509 -// Vector vecAdjustedVelocity; // 4510 -// Vector vecSpot; // 4511 -// TraceResult tr; // 4512 -// entvars_t *pevGround; // 4549 -// } -// Jump(CBasePlayer *const this); // 4507 + if (pev->flags & FL_WATERJUMP) + return; + + if (pev->waterlevel >= 2) + { + return; + } + + // jump velocity is sqrt( height * gravity * 2) + // If this isn't the first frame pressing the jump button, break out. + if (!(m_afButtonPressed & IN_JUMP)) + { + // don't pogo stick + return; + } + + if (!(pev->flags & FL_ONGROUND) || pev->groundentity == NULL) + return; + + // many features in this function use v_forward, so makevectors now. + UTIL_MakeVectors(pev->angles); + SetAnimation(PLAYER_JUMP); + + if ((pev->flags & FL_DUCKING) || (m_afPhysicsFlags & PFLAG_DUCKING)) + { + if (m_fLongJump && (pev->button & IN_DUCK) && (gpGlobals->time - m_flDuckTime < 1.0f) && pev->velocity.Length() > 50) + { + SetAnimation(PLAYER_SUPERJUMP); + } + } + + // If you're standing on a conveyor, add it's velocity to yours (for momentum) + entvars_t *pevGround = VARS(pev->groundentity); + if (pevGround) + { + if (pevGround->flags & FL_CONVEYOR) + { + pev->velocity = pev->velocity + pev->basevelocity; + } + + if (FClassnameIs(pevGround, "func_tracktrain") + || FClassnameIs(pevGround, "func_train") + || FClassnameIs(pevGround, "func_vehicle")) + { + pev->velocity = pevGround->velocity + pev->velocity; + } + } } +// This is a glorious hack to find free space when you've crouched into some solid space +// Our crouching collisions do not work correctly for some reason and this is easier +// than fixing the problem :( + /* <155fe2> ../cstrike/dlls/player.cpp:4565 */ -NOBODY void FixPlayerCrouchStuck(edict_t *pPlayer) +NOXREF void FixPlayerCrouchStuck(edict_t *pPlayer) { -// { -// TraceResult trace; // 4567 -// { -// int i; // 4570 -// } -// } + TraceResult trace; + + // Move up as many as 18 pixels if the player is stuck. + for (int i = 0; i < 18; i++) + { + UTIL_TraceHull(pPlayer->v.origin, pPlayer->v.origin, dont_ignore_monsters, head_hull, pPlayer, &trace); + + if (trace.fStartSolid) + pPlayer->v.origin.z ++; + else + break; + } } /* <153ef5> ../cstrike/dlls/player.cpp:4580 */ @@ -3319,7 +4163,7 @@ void CBasePlayer::AddPoints_(int score, BOOL bAllowNegativeScore) MESSAGE_BEGIN(MSG_BROADCAST, gmsgScoreInfo); WRITE_BYTE(ENTINDEX(edict())); - WRITE_SHORT(pev->frags); + WRITE_SHORT((short)pev->frags); WRITE_SHORT(m_iDeaths); WRITE_SHORT(0); WRITE_SHORT(m_iTeam); @@ -3327,61 +4171,420 @@ void CBasePlayer::AddPoints_(int score, BOOL bAllowNegativeScore) } /* <15125b> ../cstrike/dlls/player.cpp:4626 */ -NOBODY void CBasePlayer::AddPointsToTeam_(int score, BOOL bAllowNegativeScore) +void CBasePlayer::AddPointsToTeam_(int score, BOOL bAllowNegativeScore) { -// { -// int index; // 4628 -// entindex(CBaseEntity *const this); // 4628 -// { -// int i; // 4630 -// { -// class CBaseEntity *pPlayer; // 4632 -// } -// } -// } + int index = entindex(); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pPlayer && i != index) + { + if (g_pGameRules->PlayerRelationship(this, pPlayer) == GR_TEAMMATE) + pPlayer->AddPoints(score, bAllowNegativeScore); + } + } } /* <156047> ../cstrike/dlls/player.cpp:4645 */ -NOBODY bool CBasePlayer::CanPlayerBuy(bool display) +bool CBasePlayer::CanPlayerBuy(bool display) { -// { -// bool result; // 4647 -// class CHalfLifeMultiplay *mp; // 4666 -// int buyTime; // 4668 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + int buyTime; + + if (!mp->IsMultiplayer()) + { + return CHalfLifeTraining::PlayerCanBuy(this); + } + + if (pev->deadflag != DEAD_NO || !(m_signals.GetState() & SIGNAL_BUY)) + { + return false; + } + + buyTime = (int)(CVAR_GET_FLOAT("mp_buytime") * 60); + if (buyTime < 15) + { + buyTime = 15; + CVAR_SET_FLOAT("mp_buytime", 1 / (60 / 15)); + } + + if (gpGlobals->time - mp->m_fRoundCount > buyTime) + { + if (display) + { + ClientPrint(pev, HUD_PRINTCENTER, "#Cant_buy", UTIL_dtos1(buyTime)); + } + return false; + } + if (m_bIsVIP) + { + if (display) + { + ClientPrint(pev, HUD_PRINTCENTER, "#VIP_cant_buy"); + } + return false; + } + if (mp->m_bCTCantBuy && m_iTeam == CT) + { + if (display) + { + ClientPrint(pev, HUD_PRINTCENTER, "#CT_cant_buy"); + } + return false; + } + if (mp->m_bTCantBuy && m_iTeam == TERRORIST) + { + if (display) + { + ClientPrint(pev, HUD_PRINTCENTER, "#Terrorist_cant_buy"); + } + return false; + } + + return true; } /* <15f9ac> ../cstrike/dlls/player.cpp:4717 */ -NOBODY void CBasePlayer::PreThink_(void) -{ -// { -// int buttonsChanged; // 4719 -// class CBaseEntity *pGroundEntity; // 4831 -// { -// class CBaseEntity *pTrain; // 4845 -// float vel; // 4846 -// { -// TraceResult trainTrace; // 4850 -// } -// } -// } +void CBasePlayer::PreThink_(void) +{ + int buttonsChanged = (pev->button ^ m_afButtonLast); + + if (pev->button != m_afButtonLast) + m_fLastMovement = gpGlobals->time; + + m_afButtonPressed = (buttonsChanged & pev->button); // The changed ones still down are "pressed" + m_afButtonReleased = (buttonsChanged & (~pev->button)); // The ones not down are "released" + + m_hintMessageQueue.Update(this); + g_pGameRules->PlayerThink(this); + + if (g_fGameOver) + { + return; + } + + if (m_iJoiningState != JOINED) + { + JoiningThink(); + } + + if (m_bMissionBriefing) + { + if (m_afButtonPressed & (IN_ATTACK | IN_ATTACK2)) + { + m_afButtonPressed &= ~(IN_ATTACK | IN_ATTACK2); + RemoveLevelText(); + m_bMissionBriefing = false; + } + } + + UTIL_MakeVectors(pev->v_angle); + ItemPreFrame(); + WaterMove(); + + if (pev->flags & FL_ONGROUND) + { + if (m_flVelocityModifier < 1.0f) + { + float_precision modvel = m_flVelocityModifier + 0.01; + + m_flVelocityModifier = modvel; + pev->velocity = pev->velocity * modvel; + } + + if (m_flVelocityModifier > 1.0f) + m_flVelocityModifier = 1; + } + + if (m_flIdleCheckTime <= (double)gpGlobals->time || m_flIdleCheckTime == 0.0f) + { + m_flIdleCheckTime = gpGlobals->time + 5.0; + + double v25 = gpGlobals->time - m_fLastMovement; + + if (v25 > g_pGameRules->m_fMaxIdlePeriod) + { + if (!IsBot() && CVAR_GET_FLOAT("mp_autokick") != 0.0f) + { + UTIL_LogPrintf("\"%s<%i><%s><%s>\" triggered \"Game_idle_kick\" (auto)\n", + STRING(pev->netname), + GETPLAYERUSERID(edict()), + GETPLAYERAUTHID(edict()), + GetTeam(m_iTeam)); + + UTIL_ClientPrintAll(HUD_PRINTCONSOLE, "#Game_idle_kick", STRING(pev->netname)); + SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", STRING(pev->netname))); + m_fLastMovement = gpGlobals->time; + } + } + } + + if (g_pGameRules && g_pGameRules->FAllowFlashlight()) + m_iHideHUD &= ~HIDEHUD_FLASHLIGHT; + else + m_iHideHUD |= HIDEHUD_FLASHLIGHT; + + // JOHN: checks if new client data (for HUD and view control) needs to be sent to the client + UpdateClientData(); + CheckTimeBasedDamage(); + CheckSuitUpdate(); + + // So the correct flags get sent to client asap. + if (m_afPhysicsFlags & PFLAG_ONTRAIN) + pev->flags |= FL_ONTRAIN; + else + pev->flags &= ~FL_ONTRAIN; + + // Observer Button Handling + if (IsObserver() && (m_afPhysicsFlags & PFLAG_OBSERVER)) + { + Observer_HandleButtons(); + Observer_CheckTarget(); + Observer_CheckProperties(); + return; + } + + if (pev->deadflag >= DEAD_DYING && pev->deadflag != DEAD_RESPAWNABLE) + { + PlayerDeathThink(); + return; + } + + CBaseEntity *pGroundEntity = Instance(pev->groundentity); + + if (pGroundEntity && pGroundEntity->Classify() == CLASS_VEHICLE) + pev->iuser4 = 1; + else + pev->iuser4 = 0; + + // Train speed control + if (m_afPhysicsFlags & PFLAG_ONTRAIN) + { + CBaseEntity *pTrain = Instance(pev->groundentity); + float vel; + + if (!pTrain) + { + TraceResult trainTrace; + // Maybe this is on the other side of a level transition + UTIL_TraceLine(pev->origin, pev->origin + Vector(0, 0, -38), ignore_monsters, ENT(pev), &trainTrace); + + // HACKHACK - Just look for the func_tracktrain classname + if (trainTrace.flFraction != 1.0f && trainTrace.pHit) + pTrain = Instance(trainTrace.pHit); + + if (!pTrain || !(pTrain->ObjectCaps() & FCAP_DIRECTIONAL_USE) || !pTrain->OnControls(pev)) + { + m_iTrain = (TRAIN_NEW | TRAIN_OFF); + m_afPhysicsFlags &= ~PFLAG_ONTRAIN; + + ((CFuncVehicle *)pTrain)->m_pDriver = NULL; + return; + } + } + else if (!(pev->flags & FL_ONGROUND) || (pTrain->pev->spawnflags & SF_TRACKTRAIN_NOCONTROL)) + { + // Turn off the train if you jump, strafe, or the train controls go dead + m_iTrain = (TRAIN_NEW | TRAIN_OFF); + m_afPhysicsFlags &= ~PFLAG_ONTRAIN; + + ((CFuncVehicle *)pTrain)->m_pDriver = NULL; + return; + } + + pev->velocity = g_vecZero; + vel = 0; + + if (pTrain->Classify() == CLASS_VEHICLE) + { + if (pev->button & IN_FORWARD) + { + vel = 1; + pTrain->Use(this, this, USE_SET, vel); + } + + if (pev->button & IN_BACK) + { + vel = -1; + pTrain->Use(this, this, USE_SET, vel); + } + + if (pev->button & IN_MOVELEFT) + { + vel = 20; + pTrain->Use(this, this, USE_SET, vel); + } + if (pev->button & IN_MOVERIGHT) + { + vel = 30; + pTrain->Use(this, this, USE_SET, vel); + } + } + else + { + if (m_afButtonPressed & IN_FORWARD) + { + vel = 1; + pTrain->Use(this, this, USE_SET, vel); + } + else if (m_afButtonPressed & IN_BACK) + { + vel = -1; + pTrain->Use(this, this, USE_SET, vel); + } + } + + if (vel) + { + m_iTrain = TrainSpeed(pTrain->pev->speed, pTrain->pev->impulse); + m_iTrain |= (TRAIN_ACTIVE | TRAIN_NEW); + } + } + else if (m_iTrain & TRAIN_ACTIVE) + { + // turn off train + m_iTrain = TRAIN_NEW; + } + + if (pev->button & IN_JUMP) + { + // If on a ladder, jump off the ladder + // else Jump + Jump(); + } + + // If trying to duck, already ducked, or in the process of ducking + if ((pev->button & IN_DUCK) || (pev->flags & FL_DUCKING) || (m_afPhysicsFlags & PFLAG_DUCKING)) + { + Duck(); + } + + if (!(pev->flags & FL_ONGROUND)) + { + m_flFallVelocity = -pev->velocity.z; + } + + // Clear out ladder pointer + m_hEnemy = NULL; + + if (m_afPhysicsFlags & PFLAG_ONBARNACLE) + { + pev->velocity = g_vecZero; + } + + if (!(m_flDisplayHistory & DHF_ROUND_STARTED) && CanPlayerBuy()) + { + HintMessage("#Hint_press_buy_to_purchase"); + m_flDisplayHistory |= DHF_ROUND_STARTED; + } + + UpdateLocation(); } +// If player is taking time based damage, continue doing damage to player - +// this simulates the effect of being poisoned, gassed, dosed with radiation etc - +// anything that continues to do damage even after the initial contact stops. +// Update all time based damage counters, and shut off any that are done. + +// The m_bitsDamageType bit MUST be set if any damage is to be taken. +// This routine will detect the initial on value of the m_bitsDamageType +// and init the appropriate counter. Only processes damage every second. + /* <156096> ../cstrike/dlls/player.cpp:5146 */ -NOBODY void CBasePlayer::CheckTimeBasedDamage(void) +void CBasePlayer::CheckTimeBasedDamage(void) { -// { -// int i; // 5148 -// BYTE bDuration; // 5149 -// float gtbdPrev; // 5151 -// { -// int idif; // 5190 -// } -// } + int i; + BYTE bDuration = 0; + //static float gtbdPrev = 0.0; + + if (!(m_bitsDamageType & DMG_TIMEBASED)) + return; + + if (abs((int64_t)(gpGlobals->time - m_tbdPrev)) < 2.0f) + return; + + m_tbdPrev = gpGlobals->time; + + for (i = 0; i < CDMG_TIMEBASED; i++) + { + if (m_bitsDamageType & (DMG_PARALYZE << i)) + { + switch (i) + { + case itbd_Paralyze: + // UNDONE - flag movement as half-speed + bDuration = PARALYZE_DURATION; + break; + case itbd_NerveGas: + bDuration = NERVEGAS_DURATION; + break; + case itbd_Poison: + { + TakeDamage(pev, pev, POISON_DAMAGE, DMG_GENERIC); + bDuration = POISON_DURATION; + break; + } + case itbd_DrownRecover: + { + if (m_idrowndmg > m_idrownrestored) + { + int idif = min(m_idrowndmg - m_idrownrestored, 10); + TakeHealth(idif, DMG_GENERIC); + m_idrownrestored += idif; + } + + bDuration = 4; + break; + } + case itbd_Radiation: + bDuration = RADIATION_DURATION; + break; + case itbd_Acid: + bDuration = ACID_DURATION; + break; + case itbd_SlowBurn: + bDuration = SLOWBURN_DURATION; + break; + case itbd_SlowFreeze: + bDuration = SLOWFREEZE_DURATION; + break; + default: + bDuration = 0; + break; + } + + if (m_rgbTimeBasedDamage[i]) + { + // use up an antitoxin on poison or nervegas after a few seconds of damage + if ((i == itbd_NerveGas && m_rgbTimeBasedDamage[i] < NERVEGAS_DURATION) || (i == itbd_Poison && m_rgbTimeBasedDamage[i] < POISON_DURATION)) + { + if (m_rgItems[ ITEM_ANTIDOTE ]) + { + m_rgbTimeBasedDamage[i] = 0; + m_rgItems[ ITEM_ANTIDOTE ]--; + SetSuitUpdate("!HEV_HEAL4", FALSE, SUIT_REPEAT_OK); + } + } + + // decrement damage duration, detect when done. + if (!m_rgbTimeBasedDamage[i] || --m_rgbTimeBasedDamage[i] == 0) + { + m_rgbTimeBasedDamage[i] = 0; + // if we're done, clear damage bits + m_bitsDamageType &= ~(DMG_PARALYZE << i); + } + } + else + // first time taking this damage type - init damage duration + m_rgbTimeBasedDamage[i] = bDuration; + } + } } /* <156112> ../cstrike/dlls/player.cpp:5312 */ -NOXREF void CBasePlayer::UpdateGeigerCounter(void) +void CBasePlayer::UpdateGeigerCounter(void) { if (gpGlobals->time < m_flgeigerDelay) return; @@ -3410,7 +4613,7 @@ void CBasePlayer::CheckSuitUpdate(void) int isearch = m_iSuitPlayNext; // Ignore suit updates if no suit - if (!(pev->weapons & (1<weapons & (1 << WEAPON_SUIT))) return; // if in range of radiation source, ping geiger counter @@ -3467,7 +4670,7 @@ void CBasePlayer::SetSuitUpdate(char *name, int fgroup, int iNoRepeatTime) } /* <15623f> ../cstrike/dlls/player.cpp:5519 */ -NOXREF void CBasePlayer::CheckPowerups(entvars_t *pev) +void CBasePlayer::CheckPowerups(entvars_t *pev) { if (pev->health > 0.0f) pev->modelindex = m_modelIndexPlayer; @@ -3480,50 +4683,246 @@ void CBasePlayer::SetNewPlayerModel(const char *modelName) m_modelIndexPlayer = pev->modelindex; } +// UpdatePlayerSound - updates the position of the player's +// reserved sound slot in the sound list. + /* <1562a4> ../cstrike/dlls/player.cpp:5543 */ -NOBODY void CBasePlayer::UpdatePlayerSound(void) +void CBasePlayer::UpdatePlayerSound(void) { -// { -// int iBodyVolume; // 5545 -// int iVolume; // 5546 -// class CSound *pSound; // 5547 -// edict(CBaseEntity *const this); // 5549 -// Length(const Vector *const this); // 5564 -// } + int iBodyVolume; + int iVolume; + CSound *pSound; + + pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict())); + + if (!pSound) + { + ALERT(at_console, "Client lost reserved sound!\n"); + return; + } + + pSound->m_iType = bits_SOUND_NONE; + + // now calculate the best target volume for the sound. If the player's weapon + // is louder than his body/movement, use the weapon volume, else, use the body volume. + + if (pev->flags & FL_ONGROUND) + { + iBodyVolume = pev->velocity.Length(); + + // clamp the noise that can be made by the body, in case a push trigger, + // weapon recoil, or anything shoves the player abnormally fast. + if (iBodyVolume> 512) + { + iBodyVolume = 512; + } + } + else + { + iBodyVolume = 0; + } + + if (pev->button & IN_JUMP) + { + iBodyVolume += 100; + } + + // convert player move speed and actions into sound audible by monsters. + if (m_iWeaponVolume > iBodyVolume) + { + m_iTargetVolume = m_iWeaponVolume; + + // OR in the bits for COMBAT sound if the weapon is being louder than the player. + pSound->m_iType |= bits_SOUND_COMBAT; + } + else + { + m_iTargetVolume = iBodyVolume; + } + + // decay weapon volume over time so bits_SOUND_COMBAT stays set for a while + m_iWeaponVolume -= 250 * gpGlobals->frametime; + + // if target volume is greater than the player sound's current volume, we paste the new volume in + // immediately. If target is less than the current volume, current volume is not set immediately to the + // lower volume, rather works itself towards target volume over time. This gives monsters a much better chance + // to hear a sound, especially if they don't listen every frame. + iVolume = pSound->m_iVolume; + + if (m_iTargetVolume > iVolume) + { + iVolume = m_iTargetVolume; + } + else if (iVolume > m_iTargetVolume) + { + iVolume -= 250 * gpGlobals->frametime; + + if (iVolume < m_iTargetVolume) + iVolume = 0; + } + + if (m_fNoPlayerSound) + { + // debugging flag, lets players move around and shoot without monsters hearing. + iVolume = 0; + } + + if (gpGlobals->time > m_flStopExtraSoundTime) + { + // since the extra sound that a weapon emits only lasts for one client frame, we keep that sound around for a server frame or two + // after actual emission to make sure it gets heard. + m_iExtraSoundTypes = 0; + } + + if (pSound) + { + pSound->m_vecOrigin = pev->origin; + pSound->m_iVolume = iVolume; + pSound->m_iType |= (bits_SOUND_PLAYER | m_iExtraSoundTypes); + } + + // keep track of virtual muzzle flash + m_iWeaponFlash -= 256 * gpGlobals->frametime; + + if (m_iWeaponFlash < 0) + m_iWeaponFlash = 0; + + UTIL_MakeVectors(pev->angles); + gpGlobals->v_forward.z = 0; } /* <15a182> ../cstrike/dlls/player.cpp:5667 */ -NOBODY void CBasePlayer::PostThink_(void) -{ -// -//pt_end: // 5767 -// { -// float flFallDamage; // 5712 -// VARS(EOFFSET eoffset); // 5723 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 5717 -// VARS(EOFFSET eoffset); // 5723 -// } -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 5733 -// { -// int i; // 5771 -// { -// class CBasePlayerItem *pPlayerItem; // 5775 -// { -// class CBasePlayerWeapon *gun; // 5779 -// } -// } -// } -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 5752 -// CheckPowerups(CBasePlayer *const this, -// entvars_t *pev); // 5761 -// SetAnimation(CBasePlayer *const this, -// PLAYER_ANIM playerAnim); // 5757 +void CBasePlayer::PostThink_(void) +{ + // intermission or finale + if (g_fGameOver) + goto pt_end; + + if (!IsAlive()) + goto pt_end; + + // Handle Tank controlling + if (m_pTank != NULL) + { + // if they've moved too far from the gun, or selected a weapon, unuse the gun + if (m_pTank->OnControls(pev) && !pev->weaponmodel) + { + // try fire the gun + m_pTank->Use(this, this, USE_SET, 2); + } + else + { + // they've moved off the platform + m_pTank->Use(this, this, USE_OFF, 0); + m_pTank = NULL; + } + } + + // do weapon stuff + ItemPostFrame(); + + // check to see if player landed hard enough to make a sound + // falling farther than half of the maximum safe distance, but not as far a max safe distance will + // play a bootscrape sound, and no damage will be inflicted. Fallling a distance shorter than half + // of maximum safe distance will make no sound. Falling farther than max safe distance will play a + // fallpain sound, and damage will be inflicted based on how far the player fell + if ((pev->flags & FL_ONGROUND) && pev->health > 0.0f && m_flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD) + { + if (pev->watertype != CONTENT_WATER) + { + // after this point, we start doing damage + if (m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED) + { + float flFallDamage = g_pGameRules->FlPlayerFallDamage(this); + + //splat + if (flFallDamage > pev->health) + { + // note: play on item channel because we play footstep landing on body channel + EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/bodysplat.wav", VOL_NORM, ATTN_NORM); + } + if (flFallDamage > 0) + { + m_LastHitGroup = HITGROUP_GENERIC; + TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), flFallDamage, DMG_FALL); + pev->punchangle.x = 0; + TheBots->OnEvent(EVENT_PLAYER_LANDED_FROM_HEIGHT, this); + } + } + } + + if (IsAlive()) + { + SetAnimation(PLAYER_WALK); + } + } + + if (pev->flags & FL_ONGROUND) + { + if (m_flFallVelocity > 64.0f && !g_pGameRules->IsMultiplayer()) + { + CSoundEnt::InsertSound(bits_SOUND_PLAYER, pev->origin, m_flFallVelocity, 0.2); + } + m_flFallVelocity = 0; + } + + // select the proper animation for the player character + if (IsAlive()) + { + if (pev->velocity.x || pev->velocity.y) + { + if (((pev->velocity.x || pev->velocity.y) && (pev->flags & FL_ONGROUND)) || pev->waterlevel > 1) + SetAnimation(PLAYER_WALK); + } + else if (pev->gaitsequence != ACT_FLY) + SetAnimation(PLAYER_IDLE); + } + + StudioFrameAdvance(); + CheckPowerups(pev); + UpdatePlayerSound(); + +pt_end: +#ifdef CLIENT_WEAPONS + // Decay timers on weapons + // go through all of the weapons and make a list of the ones to pack + for (int i = 0; i < MAX_ITEM_TYPES; i++) + { + if (m_rgpPlayerItems[i]) + { + CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[i]; + + while (pPlayerItem != NULL) + { + CBasePlayerWeapon *gun = (CBasePlayerWeapon *)pPlayerItem->GetWeaponPtr(); + + if (gun && gun->UseDecrement()) + { + gun->m_flNextPrimaryAttack = max(gun->m_flNextPrimaryAttack - gpGlobals->frametime, -1.0); + gun->m_flNextSecondaryAttack = max(gun->m_flNextSecondaryAttack - gpGlobals->frametime, -0.001); + + if (gun->m_flTimeWeaponIdle != 1000.0f) + { + gun->m_flTimeWeaponIdle = max(gun->m_flTimeWeaponIdle - gpGlobals->frametime, -0.001); + } + } + + pPlayerItem = pPlayerItem->m_pNext; + } + } + } + + m_flNextAttack -= gpGlobals->frametime; + + if (m_flNextAttack < -0.001) + m_flNextAttack = -0.001; +#endif // CLIENT_WEAPONS + + // Track button info so we can detect 'pressed' and 'released' buttons next frame + m_afButtonLast = pev->button; + m_iGaitsequence = pev->gaitsequence; + + StudioProcessGait(); } /* <14e39d> ../cstrike/dlls/player.cpp:5837 */ @@ -3747,86 +5146,349 @@ void SetScoreAttrib(CBasePlayer *dest, CBasePlayer *src) } /* <15fdba> ../cstrike/dlls/player.cpp:6264 */ -NOBODY void CBasePlayer::Spawn_(void) +void CBasePlayer::Spawn_(void) { -// { -// int i; // 6394 -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 6275 -// ResetStamina(CBasePlayer *const this); // 6308 -// edict(CBaseEntity *const this); // 6314 -// edict(CBaseEntity *const this); // 6315 -// edict(CBaseEntity *const this); // 6340 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 6461 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 6461 -// { -// int i; // 6497 -// } -// SendItemStatus(CBasePlayer *pPlayer); // 6502 -// { -// int i; // 6507 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 6512 -// { -// class CBasePlayer *pObserver; // 6520 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 6523 -// } -// HintMessage(CBasePlayer *const this, -// const char *pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); // 6547 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 6553 -// entindex(CBaseEntity *const this); // 6554 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 6568 -// edict(CBaseEntity *const this); // 6569 -// ENTINDEX(edict_t *pEdict); // 6569 -// { -// char *infobuffer; // 6580 -// edict(CBaseEntity *const this); // 6580 -// FStrEq(const char *sz1, -// const char *sz2); // 6582 -// entindex(CBaseEntity *const this); // 6584 -// } -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 6591 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 6463 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 6463 -// RemoveLevelText(CBasePlayer *const this); // 6439 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 6374 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 6365 -// } + int i; + + m_iGaitsequence = 0; + + m_flGaitframe = 0; + m_flGaityaw = 0; + m_flGaitMovement = 0; + m_prevgaitorigin = Vector(0, 0, 0); + m_progressStart = 0; + m_progressEnd = 0; + + if (pev->classname) + { + RemoveEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + } + + MAKE_STRING_CLASS("player", pev); + AddEntityHashValue(pev, STRING(pev->classname), CLASSNAME); + + pev->health = 100; + + if (!m_bNotKilled) + { + pev->armorvalue = 0; + m_iKevlar = ARMOR_TYPE_EMPTY; + } + + pev->maxspeed = 1000; + pev->takedamage = DAMAGE_AIM; + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_WALK; + pev->max_health = pev->health; + + pev->flags &= FL_PROXY; + pev->flags |= FL_CLIENT; + pev->air_finished = gpGlobals->time + 12; + pev->dmg = 2; + pev->effects = 0; + pev->deadflag = DEAD_NO; + pev->dmg_take = 0; + pev->dmg_save = 0; + + m_bitsHUDDamage = -1; + m_bitsDamageType = 0; + m_afPhysicsFlags = 0; + m_fLongJump = FALSE; + m_iClientFOV = 0; + m_pentCurBombTarget = NULL; + + if (m_bOwnsShield) + pev->gamestate = 0; + else + pev->gamestate = 1; + + ResetStamina(); + pev->friction = 1; + pev->gravity = 1; + + SET_PHYSICS_KEY_VALUE(edict(), "slj", "0"); + SET_PHYSICS_KEY_VALUE(edict(), "hl", "1"); + m_hintMessageQueue.Reset(); + + m_flVelocityModifier = 1; + m_iLastZoom = DEFAULT_FOV; + m_flLastTalk = 0; + m_flIdleCheckTime = 0; + m_flRadioTime = 0; + m_iRadioMessages = 60; + m_bHasC4 = false; + m_bKilledByBomb = false; + m_bKilledByGrenade = false; + m_flDisplayHistory &= ~DHM_ROUND_CLEAR; + m_tmHandleSignals = 0; + m_fCamSwitch = 0; + m_iChaseTarget = 1; + m_bEscaped = false; + m_tmNextRadarUpdate = gpGlobals->time; + m_vLastOrigin = Vector(0, 0, 0); + m_iCurrentKickVote = 0; + m_flNextVoteTime = 0; + m_bJustKilledTeammate = false; + + SET_VIEW(ENT(pev), ENT(pev)); + + m_hObserverTarget = NULL; + pev->iuser1 = 0; + pev->iuser2 = 0; + pev->iuser3 = 0; + + m_flLastFired = -15; + m_bHeadshotKilled = false; + m_bReceivesNoMoneyNextRound = false; + m_bShieldDrawn = false; + + m_blindUntilTime = 0; + m_blindStartTime = 0; + m_blindHoldTime = 0; + m_blindFadeTime = 0; + m_blindAlpha = 0; + + m_canSwitchObserverModes = true; + m_lastLocation[0] = '\0'; + + m_bitsDamageType &= ~(DMG_DROWN | DMG_DROWNRECOVER); + m_rgbTimeBasedDamage[ itbd_DrownRecover ] = 0; + m_idrowndmg = 0; + m_idrownrestored = 0; + + if (m_iObserverC4State) + { + m_iObserverC4State = 0; + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("c4"); + MESSAGE_END(); + } + + if (m_bObserverHasDefuser) + { + m_bObserverHasDefuser = false; + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("defuser"); + MESSAGE_END(); + } + + MESSAGE_BEGIN(MSG_ONE, SVC_ROOMTYPE, NULL, pev); + WRITE_SHORT((short)CVAR_GET_FLOAT("room_type")); + MESSAGE_END(); + + if (g_pGameRules->IsFreezePeriod()) + m_bCanShoot = false; + else + m_bCanShoot = true; + + m_iNumSpawns++; + InitStatusBar(); + + for (i = 0; i < MAX_RECENT_PATH; i++) + m_vRecentPath[ i ] = Vector(0, 0, 0); + + if (m_pActiveItem != NULL && !pev->viewmodel) + { + switch (m_pActiveItem->m_iId) + { + case WEAPON_AWP: + pev->viewmodel = MAKE_STRING("models/v_awp.mdl"); + break; + case WEAPON_G3SG1: + pev->viewmodel = MAKE_STRING("models/v_g3sg1.mdl"); + break; + case WEAPON_SCOUT: + pev->viewmodel = MAKE_STRING("models/v_scout.mdl"); + break; + case WEAPON_SG550: + pev->viewmodel = MAKE_STRING("models/v_sg550.mdl"); + break; + } + } + + m_iFOV = DEFAULT_FOV; + m_flNextDecalTime = 0; + m_flTimeStepSound = 0; + m_iStepLeft = 0; + m_flFieldOfView = 0.5; + m_bloodColor = BLOOD_COLOR_RED; + m_flNextAttack = 0; + m_flgeigerDelay = gpGlobals->time + 2; + + StartSneaking(); + + m_iFlashBattery = 99; + m_flFlashLightTime = 1; + + if (m_bHasDefuser) + pev->body = 1; + else + pev->body = 0; + + if (m_bMissionBriefing) + { + RemoveLevelText(); + m_bMissionBriefing = false; + } + + m_flFallVelocity = 0; + + if (!g_skipCareerInitialSpawn) + { + g_pGameRules->GetPlayerSpawnSpot(this); + } + + if (!pev->modelindex) + { + SET_MODEL(ENT(pev), "models/player.mdl"); + m_modelIndexPlayer = pev->modelindex; + } + + pev->sequence = LookupActivity(ACT_IDLE); + + if (pev->flags & FL_DUCKING) + UTIL_SetSize(pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX); + else + UTIL_SetSize(pev, VEC_HULL_MIN, VEC_HULL_MAX); + + pev->view_ofs = VEC_VIEW; + Precache(); + + m_HackedGunPos = Vector(0, 32, 0); + + if (m_iPlayerSound == SOUNDLIST_EMPTY) + { + ALERT(at_console, "Couldn't alloc player sound slot!\n"); + } + + m_iHideHUD &= ~(HIDEHUD_WEAPONS | HIDEHUD_HEALTH | HIDEHUD_TIMER | HIDEHUD_MONEY); + m_fNoPlayerSound = FALSE; + m_pLastItem = NULL; + m_fWeapon = FALSE; + m_pClientActiveItem = NULL; + m_iClientBattery = -1; + m_fInitHUD = TRUE; + + if (!m_bNotKilled) + { + m_iClientHideHUD = -1; + + for (i = 0; i < MAX_AMMO_SLOTS; i++) + m_rgAmmo[i] = 0; + + m_bHasPrimary = false; + m_bHasNightVision = false; + + SendItemStatus(this); + } + else + { + for (i = 0; i < MAX_AMMO_SLOTS; i++) + m_rgAmmoLast[i] = -1; + } + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pev); + WRITE_BYTE(0); + MESSAGE_END(); + + m_bNightVisionOn = false; + + for (i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pObserver = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pObserver && pObserver->IsObservingPlayer(this)) + { + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pObserver->pev); + WRITE_BYTE(0); + MESSAGE_END(); + + pObserver->m_bNightVisionOn = false; + } + } + + m_lastx = 0; + m_lasty = 0; + + g_pGameRules->PlayerSpawn(this); + + m_bNotKilled = true; + m_bIsDefusing = false; + + SetProgressBarTime(0); + ResetMaxSpeed(); + + UTIL_SetOrigin(pev, pev->origin); + + if (m_bIsVIP) + { + m_iKevlar = ARMOR_TYPE_HELMET; + pev->armorvalue = 200; + HintMessage("#Hint_you_are_the_vip", TRUE, TRUE); + } + + SetScoreboardAttributes(); + + MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo); + WRITE_BYTE(entindex()); + switch (m_iTeam) + { + case CT: + WRITE_STRING("CT"); + break; + case TERRORIST: + WRITE_STRING("TERRORIST"); + break; + case SPECTATOR: + WRITE_STRING("SPECTATOR"); + break; + default: + WRITE_STRING("UNASSIGNED"); + break; + } + MESSAGE_END(); + + UpdateLocation(true); + + MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_SHORT((short)pev->frags); + WRITE_SHORT(m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(m_iTeam); + MESSAGE_END(); + + if (m_bHasChangedName) + { + char *infobuffer = GET_INFO_BUFFER(edict()); + + if (!FStrEq(m_szNewName, GET_KEY_VALUE(infobuffer, "name"))) + { + SET_CLIENT_KEY_VALUE(entindex(), infobuffer, "name", m_szNewName); + } + + m_bHasChangedName = false; + m_szNewName[0] = '\0'; + } + + UTIL_ScreenFade(this, Vector(0, 0, 0), 0.001); + SyncRoundTimer(); + + if (TheBots) + { + TheBots->OnEvent(EVENT_PLAYER_SPAWNED, this); + } + + m_allowAutoFollowTime = false; + + sv_aim = CVAR_GET_POINTER("sv_aim"); + + for (i = 0; i < ARRAYSIZE(m_flLastCommandTime); i++) + m_flLastCommandTime[i] = -1; } /* <153555> ../cstrike/dlls/player.cpp:6620 */ @@ -3859,7 +5521,7 @@ void CBasePlayer::Precache_(void) m_bitsDamageType = 0; m_bitsHUDDamage = -1; m_iClientBattery = -1; - m_iTrain = (TRAIN_NEW | TRAIN_OFF); + m_iTrain = TRAIN_NEW; // Make sure any necessary user messages have been registered LinkUserMessages(); @@ -3949,8 +5611,8 @@ void CBasePlayer::Reset(void) m_iAccount = 0; MESSAGE_BEGIN(MSG_ONE, gmsgMoney, NULL, pev); - WRITE_LONG(m_iAccount); - WRITE_BYTE(0); + WRITE_LONG(m_iAccount); + WRITE_BYTE(0); MESSAGE_END(); m_bNotKilled = false; @@ -3960,11 +5622,11 @@ void CBasePlayer::Reset(void) AddAccount(startmoney.value); MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); - WRITE_BYTE(ENTINDEX(edict())); - WRITE_SHORT(0); - WRITE_SHORT(0); - WRITE_SHORT(0); - WRITE_SHORT(m_iTeam); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(m_iTeam); MESSAGE_END(); } @@ -4129,7 +5791,7 @@ void CBasePlayer::SelectLastItem(void) // HasWeapons - do I have any weapons at all? /* <15733a> ../cstrike/dlls/player.cpp:6967 */ -NOXREF BOOL CBasePlayer::HasWeapons(void) +BOOL CBasePlayer::HasWeapons(void) { for (int i = 0; i < MAX_ITEM_TYPES; i++) { @@ -4142,7 +5804,7 @@ NOXREF BOOL CBasePlayer::HasWeapons(void) /* <157372> ../cstrike/dlls/player.cpp:6982 */ NOXREF void CBasePlayer::SelectPrevItem(int iItem) { - + ; } /* <15106c> ../cstrike/dlls/player.cpp:6987 */ @@ -4290,7 +5952,7 @@ void CBasePlayer::FlashlightTurnOn(void) WRITE_BYTE(m_iFlashBattery); MESSAGE_END(); - m_flFlashLightTime = gpGlobals->time + 1.2; + m_flFlashLightTime = gpGlobals->time + FLASH_DRAIN_TIME; } } @@ -4301,11 +5963,11 @@ void CBasePlayer::FlashlightTurnOff(void) pev->effects &= ~EF_DIMLIGHT; MESSAGE_BEGIN(MSG_ONE, gmsgFlashlight, NULL, pev); - WRITE_BYTE(0); - WRITE_BYTE(m_iFlashBattery); + WRITE_BYTE(0); + WRITE_BYTE(m_iFlashBattery); MESSAGE_END(); - m_flFlashLightTime = gpGlobals->time + 0.2; + m_flFlashLightTime = gpGlobals->time + FLASH_CHARGE_TIME; } /* <158ae7> ../cstrike/dlls/player.cpp:7179 */ @@ -4315,7 +5977,7 @@ void CBasePlayer::ForceClientDllUpdate(void) m_iClientBattery = -1; m_fWeapon = FALSE; m_fInitHUD = TRUE; - m_iTrain |= (TRAIN_NEW | TRAIN_OFF); + m_iTrain |= TRAIN_NEW; UpdateClientData(); HandleSignals(); @@ -4424,7 +6086,6 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse) ALERT(at_console, "Crediting %s with $16000\n", STRING(pev->netname)); break; case 102: - //TODO: Fix me! CGib::SpawnRandomGibs(pev, 1, 1); break; case 103: @@ -4819,7 +6480,7 @@ int CBasePlayer::GiveAmmo_(int iCount, char *szName, int iMax) // Called every frame by the player PreThink /* <158b10> ../cstrike/dlls/player.cpp:7784 */ -NOXREF void CBasePlayer::ItemPreFrame(void) +void CBasePlayer::ItemPreFrame(void) { #ifdef CLIENT_WEAPONS if (m_flNextAttack > 0) @@ -4838,7 +6499,7 @@ NOXREF void CBasePlayer::ItemPreFrame(void) // Called every frame by the player PostThink /* <158b33> ../cstrike/dlls/player.cpp:7805 */ -NOXREF void CBasePlayer::ItemPostFrame(void) +void CBasePlayer::ItemPostFrame(void) { static int fInSelect = FALSE; @@ -4862,7 +6523,6 @@ NOXREF void CBasePlayer::ItemPostFrame(void) #endif // CLIENT_WEAPONS return; - // TODO: Reverse me! ImpulseCommands(); if (m_pActiveItem != NULL) @@ -4914,7 +6574,7 @@ void CBasePlayer::SendAmmoUpdate(void) } /* <158d4b> ../cstrike/dlls/player.cpp:7885 */ -NOXREF void CBasePlayer::SendHostagePos(void) +void CBasePlayer::SendHostagePos(void) { CHostage *pHostage = NULL; @@ -4995,8 +6655,6 @@ void CBasePlayer::SendWeatherInfo(void) } } -void (*CBasePlayer__UpdateClientData)(void); - // resends any changed player HUD info to the client. // Called every frame by PlayerPreThink // Also called at start of demo recording and playback by @@ -5004,137 +6662,347 @@ void (*CBasePlayer__UpdateClientData)(void); // reflecting all of the HUD state info. /* <159d3c> ../cstrike/dlls/player.cpp:7963 */ -NOBODY void __declspec(naked) CBasePlayer::UpdateClientData_(void) +void CBasePlayer::UpdateClientData_(void) { - __asm + if (m_fInitHUD) { - jmp CBasePlayer__UpdateClientData + m_fInitHUD = FALSE; + gInitHUD = FALSE; + m_signals.Update(); + + MESSAGE_BEGIN(MSG_ONE, gmsgResetHUD, NULL, pev); + MESSAGE_END(); + + if (!m_fGameHUDInitialized) + { + MESSAGE_BEGIN(MSG_ONE, gmsgInitHUD, NULL, pev); + MESSAGE_END(); + + CBaseEntity *pEntity = UTIL_FindEntityByClassname(NULL, "env_fog"); + + if (pEntity) + { + CClientFog *pFog = (CClientFog *)pEntity; + + int r = pFog->pev->rendercolor[0]; + int g = pFog->pev->rendercolor[1]; + int b = pFog->pev->rendercolor[2]; + + if (r > 255) + r = 255; + + else if (r < 0) + r = 0; + + if (g > 255) + g = 255; + + else if (g < 0) + g = 0; + + if (b > 255) + b = 255; + + else if (b < 0) + b = 0; + + union + { + float f; + char b[4]; + + } density; + + density.f = pFog->m_fDensity; + + MESSAGE_BEGIN(MSG_ONE, gmsgFog, NULL, pev); + WRITE_BYTE(r); + WRITE_BYTE(g); + WRITE_BYTE(b); + WRITE_BYTE(density.b[0]); + WRITE_BYTE(density.b[1]); + WRITE_BYTE(density.b[2]); + WRITE_BYTE(density.b[3]); + MESSAGE_END(); + } + + g_pGameRules->InitHUD(this); + m_fGameHUDInitialized = TRUE; + + if (g_pGameRules->IsMultiplayer()) + { + FireTargets("game_playerjoin", this, this, USE_TOGGLE, 0); + } + + m_iObserverLastMode = OBS_ROAMING; + m_iObserverC4State = 0; + m_bObserverHasDefuser = false; + SetObserverAutoDirector(false); + } + + FireTargets("game_playerspawn", this, this, USE_TOGGLE, 0); + + MESSAGE_BEGIN(MSG_ONE, gmsgMoney, NULL, pev); + WRITE_LONG(m_iAccount); + WRITE_BYTE(0); + MESSAGE_END(); + + if (m_bHasDefuser) + { + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); + WRITE_BYTE(STATUSICON_SHOW); + WRITE_STRING("defuser"); + WRITE_BYTE(0); + WRITE_BYTE(160); + WRITE_BYTE(0); + MESSAGE_END(); + } + + SetBombIcon(FALSE); + SyncRoundTimer(); + SendHostagePos(); + SendWeatherInfo(); + + if (g_pGameRules->IsMultiplayer()) + { + MESSAGE_BEGIN(MSG_ONE, gmsgTeamScore, NULL, pev); + WRITE_STRING(GetTeam(CT)); + WRITE_SHORT(g_pGameRules->m_iNumCTWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgTeamScore, NULL, pev); + WRITE_STRING(GetTeam(TERRORIST)); + WRITE_SHORT(g_pGameRules->m_iNumTerroristWins); + MESSAGE_END(); + } + } + + if (m_iHideHUD != m_iClientHideHUD) + { + MESSAGE_BEGIN(MSG_ONE, gmsgHideWeapon, NULL, pev); + WRITE_BYTE(m_iHideHUD); + MESSAGE_END(); + + m_iClientHideHUD = m_iHideHUD; + } + + if (m_iFOV != m_iClientFOV) + { + // cache FOV change at end of function, so weapon updates can see that FOV has changed + + pev->fov = m_iFOV; + + MESSAGE_BEGIN(MSG_ONE, gmsgSetFOV, NULL, pev); + WRITE_BYTE(m_iFOV); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); + WRITE_BYTE(ENTINDEX(edict())); + WRITE_BYTE(m_iFOV); + MESSAGE_END(); + } + + // HACKHACK -- send the message to display the game title + if (gDisplayTitle) + { + MESSAGE_BEGIN(MSG_ONE, gmsgShowGameTitle, NULL, pev); + WRITE_BYTE(0); + MESSAGE_END(); + + gDisplayTitle = FALSE; + } + + if ((int)pev->health != m_iClientHealth) + { + int iHealth = clamp(pev->health, 0, 255); + + if (pev->health > 0.0f && pev->health <= 1.0f) + iHealth = 1; + + // send "health" update message + MESSAGE_BEGIN(MSG_ONE, gmsgHealth, NULL, pev); + WRITE_BYTE(iHealth); + MESSAGE_END(); + + m_iClientHealth = (int)pev->health; + } + + if ((int)pev->armorvalue != m_iClientBattery) + { + m_iClientBattery = (int)pev->armorvalue; + + assert(gmsgBattery > 0); + + // send "armor" update message + MESSAGE_BEGIN(MSG_ONE, gmsgBattery, NULL, pev); + WRITE_SHORT((int)pev->armorvalue); + MESSAGE_END(); + } + + if (pev->dmg_take != 0.0f || pev->dmg_save != 0.0f || m_bitsHUDDamage != m_bitsDamageType) + { + // Comes from inside me if not set + Vector damageOrigin = pev->origin; + + // send "damage" message + // causes screen to flash, and pain compass to show direction of damage + edict_t *other = pev->dmg_inflictor; + + if (other) + { + CBaseEntity *pEntity = CBaseEntity::Instance(other); + + if (pEntity) + { + damageOrigin = pEntity->Center(); + } + } + + // only send down damage type that have hud art + int visibleDamageBits = m_bitsDamageType & DMG_SHOWNHUD; + + MESSAGE_BEGIN(MSG_ONE, gmsgDamage, NULL, pev); + WRITE_BYTE((int)pev->dmg_save); + WRITE_BYTE((int)pev->dmg_take); + WRITE_LONG(visibleDamageBits); + WRITE_COORD(damageOrigin.x); + WRITE_COORD(damageOrigin.y); + WRITE_COORD(damageOrigin.z); + MESSAGE_END(); + + pev->dmg_take = 0; + pev->dmg_save = 0; + m_bitsHUDDamage = m_bitsDamageType; + + // Clear off non-time-based damage indicators + m_bitsDamageType &= DMG_TIMEBASED; + } + + // Update Flashlight + if (m_flFlashLightTime && m_flFlashLightTime <= gpGlobals->time) + { + if (FlashlightIsOn()) + { + if (m_iFlashBattery) + { + m_flFlashLightTime = gpGlobals->time + FLASH_DRAIN_TIME; + m_iFlashBattery--; + + if (!m_iFlashBattery) + { + FlashlightTurnOff(); + } + } + } + else + { + if (m_iFlashBattery < 100) + { + m_flFlashLightTime = gpGlobals->time + FLASH_CHARGE_TIME; + m_iFlashBattery++; + } + else + m_flFlashLightTime = 0; + } + + MESSAGE_BEGIN(MSG_ONE, gmsgFlashBattery, NULL, pev); + WRITE_BYTE(m_iFlashBattery); + MESSAGE_END(); + } + + if (m_iTrain & TRAIN_NEW) + { + assert(gmsgTrain > 0); + + // send "train hud" update message + MESSAGE_BEGIN(MSG_ONE, gmsgTrain, NULL, pev); + WRITE_BYTE(m_iTrain & 0xF); + MESSAGE_END(); + + m_iTrain &= ~TRAIN_NEW; + } + + SendAmmoUpdate(); + + // Update all the items + for (int i = 0; i < MAX_ITEM_TYPES; i++) + { + if (m_rgpPlayerItems[i]) + { + // each item updates it's successors + m_rgpPlayerItems[i]->UpdateClientData(this); + } + } + + // Cache and client weapon change + m_pClientActiveItem = m_pActiveItem; + m_iClientFOV = m_iFOV; + + // Update Status Bar + if (m_flNextSBarUpdateTime < gpGlobals->time) + { + UpdateStatusBar(); + m_flNextSBarUpdateTime = gpGlobals->time + 0.2; + } + + if (!(m_flDisplayHistory & DHF_AMMO_EXHAUSTED)) + { + if (m_pActiveItem && m_pActiveItem->IsWeapon()) + { + CBasePlayerWeapon *w = (CBasePlayerWeapon *)m_pActiveItem; + + if (!(w->iFlags() & ITEM_FLAG_EXHAUSTIBLE)) + { + if (AmmoInventory( w->m_iPrimaryAmmoType ) < 1 && w->m_iClip == 0) + { + m_flDisplayHistory |= DHF_AMMO_EXHAUSTED; + HintMessage("#Hint_out_of_ammo"); + } + } + } + } + + if (gpGlobals->time > m_tmHandleSignals) + { + m_tmHandleSignals = gpGlobals->time + 0.5f; + HandleSignals(); + } + + if (pev->deadflag == DEAD_NO && gpGlobals->time > m_tmNextRadarUpdate) + { + m_tmNextRadarUpdate = gpGlobals->time + 1.0f; + + if ((pev->origin - m_vLastOrigin).Length() >= 64) + { + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBaseEntity *pEntity = UTIL_PlayerByIndex(i); + + if (!pEntity || i == entindex()) + continue; + + CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pEntity->pev); + + if (pPlayer->pev->flags == FL_DORMANT) + continue; + + if (pPlayer->pev->deadflag != DEAD_NO) + continue; + + if (pPlayer->m_iTeam == m_iTeam) + { + MESSAGE_BEGIN(MSG_ONE, gmsgRadar, NULL, pPlayer->pev); + WRITE_BYTE(entindex()); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + MESSAGE_END(); + } + } + } + + m_vLastOrigin = pev->origin; } -// { -// int i; -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// Update(class CUnifiedSignals *const this); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// { -// class CBaseEntity * pEntity; -// { -// class CClientFog * pFog; -// int r; -// int g; -// int b; -// union density; -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// } -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// edict_t * ed); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// edict(class CBaseEntity *const this); -// ENTINDEX(edict_t * pEdict); -// { -// int iHealth; -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// { -// class Vector damageOrigin; -// edict_t * other; -// int visibleDamageBits; -// Vector(class Vector *const this, -// const class Vector &const v); -// { -// class CBaseEntity * pEntity; -// Instance(edict_t * pent); -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// } -// SendAmmoUpdate(class CBasePlayer *const this); -// { -// int weapon_id; -// } -// { -// class CBasePlayerWeapon * w; -// iFlags(class CBasePlayerItem *const this); -// AmmoInventory(class CBasePlayer *const this, -// int iAmmoIndex); -// HintMessage(class CBasePlayer *const this, -// const char * pMessage, -// BOOL bDisplayIfPlayerDead, -// BOOL bOverride); -// } -// operator-(const class Vector *const this, -// const class Vector &const v); -// Length(const class Vector *const this); -// { -// class CBaseEntity * pPlayer; -// entindex(class CBaseEntity *const this); -// { -// class CBasePlayer * player; -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// entindex(class CBaseEntity *const this); -// } -// } -// FlashlightIsOn(class CBasePlayer *const this); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float * pOrigin, -// entvars_t * ent); -// FlashlightTurnOff(class CBasePlayer *const this); -// } } /* <1510bc> ../cstrike/dlls/player.cpp:8330 */ @@ -5310,7 +7178,7 @@ void CBasePlayer::SetCustomDecalFrames(int nFrames) // Returns the # of custom frames this player's custom clan logo contains. /* <15902e> ../cstrike/dlls/player.cpp:8720 */ -NOXREF int CBasePlayer::GetCustomDecalFrames(void) +int CBasePlayer::GetCustomDecalFrames(void) { return m_nCustomSprayFrames; } @@ -5327,7 +7195,7 @@ void CBasePlayer::Blind_(float duration, float holdTime, float fadeTime, int alp } /* <159051> ../cstrike/dlls/player.cpp:8741 */ -NOXREF void CBasePlayer::InitStatusBar(void) +void CBasePlayer::InitStatusBar(void) { m_flStatusBarDisappearDelay = 0.0f; m_SbarString0[0] = '\0'; @@ -5483,7 +7351,7 @@ void CBasePlayer::DropPlayerItem(const char *pszItemName) } else if (!pszItemName && HasShield()) { - DropShield(true); + DropShield(); return; } @@ -5584,7 +7452,7 @@ void CBasePlayer::DropPlayerItem(const char *pszItemName) pWeaponBox->pev->nextthink = gpGlobals->time + 1; TheCSBots()->SetLooseBomb(pWeaponBox); - TheCSBots()->OnEvent(EVENT_BOMB_DROPPED, NULL, NULL); + TheCSBots()->OnEvent(EVENT_BOMB_DROPPED); } if (pWeapon->iFlags() & ITEM_FLAG_EXHAUSTIBLE) @@ -5747,7 +7615,7 @@ void CBasePlayer::SwitchTeam(void) TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, this); - UpdateLocation(TRUE); + UpdateLocation(true); if (m_iTeam) { @@ -5772,8 +7640,8 @@ void CBasePlayer::SwitchTeam(void) pev->body = 0; MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pev); - WRITE_BYTE(STATUSICON_HIDE); - WRITE_STRING("defuser"); + WRITE_BYTE(STATUSICON_HIDE); + WRITE_STRING("defuser"); MESSAGE_END(); SendItemStatus(this); @@ -6115,7 +7983,7 @@ void CBasePlayer::StudioEstimateGait(void) } /* <159f01> ../cstrike/dlls/player.cpp:9685 */ -NOXREF void CBasePlayer::StudioPlayerBlend(int *pBlend, float *pPitch) +void CBasePlayer::StudioPlayerBlend(int *pBlend, float *pPitch) { // calc up/down pointing float range = (float)(int64_t)(*pPitch * 3.0f); @@ -6140,7 +8008,7 @@ NOXREF void CBasePlayer::StudioPlayerBlend(int *pBlend, float *pPitch) } /* <159f81> ../cstrike/dlls/player.cpp:9709 */ -NOXREF void CBasePlayer::CalculatePitchBlend(void) +void CBasePlayer::CalculatePitchBlend(void) { int iBlend; float temp = pev->angles.x; @@ -6162,10 +8030,10 @@ void CBasePlayer::CalculateYawBlend(void) dt = gpGlobals->frametime; - if (dt < 0) + if (dt < 0.0) dt = 0; - else if (dt > 1) + else if (dt > 1.0) dt = 1; StudioEstimateGait(); @@ -6244,7 +8112,7 @@ void CBasePlayer::StudioProcessGait(void) } /* <15a444> ../cstrike/dlls/player.cpp:9821 */ -NOXREF void CBasePlayer::ResetStamina(void) +void CBasePlayer::ResetStamina(void) { pev->fuser1 = 0; pev->fuser3 = 0; @@ -6311,11 +8179,11 @@ void CBasePlayer::SpawnClientSideCorpse(void) m_canSwitchObserverModes = true; if (TheTutor) - TheTutor->OnEvent(EVENT_CLIENT_CORPSE_SPAWNED, this, NULL); + TheTutor->OnEvent(EVENT_CLIENT_CORPSE_SPAWNED, this); } /* <15a7a2> ../cstrike/dlls/player.cpp:9909 */ -NOXREF BOOL CBasePlayer::IsArmored(int nHitGroup) +BOOL CBasePlayer::IsArmored(int nHitGroup) { BOOL fApplyArmor = FALSE; @@ -6342,7 +8210,7 @@ NOXREF BOOL CBasePlayer::IsArmored(int nHitGroup) } /* <15a847> ../cstrike/dlls/player.cpp:9939 */ -NOXREF BOOL CBasePlayer::ShouldDoLargeFlinch(int nHitGroup, int nGunType) +BOOL CBasePlayer::ShouldDoLargeFlinch(int nHitGroup, int nGunType) { if (pev->flags & FL_DUCKING) return FALSE; @@ -6636,9 +8504,8 @@ void CBasePlayer::InitRebuyData(const char *str) } /* <15be4f> ../cstrike/dlls/player.cpp:10500 */ -NOBODY void CBasePlayer::AutoBuy(void) +void CBasePlayer::AutoBuy(void) { - const int d = sizeof(g_SentBanMasks); const char *c = NULL; bool boughtPrimary = false; bool boughtSecondary = false; @@ -6736,8 +8603,6 @@ NOXREF bool IsSecondaryWeaponId(int id) /* <15b0f1> ../cstrike/dlls/player.cpp:10600 */ NOXREF const char *GetWeaponAliasFromName(const char *weaponName) { - UNTESTED - if (!Q_strncmp(weaponName, "weapon_", 7)) weaponName += 7; @@ -6761,9 +8626,15 @@ NOXREF bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int class return false; } +void (*pCBasePlayer__PickPrimaryCareerTaskWeapon)(void); + /* <15b1eb> ../cstrike/dlls/player.cpp:10623 */ -NOBODY const char *CBasePlayer::PickPrimaryCareerTaskWeapon(void) +NOBODY const char __declspec(naked) *CBasePlayer::PickPrimaryCareerTaskWeapon(void) { + __asm + { + jmp pCBasePlayer__PickPrimaryCareerTaskWeapon + } // { // intconst BufLen; // 10625 // char buf; // 10626 @@ -6803,9 +8674,15 @@ NOBODY const char *CBasePlayer::PickPrimaryCareerTaskWeapon(void) // } } +void (*pCBasePlayer__PickSecondaryCareerTaskWeapon)(void); + /* <15b5d7> ../cstrike/dlls/player.cpp:10690 */ -NOBODY const char *CBasePlayer::PickSecondaryCareerTaskWeapon(void) +NOBODY const char __declspec(naked) *CBasePlayer::PickSecondaryCareerTaskWeapon(void) { + __asm + { + jmp pCBasePlayer__PickSecondaryCareerTaskWeapon + } // { // intconst BufLen; // 10692 // char buf; // 10693 @@ -7288,7 +9165,7 @@ void CBasePlayer::RebuyArmor(void) { if (m_rebuyStruct.m_armor > m_iKevlar) { - if (m_rebuyStruct.m_armor == 1) + if (m_rebuyStruct.m_armor == ARMOR_TYPE_KEVLAR) ClientCommand("vest"); else ClientCommand("vesthelm"); @@ -7318,6 +9195,7 @@ void CBasePlayer::UpdateLocation(bool forceUpdate) if (pev->deadflag == DEAD_NO && UTIL_IsGame("czero")) { + // search the place name where is located the player Place playerPlace = TheNavAreaGrid.GetPlace( &pev->origin ); const BotPhraseList *placeList = TheBotPhrases->GetPlaceList(); @@ -7349,15 +9227,15 @@ void CBasePlayer::UpdateLocation(bool forceUpdate) if (player->m_iTeam == m_iTeam || player->m_iTeam == SPECTATOR) { MESSAGE_BEGIN(MSG_ONE, gmsgLocation, NULL, player->edict()); - WRITE_BYTE(entindex()); - WRITE_STRING(m_lastLocation); + WRITE_BYTE(entindex()); + WRITE_STRING(m_lastLocation); MESSAGE_END(); } else if (forceUpdate) { MESSAGE_BEGIN(MSG_ONE, gmsgLocation, NULL, player->edict()); - WRITE_BYTE(entindex()); - WRITE_STRING(""); + WRITE_BYTE(entindex()); + WRITE_STRING(""); MESSAGE_END(); } } @@ -7560,4 +9438,15 @@ void CInfoIntermission::Think(void) Think_(); } +void CWShield::Spawn(void) +{ + Spawn_(); +} + +void CWShield::Touch(CBaseEntity *pOther) +{ + Touch_(pOther); + +} + #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index 7f17ebcd..8e699d1e 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -49,7 +49,13 @@ #define PLAYER_FATAL_FALL_SPEED 1100.0f #define PLAYER_MAX_SAFE_FALL_SPEED 500.0f -#define PLAYER_SEARCH_RADIUS 64.0f +#define PLAYER_SEARCH_RADIUS 64.0f + +#define ARMOR_RATIO 0.5 // Armor Takes 50% of the damage +#define ARMOR_BONUS 0.5 // Each Point of Armor is work 1/x points of health + +#define FLASH_DRAIN_TIME 1.2 // 100 units/3 minutes +#define FLASH_CHARGE_TIME 0.2 // 100 units/20 seconds (seconds per unit) // damage per unit per second. #define DAMAGE_FOR_FALL_SPEED 100.0f / (PLAYER_FATAL_FALL_SPEED - PLAYER_MAX_SAFE_FALL_SPEED) @@ -80,30 +86,6 @@ #define TRAIN_ACTIVE 0x80 #define TRAIN_NEW 0xc0 -#define DHF_ROUND_STARTED (1<<1) -#define DHF_HOSTAGE_SEEN_FAR (1<<2) -#define DHF_HOSTAGE_SEEN_NEAR (1<<3) -#define DHF_HOSTAGE_USED (1<<4) -#define DHF_HOSTAGE_INJURED (1<<5) -#define DHF_HOSTAGE_KILLED (1<<6) -#define DHF_FRIEND_SEEN (1<<7) -#define DHF_ENEMY_SEEN (1<<8) -#define DHF_FRIEND_INJURED (1<<9) -#define DHF_FRIEND_KILLED (1<<10) -#define DHF_ENEMY_KILLED (1<<11) -#define DHF_BOMB_RETRIEVED (1<<12) -#define DHF_AMMO_EXHAUSTED (1<<15) -#define DHF_IN_TARGET_ZONE (1<<16) -#define DHF_IN_RESCUE_ZONE (1<<17) -#define DHF_IN_ESCAPE_ZONE (1<<18) -#define DHF_IN_VIPSAFETY_ZONE (1<<19) -#define DHF_NIGHTVISION (1<<20) -#define DHF_HOSTAGE_CTMOVE (1<<21) -#define DHF_SPEC_DUCK (1<<22) - -#define DHM_ROUND_CLEAR (DHF_ROUND_STARTED | DHF_HOSTAGE_KILLED | DHF_FRIEND_KILLED | DHF_BOMB_RETRIEVED) -#define DHM_CONNECT_CLEAR (DHF_HOSTAGE_SEEN_FAR | DHF_HOSTAGE_SEEN_NEAR | DHF_HOSTAGE_USED | DHF_HOSTAGE_INJURED | DHF_FRIEND_SEEN | DHF_ENEMY_SEEN | DHF_FRIEND_INJURED | DHF_ENEMY_KILLED | DHF_AMMO_EXHAUSTED | DHF_IN_TARGET_ZONE | DHF_IN_RESCUE_ZONE | DHF_IN_ESCAPE_ZONE | DHF_IN_VIPSAFETY_ZONE | DHF_HOSTAGE_CTMOVE | DHF_SPEC_DUCK) - #define SIGNAL_BUY (1<<0) #define SIGNAL_BOMB (1<<1) #define SIGNAL_RESCUE (1<<2) @@ -157,6 +139,7 @@ typedef enum PLAYER_LARGE_FLINCH, PLAYER_RELOAD, PLAYER_HOLDBOMB + } PLAYER_ANIM; typedef enum @@ -176,6 +159,7 @@ typedef enum Menu_Radio2, Menu_Radio3, Menu_ClientBuy + } _Menu; typedef enum @@ -184,6 +168,7 @@ typedef enum TERRORIST, CT, SPECTATOR, + } TeamName; typedef enum @@ -200,6 +185,7 @@ typedef enum MODEL_VIP, MODEL_MILITIA, MODEL_SPETSNAZ + } ModelName; typedef enum @@ -210,6 +196,7 @@ typedef enum SHOWTEAMSELECT, PICKINGTEAM, GETINTOGAME + } JoinState; typedef enum @@ -223,6 +210,7 @@ typedef enum CMD_LISTPLAYERS, CMD_NIGHTVISION, COMMANDS_TO_TRACK, + } TrackCommands; typedef struct @@ -237,6 +225,7 @@ typedef struct int m_defuser; int m_nightVision; int m_armor; + } RebuyStruct; typedef enum @@ -248,6 +237,7 @@ typedef enum THROW_BOMB, THROW_GRENADE, THROW_HITVEL_MINUS_AIRVEL + } ThrowDirection; enum sbar_data @@ -263,6 +253,7 @@ typedef enum SILENT, CALM, INTENSE + } MusicState; struct WeaponStruct @@ -281,6 +272,7 @@ struct WeaponStruct #define g_weaponStruct (*pg_weaponStruct) #define gEvilImpulse101 (*pgEvilImpulse101) #define g_szMapBriefingText (*pg_szMapBriefingText) +#define g_pevLastInflictor (*pg_pevLastInflictor) #define g_pLastSpawn (*pg_pLastSpawn) #define g_pLastCTSpawn (*pg_pLastCTSpawn) #define g_pLastTerroristSpawn (*pg_pLastTerroristSpawn) @@ -464,9 +456,8 @@ public: class CBasePlayer: public CBaseMonster { public: - enum { MaxLocationLen = 32 }; - NOBODY virtual void Spawn(void); + virtual void Spawn(void); virtual void Precache(void); virtual int Save(CSave &save); virtual int Restore(CRestore &restore); @@ -476,65 +467,65 @@ public: } virtual int Classify(void); virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); - NOBODY virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); - NOBODY virtual int TakeHealth(float flHealth, int bitsDamageType); - NOBODY virtual void Killed(entvars_t *pevAttacker, int iGib); + virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); + virtual int TakeHealth(float flHealth, int bitsDamageType); + virtual void Killed(entvars_t *pevAttacker, int iGib); virtual void AddPoints(int score, BOOL bAllowNegativeScore); - NOBODY virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore); + virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore); virtual BOOL AddPlayerItem(CBasePlayerItem *pItem); virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem); virtual int GiveAmmo(int iAmount, char *szName, int iMax); - NOBODY virtual void StartSneaking(void) + virtual void StartSneaking(void) { StartSneaking_(); } - NOBODY virtual void StopSneaking(void) + virtual void StopSneaking(void) { StopSneaking_(); } - NOBODY virtual BOOL IsSneaking(void) + virtual BOOL IsSneaking(void) { return IsSneaking_(); } - NOBODY virtual BOOL IsAlive(void) + virtual BOOL IsAlive(void) { return IsAlive_(); } - NOBODY virtual BOOL IsPlayer(void) + virtual BOOL IsPlayer(void) { return IsPlayer_(); } - NOBODY virtual BOOL IsNetClient(void) + virtual BOOL IsNetClient(void) { return IsNetClient_(); } virtual const char *TeamID(void); virtual BOOL FBecomeProne(void); - NOBODY virtual Vector BodyTarget(const Vector &posSrc) + virtual Vector BodyTarget(const Vector &posSrc) { return BodyTarget_(posSrc); } virtual int Illumination(void); - NOBODY virtual BOOL ShouldFadeOnDeath(void) + virtual BOOL ShouldFadeOnDeath(void) { return ShouldFadeOnDeath_(); } virtual void ResetMaxSpeed(void); - NOBODY virtual void Jump(void); - NOBODY virtual void Duck(void); - NOBODY virtual void PreThink(void); - NOBODY virtual void PostThink(void); - NOBODY virtual Vector GetGunPosition(void); - NOBODY virtual BOOL IsBot(void) + virtual void Jump(void); + virtual void Duck(void); + virtual void PreThink(void); + virtual void PostThink(void); + virtual Vector GetGunPosition(void); + virtual BOOL IsBot(void) { return IsBot_(); } - NOBODY virtual void UpdateClientData(void); + virtual void UpdateClientData(void); virtual void ImpulseCommands(void); virtual void RoundRespawn(void); virtual Vector GetAutoaimVector(float flDelta); virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha); - NOBODY virtual void OnTouchingWeapon(CWeaponBox *pWeapon) + virtual void OnTouchingWeapon(CWeaponBox *pWeapon) { OnTouchingWeapon_(pWeapon); } @@ -628,16 +619,16 @@ public: { return pev->iuser1; } - NOBODY void PlantC4(void); + NOXREF void PlantC4(void); void Radio(const char *msg_id, const char *msg_verbose, short pitch = 100, bool showIcon = true); NOXREF CBasePlayer *GetNextRadioRecipient(CBasePlayer *pStartPlayer); void SmartRadio(void); NOXREF void ThrowWeapon(char *pszItemName); NOXREF void ThrowPrimary(void); void AddAccount(int amount, bool bTrackChange = true); - NOBODY void Disappear(void); + void Disappear(void); void MakeVIP(void); - NOBODY bool CanPlayerBuy(bool display); + bool CanPlayerBuy(bool display = false); void SwitchTeam(void); void TabulateAmmo(void); void Pain(int m_LastHitGroup, bool HasArmour); @@ -649,13 +640,13 @@ public: void PackDeadPlayerItems(void); void GiveDefaultItems(void); void RemoveAllItems(BOOL removeSuit); - void SetBombIcon(BOOL bFlash); + void SetBombIcon(BOOL bFlash = FALSE); void SetProgressBarTime(int time); void SetProgressBarTime2(int time, float timeElapsed); void SetPlayerModel(BOOL HasC4); void SetNewPlayerModel(const char *modelName); BOOL SwitchWeapon(CBasePlayerItem *pWeapon); - NOXREF void CheckPowerups(entvars_t *pev); + void CheckPowerups(entvars_t *pev); bool CanAffordPrimary(void); bool CanAffordPrimaryAmmo(void); bool CanAffordSecondaryAmmo(void); @@ -671,64 +662,67 @@ public: BOOL FlashlightIsOn(void); void FlashlightTurnOn(void); void FlashlightTurnOff(void); - NOBODY void UpdatePlayerSound(void); - NOXREF void DeathSound(void); + void UpdatePlayerSound(void); + void DeathSound(void); void SetAnimation(PLAYER_ANIM playerAnim); - NOBODY void SetWeaponAnimType(const char *szExtention); + NOXREF void SetWeaponAnimType(const char *szExtention) + { + Q_strcpy(m_szAnimExtention, szExtention); + } void CheatImpulseCommands(int iImpulse); - NOXREF void StartDeathCam(void); - NOBODY void StartObserver(Vector vecPosition, Vector vecViewAngle); + void StartDeathCam(void); + void StartObserver(Vector vecPosition, Vector vecViewAngle); void HandleSignals(void); void DropPlayerItem(const char *pszItemName); BOOL HasPlayerItem(CBasePlayerItem *pCheckItem); BOOL HasNamedPlayerItem(const char *pszItemName); - NOXREF BOOL HasWeapons(void); + BOOL HasWeapons(void); NOXREF void SelectPrevItem(int iItem); NOXREF void SelectNextItem(int iItem); void SelectLastItem(void); void SelectItem(const char *pstr); - NOXREF void ItemPreFrame(void); - NOXREF void ItemPostFrame(void); + void ItemPreFrame(void); + void ItemPostFrame(void); void GiveNamedItem(const char *pszName); void EnableControl(BOOL fControl); bool HintMessage(const char *pMessage, BOOL bDisplayIfPlayerDead = FALSE, BOOL bOverride = FALSE); void SendAmmoUpdate(void); - NOXREF void SendFOV(int fov); - NOBODY void WaterMove(void); - NOBODY void EXPORT PlayerDeathThink(void); + void SendFOV(int fov); + void WaterMove(void); + void EXPORT PlayerDeathThink(void); void PlayerUse(void); - NOBODY void HostageUsed(void); - NOBODY void JoiningThink(void); - NOBODY void RemoveLevelText(void); + void HostageUsed(void); + void JoiningThink(void); + void RemoveLevelText(void); void WINAPI_HOOK MenuPrint(const char *msg); void ResetMenu(void); void SyncRoundTimer(void); - NOXREF void CheckSuitUpdate(void); + void CheckSuitUpdate(void); void SetSuitUpdate(char *name = NULL, int fgroup = 0, int iNoRepeatTime = 0); - NOXREF void UpdateGeigerCounter(void); - NOBODY void CheckTimeBasedDamage(void); + void UpdateGeigerCounter(void); + void CheckTimeBasedDamage(void); NOXREF void BarnacleVictimBitten(entvars_t *pevBarnacle); NOXREF void BarnacleVictimReleased(void); static int GetAmmoIndex(const char *psz); int AmmoInventory(int iAmmoIndex); void ResetAutoaim(void); - Vector AutoaimDeflection(class Vector &vecSrc, float flDist, float flDelta); + Vector AutoaimDeflection(Vector &vecSrc, float flDist, float flDelta); void ForceClientDllUpdate(void); void DeathMessage(entvars_t *pevAttacker) { }; - void SetCustomDecalFrames(int); - NOXREF int GetCustomDecalFrames(void); - NOXREF void InitStatusBar(void); + void SetCustomDecalFrames(int nFrames); + int GetCustomDecalFrames(void); + void InitStatusBar(void); void UpdateStatusBar(void); void StudioEstimateGait(void); - NOXREF void StudioPlayerBlend(int *pBlend, float *pPitch); - NOXREF void CalculatePitchBlend(void); + void StudioPlayerBlend(int *pBlend, float *pPitch); + void CalculatePitchBlend(void); void CalculateYawBlend(void); void StudioProcessGait(void); - NOXREF void SendHostagePos(void); + void SendHostagePos(void); void SendHostageIcons(void); - NOXREF void ResetStamina(void); - NOXREF BOOL IsArmored(int nHitGroup); - NOXREF BOOL ShouldDoLargeFlinch(int nHitGroup, int nGunType); + void ResetStamina(void); + BOOL IsArmored(int nHitGroup); + BOOL ShouldDoLargeFlinch(int nHitGroup, int nGunType); void SetPrefsFromUserinfo(char *infobuffer); void SendWeatherInfo(void); void UpdateShieldCrosshair(bool); @@ -738,8 +732,8 @@ public: return HasShield() && m_bShieldDrawn; } void RemoveShield(void); - void DropShield(bool); - NOBODY void GiveShield(bool); + void DropShield(bool bDeploy = true); + void GiveShield(bool bDeploy = true); bool IsHittingShield(Vector &vecDirection, TraceResult *ptr); bool IsReloading(void) { @@ -750,7 +744,7 @@ public: } bool IsBlind(void) { - return (gpGlobals->time > m_blindUntilTime); + return (m_blindUntilTime > gpGlobals->time); } bool IsAutoFollowAllowed(void) { @@ -766,7 +760,7 @@ public: } void ClearAutoBuyData(void); void AddAutoBuyData(const char *str); - NOBODY void AutoBuy(void); + void AutoBuy(void); void ClientCommand(const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL, const char *arg3 = NULL); void PrioritizeAutoBuyString(char *autobuyString, const char *priorityString); NOBODY const char *PickPrimaryCareerTaskWeapon(void); @@ -790,7 +784,7 @@ public: void RebuyDefuser(void); void RebuyNightVision(void); void RebuyArmor(void); - void UpdateLocation(bool forceUpdate); + void UpdateLocation(bool forceUpdate = false); void SetObserverAutoDirector(bool val) { m_bObserverAutoDirector = val; @@ -800,13 +794,16 @@ public: { return m_canSwitchObserverModes; } - NOBODY void Intense(void) + NOXREF void Intense(void) { //m_musicState = INTENSE; //m_intenseTimestamp = gpGlobals->time; } public: + + enum { MaxLocationLen = 32 }; + int random_seed; unsigned short m_usPlayerBleed; EHANDLE m_hObserverTarget; @@ -1004,14 +1001,21 @@ public: float m_flLastCommandTime[8]; };/* size: 2500, cachelines: 40, members: 190 */ -/* Line - 2500 | Windows - 2480 */ /* <14ed87> ../cstrike/dlls/player.cpp:3407 */ class CWShield: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void EXPORT Touch(CBaseEntity *pOther); + virtual void Spawn(void); + virtual void EXPORT Touch(CBaseEntity *pOther); + +#ifdef HOOK_GAMEDLL + + void Spawn_(void); + void Touch_(CBaseEntity *pOther); + +#endif // HOOK_GAMEDLL + public: /* <14e77d> ../cstrike/dlls/player.cpp:3410 */ void SetCantBePickedUpByUser(CBaseEntity *pEntity, float time) @@ -1019,9 +1023,11 @@ public: m_hEntToIgnoreTouchesFrom = pEntity; m_flTimeToIgnoreTouches = gpGlobals->time + time; } + public: EHANDLE m_hEntToIgnoreTouchesFrom; float m_flTimeToIgnoreTouches; + };/* size: 164, cachelines: 3, members: 3 */ extern char *m_szPoses[4]; @@ -1029,6 +1035,7 @@ extern WeaponStruct g_weaponStruct[MAX_WEAPONS]; extern int gEvilImpulse101; extern char g_szMapBriefingText[512]; +extern entvars_t *g_pevLastInflictor; extern CBaseEntity *g_pLastSpawn; extern CBaseEntity *g_pLastCTSpawn; extern CBaseEntity *g_pLastTerroristSpawn; @@ -1120,12 +1127,13 @@ extern int gmsgBrass; extern int gmsgFog; extern int gmsgShowTimer; -//NOBODY void player(entvars_t *pev); -//NOBODY void weapon_shield(entvars_t *pev); -//NOBODY void info_intermission(entvars_t *pev); -//NOBODY void player_loadsaved(entvars_t *pev); -//NOBODY void player_weaponstrip(entvars_t *pev); -//NOBODY void monster_hevsuit_dead(entvars_t *pev); +// linked objects +C_DLLEXPORT void player(entvars_t *pev); +C_DLLEXPORT void weapon_shield(entvars_t *pev); +C_DLLEXPORT void info_intermission(entvars_t *pev); +C_DLLEXPORT void player_loadsaved(entvars_t *pev); +C_DLLEXPORT void player_weaponstrip(entvars_t *pev); +C_DLLEXPORT void monster_hevsuit_dead(entvars_t *pev); void OLD_CheckBuyZone(CBasePlayer *player); void OLD_CheckBombTarget(CBasePlayer *player); @@ -1144,7 +1152,7 @@ void EscapeZoneIcon_Clear(CBasePlayer *player); void VIP_SafetyZoneIcon_Set(CBasePlayer *player); void VIP_SafetyZoneIcon_Clear(CBasePlayer *player); -NOBODY void LinkUserMessages(void); +void LinkUserMessages(void); void WriteSigonMessages(void); void SendItemStatus(CBasePlayer *pPlayer); const char *GetCSModelName(int item_id); @@ -1154,7 +1162,7 @@ const char *GetWeaponName(entvars_t *pevInflictor, entvars_t *pKiller); void LogAttack(CBasePlayer *pAttacker, CBasePlayer *pVictim, int teamAttack, int healthHit, int armorHit, int newHealth, int newArmor, const char *killer_weapon_name); void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo); bool CanSeeUseable(CBasePlayer *me, CBaseEntity *entity); -NOBODY void FixPlayerCrouchStuck(edict_t *pPlayer); +NOXREF void FixPlayerCrouchStuck(edict_t *pPlayer); BOOL IsSpawnPointValid(CBaseEntity *pPlayer, CBaseEntity *pSpot); NOXREF void InitZombieSpawns(void); NOXREF CBaseEntity *FindZombieSpawn(CBaseEntity *player, bool forceSpawn); @@ -1173,6 +1181,7 @@ NOXREF const char *GetWeaponAliasFromName(const char *weaponName); NOXREF bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int classId); // refs -extern void (*CBasePlayer__UpdateClientData)(void); +extern void (*pCBasePlayer__PickPrimaryCareerTaskWeapon)(void); +extern void (*pCBasePlayer__PickSecondaryCareerTaskWeapon)(void); #endif // PLAYER_H diff --git a/regamedll/dlls/saverestore.h b/regamedll/dlls/saverestore.h index 52b2ea1c..670856bb 100644 --- a/regamedll/dlls/saverestore.h +++ b/regamedll/dlls/saverestore.h @@ -42,20 +42,6 @@ #define IMPLEMENT_ARRAY_CLASS(baseClass,var)\ baseClass::var -#define IMPLEMENT_SAVERESTORE(derivedClass,baseClass)\ - int derivedClass::Save(CSave &save)\ - {\ - if (!baseClass::Save(save))\ - return 0;\ - return save.WriteFields(#derivedClass, this, m_SaveData, ARRAYSIZE(m_SaveData));\ - }\ - int derivedClass::Restore(CRestore &restore)\ - {\ - if (!baseClass::Restore(restore))\ - return 0;\ - return restore.ReadFields(#derivedClass, this, m_SaveData, ARRAYSIZE(m_SaveData));\ - } - #else // HOOK_GAMEDLL #define IMPLEMENT_ARRAY(var)\ @@ -64,22 +50,22 @@ #define IMPLEMENT_ARRAY_CLASS(baseClass,var)\ (*baseClass::p##var) +#endif // HOOK_GAMEDLL + #define IMPLEMENT_SAVERESTORE(derivedClass, baseClass)\ int derivedClass::Save_(CSave &save)\ {\ if (!baseClass::Save(save))\ return 0;\ - return save.WriteFields(#derivedClass, this, (*pm_SaveData), ARRAYSIZE(*pm_SaveData));\ + return save.WriteFields(#derivedClass, this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData)));\ }\ int derivedClass::Restore_(CRestore &restore)\ {\ if (!baseClass::Restore(restore))\ return 0;\ - return restore.ReadFields(#derivedClass, this, (*pm_SaveData), ARRAYSIZE(*pm_SaveData));\ + return restore.ReadFields(#derivedClass, this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData)));\ } -#endif // HOOK_GAMEDLL - typedef enum { GLOBAL_OFF, diff --git a/regamedll/dlls/schedule.h b/regamedll/dlls/schedule.h new file mode 100644 index 00000000..217c293e --- /dev/null +++ b/regamedll/dlls/schedule.h @@ -0,0 +1,296 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef SCHEDULE_H +#define SCHEDULE_H +#ifdef _WIN32 +#pragma once +#endif + +// these MoveFlag values are assigned to a WayPoint's TYPE in order to demonstrate the +// type of movement the monster should use to get there. +#define bits_MF_TO_TARGETENT (1 << 0) // local move to targetent. +#define bits_MF_TO_ENEMY (1 << 1) // local move to enemy +#define bits_MF_TO_COVER (1 << 2) // local move to a hiding place +#define bits_MF_TO_DETOUR (1 << 3) // local move to detour point. +#define bits_MF_TO_PATHCORNER (1 << 4) // local move to a path corner +#define bits_MF_TO_NODE (1 << 5) // local move to a node +#define bits_MF_TO_LOCATION (1 << 6) // local move to an arbitrary point +#define bits_MF_IS_GOAL (1 << 7) // this waypoint is the goal of the whole move. +#define bits_MF_DONT_SIMPLIFY (1 << 8) // Don't let the route code simplify this waypoint + +// If you define any flags that aren't _TO_ flags, add them here so we can mask +// them off when doing compares. +#define bits_MF_NOT_TO_MASK (bits_MF_IS_GOAL | bits_MF_DONT_SIMPLIFY) + +#define MOVEGOAL_NONE (0) +#define MOVEGOAL_TARGETENT (bits_MF_TO_TARGETENT) +#define MOVEGOAL_ENEMY (bits_MF_TO_ENEMY) +#define MOVEGOAL_PATHCORNER (bits_MF_TO_PATHCORNER) +#define MOVEGOAL_LOCATION (bits_MF_TO_LOCATION) +#define MOVEGOAL_NODE (bits_MF_TO_NODE) + +// these bits represent conditions that may befall the monster, of which some are allowed +// to interrupt certain schedules. +#define bits_COND_NO_AMMO_LOADED (1 << 0) // weapon needs to be reloaded! +#define bits_COND_SEE_HATE (1 << 1) // see something that you hate +#define bits_COND_SEE_FEAR (1 << 2) // see something that you are afraid of +#define bits_COND_SEE_DISLIKE (1 << 3) // see something that you dislike +#define bits_COND_SEE_ENEMY (1 << 4) // target entity is in full view. +#define bits_COND_ENEMY_OCCLUDED (1 << 5) // target entity occluded by the world +#define bits_COND_SMELL_FOOD (1 << 6) +#define bits_COND_ENEMY_TOOFAR (1 << 7) +#define bits_COND_LIGHT_DAMAGE (1 << 8) // hurt a little +#define bits_COND_HEAVY_DAMAGE (1 << 9) // hurt a lot +#define bits_COND_CAN_RANGE_ATTACK1 (1 << 10) +#define bits_COND_CAN_MELEE_ATTACK1 (1 << 11) +#define bits_COND_CAN_RANGE_ATTACK2 (1 << 12) +#define bits_COND_CAN_MELEE_ATTACK2 (1 << 13) +//#define bits_COND_CAN_RANGE_ATTACK3 (1 << 14) + +#define bits_COND_PROVOKED (1 << 15) +#define bits_COND_NEW_ENEMY (1 << 16) +#define bits_COND_HEAR_SOUND (1 << 17) // there is an interesting sound +#define bits_COND_SMELL (1 << 18) // there is an interesting scent +#define bits_COND_ENEMY_FACING_ME (1 << 19) // enemy is facing me +#define bits_COND_ENEMY_DEAD (1 << 20) // enemy was killed. If you get this in combat, try to find another enemy. If you get it in alert, victory dance. +#define bits_COND_SEE_CLIENT (1 << 21) // see a client +#define bits_COND_SEE_NEMESIS (1 << 22) // see my nemesis + +#define bits_COND_SPECIAL1 (1 << 28) // Defined by individual monster +#define bits_COND_SPECIAL2 (1 << 29) // Defined by individual monster + +#define bits_COND_TASK_FAILED (1 << 30) +#define bits_COND_SCHEDULE_DONE (1 << 31) + +#define bits_COND_ALL_SPECIAL (bits_COND_SPECIAL1 | bits_COND_SPECIAL2) +#define bits_COND_CAN_ATTACK (bits_COND_CAN_RANGE_ATTACK1 | bits_COND_CAN_MELEE_ATTACK1 | bits_COND_CAN_RANGE_ATTACK2 | bits_COND_CAN_MELEE_ATTACK2) + +#define TASKSTATUS_NEW 0 // Just started +#define TASKSTATUS_RUNNING 1 // Running task & movement +#define TASKSTATUS_RUNNING_MOVEMENT 2 // Just running movement +#define TASKSTATUS_RUNNING_TASK 3 // Just running task +#define TASKSTATUS_COMPLETE 4 // Completed, get next task + +// These are the schedule types +typedef enum +{ + SCHED_NONE = 0, + SCHED_IDLE_STAND, + SCHED_IDLE_WALK, + SCHED_WAKE_ANGRY, + SCHED_WAKE_CALLED, + SCHED_ALERT_FACE, + SCHED_ALERT_SMALL_FLINCH, + SCHED_ALERT_BIG_FLINCH, + SCHED_ALERT_STAND, + SCHED_INVESTIGATE_SOUND, + SCHED_COMBAT_FACE, + SCHED_COMBAT_STAND, + SCHED_CHASE_ENEMY, + SCHED_CHASE_ENEMY_FAILED, + SCHED_VICTORY_DANCE, + SCHED_TARGET_FACE, + SCHED_TARGET_CHASE, + SCHED_SMALL_FLINCH, + SCHED_TAKE_COVER_FROM_ENEMY, + SCHED_TAKE_COVER_FROM_BEST_SOUND, + SCHED_TAKE_COVER_FROM_ORIGIN, + SCHED_COWER, // usually a last resort! + SCHED_MELEE_ATTACK1, + SCHED_MELEE_ATTACK2, + SCHED_RANGE_ATTACK1, + SCHED_RANGE_ATTACK2, + SCHED_SPECIAL_ATTACK1, + SCHED_SPECIAL_ATTACK2, + SCHED_STANDOFF, + SCHED_ARM_WEAPON, + SCHED_RELOAD, + SCHED_GUARD, + SCHED_AMBUSH, + SCHED_DIE, + SCHED_WAIT_TRIGGER, + SCHED_FOLLOW, + SCHED_SLEEP, + SCHED_WAKE, + SCHED_BARNACLE_VICTIM_GRAB, + SCHED_BARNACLE_VICTIM_CHOMP, + SCHED_AISCRIPT, + SCHED_FAIL, + + LAST_COMMON_SCHEDULE // Leave this at the bottom + +} SCHEDULE_TYPE; + +// These are the shared tasks +typedef enum +{ + TASK_INVALID = 0, + TASK_WAIT, + TASK_WAIT_FACE_ENEMY, + TASK_WAIT_PVS, + TASK_SUGGEST_STATE, + TASK_WALK_TO_TARGET, + TASK_RUN_TO_TARGET, + TASK_MOVE_TO_TARGET_RANGE, + TASK_GET_PATH_TO_ENEMY, + TASK_GET_PATH_TO_ENEMY_LKP, + TASK_GET_PATH_TO_ENEMY_CORPSE, + TASK_GET_PATH_TO_LEADER, + TASK_GET_PATH_TO_SPOT, + TASK_GET_PATH_TO_TARGET, + TASK_GET_PATH_TO_HINTNODE, + TASK_GET_PATH_TO_LASTPOSITION, + TASK_GET_PATH_TO_BESTSOUND, + TASK_GET_PATH_TO_BESTSCENT, + TASK_RUN_PATH, + TASK_WALK_PATH, + TASK_STRAFE_PATH, + TASK_CLEAR_MOVE_WAIT, + TASK_STORE_LASTPOSITION, + TASK_CLEAR_LASTPOSITION, + TASK_PLAY_ACTIVE_IDLE, + TASK_FIND_HINTNODE, + TASK_CLEAR_HINTNODE, + TASK_SMALL_FLINCH, + TASK_FACE_IDEAL, + TASK_FACE_ROUTE, + TASK_FACE_ENEMY, + TASK_FACE_HINTNODE, + TASK_FACE_TARGET, + TASK_FACE_LASTPOSITION, + TASK_RANGE_ATTACK1, + TASK_RANGE_ATTACK2, + TASK_MELEE_ATTACK1, + TASK_MELEE_ATTACK2, + TASK_RELOAD, + TASK_RANGE_ATTACK1_NOTURN, + TASK_RANGE_ATTACK2_NOTURN, + TASK_MELEE_ATTACK1_NOTURN, + TASK_MELEE_ATTACK2_NOTURN, + TASK_RELOAD_NOTURN, + TASK_SPECIAL_ATTACK1, + TASK_SPECIAL_ATTACK2, + TASK_CROUCH, + TASK_STAND, + TASK_GUARD, + TASK_STEP_LEFT, + TASK_STEP_RIGHT, + TASK_STEP_FORWARD, + TASK_STEP_BACK, + TASK_DODGE_LEFT, + TASK_DODGE_RIGHT, + TASK_SOUND_ANGRY, + TASK_SOUND_DEATH, + TASK_SET_ACTIVITY, + TASK_SET_SCHEDULE, + TASK_SET_FAIL_SCHEDULE, + TASK_CLEAR_FAIL_SCHEDULE, + TASK_PLAY_SEQUENCE, + TASK_PLAY_SEQUENCE_FACE_ENEMY, + TASK_PLAY_SEQUENCE_FACE_TARGET, + TASK_SOUND_IDLE, + TASK_SOUND_WAKE, + TASK_SOUND_PAIN, + TASK_SOUND_DIE, + TASK_FIND_COVER_FROM_BEST_SOUND, // tries lateral cover first, then node cover + TASK_FIND_COVER_FROM_ENEMY, // tries lateral cover first, then node cover + TASK_FIND_LATERAL_COVER_FROM_ENEMY, + TASK_FIND_NODE_COVER_FROM_ENEMY, + TASK_FIND_NEAR_NODE_COVER_FROM_ENEMY, // data for this one is the MAXIMUM acceptable distance to the cover. + TASK_FIND_FAR_NODE_COVER_FROM_ENEMY, // data for this one is there MINIMUM aceptable distance to the cover. + TASK_FIND_COVER_FROM_ORIGIN, + TASK_EAT, + TASK_DIE, + TASK_WAIT_FOR_SCRIPT, + TASK_PLAY_SCRIPT, + TASK_ENABLE_SCRIPT, + TASK_PLANT_ON_SCRIPT, + TASK_FACE_SCRIPT, + TASK_WAIT_RANDOM, + TASK_WAIT_INDEFINITE, + TASK_STOP_MOVING, + TASK_TURN_LEFT, + TASK_TURN_RIGHT, + TASK_REMEMBER, + TASK_FORGET, + TASK_WAIT_FOR_MOVEMENT, // wait until MovementIsComplete() + LAST_COMMON_TASK, // LEAVE THIS AT THE BOTTOM!! (sjb) + +} SHARED_TASKS; + +// These go in the flData member of the TASK_WALK_TO_TARGET, TASK_RUN_TO_TARGET +enum +{ + TARGET_MOVE_NORMAL = 0, + TARGET_MOVE_SCRIPTED = 1, +}; + +// A goal should be used for a task that requires several schedules to complete. +// The goal index should indicate which schedule (ordinally) the monster is running. +// That way, when tasks fail, the AI can make decisions based on the context of the +// current goal and sequence rather than just the current schedule. +enum +{ + GOAL_ATTACK_ENEMY, + GOAL_MOVE, + GOAL_TAKE_COVER, + GOAL_MOVE_TARGET, + GOAL_EAT, +}; + +// an array of tasks is a task list +// an array of schedules is a schedule list +struct Task_t +{ + int iTask; + float flData; +}; + +struct Schedule_t +{ + + Task_t *pTasklist; + int cTasks; + int iInterruptMask;// a bit mask of conditions that can interrupt this schedule + + // a more specific mask that indicates which TYPES of sounds will interrupt the schedule in the + // event that the schedule is broken by COND_HEAR_SOUND + int iSoundMask; + const char *pName; +}; + +// an array of waypoints makes up the monster's route. +// !!!LATER- this declaration doesn't belong in this file. +struct WayPoint_t +{ + Vector vecLocation; + int iType; +}; + +#endif // SCHEDULE_H diff --git a/regamedll/dlls/soundent.cpp b/regamedll/dlls/soundent.cpp index 5ff8dea7..807f0b22 100644 --- a/regamedll/dlls/soundent.cpp +++ b/regamedll/dlls/soundent.cpp @@ -10,9 +10,16 @@ NOBODY void CSound::Clear(void) { } +// Reset - clears the volume, origin, and type for a sound, +// but doesn't expire or unlink it. + /* <178d8f> ../cstrike/dlls/soundent.cpp:43 */ -NOBODY void CSound::Reset(void) +void CSound::Reset(void) { + m_vecOrigin = g_vecZero; + m_iNext = SOUNDLIST_EMPTY; + m_iType = 0; + m_iVolume = 0; } /* <178db7> ../cstrike/dlls/soundent.cpp:54 */ @@ -123,18 +130,52 @@ NOBODY int CSoundEnt::FreeList(void) { } +// SoundPointerForIndex - returns a pointer to the instance +// of CSound at index's position in the sound pool. + /* <179093> ../cstrike/dlls/soundent.cpp:339 */ -NOBODY CSound *CSoundEnt::SoundPointerForIndex(int iIndex) +CSound *CSoundEnt::SoundPointerForIndex(int iIndex) { + if (!pSoundEnt) + { + return NULL; + } + + if (iIndex > (MAX_WORLD_SOUNDS - 1)) + { + ALERT(at_console, "SoundPointerForIndex() - Index too large!\n"); + return NULL; + } + + if (iIndex < 0) + { + ALERT(at_console, "SoundPointerForIndex() - Index < 0!\n"); + return NULL; + } + + return &pSoundEnt->m_SoundPool[ iIndex ]; } +// Clients are numbered from 1 to MAXCLIENTS, but the client +// reserved sounds in the soundlist are from 0 to MAXCLIENTS - 1, +// so this function ensures that a client gets the proper index +// to his reserved sound in the soundlist. + /* <1790b8> ../cstrike/dlls/soundent.cpp:367 */ -NOBODY int CSoundEnt::ClientSoundIndex(edict_t *pClient) +int CSoundEnt::ClientSoundIndex(edict_t *pClient) { -// { -// int iReturn; // 369 -// ENTINDEX(edict_t *pEdict); // 369 -// } + int iReturn = ENTINDEX(pClient) - 1; + +#if defined(_DEBUG) && !defined(HOOK_GAMEDLL) + + if (iReturn < 0 || iReturn > gpGlobals->maxClients) + { + ALERT(at_console, "** ClientSoundIndex returning a bogus value! **\n"); + } + +#endif // _DEBUG && !HOOK_GAMEDLL + + return iReturn; } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/soundent.h b/regamedll/dlls/soundent.h index 67390b2b..af10119f 100644 --- a/regamedll/dlls/soundent.h +++ b/regamedll/dlls/soundent.h @@ -36,10 +36,10 @@ // spawns, and handles the world's active and free sound // lists. -#define MAX_WORLD_SOUNDS 64 // maximum number of sounds handled by the world at one time. +#define MAX_WORLD_SOUNDS 64 // maximum number of sounds handled by the world at one time. #define bits_SOUND_NONE 0 -#define bits_SOUND_COMBAT (1 << 0) // gunshots, explosions +#define bits_SOUND_COMBAT (1 << 0) // gunshots, explosions #define bits_SOUND_WORLD (1 << 1) // door opening/closing, glass breaking #define bits_SOUND_PLAYER (1 << 2) // all noises generated by player. walking, shooting, falling, splashing #define bits_SOUND_CARCASS (1 << 3) // dead body @@ -52,7 +52,7 @@ #define SOUNDLIST_EMPTY -1 #define SOUNDLISTTYPE_FREE 1 // identifiers passed to functions that can operate on either list, to indicate which list to operate on. #define SOUNDLISTTYPE_ACTIVE 2 -#define SOUND_NEVER_EXPIRE -1 // with this set as a sound's ExpireTime, the sound will never expire. +#define SOUND_NEVER_EXPIRE -1 // with this set as a sound's ExpireTime, the sound will never expire. // CSound - an instance of a sound in the world. @@ -61,7 +61,7 @@ class CSound { public: NOBODY void Clear(void); - NOBODY void Reset(void); + void Reset(void); NOBODY BOOL FIsSound(void); NOBODY BOOL FIsScent(void); diff --git a/regamedll/dlls/subs.cpp b/regamedll/dlls/subs.cpp index 33363cf9..efdeee5a 100644 --- a/regamedll/dlls/subs.cpp +++ b/regamedll/dlls/subs.cpp @@ -206,7 +206,7 @@ void CBaseDelay::SUB_UseTargets(CBaseEntity *pActivator, USE_TYPE useType, float if (pTemp->pev->classname) RemoveEntityHashValue(pTemp->pev, STRING(pTemp->pev->classname), CLASSNAME); - MAKE_STRING_CLASS("DelayedUse",pTemp->pev); + MAKE_STRING_CLASS("DelayedUse", pTemp->pev); AddEntityHashValue(pTemp->pev, STRING(pTemp->pev->classname), CLASSNAME); pTemp->pev->nextthink = gpGlobals->time + m_flDelay; diff --git a/regamedll/dlls/training_gamerules.cpp b/regamedll/dlls/training_gamerules.cpp index 056984be..9a64ad70 100644 --- a/regamedll/dlls/training_gamerules.cpp +++ b/regamedll/dlls/training_gamerules.cpp @@ -144,8 +144,9 @@ NOBODY BOOL CHalfLifeTraining::FPlayerCanRespawn_(CBasePlayer *pPlayer) } /* <18bd40> ../cstrike/dlls/training_gamerules.cpp:190 */ -NOBODY bool CHalfLifeTraining::PlayerCanBuy(CBasePlayer *pPlayer) +bool CHalfLifeTraining::PlayerCanBuy(CBasePlayer *pPlayer) { + return pPlayer->m_signals.GetState() & SIGNAL_BUY; } /* <18afa5> ../cstrike/dlls/training_gamerules.cpp:195 */ diff --git a/regamedll/dlls/training_gamerules.h b/regamedll/dlls/training_gamerules.h index 168899b4..476a6bf1 100644 --- a/regamedll/dlls/training_gamerules.h +++ b/regamedll/dlls/training_gamerules.h @@ -71,13 +71,14 @@ public: public: static void HostageDied(void); - NOBODY static bool PlayerCanBuy(CBasePlayer *pPlayer); + static bool PlayerCanBuy(CBasePlayer *pPlayer); private: float FillAccountTime; float ServerRestartTime; BOOL fInBuyArea; BOOL fVisitedBuyArea; bool fVGUIMenus; + };/* size: 728, cachelines: 12, members: 6 */ /* <18a1d5> ../cstrike/dlls/training_gamerules.cpp:252 */ diff --git a/regamedll/dlls/triggers.cpp b/regamedll/dlls/triggers.cpp index 2088eabb..21195cfb 100644 --- a/regamedll/dlls/triggers.cpp +++ b/regamedll/dlls/triggers.cpp @@ -991,7 +991,7 @@ NOBODY void CTriggerChangeTarget::Spawn_(void) } /* <1a010d> ../cstrike/dlls/triggers.cpp:2376 */ -NOBODY void CTriggerChangeTarget::Use_(CBaseEntity *pActivator, class CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTriggerChangeTarget::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // class CBaseEntity *pTarget; // 2378 @@ -1361,6 +1361,21 @@ void CTriggerPush::Touch(CBaseEntity *pOther) Touch_(pOther); } +void CTriggerTeleport::Spawn(void) +{ + Spawn_(); +} + +void CBuyZone::Spawn(void) +{ + Spawn_(); +} + +void CBombTarget::Spawn(void) +{ + Spawn_(); +} + void CHostageRescue::Spawn(void) { Spawn_(); diff --git a/regamedll/dlls/unisignals.h b/regamedll/dlls/unisignals.h index 5ee92661..7d3f4512 100644 --- a/regamedll/dlls/unisignals.h +++ b/regamedll/dlls/unisignals.h @@ -44,10 +44,10 @@ public: public: void Update(void) { -// int old; // 46 + int old = m_flSignal; - m_flState = m_flSignal; m_flSignal = 0; + m_flState = old; } void Signal(int flags) { diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp index 3f5ba48a..7074a76b 100644 --- a/regamedll/dlls/util.cpp +++ b/regamedll/dlls/util.cpp @@ -570,6 +570,8 @@ void UTIL_MakeInvVectors(const Vector &vec, globalvars_t *pgv) { MAKE_VECTORS(vec); + pgv->v_right = pgv->v_right * -1; + SWAP(pgv->v_forward.y, pgv->v_right.x); SWAP(pgv->v_forward.z, pgv->v_up.x); SWAP(pgv->v_right.z, pgv->v_up.y); @@ -667,8 +669,8 @@ NOXREF void UTIL_ScreenShakeAll(const Vector ¢er, float amplitude, float fre /* <1ac3a1> ../cstrike/dlls/util.cpp:858 */ void UTIL_ScreenFadeBuild(ScreenFade &fade, const Vector &color, float fadeTime, float fadeHold, int alpha, int flags) { - fade.duration = FixedUnsigned16(fadeTime,1<<12); - fade.holdTime = FixedUnsigned16(fadeHold,1<<12); + fade.duration = FixedUnsigned16(fadeTime, 1<<12); + fade.holdTime = FixedUnsigned16(fadeHold, 1<<12); fade.r = (int)color.x; fade.g = (int)color.y; fade.b = (int)color.z; @@ -1374,10 +1376,6 @@ void UTIL_StringToIntArray(int *pVector, int count, const char *pString) Q_strcpy(tempString, pString); -#ifdef GAMEDLL_FIXES - tempString[127] = 0; -#endif // GAMEDLL_FIXES - pstr = tempString; pfront = tempString; diff --git a/regamedll/dlls/util.h b/regamedll/dlls/util.h index b55fef85..83f99a4f 100644 --- a/regamedll/dlls/util.h +++ b/regamedll/dlls/util.h @@ -38,6 +38,11 @@ static int iNumPassed = 0;\ printf2(__FUNCTION__":: iNumPassed - %d", iNumPassed++); +#define _LOG_TRACE2\ + static int iNumPassedt = 0;\ + printf2(__FUNCTION__":: iNumPassed - %d", iNumPassedt++);\ + _logf(__FUNCTION__":: iNumPassed - %d", iNumPassedt++); + // Makes these more explicit, and easier to find #ifdef HOOK_GAMEDLL @@ -51,6 +56,9 @@ #endif // HOOK_GAMEDLL +#define eoNullEntity 0 // Testing the three types of "entity" for nullity +#define iStringNull 0 // Testing strings for nullity + #define cchMapNameMost 32 #define CBSENTENCENAME_MAX 16 @@ -69,9 +77,9 @@ extern globalvars_t *gpGlobals; // Dot products for view cone checking #define VIEW_FIELD_FULL -1.0 // +-180 degrees -#define VIEW_FIELD_WIDE -0.7 // +-135 degrees 0.1 // +-85 degrees, used for full FOV checks -#define VIEW_FIELD_NARROW 0.7 // +-45 degrees, more narrow check used to set up ranged attacks -#define VIEW_FIELD_ULTRA_NARROW 0.9 // +-25 degrees, more narrow check used to set up ranged attacks +#define VIEW_FIELD_WIDE -0.7 // +-135 degrees 0.1 // +-85 degrees, used for full FOV checks +#define VIEW_FIELD_NARROW 0.7 // +-45 degrees, more narrow check used to set up ranged attacks +#define VIEW_FIELD_ULTRA_NARROW 0.9 // +-25 degrees, more narrow check used to set up ranged attacks #define SND_SPAWNING (1<<8) // duplicated in protocol.h we're spawing, used in some cases for ambients #define SND_STOP (1<<5) // duplicated in protocol.h stop sound @@ -93,7 +101,7 @@ extern globalvars_t *gpGlobals; #define SVC_CDTRACK 32 #define SVC_WEAPONANIM 35 #define SVC_ROOMTYPE 37 -#define SVC_DIRECTOR 51 +#define SVC_DIRECTOR 51 #define VEC_HULL_MIN_Z Vector(0, 0, -36) #define VEC_DUCK_HULL_MIN_Z Vector(0, 0, -18) @@ -101,36 +109,32 @@ extern globalvars_t *gpGlobals; #define VEC_HULL_MIN Vector(-16, -16, -36) #define VEC_HULL_MAX Vector(16, 16, 36) +#define VEC_VIEW Vector(0, 0, 17) + #define VEC_DUCK_HULL_MIN Vector(-16, -16, -18) #define VEC_DUCK_HULL_MAX Vector(16, 16, 32) #define VEC_DUCK_VIEW Vector(0, 0, 12) -#ifndef HOOK_GAMEDLL - -#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName)\ +#define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName)\ C_DLLEXPORT void mapClassName(entvars_t *pev);\ void mapClassName(entvars_t *pev)\ {\ GetClassPtr((DLLClassName *)pev);\ } -#else // HOOK_GAMEDLL - -// NOTE: There is no need to link the objects with HOOK_GAMEDLL -#define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName) - -#endif // HOOK_GAMEDLL typedef enum { ignore_monsters = 1, dont_ignore_monsters = 0, missile = 2 + } IGNORE_MONSTERS; typedef enum { ignore_glass = 1, dont_ignore_glass = 0 + } IGNORE_GLASS; enum @@ -152,6 +156,7 @@ typedef enum MONSTERSTATE_SCRIPT, MONSTERSTATE_PLAYDEAD, MONSTERSTATE_DEAD + } MONSTERSTATE; typedef struct hudtextparms_s @@ -166,6 +171,7 @@ typedef struct hudtextparms_s float holdTime; float fxTime; int channel; + } hudtextparms_t; /* size: 40, cachelines: 1, members: 16 */ @@ -177,6 +183,7 @@ public: private: int m_oldgroupmask; int m_oldgroupop; + };/* size: 8, cachelines: 1, members: 2 */ /* <5da42> ../cstrike/dlls/util.h:67 */ @@ -275,7 +282,7 @@ inline BOOL FNullEnt(const edict_t *pent) /* <1c1cb> ../cstrike/dlls/util.h:203 */ inline BOOL FStringNull(int iString) { - return (iString == 0); + return (iString == iStringNull); } /* <42e8> ../cstrike/dlls/util.h:246 */ @@ -336,6 +343,8 @@ extern int g_groupmask; extern int g_groupop; extern const int gSizes[18]; +unsigned int U_Random(void); +void U_Srand(unsigned int seed); int UTIL_SharedRandomLong(unsigned int seed, int low, int high); float UTIL_SharedRandomFloat(unsigned int seed, float low, float high); NOXREF void UTIL_ParametricRocket(entvars_t *pev, Vector vecOrigin, Vector vecAngles, edict_t *owner); @@ -426,13 +435,6 @@ NOXREF int GetPlayerTeam(int index); bool UTIL_IsGame(const char *gameName); float UTIL_GetPlayerGaitYaw(int playerIndex); -// combat.cpp -NOBODY void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType); -NOBODY void GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity); -NOBODY void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); -NOBODY void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); -NOXREF char *vstr(float *v); - /* * Declared for function overload */ diff --git a/regamedll/dlls/vector.h b/regamedll/dlls/vector.h index dbc1d688..89ca9adf 100644 --- a/regamedll/dlls/vector.h +++ b/regamedll/dlls/vector.h @@ -50,7 +50,6 @@ class Vector2D { public: vec_t x, y; - inline Vector2D(void) : x(0.0), y(0.0) { } @@ -67,6 +66,20 @@ public: { return Vector2D(x - v.x, y - v.y); } +#ifdef HOOK_GAMEDLL + inline Vector2D operator*(float_precision fl) const + { + return Vector2D((vec_t)(x * fl), (vec_t)(y * fl)); + } + inline Vector2D operator/(float_precision fl) const + { + return Vector2D((vec_t)(x / fl), (vec_t)(y / fl)); + } + inline Vector2D operator/=(float_precision fl) const + { + return Vector2D((vec_t)(x / fl), (vec_t)(y / fl)); + } +#else inline Vector2D operator*(float fl) const { return Vector2D(x * fl, y * fl); @@ -79,36 +92,26 @@ public: { return Vector2D(x / fl, y / fl); } -#ifdef HOOK_GAMEDLL +#endif // HOOK_GAMEDLL inline double Length(void) const { - return sqrt((double)(x * x + y * y)); + return sqrt((float_precision)(x * x + y * y)); } -#else - inline float Length(void) const - { - return sqrt(x * x + y * y); - } -#endif // HOOK_GAMEDLL inline float LengthSquared(void) const { return (x * x + y * y); } inline Vector2D Normalize(void) const { + float_precision flLength = Length(); + if (!flLength) + return Vector2D(0, 0); + + flLength = 1 / flLength; + #ifdef HOOK_GAMEDLL - double flLength = Length(); - if (!flLength) - return Vector2D(0, 0); - - flLength = 1 / flLength; - return Vector2D((float)(x * flLength), (float)(y * flLength)); + return Vector2D((vec_t)(x * flLength), (vec_t)(y * flLength)); #else - float flLength = Length(); - if (!flLength) - return Vector2D(0, 0); - - flLength = 1 / flLength; return Vector2D(x * flLength, y * flLength); #endif // HOOK_GAMEDLL } @@ -197,6 +200,20 @@ public: { return Vector(x - v.x, y - v.y, z - v.z); } +#ifdef HOOK_GAMEDLL + inline Vector operator*(float_precision fl) const + { + return Vector((vec_t)(x * fl), (vec_t)(y * fl), (vec_t)(z * fl)); + } + inline Vector operator/(float_precision fl) const + { + return Vector((vec_t)(x / fl), (vec_t)(y / fl), (vec_t)(z / fl)); + } + inline Vector operator/=(float_precision fl) const + { + return Vector((vec_t)(x / fl), (vec_t)(y / fl), (vec_t)(z / fl)); + } +#else inline Vector operator*(float fl) const { return Vector(x * fl, y * fl, z * fl); @@ -209,23 +226,18 @@ public: { return Vector(x / fl, y / fl, z / fl); } +#endif // HOOK_GAMEDLL + inline void CopyToArray(float *rgfl) const { rgfl[0] = x; rgfl[1] = y; rgfl[2] = z; } -#ifdef HOOK_GAMEDLL inline double Length(void) const { - return sqrt((double)(x * x + y * y + z * z)); + return sqrt((float_precision)(x * x + y * y + z * z)); } -#else - inline float Length(void) const - { - return sqrt(x * x + y * y + z * z); - } -#endif // HOOK_GAMEDLL inline float LengthSquared(void) const { return (x * x + y * y + z * z); @@ -240,17 +252,16 @@ public: } inline Vector Normalize(void) const { -#ifdef HOOK_GAMEDLL - double flLength = Length(); -#else - float flLength = Length(); -#endif // HOOK_GAMEDLL - + float_precision flLength = Length(); if (!flLength) return Vector(0, 0, 1); flLength = 1 / flLength; - return Vector((float)(x * flLength), (float)(y * flLength), (float)(z * flLength)); +#ifdef HOOK_GAMEDLL + return Vector((vec_t)(x * flLength), (vec_t)(y * flLength), (vec_t)(z * flLength)); +#else + return Vector(x * flLength, y * flLength, z * flLength); +#endif // HOOK_GAMEDLL } inline Vector2D Make2D(void) const { @@ -259,17 +270,10 @@ public: Vec2.y = y; return Vec2; } -#ifdef HOOK_GAMEDLL inline double Length2D(void) const { - return sqrt((double)(x * x + y * y)); + return sqrt((float_precision)(x * x + y * y)); } -#else - inline double Length2D(void) const - { - return sqrt(x * x + y * y); - } -#endif // HOOK_GAMEDLL inline bool IsLengthLessThan(float length) const { return (LengthSquared() < length * length); diff --git a/regamedll/dlls/vehicle.cpp b/regamedll/dlls/vehicle.cpp index dd4e9ff8..5820ad1b 100644 --- a/regamedll/dlls/vehicle.cpp +++ b/regamedll/dlls/vehicle.cpp @@ -586,4 +586,9 @@ void CFuncVehicle::Blocked(CBaseEntity *pOther) Blocked_(pOther); } +void CFuncVehicleControls::Spawn(void) +{ + Spawn_(); +} + #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/weapons.h b/regamedll/dlls/weapons.h index 2d48db32..0e0444ed 100644 --- a/regamedll/dlls/weapons.h +++ b/regamedll/dlls/weapons.h @@ -54,6 +54,23 @@ class CBasePlayer; // the maximum amount of ammo each weapon's clip can hold #define WEAPON_NOCLIP -1 +#define LOUD_GUN_VOLUME 1000 +#define NORMAL_GUN_VOLUME 600 +#define QUIET_GUN_VOLUME 200 + +#define BRIGHT_GUN_FLASH 512 +#define NORMAL_GUN_FLASH 256 +#define DIM_GUN_FLASH 128 + +#define BIG_EXPLOSION_VOLUME 2048 +#define NORMAL_EXPLOSION_VOLUME 1024 +#define SMALL_EXPLOSION_VOLUME 512 + +#define WEAPON_ACTIVITY_VOLUME 64 + +// spawn flags +#define SF_DETONATE 0x0001 // Grenades flagged with this will be triggered when the owner calls detonateSatchelCharges + typedef struct { WeaponType type; @@ -118,20 +135,20 @@ public: class CGrenade: public CBaseMonster { public: - NOBODY virtual void Spawn(void); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual void Killed(entvars_t *pevAttacker,int iGib); - NOBODY virtual int BloodColor(void) + virtual void Killed(entvars_t *pevAttacker,int iGib); + virtual int BloodColor(void) { return BloodColor_(); } - NOBODY virtual void Use(CBaseEntity *pActivator,CBaseEntity *pCaller,USE_TYPE useType,float value); - NOBODY virtual void BounceSound(void); + virtual void Use(CBaseEntity *pActivator,CBaseEntity *pCaller,USE_TYPE useType,float value); + virtual void BounceSound(void); #ifdef HOOK_GAMEDLL @@ -157,41 +174,42 @@ public: { SATCHEL_DETONATE, SATCHEL_RELEASE + } SATCHELCODE; public: - NOBODY static CGrenade *ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time); - NOBODY static CGrenade *ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent); - NOBODY static CGrenade *ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); - NOBODY static CGrenade *ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent); - NOBODY static CGrenade *ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); - NOBODY static void UseSatchelCharges(entvars_t *pevOwner, SATCHELCODE code); + static CGrenade *ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time); + static CGrenade *ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent); + NOXREF static CGrenade *ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); + static CGrenade *ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent); + static CGrenade *ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); + NOXREF static void UseSatchelCharges(entvars_t *pevOwner, SATCHELCODE code); public: - NOBODY void Explode(Vector vecSrc, Vector vecAim); - NOBODY void Explode(TraceResult *pTrace, int bitsDamageType); - NOBODY void Explode2(TraceResult *pTrace, int bitsDamageType); - NOBODY void Explode3(TraceResult *pTrace, int bitsDamageType); - NOBODY void SG_Explode(TraceResult *pTrace, int bitsDamageType); + void Explode(Vector vecSrc, Vector vecAim); + void Explode(TraceResult *pTrace, int bitsDamageType); + void Explode2(TraceResult *pTrace, int bitsDamageType); + void Explode3(TraceResult *pTrace, int bitsDamageType); + NOXREF void SG_Explode(TraceResult *pTrace, int bitsDamageType); - NOBODY void EXPORT Smoke(void); - NOBODY void EXPORT Smoke2(void); - NOBODY void EXPORT Smoke3_A(void); - NOBODY void EXPORT Smoke3_B(void); - NOBODY void EXPORT Smoke3_C(void); - NOBODY void EXPORT SG_Smoke(void); - NOBODY void EXPORT BounceTouch(CBaseEntity *pOther); - NOBODY void EXPORT SlideTouch(CBaseEntity *pOther); + void EXPORT Smoke(void); + void EXPORT Smoke2(void); + void EXPORT Smoke3_A(void); + void EXPORT Smoke3_B(void); + void EXPORT Smoke3_C(void); + void EXPORT SG_Smoke(void); + void EXPORT BounceTouch(CBaseEntity *pOther); + void EXPORT SlideTouch(CBaseEntity *pOther); void EXPORT C4Touch(CBaseEntity *pOther); - NOBODY void EXPORT ExplodeTouch(CBaseEntity *pOther); - NOBODY void EXPORT DangerSoundThink(void); - NOBODY void EXPORT PreDetonate(void); - NOBODY void EXPORT Detonate(void); - NOBODY void EXPORT SG_Detonate(void); - NOBODY void EXPORT Detonate2(void); - NOBODY void EXPORT Detonate3(void); - NOBODY void EXPORT DetonateUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); - NOBODY void EXPORT TumbleThink(void); - NOBODY void EXPORT SG_TumbleThink(void); - NOBODY void EXPORT C4Think(void); + void EXPORT ExplodeTouch(CBaseEntity *pOther); + void EXPORT DangerSoundThink(void); + void EXPORT PreDetonate(void); + void EXPORT Detonate(void); + void EXPORT SG_Detonate(void); + void EXPORT Detonate2(void); + void EXPORT Detonate3(void); + void EXPORT DetonateUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + void EXPORT TumbleThink(void); + void EXPORT SG_TumbleThink(void); + void EXPORT C4Think(void); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[15]; @@ -1640,6 +1658,7 @@ extern short g_sModelIndexRadio; extern MULTIDAMAGE gMultiDamage; NOBODY void FindHullIntersection(Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity); +void AnnounceFlashInterval(float interval, float offset = 0); int MaxAmmoCarry(int iszName); void ClearMultiDamage(void); @@ -1656,4 +1675,6 @@ NOXREF void UTIL_PrecacheOtherWeapon2(const char *szClassname); void W_Precache(void); NOXREF BOOL CanAttack(float attack_time, float curtime, BOOL isPredicted); +C_DLLEXPORT void weapon_usp(entvars_t *pev); + #endif // WEAPONS_H diff --git a/regamedll/dlls/wpn_shared/wpn_usp.cpp b/regamedll/dlls/wpn_shared/wpn_usp.cpp index 0d847ff8..1dd12875 100644 --- a/regamedll/dlls/wpn_shared/wpn_usp.cpp +++ b/regamedll/dlls/wpn_shared/wpn_usp.cpp @@ -41,7 +41,7 @@ void CUSP::Spawn_(void) { Precache(); m_iId = WEAPON_USP; - SET_MODEL(ENT(pev),"models/w_usp.mdl"); + SET_MODEL(ENT(pev), "models/w_usp.mdl"); m_iWeaponState &= ~WPNSTATE_SHIELD_DRAWN; m_iDefaultAmmo = 12;//TODO: Default clip USP_MAX_CLIP m_flAccuracy = 0.92f; diff --git a/regamedll/engine/bspfile.h b/regamedll/engine/bspfile.h index 47f408c0..37cc9f95 100644 --- a/regamedll/engine/bspfile.h +++ b/regamedll/engine/bspfile.h @@ -49,23 +49,23 @@ #define CONTENTS_TRANSLUCENT -15 -#define LUMP_ENTITIES 0 -#define LUMP_PLANES 1 -#define LUMP_TEXTURES 2 -#define LUMP_VERTEXES 3 -#define LUMP_VISIBILITY 4 -#define LUMP_NODES 5 -#define LUMP_TEXINFO 6 -#define LUMP_FACES 7 -#define LUMP_LIGHTING 8 -#define LUMP_CLIPNODES 9 -#define LUMP_LEAFS 10 -#define LUMP_MARKSURFACES 11 -#define LUMP_EDGES 12 -#define LUMP_SURFEDGES 13 -#define LUMP_MODELS 14 +#define LUMP_ENTITIES 0 +#define LUMP_PLANES 1 +#define LUMP_TEXTURES 2 +#define LUMP_VERTEXES 3 +#define LUMP_VISIBILITY 4 +#define LUMP_NODES 5 +#define LUMP_TEXINFO 6 +#define LUMP_FACES 7 +#define LUMP_LIGHTING 8 +#define LUMP_CLIPNODES 9 +#define LUMP_LEAFS 10 +#define LUMP_MARKSURFACES 11 +#define LUMP_EDGES 12 +#define LUMP_SURFEDGES 13 +#define LUMP_MODELS 14 -#define HEADER_LUMPS 15 +#define HEADER_LUMPS 15 /* ../engine/bspfile.h:41 */ typedef struct lump_s diff --git a/regamedll/engine/edict.h b/regamedll/engine/edict.h index 685744d5..c8af9541 100644 --- a/regamedll/engine/edict.h +++ b/regamedll/engine/edict.h @@ -32,7 +32,7 @@ #pragma once #endif -#define MAX_ENT_LEAFS 48 +#define MAX_ENT_LEAFS 48 #include "progdefs.h" diff --git a/regamedll/engine/keydefs.h b/regamedll/engine/keydefs.h index 4adeeab6..aec54c98 100644 --- a/regamedll/engine/keydefs.h +++ b/regamedll/engine/keydefs.h @@ -1,4 +1,4 @@ -//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ // // Purpose: // @@ -17,53 +17,53 @@ // // these are the key numbers that should be passed to Key_Event // -#define K_TAB 9 -#define K_ENTER 13 -#define K_ESCAPE 27 -#define K_SPACE 32 +#define K_TAB 9 +#define K_ENTER 13 +#define K_ESCAPE 27 +#define K_SPACE 32 // normal keys should be passed as lowercased ascii -#define K_BACKSPACE 127 -#define K_UPARROW 128 -#define K_DOWNARROW 129 -#define K_LEFTARROW 130 -#define K_RIGHTARROW 131 +#define K_BACKSPACE 127 +#define K_UPARROW 128 +#define K_DOWNARROW 129 +#define K_LEFTARROW 130 +#define K_RIGHTARROW 131 -#define K_ALT 132 -#define K_CTRL 133 -#define K_SHIFT 134 -#define K_F1 135 -#define K_F2 136 -#define K_F3 137 -#define K_F4 138 -#define K_F5 139 -#define K_F6 140 -#define K_F7 141 -#define K_F8 142 -#define K_F9 143 -#define K_F10 144 -#define K_F11 145 -#define K_F12 146 -#define K_INS 147 -#define K_DEL 148 -#define K_PGDN 149 -#define K_PGUP 150 -#define K_HOME 151 -#define K_END 152 +#define K_ALT 132 +#define K_CTRL 133 +#define K_SHIFT 134 +#define K_F1 135 +#define K_F2 136 +#define K_F3 137 +#define K_F4 138 +#define K_F5 139 +#define K_F6 140 +#define K_F7 141 +#define K_F8 142 +#define K_F9 143 +#define K_F10 144 +#define K_F11 145 +#define K_F12 146 +#define K_INS 147 +#define K_DEL 148 +#define K_PGDN 149 +#define K_PGUP 150 +#define K_HOME 151 +#define K_END 152 #define K_KP_HOME 160 #define K_KP_UPARROW 161 #define K_KP_PGUP 162 -#define K_KP_LEFTARROW 163 +#define K_KP_LEFTARROW 163 #define K_KP_5 164 #define K_KP_RIGHTARROW 165 #define K_KP_END 166 #define K_KP_DOWNARROW 167 #define K_KP_PGDN 168 -#define K_KP_ENTER 169 +#define K_KP_ENTER 169 #define K_KP_INS 170 -#define K_KP_DEL 171 +#define K_KP_DEL 171 #define K_KP_SLASH 172 #define K_KP_MINUS 173 #define K_KP_PLUS 174 @@ -73,47 +73,47 @@ // // joystick buttons // -#define K_JOY1 203 -#define K_JOY2 204 -#define K_JOY3 205 -#define K_JOY4 206 +#define K_JOY1 203 +#define K_JOY2 204 +#define K_JOY3 205 +#define K_JOY4 206 // // aux keys are for multi-buttoned joysticks to generate so they can use // the normal binding process // -#define K_AUX1 207 -#define K_AUX2 208 -#define K_AUX3 209 -#define K_AUX4 210 -#define K_AUX5 211 -#define K_AUX6 212 -#define K_AUX7 213 -#define K_AUX8 214 -#define K_AUX9 215 -#define K_AUX10 216 -#define K_AUX11 217 -#define K_AUX12 218 -#define K_AUX13 219 -#define K_AUX14 220 -#define K_AUX15 221 -#define K_AUX16 222 -#define K_AUX17 223 -#define K_AUX18 224 -#define K_AUX19 225 -#define K_AUX20 226 -#define K_AUX21 227 -#define K_AUX22 228 -#define K_AUX23 229 -#define K_AUX24 230 -#define K_AUX25 231 -#define K_AUX26 232 -#define K_AUX27 233 -#define K_AUX28 234 -#define K_AUX29 235 -#define K_AUX30 236 -#define K_AUX31 237 -#define K_AUX32 238 +#define K_AUX1 207 +#define K_AUX2 208 +#define K_AUX3 209 +#define K_AUX4 210 +#define K_AUX5 211 +#define K_AUX6 212 +#define K_AUX7 213 +#define K_AUX8 214 +#define K_AUX9 215 +#define K_AUX10 216 +#define K_AUX11 217 +#define K_AUX12 218 +#define K_AUX13 219 +#define K_AUX14 220 +#define K_AUX15 221 +#define K_AUX16 222 +#define K_AUX17 223 +#define K_AUX18 224 +#define K_AUX19 225 +#define K_AUX20 226 +#define K_AUX21 227 +#define K_AUX22 228 +#define K_AUX23 229 +#define K_AUX24 230 +#define K_AUX25 231 +#define K_AUX26 232 +#define K_AUX27 233 +#define K_AUX28 234 +#define K_AUX29 235 +#define K_AUX30 236 +#define K_AUX31 237 +#define K_AUX32 238 #define K_MWHEELDOWN 239 #define K_MWHEELUP 240 @@ -122,9 +122,9 @@ // // mouse buttons generate virtual keys // -#define K_MOUSE1 241 -#define K_MOUSE2 242 -#define K_MOUSE3 243 +#define K_MOUSE1 241 +#define K_MOUSE2 242 +#define K_MOUSE3 243 #define K_MOUSE4 244 #define K_MOUSE5 245 diff --git a/regamedll/engine/model.h b/regamedll/engine/model.h index 1d2daead..c88644ed 100644 --- a/regamedll/engine/model.h +++ b/regamedll/engine/model.h @@ -38,10 +38,10 @@ //#include "quakedef.h" #include "crc.h" -#define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision +#define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision -#define SURF_PLANEBACK 2 -#define SURF_DRAWSKY 4 +#define SURF_PLANEBACK 2 +#define SURF_DRAWSKY 4 #define SURF_DRAWSPRITE 8 #define SURF_DRAWTURB 0x10 #define SURF_DRAWTILED 0x20 diff --git a/regamedll/engine/progs.h b/regamedll/engine/progs.h index 6c33dba7..90dac5d5 100644 --- a/regamedll/engine/progs.h +++ b/regamedll/engine/progs.h @@ -60,8 +60,8 @@ struct event_state_s #include "edict.h" #endif -#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m))) -#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area) +#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m))) +#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area) //============================================================================ diff --git a/regamedll/game_shared/bot/bot.cpp b/regamedll/game_shared/bot/bot.cpp index 69b18870..25d97427 100644 --- a/regamedll/game_shared/bot/bot.cpp +++ b/regamedll/game_shared/bot/bot.cpp @@ -1,516 +1,518 @@ -#include "precompiled.h" - -/* -* Globals initialization -*/ -#ifndef HOOK_GAMEDLL - -// 30 times per second, just like human clients -float g_flBotCommandInterval = 1.0 / 30.0; - -// full AI only 10 times per second -float g_flBotFullThinkInterval = 1.0 / 10.0; - -const char *BotArgs[4] = { NULL }; -bool UseBotArgs = false; - -#else // HOOK_GAMEDLL - -float g_flBotCommandInterval; -float g_flBotFullThinkInterval; - -const char *BotArgs[4]; -bool UseBotArgs; - -#endif // HOOK_GAMEDLL - -/* <48fed0> ../game_shared/bot/bot.cpp:28 */ -NOBODY CBot::CBot(void) -{ -// CBasePlayer(CBasePlayer *const this); // 28 -// { -// unsigned int nextID; // 34 -// } -} - -/* <48f6ef> ../game_shared/bot/bot.cpp:50 */ -NOBODY bool CBot::Initialize_(const BotProfile *profile) -{ -} - -/* <48fbbd> ../game_shared/bot/bot.cpp:57 */ -NOBODY void CBot::Spawn_(void) -{ -// ResetCommand(CBot *const this); // 80 -} - -/* <48fa37> ../game_shared/bot/bot.cpp:88 */ -NOBODY Vector CBot::GetAutoaimVector_(float flDelta) -{ -// operator+(const Vector *const this, -// const Vector &v); // 90 -// Vector(Vector *const this, -// const Vector &v); // 92 -} - -/* <48ffa8> ../game_shared/bot/bot.cpp:97 */ -void CBot::BotThink(void) -{ - if (gpGlobals->time >= m_flNextBotThink) - { - m_flNextBotThink = gpGlobals->time + g_flBotCommandInterval; - - Upkeep(); - - if (gpGlobals->time >= m_flNextFullBotThink) - { - m_flNextFullBotThink = gpGlobals->time + g_flBotFullThinkInterval; - - ResetCommand(); - Update(); - } - ExecuteCommand(); - } -} - -/* <48f723> ../game_shared/bot/bot.cpp:119 */ -NOBODY void CBot::MoveForward_(void) -{ -// GetMoveSpeed(CBot *const this); // 121 -} - -/* <48f761> ../game_shared/bot/bot.cpp:130 */ -NOBODY void CBot::MoveBackward_(void) -{ -// GetMoveSpeed(CBot *const this); // 132 -} - -/* <48f79f> ../game_shared/bot/bot.cpp:140 */ -NOBODY void CBot::StrafeLeft_(void) -{ -// GetMoveSpeed(CBot *const this); // 142 -} - -/* <48f7dd> ../game_shared/bot/bot.cpp:150 */ -NOBODY void CBot::StrafeRight_(void) -{ -// GetMoveSpeed(CBot *const this); // 152 -} - -/* <48fe00> ../game_shared/bot/bot.cpp:160 */ -NOBODY bool CBot::Jump_(bool mustJump) -{ -// { -// float const sanityInterval; // 173 -// IsJumping(CBot *const this); // 162 -// { -// float const minJumpInterval; // 167 -// } -// } -// Jump(CBot *const this, -// bool mustJump); // 160 -} - -/* <48f81b> ../game_shared/bot/bot.cpp:187 */ -NOBODY void CBot::ClearMovement_(void) -{ -// ResetCommand(CBot *const this); // 189 -} - -/* <48ffe7> ../game_shared/bot/bot.cpp:196 */ -NOBODY bool CBot::IsJumping(void) -{ -} - -/* <48f859> ../game_shared/bot/bot.cpp:214 */ -NOBODY void CBot::Crouch_(void) -{ -} - -/* <48f87f> ../game_shared/bot/bot.cpp:220 */ -NOBODY void CBot::StandUp_(void) -{ -} - -/* <48f8a5> ../game_shared/bot/bot.cpp:227 */ -NOBODY void CBot::UseEnvironment_(void) -{ -} - -/* <48f8cb> ../game_shared/bot/bot.cpp:234 */ -NOBODY void CBot::PrimaryAttack_(void) -{ -} - -/* <48f8f1> ../game_shared/bot/bot.cpp:240 */ -NOBODY void CBot::ClearPrimaryAttack_(void) -{ -} - -/* <48f917> ../game_shared/bot/bot.cpp:246 */ -void CBot::TogglePrimaryAttack_(void) -{ - if (m_buttonFlags & IN_ATTACK) - m_buttonFlags &= ~IN_ATTACK; - else - m_buttonFlags |= IN_ATTACK; -} - -/* <48f93d> ../game_shared/bot/bot.cpp:260 */ -NOBODY void CBot::SecondaryAttack_(void) -{ -} - -/* <48f963> ../game_shared/bot/bot.cpp:266 */ -NOBODY void CBot::Reload_(void) -{ -} - -/* <490008> ../game_shared/bot/bot.cpp:275 */ -NOBODY float CBot::GetActiveWeaponAmmoRatio(void) const -{ -// { -// class CBasePlayerWeapon *gun; // 277 -// iMaxClip(CBasePlayerItem *const this); // 286 -// } -} - -/* <490058> ../game_shared/bot/bot.cpp:293 */ -NOBODY bool CBot::IsActiveWeaponClipEmpty(void) const -{ -// { -// class CBasePlayerWeapon *gun; // 295 -// } -} - -/* <490096> ../game_shared/bot/bot.cpp:307 */ -NOBODY bool CBot::IsActiveWeaponOutOfAmmo(void) const -{ -// { -// class CBasePlayerWeapon *gun; // 309 -// } -} - -/* <4900d4> ../game_shared/bot/bot.cpp:327 */ -bool CBot::IsUsingScope(void) const -{ - // if our field of view is less than 90, we're looking thru a scope (maybe only true for CS...) - if (m_iFOV < 90.0f) - return true; - - return false; -} - -/* <48f989> ../game_shared/bot/bot.cpp:338 */ -void CBot::ExecuteCommand_(void) -{ - byte adjustedMSec; - - // Adjust msec to command time interval - adjustedMSec = ThrottledMsec(); - - // player model is "munged" - pev->angles = pev->v_angle; - pev->angles.x /= -3.0f; - - // save the command time - m_flPreviousCommandTime = gpGlobals->time; - - if (IsCrouching()) - m_buttonFlags |= IN_DUCK; - - // Run the command - PLAYER_RUN_MOVE( edict(), pev->v_angle, m_forwardSpeed, m_strafeSpeed, m_verticalSpeed, m_buttonFlags, 0, adjustedMSec ); -} - -/* <4900fa> ../game_shared/bot/bot.cpp:362 */ -NOXREF void CBot::ResetCommand(void) -{ +#include "precompiled.h" + +/* +* Globals initialization +*/ +#ifndef HOOK_GAMEDLL + +// 30 times per second, just like human clients +float g_flBotCommandInterval = 1.0 / 30.0; + +// full AI only 10 times per second +float g_flBotFullThinkInterval = 1.0 / 10.0; + +const char *BotArgs[4] = { NULL }; +bool UseBotArgs = false; + +#else // HOOK_GAMEDLL + +float g_flBotCommandInterval; +float g_flBotFullThinkInterval; + +const char *BotArgs[4]; +bool UseBotArgs; + +#endif // HOOK_GAMEDLL + +/* <48fed0> ../game_shared/bot/bot.cpp:28 */ +NOBODY CBot::CBot(void) +{ +// CBasePlayer(CBasePlayer *const this); // 28 +// { +// unsigned int nextID; // 34 +// } +} + +/* <48f6ef> ../game_shared/bot/bot.cpp:50 */ +bool CBot::Initialize_(const BotProfile *profile) +{ + m_profile = profile; + return true; +} + +/* <48fbbd> ../game_shared/bot/bot.cpp:57 */ +NOBODY void CBot::Spawn_(void) +{ +// ResetCommand(CBot *const this); // 80 +} + +/* <48fa37> ../game_shared/bot/bot.cpp:88 */ +NOBODY Vector CBot::GetAutoaimVector_(float flDelta) +{ +// operator+(const Vector *const this, +// const Vector &v); // 90 +// Vector(Vector *const this, +// const Vector &v); // 92 +} + +/* <48ffa8> ../game_shared/bot/bot.cpp:97 */ +void CBot::BotThink(void) +{ + if (gpGlobals->time >= m_flNextBotThink) + { + m_flNextBotThink = gpGlobals->time + g_flBotCommandInterval; + + Upkeep(); + + if (gpGlobals->time >= m_flNextFullBotThink) + { + m_flNextFullBotThink = gpGlobals->time + g_flBotFullThinkInterval; + + ResetCommand(); + Update(); + } + ExecuteCommand(); + } +} + +/* <48f723> ../game_shared/bot/bot.cpp:119 */ +NOBODY void CBot::MoveForward_(void) +{ +// GetMoveSpeed(CBot *const this); // 121 +} + +/* <48f761> ../game_shared/bot/bot.cpp:130 */ +NOBODY void CBot::MoveBackward_(void) +{ +// GetMoveSpeed(CBot *const this); // 132 +} + +/* <48f79f> ../game_shared/bot/bot.cpp:140 */ +NOBODY void CBot::StrafeLeft_(void) +{ +// GetMoveSpeed(CBot *const this); // 142 +} + +/* <48f7dd> ../game_shared/bot/bot.cpp:150 */ +NOBODY void CBot::StrafeRight_(void) +{ +// GetMoveSpeed(CBot *const this); // 152 +} + +/* <48fe00> ../game_shared/bot/bot.cpp:160 */ +NOBODY bool CBot::Jump_(bool mustJump) +{ +// { +// float const sanityInterval; // 173 +// IsJumping(CBot *const this); // 162 +// { +// float const minJumpInterval; // 167 +// } +// } +// Jump(CBot *const this, +// bool mustJump); // 160 +} + +/* <48f81b> ../game_shared/bot/bot.cpp:187 */ +NOBODY void CBot::ClearMovement_(void) +{ +// ResetCommand(CBot *const this); // 189 +} + +/* <48ffe7> ../game_shared/bot/bot.cpp:196 */ +NOBODY bool CBot::IsJumping(void) +{ +} + +/* <48f859> ../game_shared/bot/bot.cpp:214 */ +NOBODY void CBot::Crouch_(void) +{ +} + +/* <48f87f> ../game_shared/bot/bot.cpp:220 */ +NOBODY void CBot::StandUp_(void) +{ +} + +/* <48f8a5> ../game_shared/bot/bot.cpp:227 */ +NOBODY void CBot::UseEnvironment_(void) +{ +} + +/* <48f8cb> ../game_shared/bot/bot.cpp:234 */ +NOBODY void CBot::PrimaryAttack_(void) +{ +} + +/* <48f8f1> ../game_shared/bot/bot.cpp:240 */ +NOBODY void CBot::ClearPrimaryAttack_(void) +{ +} + +/* <48f917> ../game_shared/bot/bot.cpp:246 */ +void CBot::TogglePrimaryAttack_(void) +{ + if (m_buttonFlags & IN_ATTACK) + m_buttonFlags &= ~IN_ATTACK; + else + m_buttonFlags |= IN_ATTACK; +} + +/* <48f93d> ../game_shared/bot/bot.cpp:260 */ +NOBODY void CBot::SecondaryAttack_(void) +{ +} + +/* <48f963> ../game_shared/bot/bot.cpp:266 */ +NOBODY void CBot::Reload_(void) +{ +} + +/* <490008> ../game_shared/bot/bot.cpp:275 */ +NOBODY float CBot::GetActiveWeaponAmmoRatio(void) const +{ +// { +// class CBasePlayerWeapon *gun; // 277 +// iMaxClip(CBasePlayerItem *const this); // 286 +// } +} + +/* <490058> ../game_shared/bot/bot.cpp:293 */ +NOBODY bool CBot::IsActiveWeaponClipEmpty(void) const +{ +// { +// class CBasePlayerWeapon *gun; // 295 +// } +} + +/* <490096> ../game_shared/bot/bot.cpp:307 */ +NOBODY bool CBot::IsActiveWeaponOutOfAmmo(void) const +{ +// { +// class CBasePlayerWeapon *gun; // 309 +// } +} + +/* <4900d4> ../game_shared/bot/bot.cpp:327 */ +bool CBot::IsUsingScope(void) const +{ + // if our field of view is less than 90, we're looking thru a scope (maybe only true for CS...) + if (m_iFOV < 90.0f) + return true; + + return false; +} + +/* <48f989> ../game_shared/bot/bot.cpp:338 */ +void CBot::ExecuteCommand_(void) +{ + byte adjustedMSec; + + // Adjust msec to command time interval + adjustedMSec = ThrottledMsec(); + + // player model is "munged" + pev->angles = pev->v_angle; + pev->angles.x /= -3.0f; + + // save the command time + m_flPreviousCommandTime = gpGlobals->time; + + if (IsCrouching()) + m_buttonFlags |= IN_DUCK; + + // Run the command + PLAYER_RUN_MOVE( edict(), pev->v_angle, m_forwardSpeed, m_strafeSpeed, m_verticalSpeed, m_buttonFlags, 0, adjustedMSec ); +} + +/* <4900fa> ../game_shared/bot/bot.cpp:362 */ +NOXREF void CBot::ResetCommand(void) +{ m_forwardSpeed = 0.0f; m_strafeSpeed = 0.0f; m_verticalSpeed = 0.0f; - m_buttonFlags = 0; -} - -/* <49011b> ../game_shared/bot/bot.cpp:372 */ -NOXREF byte CBot::ThrottledMsec(void) const -{ - int iNewMsec; - - // Estimate Msec to use for this command based on time passed from the previous command - iNewMsec = (int)((gpGlobals->time - m_flPreviousCommandTime) * 1000); - - // Doh, bots are going to be slower than they should if this happens. - // Upgrade that CPU or use less bots! - if (iNewMsec > 255) - iNewMsec = 255; - - return (byte)iNewMsec; -} - -/* <49016e> ../game_shared/bot/bot.cpp:389 */ -NOBODY void CBot::ClientCommand(const char *cmd, const char *arg1, const char *arg2, const char *arg3) -{ - BotArgs[0] = cmd; - BotArgs[1] = arg1; - BotArgs[2] = arg2; - BotArgs[3] = arg3; - - UseBotArgs = true; - ::ClientCommand(ENT(pev)); - UseBotArgs = false; -} - -/* <4901ac> ../game_shared/bot/bot.cpp:410 */ -NOBODY bool CBot::IsEnemy(CBaseEntity *ent) const -{ -// { -// class CBasePlayer *player; // 420 -// } -// IsEnemy(const class CBot *const this, -// class CBaseEntity *ent); // 410 -} - -/* <49021a> ../game_shared/bot/bot.cpp:434 */ -NOBODY int CBot::GetEnemiesRemaining(void) const -{ -// { -// int count; // 436 -// { -// int i; // 438 -// { -// class CBaseEntity *player; // 440 -// FNullEnt(entvars_t *pev); // 445 -// IsEnemy(const class CBot *const this, -// class CBaseEntity *ent); // 451 -// } -// } -// } -} - -/* <490338> ../game_shared/bot/bot.cpp:467 */ -NOBODY int CBot::GetFriendsRemaining(void) const -{ -// { -// int count; // 469 -// { -// int i; // 471 -// { -// class CBaseEntity *player; // 473 -// FNullEnt(entvars_t *pev); // 478 -// IsEnemy(const class CBot *const this, -// class CBaseEntity *ent); // 484 -// } -// } -// } -} - -/* <490489> ../game_shared/bot/bot.cpp:503 */ -bool CBot::IsLocalPlayerWatchingMe(void) const -{ - // avoid crash during spawn - if (pev == NULL) - return false; - - int myIndex = const_cast< CBot * >(this)->entindex(); - - CBasePlayer *player = UTIL_GetLocalPlayer(); - if (player == NULL) - return false; - - if ((player->pev->flags & FL_SPECTATOR || player->m_iTeam == SPECTATOR) && player->pev->iuser2 == myIndex) - { - switch (player->pev->iuser1) - { - case OBS_CHASE_LOCKED: - case OBS_CHASE_FREE: - case OBS_IN_EYE: - return true; - } - } - return false; -} - -/* <4904f2> ../game_shared/bot/bot.cpp:536 */ -NOXREF void CBot::Print(char *format, ...) const -{ - va_list varg; - char buffer[1024]; - - // prefix the message with the bot's name - Q_sprintf(buffer, "%s: ", STRING(pev->netname)); - SERVER_PRINT( buffer ); - - va_start(varg, format); - Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); - va_end(varg); - - SERVER_PRINT(buffer); -} - -/* <490561> ../game_shared/bot/bot.cpp:557 */ -void CBot::PrintIfWatched(char *format, ...) const -{ - if (!cv_bot_debug.value) - return; - - if ((IsLocalPlayerWatchingMe() && (cv_bot_debug.value == 1 || cv_bot_debug.value == 3)) - || (cv_bot_debug.value == 2 || cv_bot_debug.value == 4)) - { - va_list varg; - char buffer[1024]; - - // prefix the message with the bot's name (this can be NULL if bot was just added) - const char *name; - if (pev == NULL) - name = "(NULL pev)"; - else - name = STRING(pev->netname); - - Q_sprintf(buffer, "%s: ", (name != NULL) ? name : "(NULL netname)"); - - SERVER_PRINT( buffer ); - //_logf(buffer); - - va_start(varg, format); - Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); - va_end(varg); - - //_logf(buffer); - - SERVER_PRINT( buffer ); - } -} - -/* <49066c> ../game_shared/bot/bot.cpp:588 */ -ActiveGrenade::ActiveGrenade(int weaponID, CGrenade *grenadeEntity) -{ - m_id = weaponID; - m_entity = grenadeEntity; - m_detonationPosition = grenadeEntity->pev->origin; - m_dieTimestamp = 0; -} - -/* <49069d> ../game_shared/bot/bot.cpp:597 */ -void ActiveGrenade::OnEntityGone(void) -{ - if (m_id == WEAPON_SMOKEGRENADE) - { - // smoke lingers after grenade is gone - const float smokeLingerTime = 4.0f; - m_dieTimestamp = gpGlobals->time + smokeLingerTime; - } - - m_entity = NULL; -} - -/* <4906e1> ../game_shared/bot/bot.cpp:610 */ -bool ActiveGrenade::IsValid(void) const -{ - if (!m_entity) - { - if (gpGlobals->time > m_dieTimestamp) - return false; - } - return true; -} - -/* <490710> ../game_shared/bot/bot.cpp:622 */ -NOXREF const Vector *ActiveGrenade::GetPosition(void) const -{ - return &m_entity->pev->origin; -} - -#ifdef HOOK_GAMEDLL - -void CBot::Spawn(void) -{ - Spawn_(); -} - -Vector CBot::GetAutoaimVector(float flDelta) -{ - return GetAutoaimVector_(flDelta); -} - -bool CBot::Initialize(const BotProfile *profile) -{ - return Initialize_(profile); -} - -void CBot::Crouch(void) -{ - Crouch_(); -} - -void CBot::StandUp(void) -{ - StandUp_(); -} - -void CBot::MoveForward(void) -{ - MoveForward_(); -} - -void CBot::MoveBackward(void) -{ - MoveBackward_(); -} - -void CBot::StrafeLeft(void) -{ - StrafeLeft_(); -} - -void CBot::StrafeRight(void) -{ - StrafeRight_(); -} - -bool CBot::Jump(bool mustJump) -{ - return Jump_(mustJump); -} - -void CBot::ClearMovement(void) -{ - ClearMovement_(); -} - -void CBot::UseEnvironment(void) -{ - UseEnvironment_(); -} - -void CBot::PrimaryAttack(void) -{ - PrimaryAttack_(); -} - -void CBot::ClearPrimaryAttack(void) -{ - ClearPrimaryAttack_(); -} - -void CBot::TogglePrimaryAttack(void) -{ - TogglePrimaryAttack_(); -} - -void CBot::SecondaryAttack(void) -{ - SecondaryAttack_(); -} - -void CBot::Reload(void) -{ - Reload_(); -} - -void CBot::ExecuteCommand(void) -{ - ExecuteCommand_(); -} - + m_buttonFlags = 0; +} + +/* <49011b> ../game_shared/bot/bot.cpp:372 */ +NOXREF byte CBot::ThrottledMsec(void) const +{ + int iNewMsec; + + // Estimate Msec to use for this command based on time passed from the previous command + iNewMsec = (int)((gpGlobals->time - m_flPreviousCommandTime) * 1000); + + // Doh, bots are going to be slower than they should if this happens. + // Upgrade that CPU or use less bots! + if (iNewMsec > 255) + iNewMsec = 255; + + return (byte)iNewMsec; +} + +/* <49016e> ../game_shared/bot/bot.cpp:389 */ +NOBODY void CBot::ClientCommand(const char *cmd, const char *arg1, const char *arg2, const char *arg3) +{ + BotArgs[0] = cmd; + BotArgs[1] = arg1; + BotArgs[2] = arg2; + BotArgs[3] = arg3; + + UseBotArgs = true; + ::ClientCommand(ENT(pev)); + UseBotArgs = false; +} + +/* <4901ac> ../game_shared/bot/bot.cpp:410 */ +NOBODY bool CBot::IsEnemy(CBaseEntity *ent) const +{ +// { +// class CBasePlayer *player; // 420 +// } +// IsEnemy(const class CBot *const this, +// class CBaseEntity *ent); // 410 +} + +/* <49021a> ../game_shared/bot/bot.cpp:434 */ +NOBODY int CBot::GetEnemiesRemaining(void) const +{ +// { +// int count; // 436 +// { +// int i; // 438 +// { +// class CBaseEntity *player; // 440 +// FNullEnt(entvars_t *pev); // 445 +// IsEnemy(const class CBot *const this, +// class CBaseEntity *ent); // 451 +// } +// } +// } +} + +/* <490338> ../game_shared/bot/bot.cpp:467 */ +NOBODY int CBot::GetFriendsRemaining(void) const +{ +// { +// int count; // 469 +// { +// int i; // 471 +// { +// class CBaseEntity *player; // 473 +// FNullEnt(entvars_t *pev); // 478 +// IsEnemy(const class CBot *const this, +// class CBaseEntity *ent); // 484 +// } +// } +// } +} + +/* <490489> ../game_shared/bot/bot.cpp:503 */ +bool CBot::IsLocalPlayerWatchingMe(void) const +{ + // avoid crash during spawn + if (pev == NULL) + return false; + + int myIndex = const_cast< CBot * >(this)->entindex(); + + CBasePlayer *player = UTIL_GetLocalPlayer(); + if (player == NULL) + return false; + + if ((player->pev->flags & FL_SPECTATOR || player->m_iTeam == SPECTATOR) && player->pev->iuser2 == myIndex) + { + switch (player->pev->iuser1) + { + case OBS_CHASE_LOCKED: + case OBS_CHASE_FREE: + case OBS_IN_EYE: + return true; + } + } + return false; +} + +/* <4904f2> ../game_shared/bot/bot.cpp:536 */ +NOXREF void CBot::Print(char *format, ...) const +{ + va_list varg; + char buffer[1024]; + + // prefix the message with the bot's name + Q_sprintf(buffer, "%s: ", STRING(pev->netname)); + SERVER_PRINT( buffer ); + + va_start(varg, format); + Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); + va_end(varg); + + SERVER_PRINT(buffer); +} + +/* <490561> ../game_shared/bot/bot.cpp:557 */ +void CBot::PrintIfWatched(char *format, ...) const +{ + if (!cv_bot_debug.value) + return; + + if ((IsLocalPlayerWatchingMe() && (cv_bot_debug.value == 1 || cv_bot_debug.value == 3)) + || (cv_bot_debug.value == 2 || cv_bot_debug.value == 4)) + { + va_list varg; + char buffer[1024]; + + // prefix the message with the bot's name (this can be NULL if bot was just added) + const char *name; + if (pev == NULL) + name = "(NULL pev)"; + else + name = STRING(pev->netname); + + Q_sprintf(buffer, "%s: ", (name != NULL) ? name : "(NULL netname)"); + + SERVER_PRINT( buffer ); + //_logf(buffer); + + va_start(varg, format); + Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); + va_end(varg); + + //_logf(buffer); + + SERVER_PRINT( buffer ); + } +} + +/* <49066c> ../game_shared/bot/bot.cpp:588 */ +ActiveGrenade::ActiveGrenade(int weaponID, CGrenade *grenadeEntity) +{ + m_id = weaponID; + m_entity = grenadeEntity; + m_detonationPosition = grenadeEntity->pev->origin; + m_dieTimestamp = 0; +} + +/* <49069d> ../game_shared/bot/bot.cpp:597 */ +void ActiveGrenade::OnEntityGone(void) +{ + if (m_id == WEAPON_SMOKEGRENADE) + { + // smoke lingers after grenade is gone + const float smokeLingerTime = 4.0f; + m_dieTimestamp = gpGlobals->time + smokeLingerTime; + } + + m_entity = NULL; +} + +/* <4906e1> ../game_shared/bot/bot.cpp:610 */ +bool ActiveGrenade::IsValid(void) const +{ + if (!m_entity) + { + if (gpGlobals->time > m_dieTimestamp) + return false; + } + return true; +} + +/* <490710> ../game_shared/bot/bot.cpp:622 */ +NOXREF const Vector *ActiveGrenade::GetPosition(void) const +{ + return &m_entity->pev->origin; +} + +#ifdef HOOK_GAMEDLL + +void CBot::Spawn(void) +{ + Spawn_(); +} + +Vector CBot::GetAutoaimVector(float flDelta) +{ + return GetAutoaimVector_(flDelta); +} + +bool CBot::Initialize(const BotProfile *profile) +{ + return Initialize_(profile); +} + +void CBot::Crouch(void) +{ + Crouch_(); +} + +void CBot::StandUp(void) +{ + StandUp_(); +} + +void CBot::MoveForward(void) +{ + MoveForward_(); +} + +void CBot::MoveBackward(void) +{ + MoveBackward_(); +} + +void CBot::StrafeLeft(void) +{ + StrafeLeft_(); +} + +void CBot::StrafeRight(void) +{ + StrafeRight_(); +} + +bool CBot::Jump(bool mustJump) +{ + return Jump_(mustJump); +} + +void CBot::ClearMovement(void) +{ + ClearMovement_(); +} + +void CBot::UseEnvironment(void) +{ + UseEnvironment_(); +} + +void CBot::PrimaryAttack(void) +{ + PrimaryAttack_(); +} + +void CBot::ClearPrimaryAttack(void) +{ + ClearPrimaryAttack_(); +} + +void CBot::TogglePrimaryAttack(void) +{ + TogglePrimaryAttack_(); +} + +void CBot::SecondaryAttack(void) +{ + SecondaryAttack_(); +} + +void CBot::Reload(void) +{ + Reload_(); +} + +void CBot::ExecuteCommand(void) +{ + ExecuteCommand_(); +} + #endif // HOOK_GAMEDLL \ No newline at end of file diff --git a/regamedll/game_shared/bot/bot.h b/regamedll/game_shared/bot/bot.h index 3824b1a7..99cc6105 100644 --- a/regamedll/game_shared/bot/bot.h +++ b/regamedll/game_shared/bot/bot.h @@ -51,22 +51,23 @@ extern bool UseBotArgs; class BotProfile; /* <36c175> ../game_shared/bot/bot.h:36 */ -template T *CreateBot(const BotProfile *profile) +template +T *CreateBot(const BotProfile *profile) { edict_t *pentBot; if (UTIL_ClientsInGame() >= gpGlobals->maxClients) { - CONSOLE_ECHO( "Unable to create bot: Server is full (%d/%d clients).\n", UTIL_ClientsInGame(), gpGlobals->maxClients ); + CONSOLE_ECHO( "Unable to create bot: Server is full (%d/%d clients).\n", UTIL_ClientsInGame(), gpGlobals->maxClients); return NULL; } char netname[64]; - UTIL_ConstructBotNetName(netname, 64, profile); - pentBot = CREATE_FAK_CLIENT( netname ); + UTIL_ConstructBotNetName(netname, sizeof(netname), profile); + pentBot = CREATE_FAKE_CLIENT(netname); if (FNullEnt(pentBot)) { - CONSOLE_ECHO( "Unable to create bot: pfnCreateFakeClient() returned null.\n" ); + CONSOLE_ECHO("Unable to create bot: pfnCreateFakeClient() returned null.\n"); return NULL; } else @@ -75,6 +76,7 @@ template T *CreateBot(const BotProfile *profile) FREE_PRIVATE(pentBot); pBot = GetClassPtr((T *)VARS(pentBot)); pBot->Initialize(profile); + return pBot; } } @@ -327,7 +329,7 @@ private: /* <48f61d> ../game_shared/bot/bot.h:253 */ inline void CBot::SetModel(const char *modelName) { - SET_CLIENT_KEY_VALUE(entindex(), GET_USERINFO(edict()), "model", (char *)modelName); + SET_CLIENT_KEY_VALUE(entindex(), GET_INFO_BUFFER(edict()), "model", (char *)modelName); } /* <48e98a> ../game_shared/bot/bot.h:259 */ diff --git a/regamedll/game_shared/bot/bot_manager.cpp b/regamedll/game_shared/bot/bot_manager.cpp index 1ef7c868..224c3201 100644 --- a/regamedll/game_shared/bot/bot_manager.cpp +++ b/regamedll/game_shared/bot/bot_manager.cpp @@ -121,11 +121,11 @@ void CBotManager::StartFrame_(void) } /* <49f7a6> ../game_shared/bot/bot_manager.cpp:205 */ -NOBODY const char *CBotManager::GetNavMapFilename(void) const +const char *CBotManager::GetNavMapFilename(void) const { - //static char filename[256]; - //Q_sprintf(filename, "maps\\%s.nav", STRING(gpGlobals->mapname)); - //return filename; + static char filename[256]; + Q_sprintf(filename, "maps\\%s.nav", STRING(gpGlobals->mapname)); + return filename; } /* <49f17b> ../game_shared/bot/bot_manager.cpp:219 */ diff --git a/regamedll/game_shared/bot/bot_manager.h b/regamedll/game_shared/bot/bot_manager.h index 5079ec78..1e49e4a9 100644 --- a/regamedll/game_shared/bot/bot_manager.h +++ b/regamedll/game_shared/bot/bot_manager.h @@ -88,15 +88,15 @@ class CBotManager public: CBotManager(void); - NOBODY virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0; - NOBODY virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; + virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0; + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; - NOBODY virtual void ServerActivate(void) = 0; - NOBODY virtual void ServerDeactivate(void) = 0; + virtual void ServerActivate(void) = 0; + virtual void ServerDeactivate(void) = 0; - NOBODY virtual void ServerCommand(const char *pcmd) = 0; - NOBODY virtual void AddServerCommand(const char *cmd) = 0; - NOBODY virtual void AddServerCommands(void) = 0; + virtual void ServerCommand(const char *pcmd) = 0; + virtual void AddServerCommand(const char *cmd) = 0; + virtual void AddServerCommands(void) = 0; virtual void RestartRound(void); virtual void StartFrame(void); @@ -106,20 +106,20 @@ public: virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); // return priority of player (0 = max pri) - NOBODY virtual unsigned int GetPlayerPriority(CBasePlayer *player) const = 0; + virtual unsigned int GetPlayerPriority(CBasePlayer *player) const = 0; // return the filename for this map's "nav" file - NOBODY const char *GetNavMapFilename(void) const; + const char *GetNavMapFilename(void) const; // add an active grenade to the bot's awareness - NOBODY void AddGrenade(int type, CGrenade *grenade); + void AddGrenade(int type, CGrenade *grenade); // the grenade entity in the world is going away - NOBODY void RemoveGrenade(CGrenade *grenade); + void RemoveGrenade(CGrenade *grenade); // destroy any invalid active grenades NOXREF void ValidateActiveGrenades(void); - NOBODY void DestroyAllGrenades(void); + void DestroyAllGrenades(void); // return true if line intersects smoke volume bool IsLineBlockedBySmoke(const Vector *from, const Vector *to); diff --git a/regamedll/game_shared/bot/bot_profile.cpp b/regamedll/game_shared/bot/bot_profile.cpp index 4500955c..38437636 100644 --- a/regamedll/game_shared/bot/bot_profile.cpp +++ b/regamedll/game_shared/bot/bot_profile.cpp @@ -235,27 +235,36 @@ NOBODY int BotProfileManager::FindVoiceBankIndex(const char *filename) } /* <4a8177> ../game_shared/bot/bot_profile.cpp:669 */ -NOBODY const BotProfile *BotProfileManager::GetRandomProfile(BotDifficultyType difficulty, BotProfileTeamType team) const +const BotProfile *BotProfileManager::GetRandomProfile(BotDifficultyType difficulty, BotProfileTeamType team) const { -// { -// const_iterator iter; // 674 -// int validCount; // 677 -// int which; // 690 -// operator++(_List_const_iterator *const this); // 678 -// { -// const class BotProfile *profile; // 680 -// IsDifficulty(const class BotProfile *const this, -// enum BotDifficultyType diff); // 682 -// IsValidForTeam(const class BotProfile *const this, -// enum BotProfileTeamType team); // 682 -// } -// operator++(_List_const_iterator *const this); // 691 -// { -// const class BotProfile *profile; // 693 -// IsDifficulty(const class BotProfile *const this, -// enum BotDifficultyType diff); // 695 -// IsValidForTeam(const class BotProfile *const this, -// enum BotProfileTeamType team); // 695 -// } -// } + BotProfileList::const_iterator iter; + + // count up valid profiles + int validCount = 0; + for (iter = m_profileList.begin(); iter != m_profileList.end(); ++iter) + { + const BotProfile *profile = (*iter); + + if (profile->IsDifficulty(difficulty) && !UTIL_IsNameTaken(profile->GetName()) && profile->IsValidForTeam(team)) + ++validCount; + } + + if (validCount == 0) + return NULL; + + // select one at random + int which = RANDOM_LONG(0, validCount - 1); + + for (iter = m_profileList.begin(); iter != m_profileList.end(); ++iter) + { + const BotProfile *profile = (*iter); + + if (profile->IsDifficulty(difficulty) && !UTIL_IsNameTaken(profile->GetName()) && profile->IsValidForTeam(team)) + { + if (which-- == 0) + return profile; + } + } + + return NULL; } diff --git a/regamedll/game_shared/bot/bot_util.cpp b/regamedll/game_shared/bot/bot_util.cpp index 23fbcc42..3f14424a 100644 --- a/regamedll/game_shared/bot/bot_util.cpp +++ b/regamedll/game_shared/bot/bot_util.cpp @@ -16,7 +16,7 @@ float cosTable[ COS_TABLE_SIZE ]; #endif // HOOK_GAMEDLL /* <4ad1c6> ../game_shared/bot/bot_util.cpp:26 */ -NOBODY bool UTIL_IsNameTaken(const char *name, bool ignoreHumans) +bool UTIL_IsNameTaken(const char *name, bool ignoreHumans) { for (int i = 1; i <= gpGlobals->maxClients; ++i) { @@ -33,7 +33,9 @@ NOBODY bool UTIL_IsNameTaken(const char *name, bool ignoreHumans) if (player->IsPlayer() && (((CBasePlayer *)player)->IsBot() == TRUE)) { - CBot *bot = (CBot *)player; + // bots can have prefixes so we need to check the name + // against the profile name instead. + CBot *bot = reinterpret_cast(player); if (FStrEq(name, bot->GetProfile()->GetName())) { return true; @@ -52,7 +54,7 @@ NOBODY bool UTIL_IsNameTaken(const char *name, bool ignoreHumans) } /* <4ad2da> ../game_shared/bot/bot_util.cpp:66 */ -NOBODY int UTIL_ClientsInGame(void) +int UTIL_ClientsInGame(void) { int iCount = 0; for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) @@ -269,7 +271,7 @@ NOBODY bool UTIL_IsTeamAllBots(int team) if (FStrEq(STRING(player->pev->netname), "")) continue; - if (!FBitSet(player->pev->flags, FL_FAKECLIENT)) + if (!(player->pev->flags & FL_FAKECLIENT)) return false; ++botCount; @@ -341,24 +343,27 @@ NOBODY extern CBasePlayer *UTIL_GetClosestPlayer(const Vector *pos, int team, fl } /* <4ad0de> ../game_shared/bot/bot_util.cpp:411 */ -NOBODY const char *UTIL_GetBotPrefix() +const char *UTIL_GetBotPrefix() { return cv_bot_prefix.string; } /* <4adb11> ../game_shared/bot/bot_util.cpp:418 */ -NOBODY void UTIL_ConstructBotNetName(char *name, int nameLength, const BotProfile *profile) +void UTIL_ConstructBotNetName(char *name, int nameLength, const BotProfile *profile) { if (profile == NULL) { name[0] = 0; return; } + + // if there is no bot prefix just use the profile name. if ((UTIL_GetBotPrefix() == NULL) || (Q_strlen(UTIL_GetBotPrefix()) == 0)) { Q_strncpy(name, profile->GetName(), nameLength); return; } + Q_snprintf(name, nameLength, "%s %s", UTIL_GetBotPrefix(), profile->GetName()); } @@ -694,23 +699,27 @@ NOBODY bool IsGameEventAudible(GameEventType event, CBaseEntity *entity, CBaseEn } /* <4ae3c1> ../game_shared/bot/bot_util.cpp:838 */ -NOBODY void HintMessageToAllPlayers(const char *message) +void HintMessageToAllPlayers(const char *message) { hudtextparms_t textParms; - textParms.x = -1.0f; - textParms.y = -1.0f; - textParms.fadeinTime = 1.0f; - textParms.fadeoutTime = 5.0f; - textParms.holdTime = 5.0f; - textParms.fxTime = 0.0f; - textParms.r1 = 100; - textParms.g1 = 255; - textParms.b1 = 100; - textParms.r2 = 255; - textParms.g2 = 255; - textParms.b2 = 255; + textParms.x = -1; + textParms.y = -1; textParms.effect = 0; + + textParms.r1 = 100; + textParms.g1 = -1; + textParms.b1 = 100; + + textParms.r2 = -1; + textParms.g2 = -1; + textParms.b2 = -1; + + textParms.fadeinTime = 1; + textParms.fadeoutTime = 5; + textParms.holdTime = 5; + textParms.fxTime = 0; + textParms.channel = 0; UTIL_HudMessageAll(textParms, message); diff --git a/regamedll/game_shared/bot/bot_util.h b/regamedll/game_shared/bot/bot_util.h index 979c4f6b..0903af8e 100644 --- a/regamedll/game_shared/bot/bot_util.h +++ b/regamedll/game_shared/bot/bot_util.h @@ -34,11 +34,6 @@ #define COS_TABLE_SIZE 256 -#define CREATE_FAKE_CLIENT (*g_engfuncs.pfnCreateFakeClient) -#define GET_USERINFO (*g_engfuncs.pfnGetInfoKeyBuffer) -#define SET_KEY_VALUE (*g_engfuncs.pfnSetKeyValue) -#define SET_CLIENT_KEY_VALUE (*g_engfuncs.pfnSetClientKeyValue) - class CBasePlayer; class BotProfile; @@ -233,8 +228,8 @@ inline bool IsZombieGame(void) extern short s_iBeamSprite; extern float cosTable[COS_TABLE_SIZE]; -NOBODY bool UTIL_IsNameTaken(const char *name, bool ignoreHumans = false); -NOBODY int UTIL_ClientsInGame(void); +bool UTIL_IsNameTaken(const char *name, bool ignoreHumans = false); +int UTIL_ClientsInGame(void); NOBODY int UTIL_ActivePlayersInGame(void); NOBODY int UTIL_HumansInGame(bool ignoreSpectators); NOBODY int UTIL_HumansOnTeam(int teamID, bool isAlive = false); @@ -243,8 +238,8 @@ NOBODY bool UTIL_KickBotFromTeam(TeamName kickTeam); NOBODY bool UTIL_IsTeamAllBots(int team); NOBODY CBasePlayer *UTIL_GetClosestPlayer(const Vector *pos, float *distance = NULL); NOBODY CBasePlayer *UTIL_GetClosestPlayer(const Vector *pos, int team, float *distance = NULL); -NOBODY const char *UTIL_GetBotPrefix(); -NOBODY void UTIL_ConstructBotNetName(char *name, int nameLength, const BotProfile *profile); +const char *UTIL_GetBotPrefix(); +void UTIL_ConstructBotNetName(char *name, int nameLength, const BotProfile *profile); NOBODY bool UTIL_IsVisibleToTeam(const Vector &spot, int team, float maxRange = -1.0f); CBasePlayer *UTIL_GetLocalPlayer(void); NOBODY Vector UTIL_ComputeOrigin(entvars_t *pevVars); diff --git a/regamedll/game_shared/bot/nav_area.cpp b/regamedll/game_shared/bot/nav_area.cpp index eba4df43..da510c08 100644 --- a/regamedll/game_shared/bot/nav_area.cpp +++ b/regamedll/game_shared/bot/nav_area.cpp @@ -33,34 +33,38 @@ FILE_GLOBAL Vector anchor; FILE_GLOBAL bool isPlaceMode = false; FILE_GLOBAL bool isPlacePainting = false; +FILE_GLOBAL float editTimestamp = 0.0f; + FILE_GLOBAL unsigned int BlockedID[ MAX_BLOCKED_AREAS ]; FILE_GLOBAL int BlockedIDCount = 0; #else // HOOK_GAMEDLL -unsigned int (*CNavArea::m_nextID); -unsigned int (*CNavArea::m_masterMarker); +unsigned int IMPLEMENT_ARRAY_CLASS(CNavArea, m_nextID); +unsigned int IMPLEMENT_ARRAY_CLASS(CNavArea, m_masterMarker); -unsigned int (*HidingSpot::m_nextID); -unsigned int (*HidingSpot::m_masterMarker); +unsigned int IMPLEMENT_ARRAY_CLASS(HidingSpot, m_nextID); +unsigned int IMPLEMENT_ARRAY_CLASS(HidingSpot, m_masterMarker); -//NavLadderList TheNavLadderList; +NavLadderList TheNavLadderList; HidingSpotList TheHidingSpotList; NavAreaList TheNavAreaList; CNavAreaGrid TheNavAreaGrid; -CNavArea *(*CNavArea::m_openList); -bool (*CNavArea::m_isReset); +CNavArea *IMPLEMENT_ARRAY_CLASS(CNavArea, m_openList); +bool IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset); -//float lastDrawTimestamp; +float lastDrawTimestamp; NavAreaList goodSizedAreaList; -//CNavArea *markedArea; -//CNavArea *lastSelectedArea; +CNavArea *markedArea; +CNavArea *lastSelectedArea; NavCornerType markedCorner; -//bool isCreatingNavArea; +bool isCreatingNavArea; //bool isAnchored; //Vector anchor; //bool isPlaceMode; -//bool isPlacePainting; +bool isPlacePainting; +float editTimestamp; + unsigned int BlockedID[ MAX_BLOCKED_AREAS ]; int BlockedIDCount; @@ -95,11 +99,7 @@ void DestroyHidingSpots(void) area->m_hidingSpotList.clear(); } -#ifndef HOOK_GAMEDLL - HidingSpot::m_nextID = 0; -#else - (*HidingSpot::m_nextID) = 0; -#endif // HOOK_GAMEDLL + IMPLEMENT_ARRAY_CLASS(HidingSpot, m_nextID) = 0; // free all the HidingSpots for (HidingSpotList::iterator iter = TheHidingSpotList.begin(); iter != TheHidingSpotList.end(); iter++) @@ -209,11 +209,7 @@ NOBODY CNavArea::CNavArea(CNavNode *nwNode, class CNavNode *neNode, class CNavNo /* <4d58d7> ../game_shared/bot/nav_area.cpp:295 */ NOBODY CNavArea::~CNavArea(void) { -#ifndef HOOK_GAMEDLL - if (m_isReset) -#else - if (*m_isReset) -#endif // HOOK_GAMEDLL + if (IMPLEMENT_ARRAY(m_isReset)) { //m_overlapList.~list(); //m_ladder->~list(); @@ -592,26 +588,49 @@ void CleanupApproachAreaAnalysisPrep(void) } /* <4c7b18> ../game_shared/bot/nav_area.cpp:980 */ -NOBODY void DestroyLadders(void) +void DestroyLadders(void) { -// { -// class CNavLadder *ladder; // 984 -// } + while (!TheNavLadderList.empty()) + { + CNavLadder *ladder = TheNavLadderList.front(); + TheNavLadderList.pop_front(); + delete ladder; + } } /* <4d6733> ../game_shared/bot/nav_area.cpp:994 */ -NOBODY void DestroyNavigationMap(void) +void DestroyNavigationMap(void) { -// { -// class CNavNode *node; // 1015 -// class CNavNode *next; // 1015 -// empty(const class list> *const this); // 999 -// { -// class CNavArea *area; // 1001 -// pop_front(list> *const this); // 1002 -// } -// DestroyLadders(void); // 1009 -// } + IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = true; + + // remove each element of the list and delete them + while (!TheNavAreaList.empty()) + { + CNavArea *area = TheNavAreaList.front(); + TheNavAreaList.pop_front(); + delete area; + } + + IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = false; + + // destroy ladder representations + DestroyLadders(); + + // destroy all hiding spots + DestroyHidingSpots(); + + // destroy navigation nodes created during map learning + CNavNode *node, *next; + for (node = IMPLEMENT_ARRAY_CLASS(CNavNode, m_list); node; node = next) + { + next = node->m_next; + delete node; + } + + IMPLEMENT_ARRAY_CLASS(CNavNode, m_list) = NULL; + + // reset the grid + TheNavAreaGrid.Reset(); } /* <4c7e9a> ../game_shared/bot/nav_area.cpp:1046 */ @@ -1509,8 +1528,8 @@ NOBODY void CNavArea::RemoveFromOpenList(void) if (m_prevOpen) m_prevOpen->m_nextOpen = m_nextOpen; else - (*m_openList) = m_nextOpen; - + IMPLEMENT_ARRAY(m_openList) = m_nextOpen; + if (m_nextOpen) m_nextOpen->m_prevOpen = m_prevOpen; @@ -1522,11 +1541,7 @@ NOBODY void CNavArea::RemoveFromOpenList(void) NOBODY void CNavArea::ClearSearchLists(void) { CNavArea::MakeNewMarker(); -#ifndef HOOK_GAMEDLL - m_openList = NULL; -#else - (*m_openList) = NULL; -#endif // HOOK_GAMEDLL + IMPLEMENT_ARRAY(m_openList) = NULL; } /* <4cbe06> ../game_shared/bot/nav_area.cpp:2744 */ @@ -2198,13 +2213,21 @@ NOBODY int CNavArea::GetPlayerCount(int teamID, CBasePlayer *ignore) const } /* <4cea33> ../game_shared/bot/nav_area.cpp:3749 */ -NOBODY CNavArea *GetMarkedArea(void) +CNavArea *GetMarkedArea(void) { + return markedArea; } /* <4c2a8c> ../game_shared/bot/nav_area.cpp:3757 */ -NOBODY void EditNavAreasReset(void) +void EditNavAreasReset(void) { + markedArea = NULL; + lastSelectedArea = NULL; + isCreatingNavArea = false; + isPlacePainting = false; + + editTimestamp = 0.0f; + lastDrawTimestamp = 0.0f; } /* <4cea61> ../game_shared/bot/nav_area.cpp:3767 */ @@ -2754,13 +2777,23 @@ NOBODY CNavAreaGrid::~CNavAreaGrid(void) } /* <4cf837> ../game_shared/bot/nav_area.cpp:4962 */ -NOBODY void CNavAreaGrid::Reset(void) +void CNavAreaGrid::Reset(void) { -// ~list(list>::Reset(// int const __in_chrg); // 4965 -// { -// int i; // 4972 -// } -// EditNavAreasReset(void); // 4977 + if (m_grid) + delete[] m_grid; + + m_grid = NULL; + m_gridSizeX = 0; + m_gridSizeY = 0; + + // clear the hash table + for(int i = 0; i < HASH_TABLE_SIZE; i++) + m_hashTable[i] = NULL; + + m_areaCount = 0; + + // reset static vars + EditNavAreasReset(); } /* <4cf984> ../game_shared/bot/nav_area.cpp:4983 */ diff --git a/regamedll/game_shared/bot/nav_area.h b/regamedll/game_shared/bot/nav_area.h index b7a702cd..0cce214e 100644 --- a/regamedll/game_shared/bot/nav_area.h +++ b/regamedll/game_shared/bot/nav_area.h @@ -1,1349 +1,1322 @@ -/* -* -* This program 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. -* -* This program 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 this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -* -*/ - -#ifndef NAV_AREA_H -#define NAV_AREA_H -#ifdef _WIN32 -#pragma once -#endif - -#include -//#include "nav.h" - -class CNavArea; - -enum -{ - MAX_BLOCKED_AREAS = 256 -}; - -void DestroyHidingSpots(void); -NOBODY void StripNavigationAreas(void); -//bool SaveNavigationMap(const char *filename); -//NavErrorType LoadNavigationMap(void); -NOBODY void DestroyNavigationMap(void); - -enum NavEditCmdType -{ - EDIT_NONE, - EDIT_DELETE, - EDIT_SPLIT, - EDIT_MERGE, - EDIT_JOIN, - EDIT_BREAK, - EDIT_MARK, - EDIT_ATTRIB_CROUCH, - EDIT_ATTRIB_JUMP, - EDIT_ATTRIB_PRECISE, - EDIT_ATTRIB_NO_JUMP, - EDIT_BEGIN_AREA, - EDIT_END_AREA, - EDIT_CONNECT, - EDIT_DISCONNECT, - EDIT_SPLICE, - EDIT_TOGGLE_PLACE_MODE, - EDIT_TOGGLE_PLACE_PAINTING, - EDIT_PLACE_FLOODFILL, - EDIT_PLACE_PICK, - EDIT_MARK_UNNAMED, - EDIT_WARP_TO_MARK, - EDIT_SELECT_CORNER, - EDIT_RAISE_CORNER, - EDIT_LOWER_CORNER, -}; - -//#define NO_CROUCH_SPOTS false -//class CBasePlayer; -//class CBaseEntity; - -enum RouteType -{ - FASTEST_ROUTE, - SAFEST_ROUTE, -}; - -/* <4c1845> ../game_shared/bot/nav_area.h:35 */ -union NavConnect -{ - unsigned int id; - CNavArea *area; - - /* <4c26c6> ../game_shared/bot/nav_area.h:40 */ - bool operator==(const NavConnect &other) const - { - return (area == other.area) ? true : false; - } -}; - -typedef std::list NavConnectList; - -enum LadderDirectionType -{ - LADDER_UP = 0, - LADDER_DOWN, - NUM_LADDER_DIRECTIONS -}; - - -/* <4c2fda> ../game_shared/bot/nav_area.h:63 */ -class CNavLadder -{ -public: - CNavLadder(void) - { - m_topForwardArea = NULL; - m_topRightArea = NULL; - m_topLeftArea = NULL; - m_topBehindArea = NULL; - m_bottomArea = NULL; - m_entity = NULL; - } - - Vector m_top; - Vector m_bottom; - float m_length; - NavDirType m_dir; - Vector2D m_dirVector; - CBaseEntity *m_entity; - - CNavArea *m_topForwardArea; - CNavArea *m_topLeftArea; - CNavArea *m_topRightArea; - CNavArea *m_topBehindArea; - CNavArea *m_bottomArea; - - bool m_isDangling; - - /* <4c2dc0> ../game_shared/bot/nav_area.h:88 */ - void OnDestroyNotify(CNavArea *dead) - { - if (dead == m_topForwardArea) - m_topForwardArea = NULL; - - if (dead == m_topLeftArea) - m_topLeftArea = NULL; - - if (dead == m_topRightArea) - m_topRightArea = NULL; - - if (dead == m_topBehindArea) - m_topBehindArea = NULL; - - if (dead == m_bottomArea) - m_bottomArea = NULL; - } -};/* size: 68, cachelines: 2, members: 12 */ - -typedef std::list NavLadderList; - -class HidingSpot -{ -public: - HidingSpot(void); - HidingSpot(const Vector *pos, unsigned char flags); - - enum - { - IN_COVER = 0x01, - GOOD_SNIPER_SPOT = 0x02, - IDEAL_SNIPER_SPOT = 0x04 - }; - - bool HasGoodCover(void) const - { - return (m_flags & IN_COVER) ? true : false; - } - bool IsGoodSniperSpot(void) const - { - return (m_flags & GOOD_SNIPER_SPOT) ? true : false; - } - bool IsIdealSniperSpot(void) const - { - return (m_flags & IDEAL_SNIPER_SPOT) ? true : false; - } - void SetFlags(unsigned char flags) - { - m_flags |= flags; - } - unsigned char GetFlags(void) const - { - return m_flags; - } - void Save(int fd, unsigned int version) const; - void Load(SteamFile *file, unsigned int version); - - const Vector *GetPosition(void) const - { - return &m_pos; - } - unsigned int GetID(void) const - { - return m_id; - } - void Mark(void) - { -#ifndef HOOK_GAMEDLL - m_marker = m_masterMarker; -#else - m_marker = (*m_masterMarker); -#endif // HOOK_GAMEDLL - } - bool IsMarked(void) const - { -#ifndef HOOK_GAMEDLL - return (m_marker == m_masterMarker) ? true : false; -#else - return (m_marker == (*m_masterMarker)) ? true : false; -#endif // HOOK_GAMEDLL - } - static void ChangeMasterMarker(void) - { -#ifndef HOOK_GAMEDLL - ++m_masterMarker; -#else - ++(*m_masterMarker); -#endif // HOOK_GAMEDLL - } - -private: - friend void DestroyHidingSpots(void); - - Vector m_pos; - unsigned int m_id; - unsigned int m_marker; - unsigned char m_flags; - -#ifndef HOOK_GAMEDLL - static unsigned int m_nextID; - static unsigned int m_masterMarker; -#else -public: - static unsigned int (*m_nextID); - static unsigned int (*m_masterMarker); -#endif // HOOK_GAMEDLL - -};/* size: 24, cachelines: 1, members: 6 */ - -typedef std::list HidingSpotList; - -/* <4ec0bd> ../game_shared/bot/nav_area.h:164 */ -struct SpotOrder -{ - float t; - union - { - HidingSpot *spot; - unsigned int id; - }; -};/* size: 8, cachelines: 1, members: 2 */ - -typedef std::list SpotOrderList; - -/* <4c3a51> ../game_shared/bot/nav_area.h:179 */ -struct SpotEncounter -{ - NavConnect from; - NavDirType fromDir; - NavConnect to; - NavDirType toDir; - Ray path; - SpotOrderList spotList; -};/* size: 48, cachelines: 1, members: 6 */ - -typedef std::list SpotEncounterList; -typedef std::list NavAreaList; - -class CNavArea -{ -public: - CNavArea(CNavNode *nwNode, CNavNode *neNode, CNavNode *seNode, CNavNode *swNode); - CNavArea(void); - CNavArea(const Vector *corner, const Vector *otherCorner); - CNavArea(const Vector *nwCorner, const Vector *neCorner, const Vector *seCorner, const Vector *swCorner); - - ~CNavArea(); - - void ConnectTo(CNavArea *area, NavDirType dir); - void Disconnect(CNavArea *area); - - void Save(FILE *fp) const; - void Save(int fd, unsigned int version); - - void Load(SteamFile *file, unsigned int version); - NavErrorType PostLoad(void); - - unsigned int GetID(void) const - { - return m_id; - } - void SetAttributes(unsigned char bits) - { - m_attributeFlags = bits; - } - unsigned char GetAttributes(void) const - { - return m_attributeFlags; - } - void SetPlace(Place place) - { - m_place = place; - } - Place GetPlace(void) const - { - return m_place; - } - - bool IsOverlapping(const Vector *pos) const; - bool IsOverlapping(const CNavArea *area) const; - bool IsOverlappingX(const CNavArea *area) const; - bool IsOverlappingY(const CNavArea *area) const; - int GetPlayerCount(int teamID = 0, CBasePlayer *ignore = NULL) const; - float GetZ(const Vector *pos) const; - float GetZ(float x, float y) const; - bool Contains(const Vector *pos) const; - bool IsCoplanar(const CNavArea *area) const; - void GetClosestPointOnArea(const Vector *pos, Vector *close) const; - float GetDistanceSquaredToPoint(const Vector *pos) const; - bool IsDegenerate(void) const; - - bool IsEdge(NavDirType dir) const; - - int GetAdjacentCount(NavDirType dir) const - { - return m_connect[dir].size(); - } - CNavArea *GetAdjacentArea(NavDirType dir, int i) const; - CNavArea *GetRandomAdjacentArea(NavDirType dir) const; - - const NavConnectList *GetAdjacentList(NavDirType dir) const - { - return &m_connect[dir]; - } - bool IsConnected(const CNavArea *area, NavDirType dir) const; - float ComputeHeightChange(const CNavArea *area); - - const NavLadderList *GetLadderList(LadderDirectionType dir) const - { - return &m_ladder[dir]; - } - - void ComputePortal(const CNavArea *to, NavDirType dir, Vector *center, float *halfWidth) const; - void ComputeClosestPointInPortal(const CNavArea *to, NavDirType dir, const Vector *fromPos, Vector *closePos) const; - NavDirType ComputeDirection(Vector *point) const; - - void SetClearedTimestamp(int teamID) - { - m_clearedTimestamp[teamID] = gpGlobals->time; - } - float GetClearedTimestamp(int teamID) - { - return m_clearedTimestamp[teamID]; - } - const HidingSpotList *GetHidingSpotList(void) const - { - return &m_hidingSpotList; - } - void ComputeHidingSpots(void); - void ComputeSniperSpots(void); - - SpotEncounter *GetSpotEncounter(const CNavArea *from, const CNavArea *to); - void ComputeSpotEncounters(void); - void IncreaseDanger(int teamID, float amount); - - float GetDanger(int teamID); - float GetSizeX(void) const - { - return m_extent.hi.x - m_extent.lo.x; - } - float GetSizeY(void) const - { - return m_extent.hi.y - m_extent.lo.y; - } - const Extent *GetExtent(void) const - { - return &m_extent; - } - const Vector *GetCenter(void) const - { - return &m_center; - } - const Vector *GetCorner(NavCornerType corner) const; - - struct ApproachInfo - { - NavConnect here; - NavConnect prev; - NavTraverseType prevToHereHow; - NavConnect next; - NavTraverseType hereToNextHow; - }; - - const ApproachInfo *GetApproachInfo(int i) const - { - return &m_approach[i]; - } - int GetApproachInfoCount(void) const - { - return m_approachCount; - } - void ComputeApproachAreas(void); - static void MakeNewMarker(void) - { -#ifndef HOOK_GAMEDLL - ++m_masterMarker; - if (m_masterMarker == 0) - m_masterMarker = 1; -#else - ++(*m_masterMarker); - if ((*m_masterMarker) == 0) - (*m_masterMarker) = 1; -#endif // HOOK_GAMEDLL - } - void Mark(void) - { -#ifndef HOOK_GAMEDLL - m_marker = m_masterMarker; -#else - m_marker = (*m_masterMarker); -#endif // HOOK_GAMEDLL - } - BOOL IsMarked(void) const - { -#ifndef HOOK_GAMEDLL - return (m_marker == m_masterMarker) ? true : false; -#else - return (m_marker == (*m_masterMarker)) ? true : false; -#endif // HOOK_GAMEDLL - } - void SetParent(CNavArea *parent, NavTraverseType how = NUM_TRAVERSE_TYPES) - { - m_parent = parent; - m_parentHow = how; - } - CNavArea *GetParent(void) const - { - return m_parent; - } - NavTraverseType GetParentHow(void) const - { - return m_parentHow; - } - - bool IsOpen(void) const; - void AddToOpenList(void); - void UpdateOnOpenList(void); - void RemoveFromOpenList(void); - static bool IsOpenListEmpty(void); - static CNavArea *PopOpenList(void); - - bool IsClosed(void) const; - void AddToClosedList(void); - void RemoveFromClosedList(void); - - static void ClearSearchLists(void); - - void SetTotalCost(float value) - { - m_totalCost = value; - } - float GetTotalCost(void) const - { - return m_totalCost; - } - void SetCostSoFar(float value) - { - m_costSoFar = value; - } - float GetCostSoFar(void) const - { - return m_costSoFar; - } - - void Draw(byte red, byte green, byte blue, int duration = 50); - void DrawConnectedAreas(void); - void DrawMarkedCorner(NavCornerType corner, byte red, byte green, byte blue, int duration = 50); - bool SplitEdit(bool splitAlongX, float splitEdge, CNavArea **outAlpha = NULL, CNavArea **outBeta = NULL); - bool MergeEdit(CNavArea *adj); - bool SpliceEdit(CNavArea *other); - void RaiseCorner(NavCornerType corner, int amount); - void AddLadderUp(CNavLadder *ladder) - { - m_ladder[LADDER_UP].push_back(ladder); - } - void AddLadderDown(CNavLadder *ladder) - { - m_ladder[LADDER_DOWN].push_back(ladder); - } - -private: - bool IsHidingSpotCollision(const Vector *pos) const; - void AddSpotEncounters(const CNavArea *from, NavDirType fromDir, const CNavArea *to, NavDirType toDir); - void Strip(void); - void FinishMerge(CNavArea *adjArea); - void MergeAdjacentConnections(CNavArea *adjArea); - void AssignNodes(CNavArea *area); - void FinishSplitEdit(CNavArea *newArea, NavDirType ignoreEdge); - void OnDestroyNotify(CNavArea *dead); - void DecayDanger(void); -private: - friend void ConnectGeneratedAreas(void); - friend void MergeGeneratedAreas(void); - friend void MarkJumpAreas(void); - friend bool SaveNavigationMap(const char *filename); - friend NavErrorType LoadNavigationMap(void); - friend void DestroyNavigationMap(void); - friend void DestroyHidingSpots(void); - friend void StripNavigationAreas(void); - - friend class CNavAreaGrid; - friend class CCSBotManager; - - void Initialize(void); - -#ifndef HOOK_GAMEDLL - static bool m_isReset; - static unsigned int m_nextID; -#else -public: - static bool (*m_isReset); - static unsigned int (*m_nextID); -private: -#endif // HOOK_GAMEDLL - - unsigned int m_id; - Extent m_extent; - Vector m_center; - unsigned char m_attributeFlags; - Place m_place; - - float m_neZ; - float m_swZ; - - enum { MAX_AREA_TEAMS = 2 }; - - float m_clearedTimestamp[MAX_AREA_TEAMS]; - float m_danger[MAX_AREA_TEAMS]; - float m_dangerTimestamp[MAX_AREA_TEAMS]; - +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef NAV_AREA_H +#define NAV_AREA_H +#ifdef _WIN32 +#pragma once +#endif + +#include +//#include "nav.h" + +class CNavArea; + +enum +{ + MAX_BLOCKED_AREAS = 256 +}; + +void DestroyHidingSpots(void); +NOBODY void StripNavigationAreas(void); +//bool SaveNavigationMap(const char *filename); +//NavErrorType LoadNavigationMap(void); +NOBODY void DestroyNavigationMap(void); + +enum NavEditCmdType +{ + EDIT_NONE, + EDIT_DELETE, + EDIT_SPLIT, + EDIT_MERGE, + EDIT_JOIN, + EDIT_BREAK, + EDIT_MARK, + EDIT_ATTRIB_CROUCH, + EDIT_ATTRIB_JUMP, + EDIT_ATTRIB_PRECISE, + EDIT_ATTRIB_NO_JUMP, + EDIT_BEGIN_AREA, + EDIT_END_AREA, + EDIT_CONNECT, + EDIT_DISCONNECT, + EDIT_SPLICE, + EDIT_TOGGLE_PLACE_MODE, + EDIT_TOGGLE_PLACE_PAINTING, + EDIT_PLACE_FLOODFILL, + EDIT_PLACE_PICK, + EDIT_MARK_UNNAMED, + EDIT_WARP_TO_MARK, + EDIT_SELECT_CORNER, + EDIT_RAISE_CORNER, + EDIT_LOWER_CORNER, +}; + +//#define NO_CROUCH_SPOTS false +//class CBasePlayer; +//class CBaseEntity; + +enum RouteType +{ + FASTEST_ROUTE, + SAFEST_ROUTE, +}; + +/* <4c1845> ../game_shared/bot/nav_area.h:35 */ +union NavConnect +{ + unsigned int id; + CNavArea *area; + + /* <4c26c6> ../game_shared/bot/nav_area.h:40 */ + bool operator==(const NavConnect &other) const + { + return (area == other.area) ? true : false; + } +}; + +typedef std::list NavConnectList; + +enum LadderDirectionType +{ + LADDER_UP = 0, + LADDER_DOWN, + NUM_LADDER_DIRECTIONS +}; + + +/* <4c2fda> ../game_shared/bot/nav_area.h:63 */ +class CNavLadder +{ +public: + CNavLadder(void) + { + m_topForwardArea = NULL; + m_topRightArea = NULL; + m_topLeftArea = NULL; + m_topBehindArea = NULL; + m_bottomArea = NULL; + m_entity = NULL; + } + + Vector m_top; + Vector m_bottom; + float m_length; + NavDirType m_dir; + Vector2D m_dirVector; + CBaseEntity *m_entity; + + CNavArea *m_topForwardArea; + CNavArea *m_topLeftArea; + CNavArea *m_topRightArea; + CNavArea *m_topBehindArea; + CNavArea *m_bottomArea; + + bool m_isDangling; + + /* <4c2dc0> ../game_shared/bot/nav_area.h:88 */ + void OnDestroyNotify(CNavArea *dead) + { + if (dead == m_topForwardArea) + m_topForwardArea = NULL; + + if (dead == m_topLeftArea) + m_topLeftArea = NULL; + + if (dead == m_topRightArea) + m_topRightArea = NULL; + + if (dead == m_topBehindArea) + m_topBehindArea = NULL; + + if (dead == m_bottomArea) + m_bottomArea = NULL; + } +};/* size: 68, cachelines: 2, members: 12 */ + +typedef std::list NavLadderList; + +class HidingSpot +{ +public: + HidingSpot(void); + HidingSpot(const Vector *pos, unsigned char flags); + + enum + { + IN_COVER = 0x01, + GOOD_SNIPER_SPOT = 0x02, + IDEAL_SNIPER_SPOT = 0x04 + }; + + bool HasGoodCover(void) const + { + return (m_flags & IN_COVER) ? true : false; + } + bool IsGoodSniperSpot(void) const + { + return (m_flags & GOOD_SNIPER_SPOT) ? true : false; + } + bool IsIdealSniperSpot(void) const + { + return (m_flags & IDEAL_SNIPER_SPOT) ? true : false; + } + void SetFlags(unsigned char flags) + { + m_flags |= flags; + } + unsigned char GetFlags(void) const + { + return m_flags; + } + void Save(int fd, unsigned int version) const; + void Load(SteamFile *file, unsigned int version); + + const Vector *GetPosition(void) const + { + return &m_pos; + } + unsigned int GetID(void) const + { + return m_id; + } + void Mark(void) + { + m_marker = IMPLEMENT_ARRAY(m_masterMarker); + } + bool IsMarked(void) const + { + return (m_marker == IMPLEMENT_ARRAY(m_masterMarker)) ? true : false; + } + static void ChangeMasterMarker(void) + { + IMPLEMENT_ARRAY(m_masterMarker)++; + } + +private: + friend void DestroyHidingSpots(void); + + Vector m_pos; + unsigned int m_id; + unsigned int m_marker; + unsigned char m_flags; + +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + static unsigned int IMPLEMENT_ARRAY(m_nextID); + static unsigned int IMPLEMENT_ARRAY(m_masterMarker); + +};/* size: 24, cachelines: 1, members: 6 */ + +typedef std::list HidingSpotList; + +/* <4ec0bd> ../game_shared/bot/nav_area.h:164 */ +struct SpotOrder +{ + float t; + union + { + HidingSpot *spot; + unsigned int id; + }; + +};/* size: 8, cachelines: 1, members: 2 */ + +typedef std::list SpotOrderList; + +/* <4c3a51> ../game_shared/bot/nav_area.h:179 */ +struct SpotEncounter +{ + NavConnect from; + NavDirType fromDir; + NavConnect to; + NavDirType toDir; + Ray path; + SpotOrderList spotList; + +};/* size: 48, cachelines: 1, members: 6 */ + +typedef std::list SpotEncounterList; +typedef std::list NavAreaList; + +class CNavArea +{ +public: + CNavArea(CNavNode *nwNode, CNavNode *neNode, CNavNode *seNode, CNavNode *swNode); + CNavArea(void); + CNavArea(const Vector *corner, const Vector *otherCorner); + CNavArea(const Vector *nwCorner, const Vector *neCorner, const Vector *seCorner, const Vector *swCorner); + + ~CNavArea(); + + void ConnectTo(CNavArea *area, NavDirType dir); + void Disconnect(CNavArea *area); + + void Save(FILE *fp) const; + void Save(int fd, unsigned int version); + + void Load(SteamFile *file, unsigned int version); + NavErrorType PostLoad(void); + + unsigned int GetID(void) const + { + return m_id; + } + void SetAttributes(unsigned char bits) + { + m_attributeFlags = bits; + } + unsigned char GetAttributes(void) const + { + return m_attributeFlags; + } + void SetPlace(Place place) + { + m_place = place; + } + Place GetPlace(void) const + { + return m_place; + } + + bool IsOverlapping(const Vector *pos) const; + bool IsOverlapping(const CNavArea *area) const; + bool IsOverlappingX(const CNavArea *area) const; + bool IsOverlappingY(const CNavArea *area) const; + int GetPlayerCount(int teamID = 0, CBasePlayer *ignore = NULL) const; + float GetZ(const Vector *pos) const; + float GetZ(float x, float y) const; + bool Contains(const Vector *pos) const; + bool IsCoplanar(const CNavArea *area) const; + void GetClosestPointOnArea(const Vector *pos, Vector *close) const; + float GetDistanceSquaredToPoint(const Vector *pos) const; + bool IsDegenerate(void) const; + + bool IsEdge(NavDirType dir) const; + + int GetAdjacentCount(NavDirType dir) const + { + return m_connect[dir].size(); + } + CNavArea *GetAdjacentArea(NavDirType dir, int i) const; + CNavArea *GetRandomAdjacentArea(NavDirType dir) const; + + const NavConnectList *GetAdjacentList(NavDirType dir) const + { + return &m_connect[dir]; + } + bool IsConnected(const CNavArea *area, NavDirType dir) const; + float ComputeHeightChange(const CNavArea *area); + + const NavLadderList *GetLadderList(LadderDirectionType dir) const + { + return &m_ladder[dir]; + } + + void ComputePortal(const CNavArea *to, NavDirType dir, Vector *center, float *halfWidth) const; + void ComputeClosestPointInPortal(const CNavArea *to, NavDirType dir, const Vector *fromPos, Vector *closePos) const; + NavDirType ComputeDirection(Vector *point) const; + + void SetClearedTimestamp(int teamID) + { + m_clearedTimestamp[teamID] = gpGlobals->time; + } + float GetClearedTimestamp(int teamID) + { + return m_clearedTimestamp[teamID]; + } + const HidingSpotList *GetHidingSpotList(void) const + { + return &m_hidingSpotList; + } + void ComputeHidingSpots(void); + void ComputeSniperSpots(void); + + SpotEncounter *GetSpotEncounter(const CNavArea *from, const CNavArea *to); + void ComputeSpotEncounters(void); + void IncreaseDanger(int teamID, float amount); + + float GetDanger(int teamID); + float GetSizeX(void) const + { + return m_extent.hi.x - m_extent.lo.x; + } + float GetSizeY(void) const + { + return m_extent.hi.y - m_extent.lo.y; + } + const Extent *GetExtent(void) const + { + return &m_extent; + } + const Vector *GetCenter(void) const + { + return &m_center; + } + const Vector *GetCorner(NavCornerType corner) const; + + struct ApproachInfo + { + NavConnect here; + NavConnect prev; + NavTraverseType prevToHereHow; + NavConnect next; + NavTraverseType hereToNextHow; + }; + + const ApproachInfo *GetApproachInfo(int i) const + { + return &m_approach[i]; + } + int GetApproachInfoCount(void) const + { + return m_approachCount; + } + void ComputeApproachAreas(void); + static void MakeNewMarker(void) + { + IMPLEMENT_ARRAY(m_masterMarker)++; + if (IMPLEMENT_ARRAY(m_masterMarker) == 0) + IMPLEMENT_ARRAY(m_masterMarker) = 1; + } + void Mark(void) + { + m_marker = IMPLEMENT_ARRAY(m_masterMarker); + } + BOOL IsMarked(void) const + { + return (m_marker == IMPLEMENT_ARRAY(m_masterMarker)) ? true : false; + } + void SetParent(CNavArea *parent, NavTraverseType how = NUM_TRAVERSE_TYPES) + { + m_parent = parent; + m_parentHow = how; + } + CNavArea *GetParent(void) const + { + return m_parent; + } + NavTraverseType GetParentHow(void) const + { + return m_parentHow; + } + + bool IsOpen(void) const; + void AddToOpenList(void); + void UpdateOnOpenList(void); + void RemoveFromOpenList(void); + static bool IsOpenListEmpty(void); + static CNavArea *PopOpenList(void); + + bool IsClosed(void) const; + void AddToClosedList(void); + void RemoveFromClosedList(void); + + static void ClearSearchLists(void); + + void SetTotalCost(float value) + { + m_totalCost = value; + } + float GetTotalCost(void) const + { + return m_totalCost; + } + void SetCostSoFar(float value) + { + m_costSoFar = value; + } + float GetCostSoFar(void) const + { + return m_costSoFar; + } + + void Draw(byte red, byte green, byte blue, int duration = 50); + void DrawConnectedAreas(void); + void DrawMarkedCorner(NavCornerType corner, byte red, byte green, byte blue, int duration = 50); + bool SplitEdit(bool splitAlongX, float splitEdge, CNavArea **outAlpha = NULL, CNavArea **outBeta = NULL); + bool MergeEdit(CNavArea *adj); + bool SpliceEdit(CNavArea *other); + void RaiseCorner(NavCornerType corner, int amount); + void AddLadderUp(CNavLadder *ladder) + { + m_ladder[LADDER_UP].push_back(ladder); + } + void AddLadderDown(CNavLadder *ladder) + { + m_ladder[LADDER_DOWN].push_back(ladder); + } + +private: + bool IsHidingSpotCollision(const Vector *pos) const; + void AddSpotEncounters(const CNavArea *from, NavDirType fromDir, const CNavArea *to, NavDirType toDir); + void Strip(void); + void FinishMerge(CNavArea *adjArea); + void MergeAdjacentConnections(CNavArea *adjArea); + void AssignNodes(CNavArea *area); + void FinishSplitEdit(CNavArea *newArea, NavDirType ignoreEdge); + void OnDestroyNotify(CNavArea *dead); + void DecayDanger(void); +private: + friend void ConnectGeneratedAreas(void); + friend void MergeGeneratedAreas(void); + friend void MarkJumpAreas(void); + friend bool SaveNavigationMap(const char *filename); + friend NavErrorType LoadNavigationMap(void); + friend void DestroyNavigationMap(void); + friend void DestroyHidingSpots(void); + friend void StripNavigationAreas(void); + + friend class CNavAreaGrid; + friend class CCSBotManager; + + void Initialize(void); + +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + static bool IMPLEMENT_ARRAY(m_isReset); + static unsigned int IMPLEMENT_ARRAY(m_nextID); + +#ifdef HOOK_GAMEDLL +private: +#endif // HOOK_GAMEDLL + + unsigned int m_id; + Extent m_extent; + Vector m_center; + unsigned char m_attributeFlags; + Place m_place; + + float m_neZ; + float m_swZ; + + enum { MAX_AREA_TEAMS = 2 }; + + float m_clearedTimestamp[MAX_AREA_TEAMS]; + float m_danger[MAX_AREA_TEAMS]; + float m_dangerTimestamp[MAX_AREA_TEAMS]; + #if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding1; -#endif // HOOK_GAMEDLL - - HidingSpotList m_hidingSpotList; - +#endif // HOOK_GAMEDLL + + HidingSpotList m_hidingSpotList; + #if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding2; -#endif // HOOK_GAMEDLL - - SpotEncounterList m_spotEncounterList; - - enum { MAX_APPROACH_AREAS = 16 }; - - ApproachInfo m_approach[MAX_APPROACH_AREAS]; - unsigned char m_approachCount; - -#ifndef HOOK_GAMEDLL - static unsigned int m_masterMarker; -#else -public: - static unsigned int (*m_masterMarker); -private: -#endif // HOOK_GAMEDLL - - unsigned int m_marker; - CNavArea *m_parent; - NavTraverseType m_parentHow; - float m_totalCost; - float m_costSoFar; - -#ifndef HOOK_GAMEDLL - static CNavArea *m_openList; -#else -public: - static CNavArea *(*m_openList); -private: -#endif // HOOK_GAMEDLL - - CNavArea *m_nextOpen; - CNavArea *m_prevOpen; - unsigned int m_openMarker; - +#endif // HOOK_GAMEDLL +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + SpotEncounterList m_spotEncounterList; + + enum { MAX_APPROACH_AREAS = 16 }; + + ApproachInfo m_approach[MAX_APPROACH_AREAS];//104 + unsigned char m_approachCount; + +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + static unsigned int IMPLEMENT_ARRAY(m_masterMarker); + +#ifdef HOOK_GAMEDLL +private: +#endif // HOOK_GAMEDLL + + unsigned int m_marker; + CNavArea *m_parent; + NavTraverseType m_parentHow; + float m_totalCost; + float m_costSoFar; + +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + static CNavArea *IMPLEMENT_ARRAY(m_openList); + +#ifdef HOOK_GAMEDLL +private: +#endif // HOOK_GAMEDLL + + CNavArea *m_nextOpen; + CNavArea *m_prevOpen; + unsigned int m_openMarker; + #ifdef _WIN32 int unknown_padding3; -#endif // _WIN32 - - NavConnectList m_connect[ NUM_DIRECTIONS ]; - +#endif // _WIN32 + + NavConnectList m_connect[ NUM_DIRECTIONS ]; + #ifdef _WIN32 int unknown_padding4; int unknown_padding5; int unknown_padding6; int unknown_padding7; -#endif // _WIN32 - - NavLadderList m_ladder[ NUM_LADDER_DIRECTIONS ]; - +#endif // _WIN32 + + NavLadderList m_ladder[ NUM_LADDER_DIRECTIONS ]; + #ifdef _WIN32 int unknown_padding8; -#endif // _WIN32 - - CNavNode *m_node[ NUM_CORNERS ]; +#endif // _WIN32 + + CNavNode *m_node[ NUM_CORNERS ]; #ifdef _WIN32 int unknown_padding9; -#endif // _WIN32 - - NavAreaList m_overlapList; - - CNavArea *m_prevHash; - CNavArea *m_nextHash; - -};/* size: 532, cachelines: 9, members: 32 */ - -extern NavAreaList TheNavAreaList; - -/* <4c1534> ../game_shared/bot/nav_area.h:417 */ -inline bool CNavArea::IsDegenerate(void) const -{ - return (m_extent.lo.x >= m_extent.hi.x || m_extent.lo.y >= m_extent.hi.y); -} - -/* <568e1d> ../game_shared/bot/nav_area.h:422 */ -inline CNavArea *CNavArea::GetAdjacentArea(NavDirType dir, int i) const -{ - NavConnectList::const_iterator iter; - for (iter = m_connect[dir].begin(); iter != m_connect[dir].end(); ++iter) - { - if (i == 0) - return (*iter).area; - --i; - } - return NULL; -} - -/* <5a01dc> ../game_shared/bot/nav_area.h:435 */ -inline bool CNavArea::IsOpen(void) const -{ -#ifndef HOOK_GAMEDLL - return (m_openMarker == m_masterMarker) ? true : false; -#else - return (m_openMarker == (*m_masterMarker)) ? true : false; -#endif // HOOK_GAMEDLL -} - -/* <5a0a62> ../game_shared/bot/nav_area.h:440 */ -inline bool CNavArea::IsOpenListEmpty(void) -{ -#ifndef HOOK_GAMEDLL - return (m_openList != NULL) ? false : true; -#else - return ((*m_openList) != NULL) ? false : true; -#endif // HOOK_GAMEDLL -} - -/* <5a1483> ../game_shared/bot/nav_area.h:445 */ -inline CNavArea *CNavArea::PopOpenList(void) -{ -#ifndef HOOK_GAMEDLL - if (m_openList) - { - CNavArea *area = m_openList; - area->RemoveFromOpenList(); - return area; - } -#else - if ((*m_openList)) - { - CNavArea *area = (*m_openList); - area->RemoveFromOpenList(); - return area; - } -#endif // HOOK_GAMEDLL - return NULL; -} - -/* <5a0a2a> ../game_shared/bot/nav_area.h:460 */ -inline bool CNavArea::IsClosed(void) const -{ - if (IsMarked() && !IsOpen()) - return true; - - return false; -} - -/* <5a0a46> ../game_shared/bot/nav_area.h:468 */ -inline void CNavArea::AddToClosedList(void) -{ - Mark(); -} - -/* <5a01f8> ../game_shared/bot/nav_area.h:473 */ -inline void CNavArea::RemoveFromClosedList(void) -{ - -} - -/* <4cf943> ../game_shared/bot/nav_area.cpp:4947 */ -class CNavAreaGrid -{ -public: - CNavAreaGrid(void); - ~CNavAreaGrid(); - - void Reset(void); - void Initialize(float minX, float maxX, float minY, float maxY); - void AddNavArea(CNavArea *area); - void RemoveNavArea(CNavArea *area); - unsigned int GetNavAreaCount(void) const - { - return m_areaCount; - } - CNavArea *GetNavArea(const Vector *pos, float beneathLimt = 120.0f) const; - CNavArea *GetNavAreaByID(unsigned int id) const; - CNavArea *GetNearestNavArea(const Vector *pos, bool anyZ = false) const; - - Place GetPlace(const Vector *pos) const; - -private: - - inline int ComputeHashKey(unsigned int id) const - { - return id & 0xFF; - } - inline int WorldToGridX(float wx) const - { - int x = (wx - m_minX) / m_cellSize; - if (x < 0) - x = 0; - - else if (x >= m_gridSizeX) - x = m_gridSizeX - 1; - - return x; - } - inline int WorldToGridY(float wy) const - { - int y = (wy - m_minY) / m_cellSize; - if (y < 0) - y = 0; - else if (y >= m_gridSizeY) - y = m_gridSizeY - 1; - - return y; - } - -private: - const float m_cellSize; - NavAreaList *m_grid; - int m_gridSizeX; - int m_gridSizeY; - float m_minX; - float m_minY; - unsigned int m_areaCount; - - enum { HASH_TABLE_SIZE = 256 }; - CNavArea *m_hashTable[HASH_TABLE_SIZE]; - -};/* size: 1052, cachelines: 17, members: 8 */ - -class ShortestPathCost -{ -public: - float operator() (CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder) - { - if (fromArea == NULL) - { - return 0.0f; - } - else - { - float dist; - - if (ladder) - dist = ladder->m_length; - else - dist = (*area->GetCenter() - *fromArea->GetCenter()).Length(); - - float cost = dist + fromArea->GetCostSoFar(); - if (area->GetAttributes() & NAV_CROUCH) - { - const float crouchPenalty = 20.0f; - cost += crouchPenalty * dist; - } - if (area->GetAttributes() & NAV_JUMP) - { - const float jumpPenalty = 5.0f; - cost += jumpPenalty * dist; - } - return cost; - } - } -};/* size: 0, cachelines: 0, members: 0 */ - -/* <4c3e99> ../game_shared/bot/nav_area.h:679 */ -template -bool NavAreaBuildPath(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, CostFunctor &costFunc, CNavArea **closestArea = NULL) -{ - if (closestArea) - *closestArea = NULL; - - if (startArea == NULL) - return false; - - if (goalArea == NULL && goalPos == NULL) - { - return false; - } - - startArea->SetParent(NULL); - if (startArea == goalArea) - { - goalArea->SetParent(NULL); - - if (closestArea) - *closestArea = goalArea; - - return true; - } - Vector actualGoalPos = (goalPos) ? *goalPos : *goalArea->GetCenter(); - CNavArea::ClearSearchLists(); - startArea->SetTotalCost((*startArea->GetCenter() - actualGoalPos).Length()); - - float initCost = costFunc(startArea, NULL, NULL); - if (initCost < 0.0f) - return false; - startArea->SetCostSoFar(initCost); - - startArea->AddToOpenList(); - - if (closestArea) - *closestArea = startArea; - float closestAreaDist = startArea->GetTotalCost(); - - while (!CNavArea::IsOpenListEmpty()) - { - CNavArea *area = CNavArea::PopOpenList(); - if (area == goalArea) - { - if (closestArea) - *closestArea = goalArea; - - return true; - } - - bool searchFloor = true; - int dir = NORTH; - const NavConnectList *floorList = area->GetAdjacentList(NORTH); - NavConnectList::const_iterator floorIter = floorList->begin(); - - bool ladderUp = true; - const NavLadderList *ladderList = NULL; - NavLadderList::const_iterator ladderIter; - enum - { - AHEAD = 0, - LEFT, - RIGHT, - BEHIND, - NUM_TOP_DIRECTIONS - }; - int ladderTopDir; - - while (true) - { - CNavArea *newArea; - NavTraverseType how; - const CNavLadder *ladder = NULL; - - if (searchFloor) - { - if (floorIter == floorList->end()) - { - ++dir; - - if (dir == NUM_DIRECTIONS) - { - searchFloor = false; - - ladderList = area->GetLadderList(LADDER_UP); - ladderIter = ladderList->begin(); - ladderTopDir = AHEAD; - } - else - { - - floorList = area->GetAdjacentList((NavDirType)dir); - floorIter = floorList->begin(); - } - continue; - } - - newArea = (*floorIter).area; - how = (NavTraverseType)dir; - ++floorIter; - } - else - { - if (ladderIter == ladderList->end()) - { - if (!ladderUp) - break; - - else - { - ladderUp = false; - ladderList = area->GetLadderList(LADDER_DOWN); - ladderIter = ladderList->begin(); - } - continue; - } - - if (ladderUp) - { - ladder = *ladderIter; - if (ladder->m_isDangling) - { - ++ladderIter; - continue; - } - - if (ladderTopDir == AHEAD) - newArea = ladder->m_topForwardArea; - else if (ladderTopDir == LEFT) - newArea = ladder->m_topLeftArea; - else if (ladderTopDir == RIGHT) - newArea = ladder->m_topRightArea; - else - { - ++ladderIter; - continue; - } - - how = GO_LADDER_UP; - ++ladderTopDir; - } - else - { - newArea = (*ladderIter)->m_bottomArea; - how = GO_LADDER_DOWN; - ladder = (*ladderIter); - ++ladderIter; - } - - if (newArea == NULL) - continue; - } - - if (newArea == area) - continue; - - float newCostSoFar = costFunc(newArea, area, ladder); - if (newCostSoFar < 0.0f) - continue; - - if ((newArea->IsOpen() || newArea->IsClosed()) && newArea->GetCostSoFar() <= newCostSoFar) - continue; - - else - { - float newCostRemaining = (*newArea->GetCenter() - actualGoalPos).Length(); - if (closestArea && newCostRemaining < closestAreaDist) - { - *closestArea = newArea; - closestAreaDist = newCostRemaining; - } - - newArea->SetParent(area, how); - newArea->SetCostSoFar(newCostSoFar); - newArea->SetTotalCost(newCostSoFar + newCostRemaining); - - if (newArea->IsClosed()) - newArea->RemoveFromClosedList(); - - if (newArea->IsOpen()) - newArea->UpdateOnOpenList(); - else - newArea->AddToOpenList(); - } - } - area->AddToClosedList(); - } - return false; -} - -/* <3fcb64> ../game_shared/bot/nav_area.h:914 */ -template -float NavAreaTravelDistance(CNavArea *startArea, CNavArea *endArea, CostFunctor &costFunc) -{ - if (startArea == NULL) - return -1.0f; - - if (endArea == NULL) - return -1.0f; - - if (startArea == endArea) - return 0.0f; - - if (NavAreaBuildPath(startArea, endArea, NULL, costFunc) == false) - return -1.0f; - - float distance = 0.0f; - for (CNavArea *area = endArea; area->GetParent(); area = area->GetParent()) - { - distance += (*area->GetCenter() - *area->GetParent()->GetCenter()).Length(); - } - return distance; -} - -// OVERLOAD -template -float NavAreaTravelDistance(const Vector *startPos, CNavArea *startArea, const Vector *goalPos, CostFunctor &costFunc) -{ - if (startArea == NULL || startPos == NULL || goalPos == NULL) - return -1.0f; - - CNavArea *goalArea = NULL; - if (NavAreaBuildPath(startArea, TheNavAreaGrid.GetNearestNavArea(goalPos), goalPos, costFunc, &goalArea) == false) - return -1.0f; - - if (goalArea == NULL) - return -1.0f; - - if (goalArea->GetParent() == NULL) - return (*goalPos - *startPos).Length(); - - else - { - CNavArea *area = goalArea->GetParent(); - float distance = (*goalPos - *area->GetCenter()).Length(); - - for (; area->GetParent(); area = area->GetParent()) - { - distance += (*area->GetCenter() - *area->GetParent()->GetCenter()).Length(); - } - return distance; - } -} - -/* <2e7572> ../game_shared/bot/nav_area.h:990 */ -inline void AddAreaToOpenList(CNavArea *area, CNavArea *parent, const Vector *startPos, float maxRange) -{ - if (area == NULL) - return; - - if (!area->IsMarked()) - { - area->Mark(); - area->SetTotalCost(0.0f); - area->SetParent(parent); - - if (maxRange > 0.0f) - { - Vector closePos; - area->GetClosestPointOnArea(startPos, &closePos); - if ((closePos - *startPos).Make2D().IsLengthLessThan(maxRange)) - { - float distAlong = parent->GetCostSoFar(); - distAlong += (*area->GetCenter() - *parent->GetCenter()).Length(); - area->SetCostSoFar(distAlong); - - if (distAlong <= 1.5f * maxRange) - area->AddToOpenList(); - } - } - else - area->AddToOpenList(); - } -} - -/* <56903e> ../game_shared/bot/nav_area.h:1028 */ -template -void SearchSurroundingAreas(CNavArea *startArea, const Vector *startPos, Functor &func, float maxRange = -1.0f) -{ - if (startArea == NULL || startPos == NULL) - return; - - CNavArea::MakeNewMarker(); - CNavArea::ClearSearchLists(); - - startArea->AddToOpenList(); - startArea->SetTotalCost(0.0f); - startArea->SetCostSoFar(0.0f); - startArea->SetParent(NULL); - startArea->Mark(); - - while (!CNavArea::IsOpenListEmpty()) - { - - CNavArea *area = CNavArea::PopOpenList(); - if (func(area)) - { - for (int dir = 0; dir < NUM_DIRECTIONS; ++dir) - { - int count = area->GetAdjacentCount((NavDirType)dir); - for (int i = 0; i < count; ++i) - { - CNavArea *adjArea = area->GetAdjacentArea((NavDirType)dir, i); - AddAreaToOpenList(adjArea, area, startPos, maxRange); - } - } - - NavLadderList::const_iterator ladderIt; - const NavLadderList *ladderList = area->GetLadderList(LADDER_UP); - if (ladderList) - { - for (ladderIt = ladderList->begin(); ladderIt != ladderList->end(); ++ladderIt) - { - const CNavLadder *ladder = *ladderIt; - if (ladder->m_isDangling) - { - continue; - } - - AddAreaToOpenList(ladder->m_topForwardArea, area, startPos, maxRange); - AddAreaToOpenList(ladder->m_topLeftArea, area, startPos, maxRange); - AddAreaToOpenList(ladder->m_topRightArea, area, startPos, maxRange); - } - } - ladderList = area->GetLadderList(LADDER_DOWN); - if (ladderList) - { - for (ladderIt = ladderList->begin(); ladderIt != ladderList->end(); ++ladderIt) - { - const CNavLadder *ladder = *ladderIt; - AddAreaToOpenList(ladder->m_bottomArea, area, startPos, maxRange); - } - } - } - } -} - -/* <4c4137> ../game_shared/bot/nav_area.h:1109 */ -template -void ForAllAreas(Functor &func) -{ - NavAreaList::iterator iter; - for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) - { - CNavArea *area = *iter; - func(area); - } -} - -/* <5497fa> ../game_shared/bot/nav_area.h:1143 */ -class FarAwayFromPositionFunctor -{ -public: - FarAwayFromPositionFunctor(const Vector *pos) - { - m_pos = pos; - } - - float operator() (CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder) - { - return 1.0f / (*m_pos - *area->GetCenter()).Length(); - } - -private: - const Vector *m_pos; -};/* size: 4, cachelines: 1, members: 1 */ - -/* <549838> ../game_shared/bot/nav_area.h:1162 */ -template -CNavArea *FindMinimumCostArea(CNavArea *startArea, CostFunctor &costFunc) -{ - const float minSize = 150.0f; - - enum { NUM_CHEAP_AREAS = 32 }; - struct - { - CNavArea *area; - float cost; - } - cheapAreaSet[NUM_CHEAP_AREAS]; - int cheapAreaSetCount = 0; - - NavAreaList::iterator iter; - for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) - { - CNavArea *area = *iter; - const Extent *extent = area->GetExtent(); - if (extent->hi.x - extent->lo.x < minSize || extent->hi.y - extent->lo.y < minSize) - continue; - - float cost = costFunc(area, startArea, NULL); - if (cheapAreaSetCount < NUM_CHEAP_AREAS) - { - cheapAreaSet[cheapAreaSetCount].area = area; - cheapAreaSet[cheapAreaSetCount++].cost = cost; - } - else - { - int expensive = 0; - for (int i = 1; i < NUM_CHEAP_AREAS; i++) - if (cheapAreaSet[i].cost > cheapAreaSet[expensive].cost) - expensive = i; - - if (cheapAreaSet[expensive].cost > cost) - { - cheapAreaSet[expensive].area = area; - cheapAreaSet[expensive].cost = cost; - } - } - } - if (cheapAreaSetCount) - { - return cheapAreaSet[RANDOM_LONG(0, cheapAreaSetCount-1)].area; - } - else - { - int numAreas = TheNavAreaList.size(); - int which = RANDOM_LONG(0, numAreas-1); - - NavAreaList::iterator iter; - for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) - if (which-- == 0) - break; - - return *iter; - } -} - -#ifdef HOOK_GAMEDLL - -typedef const Vector *(FIND_SPOT_CBASE)(CBaseEntity *, const Vector *, CNavArea *, float, int, bool); - -typedef void (CNavArea::*SAVE_FD)(int fd, unsigned int version); -typedef void (CNavArea::*SAVE_FILE)(FILE *fp); - -typedef void (CNavArea::*OVERLAP_VECTOR)(Vector *pos); -typedef void (CNavArea::*OVERLAP_CNAV)(CNavArea *area); - -typedef float (CNavArea::*GETZ_VECTOR)(const Vector *pos) const; -typedef float (CNavArea::*GETZ_TWO_FLOAT)(float x, float y) const; - -typedef void (HidingSpot::*HIDING_SPOT_VOID)(void); -typedef void (HidingSpot::*HIDING_SPOT_VECTOR)(const Vector *pos, unsigned char flags); - -typedef void (HidingSpot::*CNAV_AREA_VOID)(void); -typedef void (HidingSpot::*CNAV_AREA_TWO_VECTOR)(const Vector *corner, const Vector *otherCorner); -typedef void (HidingSpot::*CNAV_AREA_VECTOR)(const Vector *nwCorner, const Vector *neCorner, const Vector *seCorner, const Vector *swCorner); -typedef void (HidingSpot::*CNAV_AREA_NAVNODE)(CNavNode *nwNode, class CNavNode *neNode, class CNavNode *seNode, class CNavNode *swNode); - -#endif // HOOK_GAMEDLL - -#ifdef HOOK_GAMEDLL - -//#define TheNavLadderList (*pTheNavLadderList) -#define TheHidingSpotList (*pTheHidingSpotList) -#define TheNavAreaList (*pTheNavAreaList) -#define TheNavAreaGrid (*pTheNavAreaGrid) - -//#define lastDrawTimestamp (*plastDrawTimestamp) -#define goodSizedAreaList (*pgoodSizedAreaList) -//#define markedArea (*pmarkedArea) -//#define lastSelectedArea (*plastSelectedArea) -#define markedCorner (*pmarkedCorner) -//#define isCreatingNavArea (*pisCreatingNavArea) -//#define isAnchored (*pisAnchored) -//#define anchor (*panchor) -//#define isPlaceMode (*pisPlaceMode) -//#define isPlacePainting (*pisPlacePainting) -#define BlockedID (*pBlockedID) -#define BlockedIDCount (*pBlockedIDCount) - -#endif // HOOK_GAMEDLL - -//extern NavLadderList TheNavLadderList; -extern HidingSpotList TheHidingSpotList; -extern NavAreaList TheNavAreaList; -extern CNavAreaGrid TheNavAreaGrid; -//extern float lastDrawTimestamp; -extern NavAreaList goodSizedAreaList; -//extern CNavArea *markedArea; -//extern CNavArea *lastSelectedArea; -extern NavCornerType markedCorner; -//extern bool isCreatingNavArea; -//extern bool isAnchored; -//extern Vector anchor; -//extern bool isPlaceMode; -//extern bool isPlacePainting; -extern unsigned int BlockedID[ MAX_BLOCKED_AREAS ]; -extern int BlockedIDCount; - -#ifdef HOOK_GAMEDLL - -NOXREF void buildGoodSizedList(void); - -#endif // HOOK_GAMEDLL - -NOBODY bool IsHidingSpotInCover(const Vector *spot); -NOBODY void ClassifySniperSpot(HidingSpot *spot); -NOBODY void DestroyHidingSpots(void); -NOBODY void EditNavAreas(NavEditCmdType cmd); -bool GetGroundHeight(const Vector *pos, float *height, Vector *normal = NULL); -NOBODY bool GetSimpleGroundHeight(const Vector *pos, float *height, Vector *normal = NULL); -NOBODY inline bool IsAreaVisible(const Vector *pos, const CNavArea *area); -NOBODY CNavArea *GetMarkedArea(void); -NOBODY void EditNavAreasReset(void); -NOBODY void DrawHidingSpots(const CNavArea *area); -NOBODY void IncreaseDangerNearby(int teamID, float amount, CNavArea *startArea, const Vector *pos, float maxRadius); -NOBODY void DrawDanger(void); -NOBODY bool IsSpotOccupied(CBaseEntity *me, const Vector *pos); -NOBODY const Vector *FindNearbyHidingSpot(CBaseEntity *me, const Vector *pos, CNavArea *startArea, float maxRange = 1000.0f, bool isSniper = false, bool useNearest = false); -NOBODY const Vector *FindNearbyRetreatSpot(CBaseEntity *me, const Vector *start, CNavArea *startArea, float maxRange = 1000.0f, int avoidTeam = 0, bool useCrouchAreas = true); -NOBODY bool IsCrossingLineOfFire(const Vector &start, const Vector &finish, CBaseEntity *ignore = NULL, int ignoreTeam = 0); -NOBODY const Vector *FindRandomHidingSpot(CBaseEntity *me, Place place, bool isSniper = false); -NOBODY HidingSpot *GetHidingSpotByID(unsigned int id); -void ApproachAreaAnalysisPrep(void); -void CleanupApproachAreaAnalysisPrep(void); -NOBODY void DestroyLadders(void); -NOBODY void DestroyNavigationMap(void); -NOBODY void StripNavigationAreas(void); -NOBODY inline CNavArea *FindFirstAreaInDirection(const Vector *start, NavDirType dir, float range, float beneathLimit, CBaseEntity *traceIgnore, Vector *closePos); -NOBODY inline bool testJumpDown(const Vector *fromPos, const Vector *toPos); -NOBODY inline CNavArea *findJumpDownArea(const Vector *fromPos, NavDirType dir); -NOBODY void ConnectGeneratedAreas(void); -NOBODY void MergeGeneratedAreas(void); -NOBODY inline bool IsAreaRoughlySquare(const CNavArea *area); -NOBODY void SplitX(CNavArea *area); -NOBODY void SplitY(CNavArea *area); -NOBODY void SquareUpAreas(void); -NOBODY bool TestArea(CNavNode *node, int width, int height); -NOBODY int BuildArea(CNavNode *node, int width, int height); -NOBODY void BuildLadders(void); -NOBODY void MarkJumpAreas(void); -NOBODY void GenerateNavigationAreaMesh(void); - -//refs -extern float (*pGetZ__Vector)(const Vector *pos); -extern CNavArea *(*pGetNearestNavArea)(const Vector *pos, bool anyZ); -extern CNavArea *(*pGetNavArea)(const Vector *pos, float beneathLimit); - -#endif // NAV_AREA_H +#endif // _WIN32 + + NavAreaList m_overlapList; + + CNavArea *m_prevHash; + CNavArea *m_nextHash; + +};/* size: 532, cachelines: 9, members: 32 */ + +extern NavAreaList TheNavAreaList; + +/* <4c1534> ../game_shared/bot/nav_area.h:417 */ +inline bool CNavArea::IsDegenerate(void) const +{ + return (m_extent.lo.x >= m_extent.hi.x || m_extent.lo.y >= m_extent.hi.y); +} + +/* <568e1d> ../game_shared/bot/nav_area.h:422 */ +inline CNavArea *CNavArea::GetAdjacentArea(NavDirType dir, int i) const +{ + NavConnectList::const_iterator iter; + for (iter = m_connect[dir].begin(); iter != m_connect[dir].end(); ++iter) + { + if (i == 0) + return (*iter).area; + --i; + } + return NULL; +} + +/* <5a01dc> ../game_shared/bot/nav_area.h:435 */ +inline bool CNavArea::IsOpen(void) const +{ + return (m_openMarker == IMPLEMENT_ARRAY(m_masterMarker)) ? true : false; +} + +/* <5a0a62> ../game_shared/bot/nav_area.h:440 */ +inline bool CNavArea::IsOpenListEmpty(void) +{ + return (IMPLEMENT_ARRAY(m_openList) != NULL) ? false : true; +} + +/* <5a1483> ../game_shared/bot/nav_area.h:445 */ +inline CNavArea *CNavArea::PopOpenList(void) +{ +#ifndef HOOK_GAMEDLL + if (m_openList) + { + CNavArea *area = m_openList; + area->RemoveFromOpenList(); + return area; + } +#else + if (IMPLEMENT_ARRAY(m_openList)) + { + CNavArea *area = IMPLEMENT_ARRAY(m_openList); + area->RemoveFromOpenList(); + return area; + } +#endif // HOOK_GAMEDLL + return NULL; +} + +/* <5a0a2a> ../game_shared/bot/nav_area.h:460 */ +inline bool CNavArea::IsClosed(void) const +{ + if (IsMarked() && !IsOpen()) + return true; + + return false; +} + +/* <5a0a46> ../game_shared/bot/nav_area.h:468 */ +inline void CNavArea::AddToClosedList(void) +{ + Mark(); +} + +/* <5a01f8> ../game_shared/bot/nav_area.h:473 */ +inline void CNavArea::RemoveFromClosedList(void) +{ + +} + +/* <4cf943> ../game_shared/bot/nav_area.cpp:4947 */ +class CNavAreaGrid +{ +public: + CNavAreaGrid(void); + ~CNavAreaGrid(); + + void Reset(void); + void Initialize(float minX, float maxX, float minY, float maxY); + void AddNavArea(CNavArea *area); + void RemoveNavArea(CNavArea *area); + unsigned int GetNavAreaCount(void) const + { + return m_areaCount; + } + CNavArea *GetNavArea(const Vector *pos, float beneathLimt = 120.0f) const; + CNavArea *GetNavAreaByID(unsigned int id) const; + CNavArea *GetNearestNavArea(const Vector *pos, bool anyZ = false) const; + + Place GetPlace(const Vector *pos) const; + +private: + + inline int ComputeHashKey(unsigned int id) const + { + return id & 0xFF; + } + inline int WorldToGridX(float wx) const + { + int x = (wx - m_minX) / m_cellSize; + if (x < 0) + x = 0; + + else if (x >= m_gridSizeX) + x = m_gridSizeX - 1; + + return x; + } + inline int WorldToGridY(float wy) const + { + int y = (wy - m_minY) / m_cellSize; + if (y < 0) + y = 0; + else if (y >= m_gridSizeY) + y = m_gridSizeY - 1; + + return y; + } + +private: + const float m_cellSize; + NavAreaList *m_grid; + int m_gridSizeX; + int m_gridSizeY; + float m_minX; + float m_minY; + unsigned int m_areaCount; + + enum { HASH_TABLE_SIZE = 256 }; + CNavArea *m_hashTable[HASH_TABLE_SIZE]; + +};/* size: 1052, cachelines: 17, members: 8 */ + +class ShortestPathCost +{ +public: + float operator() (CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder) + { + if (fromArea == NULL) + { + return 0.0f; + } + else + { + float dist; + + if (ladder) + dist = ladder->m_length; + else + dist = (*area->GetCenter() - *fromArea->GetCenter()).Length(); + + float cost = dist + fromArea->GetCostSoFar(); + if (area->GetAttributes() & NAV_CROUCH) + { + const float crouchPenalty = 20.0f; + cost += crouchPenalty * dist; + } + if (area->GetAttributes() & NAV_JUMP) + { + const float jumpPenalty = 5.0f; + cost += jumpPenalty * dist; + } + return cost; + } + } +};/* size: 0, cachelines: 0, members: 0 */ + +/* <4c3e99> ../game_shared/bot/nav_area.h:679 */ +template +bool NavAreaBuildPath(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, CostFunctor &costFunc, CNavArea **closestArea = NULL) +{ + if (closestArea) + *closestArea = NULL; + + if (startArea == NULL) + return false; + + if (goalArea == NULL && goalPos == NULL) + { + return false; + } + + startArea->SetParent(NULL); + if (startArea == goalArea) + { + goalArea->SetParent(NULL); + + if (closestArea) + *closestArea = goalArea; + + return true; + } + Vector actualGoalPos = (goalPos) ? *goalPos : *goalArea->GetCenter(); + CNavArea::ClearSearchLists(); + startArea->SetTotalCost((*startArea->GetCenter() - actualGoalPos).Length()); + + float initCost = costFunc(startArea, NULL, NULL); + if (initCost < 0.0f) + return false; + startArea->SetCostSoFar(initCost); + + startArea->AddToOpenList(); + + if (closestArea) + *closestArea = startArea; + float closestAreaDist = startArea->GetTotalCost(); + + while (!CNavArea::IsOpenListEmpty()) + { + CNavArea *area = CNavArea::PopOpenList(); + if (area == goalArea) + { + if (closestArea) + *closestArea = goalArea; + + return true; + } + + bool searchFloor = true; + int dir = NORTH; + const NavConnectList *floorList = area->GetAdjacentList(NORTH); + NavConnectList::const_iterator floorIter = floorList->begin(); + + bool ladderUp = true; + const NavLadderList *ladderList = NULL; + NavLadderList::const_iterator ladderIter; + enum + { + AHEAD = 0, + LEFT, + RIGHT, + BEHIND, + NUM_TOP_DIRECTIONS + }; + int ladderTopDir; + + while (true) + { + CNavArea *newArea; + NavTraverseType how; + const CNavLadder *ladder = NULL; + + if (searchFloor) + { + if (floorIter == floorList->end()) + { + ++dir; + + if (dir == NUM_DIRECTIONS) + { + searchFloor = false; + + ladderList = area->GetLadderList(LADDER_UP); + ladderIter = ladderList->begin(); + ladderTopDir = AHEAD; + } + else + { + + floorList = area->GetAdjacentList((NavDirType)dir); + floorIter = floorList->begin(); + } + continue; + } + + newArea = (*floorIter).area; + how = (NavTraverseType)dir; + ++floorIter; + } + else + { + if (ladderIter == ladderList->end()) + { + if (!ladderUp) + break; + + else + { + ladderUp = false; + ladderList = area->GetLadderList(LADDER_DOWN); + ladderIter = ladderList->begin(); + } + continue; + } + + if (ladderUp) + { + ladder = *ladderIter; + if (ladder->m_isDangling) + { + ++ladderIter; + continue; + } + + if (ladderTopDir == AHEAD) + newArea = ladder->m_topForwardArea; + else if (ladderTopDir == LEFT) + newArea = ladder->m_topLeftArea; + else if (ladderTopDir == RIGHT) + newArea = ladder->m_topRightArea; + else + { + ++ladderIter; + continue; + } + + how = GO_LADDER_UP; + ++ladderTopDir; + } + else + { + newArea = (*ladderIter)->m_bottomArea; + how = GO_LADDER_DOWN; + ladder = (*ladderIter); + ++ladderIter; + } + + if (newArea == NULL) + continue; + } + + if (newArea == area) + continue; + + float newCostSoFar = costFunc(newArea, area, ladder); + if (newCostSoFar < 0.0f) + continue; + + if ((newArea->IsOpen() || newArea->IsClosed()) && newArea->GetCostSoFar() <= newCostSoFar) + continue; + + else + { + float newCostRemaining = (*newArea->GetCenter() - actualGoalPos).Length(); + if (closestArea && newCostRemaining < closestAreaDist) + { + *closestArea = newArea; + closestAreaDist = newCostRemaining; + } + + newArea->SetParent(area, how); + newArea->SetCostSoFar(newCostSoFar); + newArea->SetTotalCost(newCostSoFar + newCostRemaining); + + if (newArea->IsClosed()) + newArea->RemoveFromClosedList(); + + if (newArea->IsOpen()) + newArea->UpdateOnOpenList(); + else + newArea->AddToOpenList(); + } + } + area->AddToClosedList(); + } + return false; +} + +/* <3fcb64> ../game_shared/bot/nav_area.h:914 */ +template +float NavAreaTravelDistance(CNavArea *startArea, CNavArea *endArea, CostFunctor &costFunc) +{ + if (startArea == NULL) + return -1.0f; + + if (endArea == NULL) + return -1.0f; + + if (startArea == endArea) + return 0.0f; + + if (NavAreaBuildPath(startArea, endArea, NULL, costFunc) == false) + return -1.0f; + + float distance = 0.0f; + for (CNavArea *area = endArea; area->GetParent(); area = area->GetParent()) + { + distance += (*area->GetCenter() - *area->GetParent()->GetCenter()).Length(); + } + return distance; +} + +// OVERLOAD +template +float NavAreaTravelDistance(const Vector *startPos, CNavArea *startArea, const Vector *goalPos, CostFunctor &costFunc) +{ + if (startArea == NULL || startPos == NULL || goalPos == NULL) + return -1.0f; + + CNavArea *goalArea = NULL; + if (NavAreaBuildPath(startArea, TheNavAreaGrid.GetNearestNavArea(goalPos), goalPos, costFunc, &goalArea) == false) + return -1.0f; + + if (goalArea == NULL) + return -1.0f; + + if (goalArea->GetParent() == NULL) + return (*goalPos - *startPos).Length(); + + else + { + CNavArea *area = goalArea->GetParent(); + float distance = (*goalPos - *area->GetCenter()).Length(); + + for (; area->GetParent(); area = area->GetParent()) + { + distance += (*area->GetCenter() - *area->GetParent()->GetCenter()).Length(); + } + return distance; + } +} + +/* <2e7572> ../game_shared/bot/nav_area.h:990 */ +inline void AddAreaToOpenList(CNavArea *area, CNavArea *parent, const Vector *startPos, float maxRange) +{ + if (area == NULL) + return; + + if (!area->IsMarked()) + { + area->Mark(); + area->SetTotalCost(0.0f); + area->SetParent(parent); + + if (maxRange > 0.0f) + { + Vector closePos; + area->GetClosestPointOnArea(startPos, &closePos); + if ((closePos - *startPos).Make2D().IsLengthLessThan(maxRange)) + { + float distAlong = parent->GetCostSoFar(); + distAlong += (*area->GetCenter() - *parent->GetCenter()).Length(); + area->SetCostSoFar(distAlong); + + if (distAlong <= 1.5f * maxRange) + area->AddToOpenList(); + } + } + else + area->AddToOpenList(); + } +} + +/* <56903e> ../game_shared/bot/nav_area.h:1028 */ +template +void SearchSurroundingAreas(CNavArea *startArea, const Vector *startPos, Functor &func, float maxRange = -1.0f) +{ + if (startArea == NULL || startPos == NULL) + return; + + CNavArea::MakeNewMarker(); + CNavArea::ClearSearchLists(); + + startArea->AddToOpenList(); + startArea->SetTotalCost(0.0f); + startArea->SetCostSoFar(0.0f); + startArea->SetParent(NULL); + startArea->Mark(); + + while (!CNavArea::IsOpenListEmpty()) + { + + CNavArea *area = CNavArea::PopOpenList(); + if (func(area)) + { + for (int dir = 0; dir < NUM_DIRECTIONS; ++dir) + { + int count = area->GetAdjacentCount((NavDirType)dir); + for (int i = 0; i < count; ++i) + { + CNavArea *adjArea = area->GetAdjacentArea((NavDirType)dir, i); + AddAreaToOpenList(adjArea, area, startPos, maxRange); + } + } + + NavLadderList::const_iterator ladderIt; + const NavLadderList *ladderList = area->GetLadderList(LADDER_UP); + if (ladderList) + { + for (ladderIt = ladderList->begin(); ladderIt != ladderList->end(); ++ladderIt) + { + const CNavLadder *ladder = *ladderIt; + if (ladder->m_isDangling) + { + continue; + } + + AddAreaToOpenList(ladder->m_topForwardArea, area, startPos, maxRange); + AddAreaToOpenList(ladder->m_topLeftArea, area, startPos, maxRange); + AddAreaToOpenList(ladder->m_topRightArea, area, startPos, maxRange); + } + } + ladderList = area->GetLadderList(LADDER_DOWN); + if (ladderList) + { + for (ladderIt = ladderList->begin(); ladderIt != ladderList->end(); ++ladderIt) + { + const CNavLadder *ladder = *ladderIt; + AddAreaToOpenList(ladder->m_bottomArea, area, startPos, maxRange); + } + } + } + } +} + +/* <4c4137> ../game_shared/bot/nav_area.h:1109 */ +template +void ForAllAreas(Functor &func) +{ + NavAreaList::iterator iter; + for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + { + CNavArea *area = *iter; + func(area); + } +} + +/* <5497fa> ../game_shared/bot/nav_area.h:1143 */ +class FarAwayFromPositionFunctor +{ +public: + FarAwayFromPositionFunctor(const Vector *pos) + { + m_pos = pos; + } + + float operator() (CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder) + { + return 1.0f / (*m_pos - *area->GetCenter()).Length(); + } + +private: + const Vector *m_pos; +};/* size: 4, cachelines: 1, members: 1 */ + +/* <549838> ../game_shared/bot/nav_area.h:1162 */ +template +CNavArea *FindMinimumCostArea(CNavArea *startArea, CostFunctor &costFunc) +{ + const float minSize = 150.0f; + + enum { NUM_CHEAP_AREAS = 32 }; + struct + { + CNavArea *area; + float cost; + } + cheapAreaSet[NUM_CHEAP_AREAS]; + int cheapAreaSetCount = 0; + + NavAreaList::iterator iter; + for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + { + CNavArea *area = *iter; + const Extent *extent = area->GetExtent(); + if (extent->hi.x - extent->lo.x < minSize || extent->hi.y - extent->lo.y < minSize) + continue; + + float cost = costFunc(area, startArea, NULL); + if (cheapAreaSetCount < NUM_CHEAP_AREAS) + { + cheapAreaSet[cheapAreaSetCount].area = area; + cheapAreaSet[cheapAreaSetCount++].cost = cost; + } + else + { + int expensive = 0; + for (int i = 1; i < NUM_CHEAP_AREAS; i++) + if (cheapAreaSet[i].cost > cheapAreaSet[expensive].cost) + expensive = i; + + if (cheapAreaSet[expensive].cost > cost) + { + cheapAreaSet[expensive].area = area; + cheapAreaSet[expensive].cost = cost; + } + } + } + if (cheapAreaSetCount) + { + return cheapAreaSet[RANDOM_LONG(0, cheapAreaSetCount-1)].area; + } + else + { + int numAreas = TheNavAreaList.size(); + int which = RANDOM_LONG(0, numAreas-1); + + NavAreaList::iterator iter; + for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + if (which-- == 0) + break; + + return *iter; + } +} + +#ifdef HOOK_GAMEDLL + +typedef const Vector *(FIND_SPOT_CBASE)(CBaseEntity *, const Vector *, CNavArea *, float, int, bool); + +typedef void (CNavArea::*SAVE_FD)(int fd, unsigned int version); +typedef void (CNavArea::*SAVE_FILE)(FILE *fp); + +typedef void (CNavArea::*OVERLAP_VECTOR)(Vector *pos); +typedef void (CNavArea::*OVERLAP_CNAV)(CNavArea *area); + +typedef float (CNavArea::*GETZ_VECTOR)(const Vector *pos) const; +typedef float (CNavArea::*GETZ_TWO_FLOAT)(float x, float y) const; + +typedef void (HidingSpot::*HIDING_SPOT_VOID)(void); +typedef void (HidingSpot::*HIDING_SPOT_VECTOR)(const Vector *pos, unsigned char flags); + +typedef void (HidingSpot::*CNAV_AREA_VOID)(void); +typedef void (HidingSpot::*CNAV_AREA_TWO_VECTOR)(const Vector *corner, const Vector *otherCorner); +typedef void (HidingSpot::*CNAV_AREA_VECTOR)(const Vector *nwCorner, const Vector *neCorner, const Vector *seCorner, const Vector *swCorner); +typedef void (HidingSpot::*CNAV_AREA_NAVNODE)(CNavNode *nwNode, class CNavNode *neNode, class CNavNode *seNode, class CNavNode *swNode); + +#endif // HOOK_GAMEDLL + +#ifdef HOOK_GAMEDLL + +#define TheNavLadderList (*pTheNavLadderList) +#define TheHidingSpotList (*pTheHidingSpotList) +#define TheNavAreaList (*pTheNavAreaList) +#define TheNavAreaGrid (*pTheNavAreaGrid) + +#define lastDrawTimestamp (*plastDrawTimestamp) +#define goodSizedAreaList (*pgoodSizedAreaList) +#define markedArea (*pmarkedArea) +#define lastSelectedArea (*plastSelectedArea) +#define markedCorner (*pmarkedCorner) +#define isCreatingNavArea (*pisCreatingNavArea) +//#define isAnchored (*pisAnchored) +//#define anchor (*panchor) +//#define isPlaceMode (*pisPlaceMode) +#define isPlacePainting (*pisPlacePainting) +#define editTimestamp (*peditTimestamp) + +#define BlockedID (*pBlockedID) +#define BlockedIDCount (*pBlockedIDCount) + +#endif // HOOK_GAMEDLL + +extern NavLadderList TheNavLadderList; +extern HidingSpotList TheHidingSpotList; +extern NavAreaList TheNavAreaList; +extern CNavAreaGrid TheNavAreaGrid; +extern float lastDrawTimestamp; +extern NavAreaList goodSizedAreaList; +extern CNavArea *markedArea; +extern CNavArea *lastSelectedArea; +extern NavCornerType markedCorner; +extern bool isCreatingNavArea; +//extern bool isAnchored; +//extern Vector anchor; +//extern bool isPlaceMode; +extern bool isPlacePainting; +extern float editTimestamp; + +extern unsigned int BlockedID[ MAX_BLOCKED_AREAS ]; +extern int BlockedIDCount; + +#ifdef HOOK_GAMEDLL + +NOXREF void buildGoodSizedList(void); + +#endif // HOOK_GAMEDLL + +NOBODY bool IsHidingSpotInCover(const Vector *spot); +NOBODY void ClassifySniperSpot(HidingSpot *spot); +NOBODY void DestroyHidingSpots(void); +NOBODY void EditNavAreas(NavEditCmdType cmd); +bool GetGroundHeight(const Vector *pos, float *height, Vector *normal = NULL); +NOBODY bool GetSimpleGroundHeight(const Vector *pos, float *height, Vector *normal = NULL); +NOBODY inline bool IsAreaVisible(const Vector *pos, const CNavArea *area); +NOBODY CNavArea *GetMarkedArea(void); +void EditNavAreasReset(void); +NOBODY void DrawHidingSpots(const CNavArea *area); +NOBODY void IncreaseDangerNearby(int teamID, float amount, CNavArea *startArea, const Vector *pos, float maxRadius); +NOBODY void DrawDanger(void); +NOBODY bool IsSpotOccupied(CBaseEntity *me, const Vector *pos); +NOBODY const Vector *FindNearbyHidingSpot(CBaseEntity *me, const Vector *pos, CNavArea *startArea, float maxRange = 1000.0f, bool isSniper = false, bool useNearest = false); +NOBODY const Vector *FindNearbyRetreatSpot(CBaseEntity *me, const Vector *start, CNavArea *startArea, float maxRange = 1000.0f, int avoidTeam = 0, bool useCrouchAreas = true); +NOBODY bool IsCrossingLineOfFire(const Vector &start, const Vector &finish, CBaseEntity *ignore = NULL, int ignoreTeam = 0); +NOBODY const Vector *FindRandomHidingSpot(CBaseEntity *me, Place place, bool isSniper = false); +NOBODY HidingSpot *GetHidingSpotByID(unsigned int id); +void ApproachAreaAnalysisPrep(void); +void CleanupApproachAreaAnalysisPrep(void); +void DestroyLadders(void); +NOBODY void DestroyNavigationMap(void); +NOBODY void StripNavigationAreas(void); +NOBODY inline CNavArea *FindFirstAreaInDirection(const Vector *start, NavDirType dir, float range, float beneathLimit, CBaseEntity *traceIgnore, Vector *closePos); +NOBODY inline bool testJumpDown(const Vector *fromPos, const Vector *toPos); +NOBODY inline CNavArea *findJumpDownArea(const Vector *fromPos, NavDirType dir); +NOBODY void ConnectGeneratedAreas(void); +NOBODY void MergeGeneratedAreas(void); +NOBODY inline bool IsAreaRoughlySquare(const CNavArea *area); +NOBODY void SplitX(CNavArea *area); +NOBODY void SplitY(CNavArea *area); +NOBODY void SquareUpAreas(void); +NOBODY bool TestArea(CNavNode *node, int width, int height); +NOBODY int BuildArea(CNavNode *node, int width, int height); +NOBODY void BuildLadders(void); +NOBODY void MarkJumpAreas(void); +NOBODY void GenerateNavigationAreaMesh(void); + +//refs +extern float (*pGetZ__Vector)(const Vector *pos); +extern CNavArea *(*pGetNearestNavArea)(const Vector *pos, bool anyZ); +extern CNavArea *(*pGetNavArea)(const Vector *pos, float beneathLimit); + +#endif // NAV_AREA_H diff --git a/regamedll/game_shared/bot/nav_file.cpp b/regamedll/game_shared/bot/nav_file.cpp index 9a095d5f..e93550fa 100644 --- a/regamedll/game_shared/bot/nav_file.cpp +++ b/regamedll/game_shared/bot/nav_file.cpp @@ -537,9 +537,15 @@ NOBODY void SanityCheckNavigationMap(const char *mapName) // } } +void (*pLoadNavigationMap)(void); + /* <4f19c7> ../game_shared/bot/nav_file.cpp:947 */ -NOBODY NavErrorType LoadNavigationMap(void) +NOBODY NavErrorType __declspec(naked) LoadNavigationMap(void) { + __asm + { + jmp pLoadNavigationMap + } // { // char filename; // 955 // class SteamFile navFile; // 965 diff --git a/regamedll/game_shared/bot/nav_file.h b/regamedll/game_shared/bot/nav_file.h index ab96f8c8..d90fc062 100644 --- a/regamedll/game_shared/bot/nav_file.h +++ b/regamedll/game_shared/bot/nav_file.h @@ -69,4 +69,6 @@ NOBODY void LoadLocationFile(const char *filename); NOBODY void SanityCheckNavigationMap(const char *mapName); NOBODY NavErrorType LoadNavigationMap(void); +extern void (*pLoadNavigationMap)(void); + #endif // NAV_FILE_H diff --git a/regamedll/game_shared/bot/nav_node.cpp b/regamedll/game_shared/bot/nav_node.cpp index 019c5b5f..e4544712 100644 --- a/regamedll/game_shared/bot/nav_node.cpp +++ b/regamedll/game_shared/bot/nav_node.cpp @@ -7,7 +7,7 @@ //NavDirType Opposite[ NUM_DIRECTIONS ] = { SOUTH, WEST, NORTH, EAST }; -//CNavNode *CNavNode::m_list = NULL; +CNavNode *CNavNode::m_list = NULL; //unsigned int CNavNode::m_listLength = 0; //Extent NodeMapExtent; @@ -16,7 +16,7 @@ //NavDirType Opposite[ NUM_DIRECTIONS ]; -//CNavNode *CNavNode::m_list; +CNavNode *IMPLEMENT_ARRAY_CLASS(CNavNode, m_list); //unsigned int CNavNode::m_listLength; //Extent NodeMapExtent; diff --git a/regamedll/game_shared/bot/nav_node.h b/regamedll/game_shared/bot/nav_node.h index 69ae1e7c..02b17a41 100644 --- a/regamedll/game_shared/bot/nav_node.h +++ b/regamedll/game_shared/bot/nav_node.h @@ -54,7 +54,7 @@ public: static CNavNode *GetFirst(void) { - return m_list; + return IMPLEMENT_ARRAY(m_list); } static unsigned int GetListLength(void) { @@ -109,9 +109,14 @@ private: unsigned int m_id; // unique ID of this node unsigned char m_attributeFlags; // set of attribute bit flags (see NavAttributeType) - static CNavNode *m_list; // the master list of all nodes for this map +#ifdef HOOK_GAMEDLL +public: +#endif // HOOK_GAMEDLL + static CNavNode *IMPLEMENT_ARRAY(m_list); // the master list of all nodes for this map static unsigned int m_listLength; - +#ifdef HOOK_GAMEDLL +private: +#endif // HOOK_GAMEDLL CNavNode *m_next; // next link in master list // below are only needed when generating diff --git a/regamedll/game_shared/shared_util.h b/regamedll/game_shared/shared_util.h index ac197af0..7a08a07c 100644 --- a/regamedll/game_shared/shared_util.h +++ b/regamedll/game_shared/shared_util.h @@ -56,7 +56,13 @@ NOBODY bool SharedTokenWaiting(const char *buffer); /* ../game_shared/shared_util.h:46 */ inline char *CloneString(const char *str) { - char *cloneStr = new char [strlen(str) + 1]; + if (!str) + { + char *cloneStr = new char[1]; + cloneStr[0] = '\0'; + return cloneStr; + } + char *cloneStr = new char [Q_strlen(str) + 1]; Q_strcpy(cloneStr, str); return cloneStr; } diff --git a/regamedll/hookers/6153_hooker.cpp b/regamedll/hookers/6153_hooker.cpp index 74194cb0..5aad6c1b 100644 --- a/regamedll/hookers/6153_hooker.cpp +++ b/regamedll/hookers/6153_hooker.cpp @@ -28,6 +28,8 @@ #include "precompiled.h" +#define CBASE_VIRTUAL_COUNT 58 + template size_t mfunc_ptr_cast(MFUNC f) { @@ -189,7 +191,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01DB5D20, "PM_ShouldDoSpectMode", (size_t)&PM_ShouldDoSpectMode }, // NOXREF //{ 0x01DB5D50, "PM_PlayerMove", (size_t)&PM_PlayerMove }, - { 0x01DB6430, "PM_CreateStuckTable", (size_t)&PM_CreateStuckTable }, + //5@{ 0x01DB6430, "PM_CreateStuckTable", (size_t)&PM_CreateStuckTable }, //{ 0x01DB66B0, "PM_GetVisEntInfo", (size_t)&PM_GetVisEntInfo }, // NOXREF //{ 0x01DB66E0, "PM_GetPhysEntInfo", (size_t)&PM_GetPhysEntInfo }, // NOXREF //pm_math @@ -219,7 +221,6 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "VectorMatrix", (size_t)&VectorMatrix }, //{ 0x0, "VectorAngles", (size_t)&VectorAngles }, - #endif // PM_Shared_Region #ifndef Monsters_Region @@ -229,11 +230,11 @@ FunctionHook g_FunctionHooks[] = //non-virtual func { 0x01D6FFE0, "_ZN4CGib5SpawnEPKc", mfunc_ptr_cast(&CGib::Spawn) }, { 0x01D6FCA0, "_ZN4CGib14BounceGibTouchEP11CBaseEntity", mfunc_ptr_cast(&CGib::BounceGibTouch) }, - //{ 0x01D6FE40, "_ZN4CGib14StickyGibTouchEP11CBaseEntity", mfunc_ptr_cast(&CGib::StickyGibTouch) }, + { 0x01D6FE40, "_ZN4CGib14StickyGibTouchEP11CBaseEntity", mfunc_ptr_cast(&CGib::StickyGibTouch) }, { 0x01D6FBF0, "_ZN4CGib12WaitTillLandEv", mfunc_ptr_cast(&CGib::WaitTillLand) }, { 0x01D6E550, "_ZN4CGib13LimitVelocityEv", mfunc_ptr_cast(&CGib::LimitVelocity) }, //{ 0x01D6EAB0, "_ZN4CGib12SpawnHeadGibEP9entvars_s", mfunc_ptr_cast(&CGib::SpawnHeadGib) }, - //{ 0x01D6EEB0, "_ZN4CGib15SpawnRandomGibsEP9entvars_sii", mfunc_ptr_cast(&CGib::SpawnRandomGibs) }, + { 0x01D6EEB0, "_ZN4CGib15SpawnRandomGibsEP9entvars_sii", mfunc_ptr_cast(&CGib::SpawnRandomGibs) }, //{ 0x01D6E640, "_ZN4CGib15SpawnStickyGibsEP9entvars_s6Vectori", mfunc_ptr_cast(&CGib::SpawnStickyGibs) }, // NOXREF #endif // Monsters_Region @@ -256,24 +257,24 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZL8CMD_ARGCv", (size_t)&CMD_ARGC_ }, //{ 0x0, "_ZL8CMD_ARGVi", (size_t)&CMD_ARGV_ }, - //{ 0x0, "_Z17set_suicide_frameP9entvars_s", (size_t)&set_suicide_frame }, - //{ 0x01D63D30, "_Z13ClientConnectP7edict_sPKcS2_Pc", (size_t)&ClientConnect }, - //{ 0x01D63D50, "_Z16ClientDisconnectP7edict_s", (size_t)&ClientDisconnect }, + //{ 0x01D63CE0, "_Z17set_suicide_frameP9entvars_s", (size_t)&set_suicide_frame }, // NOXREF + { 0x01D63D30, "_Z13ClientConnectP7edict_sPKcS2_Pc", (size_t)&ClientConnect }, + { 0x01D63D50, "_Z16ClientDisconnectP7edict_s", (size_t)&ClientDisconnect }, { 0x01D63E50, "_Z7respawnP9entvars_si", (size_t)&respawn }, - //{ 0x01D63F60, "_Z10ClientKillP7edict_s", (size_t)&ClientKill }, - //{ 0x0, "_Z8ShowMenuP11CBasePlayeriiiPc_constprop_32", (size_t)&ShowMenu }, - //{ 0x0, "_Z12ShowVGUIMenuP11CBasePlayeriiPc", (size_t)&ShowVGUIMenu }, - //{ 0x01D64130, "CountTeams", (size_t)&CountTeams }, //extern c func - //{ 0x0, "_Z11ListPlayersP11CBasePlayer", (size_t)&ListPlayers }, - //{ 0x01D64460, "CountTeamPlayers", (size_t)&CountTeamPlayers }, //extern c func - //{ 0x0, "_Z15ProcessKickVoteP11CBasePlayerS0_", (size_t)&ProcessKickVote }, - //{ 0x0, "_Z17SelectDefaultTeamv", (size_t)&SelectDefaultTeam }, + { 0x01D63F60, "_Z10ClientKillP7edict_s", (size_t)&ClientKill }, + { 0x01D64010, "_Z8ShowMenuP11CBasePlayeriiiPc_constprop_32", (size_t)&ShowMenu }, + { 0x01D64070, "_Z12ShowVGUIMenuP11CBasePlayeriiPc", (size_t)&ShowVGUIMenu }, + { 0x01D64130, "CountTeams", (size_t)&CountTeams }, //extern c func + { 0x01D64260, "_Z11ListPlayersP11CBasePlayer", (size_t)&ListPlayers }, + { 0x01D64460, "CountTeamPlayers", (size_t)&CountTeamPlayers }, //extern c func + { 0x01D64580, "_Z15ProcessKickVoteP11CBasePlayerS0_", (size_t)&ProcessKickVote }, + { 0x01D64920, "_Z17SelectDefaultTeamv", (size_t)&SelectDefaultTeam }, { 0x01D649A0, "_Z15CheckStartMoneyv", (size_t)&CheckStartMoney }, - //{ 0x01D649F0, "_Z17ClientPutInServerP7edict_s", (size_t)&ClientPutInServer }, - //{ 0x0, "Q_strlen", (size_t)&Q_strlen_ }, - //{ 0x0, "_Z8Host_SayP7edict_si", (size_t)&Host_Say }, - //{ 0x0, "_Z11DropPrimaryP11CBasePlayer", (size_t)&DropPrimary }, - //{ 0x0, "_Z10CanBuyThisP11CBasePlayeri", (size_t)&CanBuyThis }, + { 0x01D649F0, "_Z17ClientPutInServerP7edict_s", (size_t)&ClientPutInServer }, + { 0x01D64F00, "Q_strlen", (size_t)&Q_strlen_ }, + //{ 0x01D64F20, "_Z8Host_SayP7edict_si", (size_t)&Host_Say }, + { 0x01D656F0, "_Z11DropPrimaryP11CBasePlayer", (size_t)&DropPrimary }, + //{ 0x01D65740, "_Z10CanBuyThisP11CBasePlayeri", (size_t)&CanBuyThis }, //{ 0x0, "_Z9BuyPistolP11CBasePlayeri", (size_t)&BuyPistol }, //{ 0x0, "_Z10BuyShotgunP11CBasePlayeri", (size_t)&BuyShotgun }, //{ 0x0, "_Z16BuySubMachineGunP11CBasePlayeri", (size_t)&BuySubMachineGun }, @@ -281,8 +282,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z8BuyRifleP11CBasePlayeri", (size_t)&BuyRifle }, //{ 0x0, "_Z13BuyMachineGunP11CBasePlayeri", (size_t)&BuyMachineGun }, //{ 0x0, "_Z7BuyItemP11CBasePlayeri", (size_t)&BuyItem }, - //{ 0x0, "_Z27HandleMenu_ChooseAppearanceP11CBasePlayeri", (size_t)&HandleMenu_ChooseAppearance }, - //{ 0x0, "_Z21HandleMenu_ChooseTeamP11CBasePlayeri", (size_t)&HandleMenu_ChooseTeam }, + //{ 0x01D669A0, "_Z27HandleMenu_ChooseAppearanceP11CBasePlayeri", (size_t)&HandleMenu_ChooseAppearance }, + //{ 0x01D66D10, "_Z21HandleMenu_ChooseTeamP11CBasePlayeri", (size_t)&HandleMenu_ChooseTeam }, //{ 0x0, "_Z6Radio1P11CBasePlayeri", (size_t)&Radio1 }, //{ 0x0, "_Z6Radio2P11CBasePlayeri", (size_t)&Radio2 }, //{ 0x0, "_Z6Radio3P11CBasePlayeri", (size_t)&Radio3 }, @@ -294,10 +295,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z24HandleRadioAliasCommandsP11CBasePlayerPKc", (size_t)&HandleRadioAliasCommands }, //{ 0x01D68840, "_Z13ClientCommandP7edict_s", (size_t)&ClientCommand }, //{ 0x01D6B230, "_Z21ClientUserInfoChangedP7edict_sPc", (size_t)&ClientUserInfoChanged }, - //{ 0x01D6B4D0, "_Z16ServerDeactivatev", (size_t)&ServerDeactivate }, - //{ 0x01D6B520, "_Z14ServerActivateP7edict_sii", (size_t)&ServerActivate }, - //{ 0x01D6B620, "_Z14PlayerPreThinkP7edict_s", (size_t)&PlayerPreThink }, - //{ 0x01D6B640, "_Z15PlayerPostThinkP7edict_s", (size_t)&PlayerPostThink }, + { 0x01D6B4D0, "_Z16ServerDeactivatev", (size_t)&ServerDeactivate }, + { 0x01D6B520, "_Z14ServerActivateP7edict_sii", (size_t)&ServerActivate }, + { 0x01D6B620, "_Z14PlayerPreThinkP7edict_s", (size_t)&PlayerPreThink }, + { 0x01D6B640, "_Z15PlayerPostThinkP7edict_s", (size_t)&PlayerPostThink }, //{ 0x01D6B660, "_Z13ParmsNewLevelv", (size_t)&ParmsNewLevel }, // PURE //{ 0x01D6B670, "_Z16ParmsChangeLevelv", (size_t)&ParmsChangeLevel }, //{ 0x01D6B6A0, "_Z10StartFramev", (size_t)&StartFrame }, @@ -372,69 +373,69 @@ FunctionHook g_FunctionHooks[] = //{ 0x01DD1D00, "_Z18RestoreGlobalStateP13saverestore_s", (size_t)&RestoreGlobalState }, //{ 0x01DD1E50, "_Z16ResetGlobalStatev", (size_t)&ResetGlobalState }, //!@{ 0x01DB6640, "PM_Move", (size_t)&PM_Move }, - { 0x01DB6710, "PM_Init", (size_t)&PM_Init }, + //5@{ 0x01DB6710, "PM_Init", (size_t)&PM_Init }, { 0x01DB1020, "PM_FindTextureType", (size_t)&PM_FindTextureType }, //virtual func //CBaseEntity - ////{ 0x0, "_ZN11CBaseEntity5SpawnEv", mfunc_ptr_cast(&CBaseEntity::Spawn) }, - ////{ 0x0, "_ZN11CBaseEntity8PrecacheEv", mfunc_ptr_cast(&CBaseEntity::Precache) }, - ////{ 0x0, "_ZN11CBaseEntity7RestartEv", mfunc_ptr_cast(&CBaseEntity::Restart) }, + //{ 0x01D18590, "_ZN11CBaseEntity5SpawnEv", mfunc_ptr_cast(&CBaseEntity::Spawn) }, + //{ 0x01D185A0, "_ZN11CBaseEntity8PrecacheEv", mfunc_ptr_cast(&CBaseEntity::Precache) }, + //{ 0x01D01B90, "_ZN11CBaseEntity7RestartEv", mfunc_ptr_cast(&CBaseEntity::Restart) }, ////{ 0x01D185B0, "_ZN11CBaseEntity8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseEntity::KeyValue_) }, //{ 0x01D635D0, "_ZN11CBaseEntity4SaveER5CSave", mfunc_ptr_cast(&CBaseEntity::Save_) }, //{ 0x01D63610, "_ZN11CBaseEntity7RestoreER8CRestore", mfunc_ptr_cast(&CBaseEntity::Restore_) }, - ////{ 0x0, "_ZN11CBaseEntity10ObjectCapsEv", mfunc_ptr_cast(&CBaseEntity::ObjectCaps) }, - ////{ 0x0, "_ZN11CBaseEntity8ActivateEv", mfunc_ptr_cast(&CBaseEntity::Activate) }, - ////{ 0x0, "_ZN11CBaseEntity21SetObjectCollisionBoxEv", mfunc_ptr_cast(&CBaseEntity::SetObjectCollisionBox) }, - ////{ 0x0, "_ZN11CBaseEntity8ClassifyEv", mfunc_ptr_cast(&CBaseEntity::Classify) }, - ////{ 0x0, "_ZN11CBaseEntity11DeathNoticeEP9entvars_s", mfunc_ptr_cast(&CBaseEntity::DeathNotice) }, - //{ 0x01D719D0, "_ZN11CBaseEntity11TraceAttackEP9entvars_sf6VectorP11TraceResulti", mfunc_ptr_cast(&CBaseEntity::TraceAttack_) }, + //{ 0x01D01BA0, "_ZN11CBaseEntity10ObjectCapsEv", mfunc_ptr_cast(&CBaseEntity::ObjectCaps) }, + //{ 0x01D01BB0, "_ZN11CBaseEntity8ActivateEv", mfunc_ptr_cast(&CBaseEntity::Activate) }, + //{ 0x01D638B0, "_ZN11CBaseEntity21SetObjectCollisionBoxEv", mfunc_ptr_cast(&CBaseEntity::SetObjectCollisionBox) }, + //{ 0x01D01BC0, "_ZN11CBaseEntity8ClassifyEv", mfunc_ptr_cast(&CBaseEntity::Classify) }, + { 0x01D01BD0, "_ZN11CBaseEntity11DeathNoticeEP9entvars_s", mfunc_ptr_cast(&CBaseEntity::DeathNotice_) }, + { 0x01D719D0, "_ZN11CBaseEntity11TraceAttackEP9entvars_sf6VectorP11TraceResulti", mfunc_ptr_cast(&CBaseEntity::TraceAttack_) }, //{ 0x01D63210, "_ZN11CBaseEntity10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseEntity::TakeDamage_) }, { 0x01D63190, "_ZN11CBaseEntity10TakeHealthEfi", mfunc_ptr_cast(&CBaseEntity::TakeHealth_) }, - //{ 0x0, "_ZN11CBaseEntity6KilledEP9entvars_si", mfunc_ptr_cast(&CBaseEntity::Killed_) }, + //{ 0x01D63550, "_ZN11CBaseEntity6KilledEP9entvars_si", mfunc_ptr_cast(&CBaseEntity::Killed_) }, //{ 0x01D01BE0, "_ZN11CBaseEntity10BloodColorEv", mfunc_ptr_cast(&CBaseEntity::BloodColor) }, { 0x01D72EE0, "_ZN11CBaseEntity10TraceBleedEf6VectorP11TraceResulti", mfunc_ptr_cast(&CBaseEntity::TraceBleed_) }, - ////{ 0x0, "_ZN11CBaseEntity11IsTriggeredEPS_", mfunc_ptr_cast(&CBaseEntity::IsTriggered) }, - ////{ 0x0, "_ZN11CBaseEntity16MyMonsterPointerEv", mfunc_ptr_cast(&CBaseEntity::MyMonsterPointer) }, - ////{ 0x0, "_ZN11CBaseEntity21MySquadMonsterPointerEv", mfunc_ptr_cast(&CBaseEntity::MySquadMonsterPointer) }, - ////{ 0x0, "_ZN11CBaseEntity14GetToggleStateEv", mfunc_ptr_cast(&CBaseEntity::GetToggleState) }, - ////{ 0x0, "_ZN11CBaseEntity9AddPointsEii", mfunc_ptr_cast(&CBaseEntity::AddPoints) }, - ////{ 0x0, "_ZN11CBaseEntity15AddPointsToTeamEii", mfunc_ptr_cast(&CBaseEntity::AddPointsToTeam) }, - ////{ 0x0, "_ZN11CBaseEntity13AddPlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBaseEntity::AddPlayerItem) }, - ////{ 0x01DA8960, "_ZN11CBaseEntity16RemovePlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBaseEntity::RemovePlayerItem) }, - ////{ 0x01D8EC90, "_ZN11CBaseEntity8GiveAmmoEiPci", mfunc_ptr_cast(&CBaseEntity::GiveAmmo) }, - ////{ 0x0, "_ZN11CBaseEntity8GetDelayEv", mfunc_ptr_cast(&CBaseEntity::GetDelay) }, + //{ 0x01D01BF0, "_ZN11CBaseEntity11IsTriggeredEPS_", mfunc_ptr_cast(&CBaseEntity::IsTriggered) }, + //{ 0x01D01C00, "_ZN11CBaseEntity16MyMonsterPointerEv", mfunc_ptr_cast(&CBaseEntity::MyMonsterPointer) }, + //{ 0x01D01C10, "_ZN11CBaseEntity21MySquadMonsterPointerEv", mfunc_ptr_cast(&CBaseEntity::MySquadMonsterPointer) }, + { 0x01D01C20, "_ZN11CBaseEntity14GetToggleStateEv", mfunc_ptr_cast(&CBaseEntity::GetToggleState_) }, + //{ 0x01D01C30, "_ZN11CBaseEntity9AddPointsEii", mfunc_ptr_cast(&CBaseEntity::AddPoints) }, + //{ 0x01D01C40, "_ZN11CBaseEntity15AddPointsToTeamEii", mfunc_ptr_cast(&CBaseEntity::AddPointsToTeam) }, + //{ 0x01D01C50, "_ZN11CBaseEntity13AddPlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBaseEntity::AddPlayerItem) }, + //{ 0x01D01C60, "_ZN11CBaseEntity16RemovePlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBaseEntity::RemovePlayerItem) }, + //{ 0x01D01C70, "_ZN11CBaseEntity8GiveAmmoEiPci", mfunc_ptr_cast(&CBaseEntity::GiveAmmo) }, + { 0x01D01C80, "_ZN11CBaseEntity8GetDelayEv", mfunc_ptr_cast(&CBaseEntity::GetDelay_) }, ////{ 0x01D01C90, "_ZN11CBaseEntity8IsMovingEv", mfunc_ptr_cast(&CBaseEntity::IsMoving) }, - ////{ 0x0, "_ZN11CBaseEntity13OverrideResetEv", mfunc_ptr_cast(&CBaseEntity::OverrideReset) }, - //{ 0x0, "_ZN11CBaseEntity11DamageDecalEi", mfunc_ptr_cast(&CBaseEntity::DamageDecal_) }, - ////{ 0x0, "_ZN11CBaseEntity14SetToggleStateEi", mfunc_ptr_cast(&CBaseEntity::SetToggleState) }, - ////{ 0x0, "_ZN11CBaseEntity13StartSneakingEv", mfunc_ptr_cast(&CBaseEntity::StartSneaking) }, - ////{ 0x0, "_ZN11CBaseEntity12StopSneakingEv", mfunc_ptr_cast(&CBaseEntity::StopSneaking) }, - ////{ 0x0, "_ZN11CBaseEntity10OnControlsEP9entvars_s", mfunc_ptr_cast(&CBaseEntity::OnControls) }, + //{ 0x01D01CE0, "_ZN11CBaseEntity13OverrideResetEv", mfunc_ptr_cast(&CBaseEntity::OverrideReset) }, + //{ 0x01D63AF0, "_ZN11CBaseEntity11DamageDecalEi", mfunc_ptr_cast(&CBaseEntity::DamageDecal_) }, + //{ 0x01D01CF0, "_ZN11CBaseEntity14SetToggleStateEi", mfunc_ptr_cast(&CBaseEntity::SetToggleState) }, + //{ 0x01D01D00, "_ZN11CBaseEntity13StartSneakingEv", mfunc_ptr_cast(&CBaseEntity::StartSneaking) }, + //{ 0x01D01D10, "_ZN11CBaseEntity12StopSneakingEv", mfunc_ptr_cast(&CBaseEntity::StopSneaking) }, + //{ 0x01D01D20, "_ZN11CBaseEntity10OnControlsEP9entvars_s", mfunc_ptr_cast(&CBaseEntity::OnControls) }, ////{ 0x01D01D30, "_ZN11CBaseEntity10IsSneakingEv", mfunc_ptr_cast(&CBaseEntity::IsSneaking) }, - ////{ 0x01D21030, "_ZN11CBaseEntity7IsAliveEv", mfunc_ptr_cast(&CBaseEntity::IsAlive) }, - ////{ 0x01D01D70, "_ZN11CBaseEntity10IsBSPModelEv", mfunc_ptr_cast(&CBaseEntity::IsBSPModel) }, - ////{ 0x01D01D90, "_ZN11CBaseEntity12ReflectGaussEv", mfunc_ptr_cast(&CBaseEntity::ReflectGauss) }, - ////{ 0x01D01DC0, "_ZN11CBaseEntity9HasTargetEj", mfunc_ptr_cast(&CBaseEntity::HasTarget) }, - ////{ 0x0, "_ZN11CBaseEntity9IsInWorldEv", mfunc_ptr_cast(&CBaseEntity::IsInWorld) }, - ////{ 0x01D01E30, "_ZN11CBaseEntity8IsPlayerEv", mfunc_ptr_cast(&CBaseEntity::IsPlayer) }, - ////{ 0x01D01E40, "_ZN11CBaseEntity11IsNetClientEv", mfunc_ptr_cast(&CBaseEntity::IsNetClient_) }, - ////{ 0x01D01E50, "_ZN11CBaseEntity6TeamIDEv", mfunc_ptr_cast(&CBaseEntity::TeamID) }, - //{ 0x0, "_ZN11CBaseEntity13GetNextTargetEv", mfunc_ptr_cast(&CBaseEntity::GetNextTarget_) }, - ////{ 0x01D01E60, "_ZN11CBaseEntity5ThinkEv", mfunc_ptr_cast(&CBaseEntity::Think) }, - ////{ 0x01D01E70, "_ZN11CBaseEntity5TouchEPS_", mfunc_ptr_cast(&CBaseEntity::Touch) }, - ////{ 0x01D01EA0, "_ZN11CBaseEntity3UseEPS_S0_8USE_TYPEf", mfunc_ptr_cast(&CBaseEntity::Use) }, - ////{ 0x0, "_ZN11CBaseEntity7BlockedEPS_", mfunc_ptr_cast(&CBaseEntity::Blocked) }, - ////{ 0x0, "_ZN11CBaseEntity7RespawnEv", mfunc_ptr_cast(&CBaseEntity::Respawn) }, - ////{ 0x0, "_ZN11CBaseEntity11UpdateOwnerEv", mfunc_ptr_cast(&CBaseEntity::UpdateOwner) }, - ////{ 0x0, "_ZN11CBaseEntity12FBecomeProneEv", mfunc_ptr_cast(&CBaseEntity::FBecomeProne) }, - ////{ 0x0, "_ZN11CBaseEntity6CenterEv", mfunc_ptr_cast(&CBaseEntity::Center) }, - ////{ 0x0, "_ZN11CBaseEntity11EyePositionEv", mfunc_ptr_cast(&CBaseEntity::EyePosition) }, - ////{ 0x0, "_ZN11CBaseEntity11EarPositionEv", mfunc_ptr_cast(&CBaseEntity::EarPosition) }, - ////{ 0x0, "_ZN11CBaseEntity10BodyTargetERK6Vector", mfunc_ptr_cast(&CBaseEntity::BodyTarget) }, + //{ 0x01D01D40, "_ZN11CBaseEntity7IsAliveEv", mfunc_ptr_cast(&CBaseEntity::IsAlive) }, + //{ 0x01D01D70, "_ZN11CBaseEntity10IsBSPModelEv", mfunc_ptr_cast(&CBaseEntity::IsBSPModel) }, + //{ 0x01D01D90, "_ZN11CBaseEntity12ReflectGaussEv", mfunc_ptr_cast(&CBaseEntity::ReflectGauss) }, + //{ 0x01D01DC0, "_ZN11CBaseEntity9HasTargetEj", mfunc_ptr_cast(&CBaseEntity::HasTarget) }, + { 0x01D639C0, "_ZN11CBaseEntity9IsInWorldEv", mfunc_ptr_cast(&CBaseEntity::IsInWorld_) }, + //{ 0x01D01E30, "_ZN11CBaseEntity8IsPlayerEv", mfunc_ptr_cast(&CBaseEntity::IsPlayer) }, + //{ 0x01D01E40, "_ZN11CBaseEntity11IsNetClientEv", mfunc_ptr_cast(&CBaseEntity::IsNetClient_) }, + //{ 0x01D01E50, "_ZN11CBaseEntity6TeamIDEv", mfunc_ptr_cast(&CBaseEntity::TeamID) }, + //{ 0x01D63580, "_ZN11CBaseEntity13GetNextTargetEv", mfunc_ptr_cast(&CBaseEntity::GetNextTarget_) }, + //{ 0x01D01E60, "_ZN11CBaseEntity5ThinkEv", mfunc_ptr_cast(&CBaseEntity::Think) }, + //{ 0x01D01E70, "_ZN11CBaseEntity5TouchEPS_", mfunc_ptr_cast(&CBaseEntity::Touch) }, + //{ 0x01D01E80, "_ZN11CBaseEntity3UseEPS_S0_8USE_TYPEf", mfunc_ptr_cast(&CBaseEntity::Use) }, + //{ 0x01D01EA0, "_ZN11CBaseEntity7BlockedEPS_", mfunc_ptr_cast(&CBaseEntity::Blocked) }, + //{ 0x01D18B00, "_ZN11CBaseEntity7RespawnEv", mfunc_ptr_cast(&CBaseEntity::Respawn) }, + //{ 0x01D01EC0, "_ZN11CBaseEntity11UpdateOwnerEv", mfunc_ptr_cast(&CBaseEntity::UpdateOwner) }, + //{ 0x01D01ED0, "_ZN11CBaseEntity12FBecomeProneEv", mfunc_ptr_cast(&CBaseEntity::FBecomeProne) }, + //{ 0x01D01EE0, "_ZN11CBaseEntity6CenterEv", mfunc_ptr_cast(&CBaseEntity::Center) }, + //{ 0x01D01F40, "_ZN11CBaseEntity11EyePositionEv", mfunc_ptr_cast(&CBaseEntity::EyePosition) }, + //{ 0x01D01F70, "_ZN11CBaseEntity11EarPositionEv", mfunc_ptr_cast(&CBaseEntity::EarPosition) }, + { 0x01D01FA0, "_ZN11CBaseEntity10BodyTargetERK6Vector", mfunc_ptr_cast(&CBaseEntity::BodyTarget_) }, ////{ 0x01D01FC0, "_ZN11CBaseEntity12IlluminationEv", mfunc_ptr_cast(&CBaseEntity::Illumination) }, - //{ 0x01D71840, "_ZN11CBaseEntity8FVisibleEPS_", mfunc_ptr_cast(&CBaseEntity::FVisible_) }, //{ 0x01D71950, "_ZN11CBaseEntity8FVisibleERK6Vector", mfunc_ptr_cast(&CBaseEntity::FVisible_) }, + //{ 0x01D71840, "_ZN11CBaseEntity8FVisibleEPS_", mfunc_ptr_cast(&CBaseEntity::FVisible_) }, //non-virtual func //{ 0x01DA7FD0, "", mfunc_ptr_cast(&CBaseEntity::Instance) }, { 0x01DBAF90, "_ZN11CBaseEntity14UpdateOnRemoveEv", mfunc_ptr_cast(&CBaseEntity::UpdateOnRemove) }, @@ -455,7 +456,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D63B20, "_ZN11CBaseEntity6CreateEPcRK6VectorS3_P7edict_s", mfunc_ptr_cast(&CBaseEntity::Create) }, //CPointEntity //{ 0x01DBACC0, "_ZN12CPointEntity5SpawnEv", mfunc_ptr_cast(&CPointEntity::Spawn) }, - //{ 0x0, "_ZN12CPointEntity10ObjectCapsEv", mfunc_ptr_cast(&CPointEntity::ObjectCaps) }, + //{ 0x01D60CB0, "_ZN12CPointEntity10ObjectCapsEv", mfunc_ptr_cast(&CPointEntity::ObjectCaps) }, //CBaseDelay //virtual func { 0x01DBB110, "_ZN10CBaseDelay8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseDelay::KeyValue_) }, @@ -469,9 +470,9 @@ FunctionHook g_FunctionHooks[] = //virtual func { 0x01D59E70, "_ZN14CBaseAnimating4SaveER5CSave", mfunc_ptr_cast(&CBaseAnimating::Save_) }, { 0x01D59EA0, "_ZN14CBaseAnimating7RestoreER8CRestore", mfunc_ptr_cast(&CBaseAnimating::Restore_) }, - //{ 0x0, "_ZN14CBaseAnimating15HandleAnimEventEP14MonsterEvent_t", mfunc_ptr_cast(&CBaseAnimating::HandleAnimEvent) }, + //{ 0x01D01FE0, "_ZN14CBaseAnimating15HandleAnimEventEP14MonsterEvent_t", mfunc_ptr_cast(&CBaseAnimating::HandleAnimEvent) }, //non-virtual func - //{ 0x0, "_ZN14CBaseAnimating18StudioFrameAdvanceEf", mfunc_ptr_cast(&CBaseAnimating::StudioFrameAdvance) }, + { 0x01D59ED0, "_ZN14CBaseAnimating18StudioFrameAdvanceEf", mfunc_ptr_cast(&CBaseAnimating::StudioFrameAdvance) }, //{ 0x01D5A130, "_ZN14CBaseAnimating16GetSequenceFlagsEv", mfunc_ptr_cast(&CBaseAnimating::GetSequenceFlags) }, // NOXREF //{ 0x0, "_ZN14CBaseAnimating22LookupActivityHeaviestEi", mfunc_ptr_cast(&CBaseAnimating::LookupActivityHeaviest) }, @@ -483,7 +484,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CBaseAnimating18DispatchAnimEventsEf", mfunc_ptr_cast(&CBaseAnimating::DispatchAnimEvents) }, { 0x01D5A280, "_ZN14CBaseAnimating17SetBoneControllerEif", mfunc_ptr_cast(&CBaseAnimating::SetBoneController) }, { 0x01D5A2B0, "_ZN14CBaseAnimating19InitBoneControllersEv", mfunc_ptr_cast(&CBaseAnimating::InitBoneControllers) }, - //{ 0x0, "_ZN14CBaseAnimating11SetBlendingEif", mfunc_ptr_cast(&CBaseAnimating::SetBlending) }, + //{ 0x01D5A310, "_ZN14CBaseAnimating11SetBlendingEif", mfunc_ptr_cast(&CBaseAnimating::SetBlending) }, // NOXREF //{ 0x0, "_ZN14CBaseAnimating15GetBonePositionEiR6VectorS1_", mfunc_ptr_cast(&CBaseAnimating::GetBonePosition) }, //{ 0x0, "_ZN14CBaseAnimating15GetAutomovementER6VectorS1_f", mfunc_ptr_cast(&CBaseAnimating::GetAutomovement) }, //{ 0x0, "_ZN14CBaseAnimating14FindTransitionEiiPi", mfunc_ptr_cast(&CBaseAnimating::FindTransition) }, @@ -491,14 +492,14 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CBaseAnimating12SetBodygroupEii", mfunc_ptr_cast(&CBaseAnimating::SetBodygroup) }, //{ 0x0, "_ZN14CBaseAnimating12GetBodygroupEi", mfunc_ptr_cast(&CBaseAnimating::GetBodygroup) }, //{ 0x0, "_ZN14CBaseAnimating11ExtractBboxEiPfS0_", mfunc_ptr_cast(&CBaseAnimating::ExtractBbox) }, - //{ 0x0, "_ZN14CBaseAnimating14SetSequenceBoxEv", mfunc_ptr_cast(&CBaseAnimating::SetSequenceBox) }, + //{ 0x01D5A4A0, "_ZN14CBaseAnimating14SetSequenceBoxEv", mfunc_ptr_cast(&CBaseAnimating::SetSequenceBox) }, //CBaseToggle //virtual func { 0x01DBB7D0, "_ZN11CBaseToggle8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseToggle::KeyValue_) }, { 0x01DBB770, "_ZN11CBaseToggle4SaveER5CSave", mfunc_ptr_cast(&CBaseToggle::Save_) }, { 0x01DBB7A0, "_ZN11CBaseToggle7RestoreER8CRestore", mfunc_ptr_cast(&CBaseToggle::Restore_) }, - //{ 0x0, "_ZN11CBaseToggle14GetToggleStateEv", mfunc_ptr_cast(&CBaseToggle::GetToggleState_) }, - //{ 0x0, "_ZN11CBaseToggle8GetDelayEv", mfunc_ptr_cast(&CBaseToggle::GetDelay_) }, + //{ 0x01D20F20, "_ZN11CBaseToggle14GetToggleStateEv", mfunc_ptr_cast(&CBaseToggle::GetToggleState_) }, + //{ 0x01D20F30, "_ZN11CBaseToggle8GetDelayEv", mfunc_ptr_cast(&CBaseToggle::GetDelay_) }, //non-virtual func //{ 0x0, "_ZN11CBaseToggle10LinearMoveE6Vectorf", mfunc_ptr_cast(&CBaseToggle::LinearMove) }, //{ 0x0, "_ZN11CBaseToggle14LinearMoveDoneEv", mfunc_ptr_cast(&CBaseToggle::LinearMoveDone) }, @@ -538,49 +539,49 @@ FunctionHook g_FunctionHooks[] = #ifndef BaseMonster_Region //virtual func - //{ 0x01D8AD30, "_ZN12CBaseMonster8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseMonster::KeyValue) }, - //{ 0x01D71AA0, "_ZN12CBaseMonster11TraceAttackEP9entvars_sf6VectorP11TraceResulti", mfunc_ptr_cast(&CBaseMonster::TraceAttack) }, - //{ 0x01D70180, "_ZN12CBaseMonster10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseMonster::TakeDamage) }, + { 0x01D8AD30, "_ZN12CBaseMonster8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseMonster::KeyValue_) }, + { 0x01D71AA0, "_ZN12CBaseMonster11TraceAttackEP9entvars_sf6VectorP11TraceResulti", mfunc_ptr_cast(&CBaseMonster::TraceAttack_) }, + { 0x01D70180, "_ZN12CBaseMonster10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseMonster::TakeDamage_) }, { 0x01D70130, "_ZN12CBaseMonster10TakeHealthEfi", mfunc_ptr_cast(&CBaseMonster::TakeHealth_) }, - //{ 0x01D6F9D0, "_ZN12CBaseMonster6KilledEP9entvars_si", mfunc_ptr_cast(&CBaseMonster::Killed_) }, - //{ 0x0, "_ZN12CBaseMonster10BloodColorEv", mfunc_ptr_cast(&CBaseMonster::BloodColor) }, - //{ 0x0, "_ZN12CBaseMonster7IsAliveEv", mfunc_ptr_cast(&CBaseMonster::IsAlive) }, - //{ 0x0, "_ZN12CBaseMonster9ChangeYawEi", mfunc_ptr_cast(&CBaseMonster::ChangeYaw) }, - //{ 0x01D6F360, "_ZN12CBaseMonster12HasHumanGibsEv", mfunc_ptr_cast(&CBaseMonster::HasHumanGibs) }, - //{ 0x01D6F390, "_ZN12CBaseMonster12HasAlienGibsEv", mfunc_ptr_cast(&CBaseMonster::HasAlienGibs) }, - //{ 0x01D6F3C0, "_ZN12CBaseMonster11FadeMonsterEv", mfunc_ptr_cast(&CBaseMonster::FadeMonster) }, - //{ 0x01D6F4B0, "_ZN12CBaseMonster10GibMonsterEv", mfunc_ptr_cast(&CBaseMonster::GibMonster) }, + { 0x01D6F9D0, "_ZN12CBaseMonster6KilledEP9entvars_si", mfunc_ptr_cast(&CBaseMonster::Killed_) }, + { 0x01D20F50, "_ZN12CBaseMonster10BloodColorEv", mfunc_ptr_cast(&CBaseMonster::BloodColor_) }, + { 0x01D24CF0, "_ZN12CBaseMonster7IsAliveEv", mfunc_ptr_cast(&CBaseMonster::IsAlive_) }, + { 0x01D8ABF0, "_ZN12CBaseMonster9ChangeYawEi", mfunc_ptr_cast(&CBaseMonster::ChangeYaw_) }, + { 0x01D6F360, "_ZN12CBaseMonster12HasHumanGibsEv", mfunc_ptr_cast(&CBaseMonster::HasHumanGibs_) }, + { 0x01D6F390, "_ZN12CBaseMonster12HasAlienGibsEv", mfunc_ptr_cast(&CBaseMonster::HasAlienGibs_) }, + { 0x01D6F3C0, "_ZN12CBaseMonster11FadeMonsterEv", mfunc_ptr_cast(&CBaseMonster::FadeMonster_) }, + { 0x01D6F4B0, "_ZN12CBaseMonster10GibMonsterEv", mfunc_ptr_cast(&CBaseMonster::GibMonster_) }, //{ 0x01D6F5A0, "_ZN12CBaseMonster16GetDeathActivityEv", mfunc_ptr_cast(&CBaseMonster::GetDeathActivity) }, { 0x01D6F880, "_ZN12CBaseMonster10BecomeDeadEv", mfunc_ptr_cast(&CBaseMonster::BecomeDead_) }, - //{ 0x0, "_ZN12CBaseMonster17ShouldFadeOnDeathEv", mfunc_ptr_cast(&CBaseMonster::ShouldFadeOnDeath) }, - //{ 0x0, "_ZN12CBaseMonster13IRelationshipEP11CBaseEntity", mfunc_ptr_cast(&CBaseMonster::IRelationship) }, - //{ 0x0, "_ZN12CBaseMonster9PainSoundEv", mfunc_ptr_cast(&CBaseMonster::PainSound) }, - //{ 0x0, "_ZN12CBaseMonster13ResetMaxSpeedEv", mfunc_ptr_cast(&CBaseMonster::ResetMaxSpeed) }, - //{ 0x0, "_ZN12CBaseMonster13ReportAIStateEv", mfunc_ptr_cast(&CBaseMonster::ReportAIState) }, + { 0x01D8AD10, "_ZN12CBaseMonster17ShouldFadeOnDeathEv", mfunc_ptr_cast(&CBaseMonster::ShouldFadeOnDeath_) }, + //{ 0x01D8AD40, "_ZN12CBaseMonster13IRelationshipEP11CBaseEntity", mfunc_ptr_cast(&CBaseMonster::IRelationship) }, + //{ 0x01D20F40, "_ZN12CBaseMonster9PainSoundEv", mfunc_ptr_cast(&CBaseMonster::PainSound_) }, + //{ 0x01D24AD0, "_ZN12CBaseMonster13ResetMaxSpeedEv", mfunc_ptr_cast(&CBaseMonster::ResetMaxSpeed) }, + //{ 0x01D8ABE0, "_ZN12CBaseMonster13ReportAIStateEv", mfunc_ptr_cast(&CBaseMonster::ReportAIState) }, { 0x01D8AC60, "_ZN12CBaseMonster15MonsterInitDeadEv", mfunc_ptr_cast(&CBaseMonster::MonsterInitDead_) }, - //{ 0x0, "_ZN12CBaseMonster4LookEi", mfunc_ptr_cast(&CBaseMonster::Look) }, - //{ 0x0, "_ZN12CBaseMonster16BestVisibleEnemyEv", mfunc_ptr_cast(&CBaseMonster::BestVisibleEnemy) }, + //{ 0x01D8AD70, "_ZN12CBaseMonster4LookEi", mfunc_ptr_cast(&CBaseMonster::Look) }, + //{ 0x01D8AF10, "_ZN12CBaseMonster16BestVisibleEnemyEv", mfunc_ptr_cast(&CBaseMonster::BestVisibleEnemy) }, //{ 0x01D716D0, "_ZN12CBaseMonster11FInViewConeEP11CBaseEntity", mfunc_ptr_cast(&CBaseMonster::FInViewCone_) }, //{ 0x01D71790, "_ZN12CBaseMonster11FInViewConeEP6Vector", mfunc_ptr_cast(&CBaseMonster::FInViewCone_) }, //non-virtual func - //{ 0x0, "_ZN12CBaseMonster12MakeIdealYawE6Vector", mfunc_ptr_cast(&CBaseMonster::MakeIdealYaw) }, + //{ 0x01D8AC00, "_ZN12CBaseMonster12MakeIdealYawE6Vector", mfunc_ptr_cast(&CBaseMonster::MakeIdealYaw) }, // PURE //{ 0x01D6F7F0, "_ZN12CBaseMonster22GetSmallFlinchActivityEv", mfunc_ptr_cast(&CBaseMonster::GetSmallFlinchActivity) }, // NOXREF //{ 0x01D6F8C0, "_ZN12CBaseMonster16ShouldGibMonsterEi", mfunc_ptr_cast(&CBaseMonster::ShouldGibMonster) }, // NOXREF - //{ 0x01D6F8F0, "_ZN12CBaseMonster14CallGibMonsterEv", mfunc_ptr_cast(&CBaseMonster::CallGibMonster) }, - //{ 0x01D8AD20, "_ZN12CBaseMonster15FCheckAITriggerEv", mfunc_ptr_cast(&CBaseMonster::FCheckAITrigger) }, - //{ 0x01D705B0, "_ZN12CBaseMonster14DeadTakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseMonster::DeadTakeDamage) }, + { 0x01D6F8F0, "_ZN12CBaseMonster14CallGibMonsterEv", mfunc_ptr_cast(&CBaseMonster::CallGibMonster) }, + { 0x01D8AD20, "_ZN12CBaseMonster15FCheckAITriggerEv", mfunc_ptr_cast(&CBaseMonster::FCheckAITrigger) }, + { 0x01D705B0, "_ZN12CBaseMonster14DeadTakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseMonster::DeadTakeDamage) }, //{ 0x01D707C0, "_ZN12CBaseMonster11DamageForceEf", mfunc_ptr_cast(&CBaseMonster::DamageForce) }, // NOXREF - //{ 0x01D71470, "_ZN12CBaseMonster12RadiusDamageEP9entvars_sS1_fii", mfunc_ptr_cast(&CBaseMonster::RadiusDamage) }, + { 0x01D71470, "_ZN12CBaseMonster12RadiusDamageEP9entvars_sS1_fii", mfunc_ptr_cast(&CBaseMonster::RadiusDamage) }, //{ 0x01D71520, "_ZN12CBaseMonster12RadiusDamageE6VectorP9entvars_sS2_fii", mfunc_ptr_cast(&CBaseMonster::RadiusDamage) }, // NOXREF //{ 0x0, "_ZN12CBaseMonster13RadiusDamage2E6VectorP9entvars_sS2_fii", mfunc_ptr_cast(&CBaseMonster::RadiusDamage2) }, // NOXREF //{ 0x01D8AC10, "_ZN12CBaseMonster15CorpseFallThinkEv", mfunc_ptr_cast(&CBaseMonster::CorpseFallThink) }, //{ 0x01D715D0, "_ZN12CBaseMonster20CheckTraceHullAttackEfii", mfunc_ptr_cast(&CBaseMonster::CheckTraceHullAttack) }, // NOXREF //{ 0x01D730E0, "_ZN12CBaseMonster20MakeDamageBloodDecalEifP11TraceResultRK6Vector", mfunc_ptr_cast(&CBaseMonster::MakeDamageBloodDecal) }, // NOXREF { 0x01D73240, "_ZN12CBaseMonster10BloodSplatER6VectorS1_ii", mfunc_ptr_cast(&CBaseMonster::BloodSplat) }, - //{ 0x01D70800, "_Z11RadiusFlash6VectorP9entvars_sS1_fii", (size_t)&RadiusFlash }, - //{ 0x0, "_ZL24GetAmountOfPlayerVisible6VectorP11CBaseEntity_constprop_21", (size_t)&GetAmountOfPlayerVisible }, - //{ 0x01D70CA0, "_Z12RadiusDamage6VectorP9entvars_sS1_ffii", (size_t)&RadiusDamage }, - //{ 0x01D711B0, "_Z13RadiusDamage26VectorP9entvars_sS1_ffii", (size_t)&RadiusDamage2 }, + { 0x01D70800, "_Z11RadiusFlash6VectorP9entvars_sS1_fii", (size_t)&RadiusFlash }, + //{ 0x0, "_ZL24GetAmountOfPlayerVisible6VectorP11CBaseEntity_constprop_21", (size_t)&GetAmountOfPlayerVisible }, // NOXREF + { 0x01D70CA0, "_Z12RadiusDamage6VectorP9entvars_sS1_ffii", (size_t)&RadiusDamage }, + { 0x01D711B0, "_Z13RadiusDamage26VectorP9entvars_sS1_ffii", (size_t)&RadiusDamage2 }, //{ 0x01D72430, "_Z4vstrPf", (size_t)&vstr }, // NOXREF #endif // BaseMonster_Region @@ -589,64 +590,64 @@ FunctionHook g_FunctionHooks[] = //CBasePlayer //virtual func - //{ 0x01DA5200, "_ZN11CBasePlayer5SpawnEv", mfunc_ptr_cast(&CBasePlayer::Spawn_) }, + { 0x01DA5200, "_ZN11CBasePlayer5SpawnEv", mfunc_ptr_cast(&CBasePlayer::Spawn_) }, { 0x01DA5E40, "_ZN11CBasePlayer8PrecacheEv", mfunc_ptr_cast(&CBasePlayer::Precache_) }, { 0x01DA5EE0, "_ZN11CBasePlayer4SaveER5CSave", mfunc_ptr_cast(&CBasePlayer::Save_) }, { 0x01DA6080, "_ZN11CBasePlayer7RestoreER8CRestore", mfunc_ptr_cast(&CBasePlayer::Restore_) }, { 0x01D210A0, "_ZN11CBasePlayer10ObjectCapsEv", mfunc_ptr_cast(&CBasePlayer::ObjectCaps_) }, { 0x01DA3550, "_ZN11CBasePlayer8ClassifyEv", mfunc_ptr_cast(&CBasePlayer::Classify_) }, { 0x01D9BE00, "_ZN11CBasePlayer11TraceAttackEP9entvars_sf6VectorP11TraceResulti", mfunc_ptr_cast(&CBasePlayer::TraceAttack_) }, - //{ 0x0, "_ZN11CBasePlayer10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBasePlayer::TakeDamage_) }, + { 0x01D9C4C0, "_ZN11CBasePlayer10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBasePlayer::TakeDamage_) }, { 0x01D9BD70, "_ZN11CBasePlayer10TakeHealthEfi", mfunc_ptr_cast(&CBasePlayer::TakeHealth_) }, - //{ 0x0, "_ZN11CBasePlayer6KilledEP9entvars_si", mfunc_ptr_cast(&CBasePlayer::Killed_) }, + { 0x01D9E550, "_ZN11CBasePlayer6KilledEP9entvars_si", mfunc_ptr_cast(&CBasePlayer::Killed_) }, { 0x01DA3560, "_ZN11CBasePlayer9AddPointsEii", mfunc_ptr_cast(&CBasePlayer::AddPoints_) }, - //{ 0x0, "_ZN11CBasePlayer15AddPointsToTeamEii", mfunc_ptr_cast(&CBasePlayer::AddPointsToTeam_) }, + { 0x01DA3640, "_ZN11CBasePlayer15AddPointsToTeamEii", mfunc_ptr_cast(&CBasePlayer::AddPointsToTeam_) }, { 0x01DA86C0, "_ZN11CBasePlayer13AddPlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBasePlayer::AddPlayerItem_) }, { 0x01DA8960, "_ZN11CBasePlayer16RemovePlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBasePlayer::RemovePlayerItem_) }, { 0x01DA8AA0, "_ZN11CBasePlayer8GiveAmmoEiPci", mfunc_ptr_cast(&CBasePlayer::GiveAmmo_) }, - //{ 0x0, "_ZN11CBasePlayer13StartSneakingEv", mfunc_ptr_cast(&CBasePlayer::StartSneaking_) }, - //{ 0x0, "_ZN11CBasePlayer12StopSneakingEv", mfunc_ptr_cast(&CBasePlayer::StopSneaking_) }, - //{ 0x01D21010, "_ZN11CBasePlayer10IsSneakingEv", mfunc_ptr_cast(&CBasePlayer::IsSneaking_) }, + { 0x01D20FD0, "_ZN11CBasePlayer13StartSneakingEv", mfunc_ptr_cast(&CBasePlayer::StartSneaking_) }, + { 0x01D20FF0, "_ZN11CBasePlayer12StopSneakingEv", mfunc_ptr_cast(&CBasePlayer::StopSneaking_) }, + { 0x01D21010, "_ZN11CBasePlayer10IsSneakingEv", mfunc_ptr_cast(&CBasePlayer::IsSneaking_) }, { 0x01D21030, "_ZN11CBasePlayer7IsAliveEv", mfunc_ptr_cast(&CBasePlayer::IsAlive_) }, - //{ 0x0, "_ZN11CBasePlayer8IsPlayerEv", mfunc_ptr_cast(&CBasePlayer::IsPlayer_) }, - //{ 0x0, "_ZN11CBasePlayer11IsNetClientEv", mfunc_ptr_cast(&CBasePlayer::IsNetClient_) }, + { 0x01D21070, "_ZN11CBasePlayer8IsPlayerEv", mfunc_ptr_cast(&CBasePlayer::IsPlayer_) }, + { 0x01D21090, "_ZN11CBasePlayer11IsNetClientEv", mfunc_ptr_cast(&CBasePlayer::IsNetClient_) }, { 0x01DA6950, "_ZN11CBasePlayer6TeamIDEv", mfunc_ptr_cast(&CBasePlayer::TeamID_) }, { 0x01DA9BF0, "_ZN11CBasePlayer12FBecomeProneEv", mfunc_ptr_cast(&CBasePlayer::FBecomeProne_) }, - //{ 0x01D20F60, "_ZN11CBasePlayer10BodyTargetERK6Vector", mfunc_ptr_cast(&CBasePlayer::BodyTarget_) }, + { 0x01D20F60, "_ZN11CBasePlayer10BodyTargetERK6Vector", mfunc_ptr_cast(&CBasePlayer::BodyTarget_) }, { 0x01DA9C50, "_ZN11CBasePlayer12IlluminationEv", mfunc_ptr_cast(&CBasePlayer::Illumination_) }, - //{ 0x01D21060, "_ZN11CBasePlayer17ShouldFadeOnDeathEv", mfunc_ptr_cast(&CBasePlayer::ShouldFadeOnDeath_) }, + { 0x01D21060, "_ZN11CBasePlayer17ShouldFadeOnDeathEv", mfunc_ptr_cast(&CBasePlayer::ShouldFadeOnDeath_) }, { 0x01DA9CB0, "_ZN11CBasePlayer13ResetMaxSpeedEv", mfunc_ptr_cast(&CBasePlayer::ResetMaxSpeed_) }, - //{ 0x0, "_ZN11CBasePlayer4JumpEv", mfunc_ptr_cast(&CBasePlayer::Jump_) }, + { 0x01DA3310, "_ZN11CBasePlayer4JumpEv", mfunc_ptr_cast(&CBasePlayer::Jump_) }, { 0x01DA3530, "_ZN11CBasePlayer4DuckEv", mfunc_ptr_cast(&CBasePlayer::Duck_) }, - //{ 0x01DA3850, "_ZN11CBasePlayer8PreThinkEv", mfunc_ptr_cast(&CBasePlayer::PreThink_) }, - //{ 0x01DA4610, "_ZN11CBasePlayer9PostThinkEv", mfunc_ptr_cast(&CBasePlayer::PostThink_) }, + { 0x01DA3850, "_ZN11CBasePlayer8PreThinkEv", mfunc_ptr_cast(&CBasePlayer::PreThink_) }, + { 0x01DA4610, "_ZN11CBasePlayer9PostThinkEv", mfunc_ptr_cast(&CBasePlayer::PostThink_) }, { 0x01D9BD80, "_ZN11CBasePlayer14GetGunPositionEv", mfunc_ptr_cast(&CBasePlayer::GetGunPosition_) }, - //{ 0x0, "_ZN11CBasePlayer5IsBotEv", mfunc_ptr_cast(&CBasePlayer::IsBot_) }, - //{ 0x01DA8F90, "_ZN11CBasePlayer16UpdateClientDataEv", mfunc_ptr_cast(&CBasePlayer::UpdateClientData_) }, + { 0x01D25AD0, "_ZN11CBasePlayer5IsBotEv", mfunc_ptr_cast(&CBasePlayer::IsBot_) }, + { 0x01DA8F90, "_ZN11CBasePlayer16UpdateClientDataEv", mfunc_ptr_cast(&CBasePlayer::UpdateClientData_) }, { 0x01DA7020, "_ZN11CBasePlayer15ImpulseCommandsEv", mfunc_ptr_cast(&CBasePlayer::ImpulseCommands_) }, { 0x01DA2490, "_ZN11CBasePlayer12RoundRespawnEv", mfunc_ptr_cast(&CBasePlayer::RoundRespawn_) }, { 0x01DA9DC0, "_ZN11CBasePlayer16GetAutoaimVectorEf", mfunc_ptr_cast(&CBasePlayer::GetAutoaimVector_) }, { 0x01DAA220, "_ZN11CBasePlayer5BlindEfffi", mfunc_ptr_cast(&CBasePlayer::Blind_) }, - //{ 0x0, "_ZN11CBasePlayer16OnTouchingWeaponEP10CWeaponBox", mfunc_ptr_cast(&CBasePlayer::OnTouchingWeapon_) }, + { 0x01D25AE0, "_ZN11CBasePlayer16OnTouchingWeaponEP10CWeaponBox", mfunc_ptr_cast(&CBasePlayer::OnTouchingWeapon_) }, // pure //non-virtual func { 0x01DAC8D0, "_ZN11CBasePlayer21SpawnClientSideCorpseEv", mfunc_ptr_cast(&CBasePlayer::SpawnClientSideCorpse) }, - { 0x01D93750, "_ZN11CBasePlayer23Observer_FindNextPlayerEbPKc", mfunc_ptr_cast(&CBasePlayer::Observer_FindNextPlayer) }, // TODO: Reverse me + { 0x01D93750, "_ZN11CBasePlayer23Observer_FindNextPlayerEbPKc", mfunc_ptr_cast(&CBasePlayer::Observer_FindNextPlayer) }, { 0x01D936E0, "_ZN11CBasePlayer22Observer_IsValidTargetEib", mfunc_ptr_cast(&CBasePlayer::Observer_IsValidTarget) }, { 0x01D93D10, "_ZN11CBasePlayer22Observer_HandleButtonsEv", mfunc_ptr_cast(&CBasePlayer::Observer_HandleButtons) }, { 0x01D94280, "_ZN11CBasePlayer16Observer_SetModeEi", mfunc_ptr_cast(&CBasePlayer::Observer_SetMode) }, { 0x01D93DF0, "_ZN11CBasePlayer20Observer_CheckTargetEv", mfunc_ptr_cast(&CBasePlayer::Observer_CheckTarget) }, { 0x01D93F30, "_ZN11CBasePlayer24Observer_CheckPropertiesEv", mfunc_ptr_cast(&CBasePlayer::Observer_CheckProperties) }, - //{ 0x0, "_ZN11CBasePlayer10IsObserverEv", mfunc_ptr_cast(&CBasePlayer::IsObserver) }, - //{ 0x0, "_ZN11CBasePlayer7PlantC4Ev", mfunc_ptr_cast(&CBasePlayer::PlantC4) }, + //{ 0x0, "_ZN11CBasePlayer10IsObserverEv", mfunc_ptr_cast(&CBasePlayer::IsObserver) }, // NOXREF + //{ 0x0, "_ZN11CBasePlayer7PlantC4Ev", mfunc_ptr_cast(&CBasePlayer::PlantC4) }, // NOXREF { 0x01D9B670, "_ZN11CBasePlayer5RadioEPKcS1_sb", mfunc_ptr_cast(&CBasePlayer::Radio) }, //{ 0x01D9B4F0, "_ZN11CBasePlayer21GetNextRadioRecipientEPS_", mfunc_ptr_cast(&CBasePlayer::GetNextRadioRecipient) }, // NOXREF //{ 0x01D9B9A0, "_ZN11CBasePlayer10SmartRadioEv", mfunc_ptr_cast(&CBasePlayer::SmartRadio) }, // NOXREF { 0x01DA07D0, "_ZN11CBasePlayer11ThrowWeaponEPc", mfunc_ptr_cast(&CBasePlayer::ThrowWeapon) }, // NOXREF //{ 0x01DA0DB0, "_ZN11CBasePlayer12ThrowPrimaryEv", mfunc_ptr_cast(&CBasePlayer::ThrowPrimary) }, // NOXREF { 0x01DA1170, "_ZN11CBasePlayer10AddAccountEib", mfunc_ptr_cast(&CBasePlayer::AddAccount) }, - //{ 0x0, "_ZN11CBasePlayer9DisappearEv", mfunc_ptr_cast(&CBasePlayer::Disappear) }, + { 0x01DA1DA0, "_ZN11CBasePlayer9DisappearEv", mfunc_ptr_cast(&CBasePlayer::Disappear) }, { 0x01DA15B0, "_ZN11CBasePlayer7MakeVIPEv", mfunc_ptr_cast(&CBasePlayer::MakeVIP) }, - //{ 0x0, "_ZN11CBasePlayer12CanPlayerBuyEb", mfunc_ptr_cast(&CBasePlayer::CanPlayerBuy) }, + { 0x01DA36C0, "_ZN11CBasePlayer12CanPlayerBuyEb", mfunc_ptr_cast(&CBasePlayer::CanPlayerBuy) }, { 0x01DAB070, "_ZN11CBasePlayer10SwitchTeamEv", mfunc_ptr_cast(&CBasePlayer::SwitchTeam) }, { 0x01DAB820, "_ZN11CBasePlayer12TabulateAmmoEv", mfunc_ptr_cast(&CBasePlayer::TabulateAmmo) }, { 0x01D9B9B0, "_ZN11CBasePlayer4PainEib", mfunc_ptr_cast(&CBasePlayer::Pain) }, @@ -662,7 +663,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D9E190, "_ZN11CBasePlayer18SetProgressBarTimeEi", mfunc_ptr_cast(&CBasePlayer::SetProgressBarTime) }, { 0x01D9E320, "_ZN11CBasePlayer19SetProgressBarTime2Eif", mfunc_ptr_cast(&CBasePlayer::SetProgressBarTime2) }, //{ 0x01D93690, "_Z14GetForceCamerav", (size_t)&GetForceCamera }, // NOXREF - { 0x01D93A00, "_ZL19UpdateClientEffectsP11CBasePlayeri", (size_t)&UpdateClientEffects }, // TODO: Reverse me + { 0x01D93A00, "_ZL19UpdateClientEffectsP11CBasePlayeri", (size_t)&UpdateClientEffects }, //{ 0x0, "", (size_t)&OLD_CheckBuyZone }, // NOXREF //{ 0x0, "", (size_t)&OLD_CheckBombTarget }, // NOXREF @@ -676,7 +677,6 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "", (size_t)&BombTargetFlash_Clear }, // NOXREF //{ 0x0, "", (size_t)&RescueZoneIcon_Set }, //{ 0x0, "", (size_t)&RescueZoneIcon_Clear }, // NOXREF - { 0x01DA8410, "", (size_t)&EscapeZoneIcon_Set }, { 0x01DA84C0, "", (size_t)&EscapeZoneIcon_Clear }, { 0x01DA8550, "", (size_t)&VIP_SafetyZoneIcon_Set }, @@ -688,28 +688,27 @@ FunctionHook g_FunctionHooks[] = { 0x01DAB720, "_ZN11CBasePlayer12SwitchWeaponEP15CBasePlayerItem", mfunc_ptr_cast(&CBasePlayer::SwitchWeapon) }, //{ 0x01DA43F0, "_ZN11CBasePlayer13CheckPowerupsEP9entvars_s", mfunc_ptr_cast(&CBasePlayer::CheckPowerups) }, // NOXREF { 0x01DACDA0, "_ZN11CBasePlayer16CanAffordPrimaryEv", mfunc_ptr_cast(&CBasePlayer::CanAffordPrimary) }, - - { 0x01DACE10, "_ZN11CBasePlayer20CanAffordPrimaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::CanAffordPrimaryAmmo) }, // UNTESTED - { 0x01DACE60, "_ZN11CBasePlayer22CanAffordSecondaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::CanAffordSecondaryAmmo) }, // UNTESTED - { 0x01DACEB0, "_ZN11CBasePlayer14CanAffordArmorEv", mfunc_ptr_cast(&CBasePlayer::CanAffordArmor) }, // UNTESTED - { 0x01DACEF0, "_ZN11CBasePlayer18CanAffordDefuseKitEv", mfunc_ptr_cast(&CBasePlayer::CanAffordDefuseKit) }, // UNTESTED - { 0x01DACF00, "_ZN11CBasePlayer16CanAffordGrenadeEv", mfunc_ptr_cast(&CBasePlayer::CanAffordGrenade) }, // UNTESTED - { 0x01DACF20, "_ZN11CBasePlayer16NeedsPrimaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::NeedsPrimaryAmmo) }, // UNTESTED - { 0x01DACF60, "_ZN11CBasePlayer18NeedsSecondaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::NeedsSecondaryAmmo) }, // UNTESTED - { 0x01DACFA0, "_ZN11CBasePlayer10NeedsArmorEv", mfunc_ptr_cast(&CBasePlayer::NeedsArmor) }, // UNTESTED - { 0x01DACFD0, "_ZN11CBasePlayer14NeedsDefuseKitEv", mfunc_ptr_cast(&CBasePlayer::NeedsDefuseKit) }, // UNTESTED - { 0x01DAD000, "_ZN11CBasePlayer12NeedsGrenadeEv", mfunc_ptr_cast(&CBasePlayer::NeedsGrenade) }, // UNTESTED + { 0x01DACE10, "_ZN11CBasePlayer20CanAffordPrimaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::CanAffordPrimaryAmmo) }, + { 0x01DACE60, "_ZN11CBasePlayer22CanAffordSecondaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::CanAffordSecondaryAmmo) }, + { 0x01DACEB0, "_ZN11CBasePlayer14CanAffordArmorEv", mfunc_ptr_cast(&CBasePlayer::CanAffordArmor) }, + { 0x01DACEF0, "_ZN11CBasePlayer18CanAffordDefuseKitEv", mfunc_ptr_cast(&CBasePlayer::CanAffordDefuseKit) }, + { 0x01DACF00, "_ZN11CBasePlayer16CanAffordGrenadeEv", mfunc_ptr_cast(&CBasePlayer::CanAffordGrenade) }, + { 0x01DACF20, "_ZN11CBasePlayer16NeedsPrimaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::NeedsPrimaryAmmo) }, + { 0x01DACF60, "_ZN11CBasePlayer18NeedsSecondaryAmmoEv", mfunc_ptr_cast(&CBasePlayer::NeedsSecondaryAmmo) }, + { 0x01DACFA0, "_ZN11CBasePlayer10NeedsArmorEv", mfunc_ptr_cast(&CBasePlayer::NeedsArmor) }, + { 0x01DACFD0, "_ZN11CBasePlayer14NeedsDefuseKitEv", mfunc_ptr_cast(&CBasePlayer::NeedsDefuseKit) }, + { 0x01DAD000, "_ZN11CBasePlayer12NeedsGrenadeEv", mfunc_ptr_cast(&CBasePlayer::NeedsGrenade) }, { 0x01DA07B0, "_ZN11CBasePlayer10IsOnLadderEv", mfunc_ptr_cast(&CBasePlayer::IsOnLadder) }, //{ 0x01DA6E80, "_ZN11CBasePlayer14FlashlightIsOnEv", mfunc_ptr_cast(&CBasePlayer::FlashlightIsOn) }, // NOXREF //{ 0x01DA6E90, "_ZN11CBasePlayer16FlashlightTurnOnEv", mfunc_ptr_cast(&CBasePlayer::FlashlightTurnOn) }, // NOXREF //{ 0x01DA6F40, "_ZN11CBasePlayer17FlashlightTurnOffEv", mfunc_ptr_cast(&CBasePlayer::FlashlightTurnOff) }, // NOXREF - //{ 0x0, "_ZN11CBasePlayer17UpdatePlayerSoundEv", mfunc_ptr_cast(&CBasePlayer::UpdatePlayerSound) }, + { 0x01DA4450, "_ZN11CBasePlayer17UpdatePlayerSoundEv", mfunc_ptr_cast(&CBasePlayer::UpdatePlayerSound) }, //{ 0x01D9BCA0, "_ZN11CBasePlayer10DeathSoundEv", mfunc_ptr_cast(&CBasePlayer::DeathSound) }, // NOXREF { 0x01D9F430, "_ZN11CBasePlayer12SetAnimationE11PLAYER_ANIM", mfunc_ptr_cast(&CBasePlayer::SetAnimation) }, - //{ 0x0, "_ZN11CBasePlayer17SetWeaponAnimTypeEPKc", mfunc_ptr_cast(&CBasePlayer::SetWeaponAnimType) }, + //{ 0x0, "_ZN11CBasePlayer17SetWeaponAnimTypeEPKc", mfunc_ptr_cast(&CBasePlayer::SetWeaponAnimType) }, // NOXREF { 0x01DA73C0, "_ZN11CBasePlayer20CheatImpulseCommandsEi", mfunc_ptr_cast(&CBasePlayer::CheatImpulseCommands) }, //{ 0x01DA2640, "_ZN11CBasePlayer13StartDeathCamEv", mfunc_ptr_cast(&CBasePlayer::StartDeathCam) }, // NOXREF - //{ 0x01DA26D0, "_ZN11CBasePlayer13StartObserverE6VectorS0_", mfunc_ptr_cast(&CBasePlayer::StartObserver) }, + { 0x01DA26D0, "_ZN11CBasePlayer13StartObserverE6VectorS0_", mfunc_ptr_cast(&CBasePlayer::StartObserver) }, { 0x01DA7FF0, "_ZN11CBasePlayer13HandleSignalsEv", mfunc_ptr_cast(&CBasePlayer::HandleSignals) }, { 0x01DAA850, "_ZN11CBasePlayer14DropPlayerItemEPKc", mfunc_ptr_cast(&CBasePlayer::DropPlayerItem) }, { 0x01DAAF30, "_ZN11CBasePlayer13HasPlayerItemEP15CBasePlayerItem", mfunc_ptr_cast(&CBasePlayer::HasPlayerItem) }, @@ -726,19 +725,19 @@ FunctionHook g_FunctionHooks[] = { 0x01DA9D50, "_ZN11CBasePlayer11HintMessageEPKcii", mfunc_ptr_cast(&CBasePlayer::HintMessage) }, { 0x01DA8CC0, "_ZN11CBasePlayer14SendAmmoUpdateEv", mfunc_ptr_cast(&CBasePlayer::SendAmmoUpdate) }, //{ 0x01D9E4F0, "_ZN11CBasePlayer7SendFOVEi", mfunc_ptr_cast(&CBasePlayer::SendFOV) }, // NOXREF - //{ 0x01DA0390, "_ZN11CBasePlayer9WaterMoveEv", mfunc_ptr_cast(&CBasePlayer::WaterMove) }, - //{ 0x01DA2140, "_ZN11CBasePlayer16PlayerDeathThinkEv", mfunc_ptr_cast(&CBasePlayer::PlayerDeathThink) }, + { 0x01DA0390, "_ZN11CBasePlayer9WaterMoveEv", mfunc_ptr_cast(&CBasePlayer::WaterMove) }, + { 0x01DA2140, "_ZN11CBasePlayer16PlayerDeathThinkEv", mfunc_ptr_cast(&CBasePlayer::PlayerDeathThink) }, { 0x01DA29A0, "_ZN11CBasePlayer9PlayerUseEv", mfunc_ptr_cast(&CBasePlayer::PlayerUse) }, - //{ 0x0, "_ZN11CBasePlayer11HostageUsedEv", mfunc_ptr_cast(&CBasePlayer::HostageUsed) }, - //{ 0x0, "_ZN11CBasePlayer12JoiningThinkEv", mfunc_ptr_cast(&CBasePlayer::JoiningThink) }, + { 0x01DA3290, "_ZN11CBasePlayer11HostageUsedEv", mfunc_ptr_cast(&CBasePlayer::HostageUsed) }, + { 0x01DA1680, "_ZN11CBasePlayer12JoiningThinkEv", mfunc_ptr_cast(&CBasePlayer::JoiningThink) }, //{ 0x01DA1480, "_ZN11CBasePlayer15RemoveLevelTextEv", mfunc_ptr_cast(&CBasePlayer::RemoveLevelText) }, // NOXREF { 0x01DA14D0, "_ZN11CBasePlayer9MenuPrintEPS_PKc", mfunc_ptr_cast(&CBasePlayer::MenuPrint) }, //{ 0x01DA11F0, "_ZN11CBasePlayer9ResetMenuEv", mfunc_ptr_cast(&CBasePlayer::ResetMenu) }, // NOXREF { 0x01DA1240, "_ZN11CBasePlayer14SyncRoundTimerEv", mfunc_ptr_cast(&CBasePlayer::SyncRoundTimer) }, - //{ 0x01DA4220, "_ZN11CBasePlayer15CheckSuitUpdateEv", mfunc_ptr_cast(&CBasePlayer::CheckSuitUpdate) }, - { 0x01DA43E0, "_ZN11CBasePlayer13SetSuitUpdateEPcii", mfunc_ptr_cast(&CBasePlayer::SetSuitUpdate) }, // NOXREF + { 0x01DA4220, "_ZN11CBasePlayer15CheckSuitUpdateEv", mfunc_ptr_cast(&CBasePlayer::CheckSuitUpdate) }, + { 0x01DA43E0, "_ZN11CBasePlayer13SetSuitUpdateEPcii", mfunc_ptr_cast(&CBasePlayer::SetSuitUpdate) }, //{ 0x01DA4170, "_ZN11CBasePlayer19UpdateGeigerCounterEv", mfunc_ptr_cast(&CBasePlayer::UpdateGeigerCounter) }, // NOXREF - //{ 0x0, "_ZN11CBasePlayer20CheckTimeBasedDamageEv", mfunc_ptr_cast(&CBasePlayer::CheckTimeBasedDamage) }, + { 0x01DA3FE0, "_ZN11CBasePlayer20CheckTimeBasedDamageEv", mfunc_ptr_cast(&CBasePlayer::CheckTimeBasedDamage) }, //{ 0x01DA9C10, "_ZN11CBasePlayer20BarnacleVictimBittenEP9entvars_s", mfunc_ptr_cast(&CBasePlayer::BarnacleVictimBitten) }, // NOXREF //{ 0x01DA9C40, "_ZN11CBasePlayer22BarnacleVictimReleasedEv", mfunc_ptr_cast(&CBasePlayer::BarnacleVictimReleased) }, // NOXREF { 0x01DA8C80, "_ZN11CBasePlayer12GetAmmoIndexEPKc", mfunc_ptr_cast(&CBasePlayer::GetAmmoIndex) }, @@ -746,7 +745,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01DAA150, "_ZN11CBasePlayer12ResetAutoaimEv", mfunc_ptr_cast(&CBasePlayer::ResetAutoaim) }, // NOXREF //{ 0x01DAA120, "_ZN11CBasePlayer17AutoaimDeflectionER6Vectorff", mfunc_ptr_cast(&CBasePlayer::AutoaimDeflection) }, // NOXREF { 0x01DA6FD0, "_ZN11CBasePlayer20ForceClientDllUpdateEv", mfunc_ptr_cast(&CBasePlayer::ForceClientDllUpdate) }, - //{ 0x0, "_ZN11CBasePlayer12DeathMessageEP9entvars_s", mfunc_ptr_cast(&CBasePlayer::DeathMessage) }, + //{ 0x0, "_ZN11CBasePlayer12DeathMessageEP9entvars_s", mfunc_ptr_cast(&CBasePlayer::DeathMessage) }, // NOXREF { 0x01DAA1E0, "_ZN11CBasePlayer20SetCustomDecalFramesEi", mfunc_ptr_cast(&CBasePlayer::SetCustomDecalFrames) }, //{ 0x01DAA210, "_ZN11CBasePlayer20GetCustomDecalFramesEv", mfunc_ptr_cast(&CBasePlayer::GetCustomDecalFrames) }, // NOXREF //{ 0x01DAA260, "_ZN11CBasePlayer13InitStatusBarEv", mfunc_ptr_cast(&CBasePlayer::InitStatusBar) }, // NOXREF @@ -768,16 +767,16 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN11CBasePlayer19IsProtectedByShieldEv", mfunc_ptr_cast(&CBasePlayer::IsProtectedByShield) }, //{ 0x01DA0B20, "_ZN11CBasePlayer12RemoveShieldEv", mfunc_ptr_cast(&CBasePlayer::RemoveShield) }, // NOXREF { 0x01DA0B60, "_ZN11CBasePlayer10DropShieldEb", mfunc_ptr_cast(&CBasePlayer::DropShield) }, - //{ 0x0, "_ZN11CBasePlayer10GiveShieldEb", mfunc_ptr_cast(&CBasePlayer::GiveShield) }, + { 0x01DA0A90, "_ZN11CBasePlayer10GiveShieldEb", mfunc_ptr_cast(&CBasePlayer::GiveShield) }, //{ 0x01D9BDB0, "_ZN11CBasePlayer15IsHittingShieldERK6VectorP11TraceResult", mfunc_ptr_cast(&CBasePlayer::IsHittingShield) }, // NOXREF - //{ 0x0, "_ZN11CBasePlayer11IsReloadingEv", mfunc_ptr_cast(&CBasePlayer::IsReloading) }, - //{ 0x0, "_ZNK11CBasePlayer7IsBlindEv", mfunc_ptr_cast(&CBasePlayer::IsBlind) }, - //{ 0x0, "_ZNK11CBasePlayer19IsAutoFollowAllowedEv", mfunc_ptr_cast(&CBasePlayer::IsAutoFollowAllowed) }, - //{ 0x0, "_ZN11CBasePlayer17InhibitAutoFollowEf", mfunc_ptr_cast(&CBasePlayer::InhibitAutoFollow) }, - //{ 0x0, "_ZN11CBasePlayer15AllowAutoFollowEv", mfunc_ptr_cast(&CBasePlayer::AllowAutoFollow) }, - //{ 0x01DAD180, "_ZN11CBasePlayer16ClearAutoBuyDataEv", mfunc_ptr_cast(&CBasePlayer::ClearAutoBuyData) }, + //{ 0x0, "_ZN11CBasePlayer11IsReloadingEv", mfunc_ptr_cast(&CBasePlayer::IsReloading) }, // NOXREF + //{ 0x0, "_ZNK11CBasePlayer7IsBlindEv", mfunc_ptr_cast(&CBasePlayer::IsBlind) }, // NOXREF + //{ 0x0, "_ZNK11CBasePlayer19IsAutoFollowAllowedEv", mfunc_ptr_cast(&CBasePlayer::IsAutoFollowAllowed) }, // NOXREF + //{ 0x0, "_ZN11CBasePlayer17InhibitAutoFollowEf", mfunc_ptr_cast(&CBasePlayer::InhibitAutoFollow) }, // NOXREF + //{ 0x0, "_ZN11CBasePlayer15AllowAutoFollowEv", mfunc_ptr_cast(&CBasePlayer::AllowAutoFollow) }, // NOXREF + { 0x01DAD180, "_ZN11CBasePlayer16ClearAutoBuyDataEv", mfunc_ptr_cast(&CBasePlayer::ClearAutoBuyData) }, { 0x01DAD190, "_ZN11CBasePlayer14AddAutoBuyDataEPKc", mfunc_ptr_cast(&CBasePlayer::AddAutoBuyData) }, - //{ 0x01DAD280, "_ZN11CBasePlayer7AutoBuyEv", mfunc_ptr_cast(&CBasePlayer::AutoBuy) }, + { 0x01DAD280, "_ZN11CBasePlayer7AutoBuyEv", mfunc_ptr_cast(&CBasePlayer::AutoBuy) }, { 0x01DAD0D0, "_ZN11CBasePlayer13ClientCommandEPKcS1_S1_S1_", mfunc_ptr_cast(&CBasePlayer::ClientCommand) }, { 0x01DADD00, "_ZN11CBasePlayer23PrioritizeAutoBuyStringEPcPKc", mfunc_ptr_cast(&CBasePlayer::PrioritizeAutoBuyString) }, //{ 0x01DAD590, "_ZN11CBasePlayer27PickPrimaryCareerTaskWeaponEv", mfunc_ptr_cast(&CBasePlayer::PickPrimaryCareerTaskWeapon) }, @@ -802,10 +801,10 @@ FunctionHook g_FunctionHooks[] = { 0x01DAE960, "_ZN11CBasePlayer16RebuyNightVisionEv", mfunc_ptr_cast(&CBasePlayer::RebuyNightVision) }, { 0x01DAE9C0, "_ZN11CBasePlayer10RebuyArmorEv", mfunc_ptr_cast(&CBasePlayer::RebuyArmor) }, { 0x01DAEAB0, "_ZN11CBasePlayer14UpdateLocationEb", mfunc_ptr_cast(&CBasePlayer::UpdateLocation) }, - //{ 0x0, "_ZN11CBasePlayer23SetObserverAutoDirectorEb", mfunc_ptr_cast(&CBasePlayer::SetObserverAutoDirector) }, + //{ 0x0, "_ZN11CBasePlayer23SetObserverAutoDirectorEb", mfunc_ptr_cast(&CBasePlayer::SetObserverAutoDirector) }, // NOXREF { 0x01DAEA40, "_ZN11CBasePlayer17IsObservingPlayerEPS_", mfunc_ptr_cast(&CBasePlayer::IsObservingPlayer) }, - //{ 0x0, "_ZNK11CBasePlayer22CanSwitchObserverModesEv", mfunc_ptr_cast(&CBasePlayer::CanSwitchObserverModes) }, - //{ 0x0, "_ZN11CBasePlayer7IntenseEv", mfunc_ptr_cast(&CBasePlayer::Intense) }, + //{ 0x0, "_ZNK11CBasePlayer22CanSwitchObserverModesEv", mfunc_ptr_cast(&CBasePlayer::CanSwitchObserverModes) }, // NOXREF + //{ 0x0, "_ZN11CBasePlayer7IntenseEv", mfunc_ptr_cast(&CBasePlayer::Intense) }, // NOXREF { 0x01D9AB20, "_Z16LinkUserMessagesv", (size_t)&LinkUserMessages }, { 0x01D9B0F0, "_Z18WriteSigonMessagesv", (size_t)&WriteSigonMessages }, { 0x01D9B280, "_Z14SendItemStatusP11CBasePlayer", (size_t)&SendItemStatus }, @@ -817,7 +816,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D9C3C0, "_Z9LogAttackP11CBasePlayerS0_iiiiiPKc", (size_t)&LogAttack }, { 0x01D9D770, "_ZL14packPlayerItemP11CBasePlayerP15CBasePlayerItemb", (size_t)&packPlayerItem }, { 0x01DA3110, "_ZL13CanSeeUseableP11CBasePlayerP11CBaseEntity_isra_13", (size_t)&CanSeeUseable }, - //{ 0x01DA34E0, "_Z20FixPlayerCrouchStuckP7edict_s", (size_t)&FixPlayerCrouchStuck }, + //{ 0x01DA34E0, "_Z20FixPlayerCrouchStuckP7edict_s", (size_t)&FixPlayerCrouchStuck }, // NOXREF //{ 0x01DA4A90, "_Z17IsSpawnPointValidP11CBaseEntityS0_", (size_t)&IsSpawnPointValid }, // NOXREF //{ 0x01DA4B20, "_Z16InitZombieSpawnsv", (size_t)&InitZombieSpawns }, // NOXREF //{ 0x01DA4BC0, "_Z15FindZombieSpawnP11CBaseEntityb", (size_t)&FindZombieSpawn }, // NOXREF @@ -840,8 +839,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x01DAD520, "_Z22CurrentWeaponSatisfiesP17CBasePlayerWeaponii", (size_t)&CurrentWeaponSatisfies }, // NOXREF //CWShield //virtual func - //{ 0x0, "_ZN8CWShield5SpawnEv", mfunc_ptr_cast(&CWShield::Spawn) }, - //{ 0x0, "_ZN8CWShield5TouchEP11CBaseEntity", mfunc_ptr_cast(&CWShield::Touch) }, + { 0x1DA08D0, "_ZN8CWShield5SpawnEv", mfunc_ptr_cast(&CWShield::Spawn_) }, + { 0x01DA0920, "_ZN8CWShield5TouchEP11CBaseEntity", mfunc_ptr_cast(&CWShield::Touch_) }, //non-virtual func //{ 0x0, "_ZN8CWShield23SetCantBePickedUpByUserEP11CBaseEntityf", mfunc_ptr_cast(&CWShield::SetCantBePickedUpByUser) } // NOXREF INLINEBODY @@ -876,12 +875,12 @@ FunctionHook g_FunctionHooks[] = { 0x01DABF20, "_ZN17CInfoIntermission5SpawnEv", mfunc_ptr_cast(&CInfoIntermission::Spawn_) }, { 0x01DABF90, "_ZN17CInfoIntermission5ThinkEv", mfunc_ptr_cast(&CInfoIntermission::Think_) }, //linked object - //{ 0x01D9B1F0, "player", (size_t)&player }, - //{ 0x01DAC0A0, "info_intermission", (size_t)&info_intermission }, - //{ 0x01DABC70, "player_loadsaved", (size_t)&player_loadsaved }, - //{ 0x01DABBC0, "player_weaponstrip", (size_t)&player_weaponstrip }, - //{ 0x01DABA90, "monster_hevsuit_dead", (size_t)&monster_hevsuit_dead }, - //{ 0x01DA0880, "weapon_shield", (size_t)&weapon_shield }, + { 0x01D9B1F0, "player", (size_t)&player }, + { 0x01DAC0A0, "info_intermission", (size_t)&info_intermission }, + { 0x01DABC70, "player_loadsaved", (size_t)&player_loadsaved }, + { 0x01DABBC0, "player_weaponstrip", (size_t)&player_weaponstrip }, + { 0x01DABA90, "monster_hevsuit_dead", (size_t)&monster_hevsuit_dead }, + { 0x01DA0880, "weapon_shield", (size_t)&weapon_shield }, #endif // Player_Region @@ -2115,6 +2114,10 @@ FunctionHook g_FunctionHooks[] = #ifndef SharedUtil_Region +#ifdef _WIN32 + //{ 0x01D50CA0, "", (size_t)&CloneString }, +#endif // _WIN32 + //{ 0x01D58EE0, "_Z14SharedWVarArgsPwz", (size_t)&SharedWVarArgs }, // NOXREF { 0x01D58F30, "_Z13SharedVarArgsPcz", (size_t)&SharedVarArgs }, { 0x01D58F80, "_Z9BufPrintfPcRiPKcz", (size_t)&BufPrintf }, @@ -2174,7 +2177,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN6CGraph10FLoadGraphEPc", mfunc_ptr_cast(&CGraph::FLoadGraph) }, //{ 0x01D8ABB0, "_ZN6CGraph17FSetGraphPointersEv", mfunc_ptr_cast(&CGraph::FSetGraphPointers) }, //{ 0x01D8ABC0, "_ZN6CGraph19ShowNodeConnectionsEi", mfunc_ptr_cast(&CGraph::ShowNodeConnections) }, // NOXREF - //{ 0x01D8ABE0, "_ZN6CGraph15FindNearestNodeERK6VectorP11CBaseEntity", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // NOXREF + //{ 0x0, "_ZN6CGraph15FindNearestNodeERK6VectorP11CBaseEntity", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // NOXREF //{ 0x01D8ABD0, "_ZN6CGraph15FindNearestNodeERK6Vectori", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // PURE #endif // Graph_Region @@ -2184,7 +2187,7 @@ FunctionHook g_FunctionHooks[] = //CSound //non-virtual func //{ 0x0, "_ZN6CSound5ClearEv", mfunc_ptr_cast(&CSound::Clear) }, - //{ 0x0, "_ZN6CSound5ResetEv", mfunc_ptr_cast(&CSound::Reset) }, + { 0x01DBA560, "_ZN6CSound5ResetEv", mfunc_ptr_cast(&CSound::Reset) }, //{ 0x0, "_ZN6CSound8FIsSoundEv", mfunc_ptr_cast(&CSound::FIsSound) }, //{ 0x0, "_ZN6CSound8FIsScentEv", mfunc_ptr_cast(&CSound::FIsScent) }, //CSoundEnt @@ -2199,8 +2202,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN9CSoundEnt9FreeSoundEii", mfunc_ptr_cast(&CSoundEnt::FreeSound) }, //{ 0x0, "_ZN9CSoundEnt10ActiveListEv", mfunc_ptr_cast(&CSoundEnt::ActiveList) }, //{ 0x0, "_ZN9CSoundEnt8FreeListEv", mfunc_ptr_cast(&CSoundEnt::FreeList) }, - //{ 0x0, "_ZN9CSoundEnt20SoundPointerForIndexEi", mfunc_ptr_cast(&CSoundEnt::SoundPointerForIndex) }, - //{ 0x0, "_ZN9CSoundEnt16ClientSoundIndexEP7edict_s", mfunc_ptr_cast(&CSoundEnt::ClientSoundIndex) }, + { 0x01DBAAB0, "_ZN9CSoundEnt20SoundPointerForIndexEi", mfunc_ptr_cast(&CSoundEnt::SoundPointerForIndex) }, + { 0x01DBAB00, "_ZN9CSoundEnt16ClientSoundIndexEP7edict_s", mfunc_ptr_cast(&CSoundEnt::ClientSoundIndex) }, //{ 0x0, "_ZN9CSoundEnt7IsEmptyEv", mfunc_ptr_cast(&CSoundEnt::IsEmpty) }, // NOXREF //{ 0x0, "_ZN9CSoundEnt13ISoundsInListEi", mfunc_ptr_cast(&CSoundEnt::ISoundsInList) }, //{ 0x01DBA7D0, "_ZN9CSoundEnt11IAllocSoundEv", mfunc_ptr_cast(&CSoundEnt::IAllocSound) }, // NOXREF @@ -2259,6 +2262,12 @@ FunctionHook g_FunctionHooks[] = #ifndef Util_Region +#ifdef _WIN32 + //{ 0x01D67920, "", mfunc_ptr_cast(&VARS) }, +#endif // _WIN32 + + //{ 0x01DC2670, "_Z8U_Randomv", (size_t)&U_Random }, // NOXREF + //{ 0x01DC26B0, "_Z7U_Srandj", (size_t)&U_Srand }, // NOXREF { 0x01DC26D0, "_Z21UTIL_SharedRandomLongjii", (size_t)&UTIL_SharedRandomLong }, { 0x01DC2740, "_Z22UTIL_SharedRandomFloatjff", (size_t)&UTIL_SharedRandomFloat }, //{ 0x01DC2820, "_Z21UTIL_ParametricRocketP9entvars_s6VectorS1_P7edict_s", (size_t)&UTIL_ParametricRocket }, // NOXREF @@ -2286,8 +2295,8 @@ FunctionHook g_FunctionHooks[] = { 0x01DC31A0, "_Z21UTIL_EmitAmbientSoundP7edict_sRK6VectorPKcffii", (size_t)&UTIL_EmitAmbientSound }, { 0x01DC3240, "_Z16UTIL_ScreenShakeRK6Vectorffff", (size_t)&UTIL_ScreenShake }, //{ 0x01DC33F0, "_Z19UTIL_ScreenShakeAllRK6Vectorfff", (size_t)&UTIL_ScreenShakeAll }, // NOXREF - //{ 0x01DC33D0, "_Z20UTIL_ScreenFadeBuildR10ScreenFadeRK6Vectorffii", (size_t)&UTIL_ScreenFadeBuild }, // NOXREF - { 0x01DC34A0, "_Z20UTIL_ScreenFadeWriteRK10ScreenFadeP11CBaseEntity", (size_t)&UTIL_ScreenFadeWrite }, + //{ 0x01DC3410, "_Z20UTIL_ScreenFadeBuildR10ScreenFadeRK6Vectorffii", (size_t)&UTIL_ScreenFadeBuild }, // NOXREF + //{ 0x01DC34A0, "_Z20UTIL_ScreenFadeWriteRK10ScreenFadeP11CBaseEntity", (size_t)&UTIL_ScreenFadeWrite }, // NOXREF { 0x01DC3540, "_Z18UTIL_ScreenFadeAllRK6Vectorffii", (size_t)&UTIL_ScreenFadeAll }, { 0x01DC36E0, "_Z15UTIL_ScreenFadeP11CBaseEntityRK6Vectorffii", (size_t)&UTIL_ScreenFade }, { 0x01DC3810, "_Z15UTIL_HudMessageP11CBaseEntityRK14hudtextparms_sPKc", (size_t)&UTIL_HudMessage }, @@ -2327,7 +2336,7 @@ FunctionHook g_FunctionHooks[] = { 0x01DC4720, "_Z20UTIL_BloodDecalTraceP11TraceResulti", (size_t)&UTIL_BloodDecalTrace }, { 0x01DC47A0, "_Z15UTIL_DecalTraceP11TraceResulti", (size_t)&UTIL_DecalTrace }, { 0x01DC48A0, "_Z21UTIL_PlayerDecalTraceP11TraceResultiii", (size_t)&UTIL_PlayerDecalTrace }, - { 0x01DC4940, "_Z22UTIL_GunshotDecalTraceP11TraceResultibP9entvars_s", (size_t)&UTIL_GunshotDecalTrace }, + //{ 0x01DC4940, "_Z22UTIL_GunshotDecalTraceP11TraceResultibP9entvars_s", (size_t)&UTIL_GunshotDecalTrace }, // NOXREF { 0x01DC4A40, "_Z11UTIL_SparksRK6Vector", (size_t)&UTIL_Sparks }, { 0x01DC4A90, "_Z13UTIL_RicochetRK6Vectorf", (size_t)&UTIL_Ricochet }, { 0x01DC4AF0, "_Z15UTIL_TeamsMatchPKcS0_", (size_t)&UTIL_TeamsMatch }, @@ -2343,14 +2352,14 @@ FunctionHook g_FunctionHooks[] = { 0x01DC5380, "_Z14UTIL_LogPrintfPcz", (size_t)&UTIL_LogPrintf }, //{ 0x01DC53B0, "_Z14UTIL_DotPointsRK6VectorS1_S1_", (size_t)&UTIL_DotPoints }, // NOXREF { 0x01DC5430, "_Z15UTIL_StripTokenPKcPc", (size_t)&UTIL_StripToken }, - ////{ 0x01DC5470, "_ZN18CSaveRestoreBufferC2Ev", mfunc_ptr_cast(&CSaveRestoreBuffer::CSaveRestoreBuffer) }, // NOXREF - ////{ 0x01DC5480, "_ZN18CSaveRestoreBufferC2EP13saverestore_s", mfunc_ptr_cast(&CSaveRestoreBuffer::CSaveRestoreBuffer) }, // NOXREF - ////{ 0x01DC5490, "_ZN18CSaveRestoreBufferD2Ev", mfunc_ptr_cast(&CSaveRestoreBuffer::~CSaveRestoreBuffer) }, // NOXREF + //{ 0x01DC5470, "_ZN18CSaveRestoreBufferC2Ev", mfunc_ptr_cast(&CSaveRestoreBuffer::CSaveRestoreBuffer) }, // NOXREF + //{ 0x01DC5480, "_ZN18CSaveRestoreBufferC2EP13saverestore_s", mfunc_ptr_cast(&CSaveRestoreBuffer::CSaveRestoreBuffer) }, // NOXREF + //{ 0x01DC5490, "_ZN18CSaveRestoreBufferD2Ev", mfunc_ptr_cast(&CSaveRestoreBuffer::~CSaveRestoreBuffer) }, // NOXREF { 0x01DC54A0, "_ZN18CSaveRestoreBuffer11EntityIndexEP11CBaseEntity", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityIndex) }, //{ 0x01DC54F0, "_ZN18CSaveRestoreBuffer11EntityIndexEP7edict_s", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityIndex) }, // NOXREF //{ 0x01DC5540, "_ZN18CSaveRestoreBuffer11EntityIndexEi", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityIndex) }, // NOXREF { 0x01DC5590, "_ZN18CSaveRestoreBuffer11EntityIndexEP9entvars_s", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityIndex) }, - { 0x01DC55D0, "_ZN18CSaveRestoreBuffer15EntityFromIndexEi", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityFromIndex) }, + //{ 0x01DC55D0, "_ZN18CSaveRestoreBuffer15EntityFromIndexEi", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityFromIndex) }, // NOXREF { 0x01DC5610, "_ZN18CSaveRestoreBuffer14EntityFlagsSetEii", mfunc_ptr_cast(&CSaveRestoreBuffer::EntityFlagsSet) }, //{ 0x01DC5660, "_ZN18CSaveRestoreBuffer12BufferRewindEi", mfunc_ptr_cast(&CSaveRestoreBuffer::BufferRewind) }, // NOXREF //{ 0x01DC5690, "_ZN18CSaveRestoreBuffer10HashStringEPKc", mfunc_ptr_cast(&CSaveRestoreBuffer::HashString) }, // NOXREF @@ -2491,7 +2500,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D90BC0, "_ZN18CHalfLifeMultiplay7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::InitHUD_) }, //{ 0x0, "_ZN18CHalfLifeMultiplay18ClientDisconnectedEP7edict_s", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientDisconnected_) }, //{ 0x01D90B80, "_ZN18CHalfLifeMultiplay14UpdateGameModeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::UpdateGameMode_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18FlPlayerFallDamageEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FlPlayerFallDamage_) }, + { 0x01D91360, "_ZN18CHalfLifeMultiplay18FlPlayerFallDamageEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FlPlayerFallDamage_) }, //{ 0x0, "_ZN18CHalfLifeMultiplay20FPlayerCanTakeDamageEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::FPlayerCanTakeDamage_) }, //{ 0x0, "_ZN18CHalfLifeMultiplay11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerSpawn_) }, //{ 0x0, "_ZN18CHalfLifeMultiplay11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerThink_) }, @@ -2545,8 +2554,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN18CHalfLifeMultiplay15IsInCareerRoundEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsInCareerRound) }, //{ 0x0, "_ZN18CHalfLifeMultiplay13CareerRestartEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CareerRestart) }, //{ 0x0, "_ZN18CHalfLifeMultiplay16PlayerJoinedTeamEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerJoinedTeam) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay8TeamFullEi", mfunc_ptr_cast(&CHalfLifeMultiplay::TeamFull) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay11TeamStackedEii", mfunc_ptr_cast(&CHalfLifeMultiplay::TeamStacked) }, + { 0x01D8EC20, "_ZN18CHalfLifeMultiplay8TeamFullEi", mfunc_ptr_cast(&CHalfLifeMultiplay::TeamFull) }, + { 0x01D8ECA0, "_ZN18CHalfLifeMultiplay11TeamStackedEii", mfunc_ptr_cast(&CHalfLifeMultiplay::TeamStacked) }, //{ 0x0, "_ZN18CHalfLifeMultiplay15IsVIPQueueEmptyEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsVIPQueueEmpty) }, //{ 0x0, "_ZN18CHalfLifeMultiplay13AddToVIPQueueEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::AddToVIPQueue) }, //{ 0x0, "_ZN18CHalfLifeMultiplay11PickNextVIPEv", mfunc_ptr_cast(&CHalfLifeMultiplay::PickNextVIP) }, @@ -2558,8 +2567,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN18CHalfLifeMultiplay11DisplayMapsEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::DisplayMaps) }, //{ 0x0, "_ZN18CHalfLifeMultiplay16ResetAllMapVotesEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ResetAllMapVotes) }, //{ 0x0, "_ZN18CHalfLifeMultiplay14ProcessMapVoteEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::ProcessMapVote) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay14IsThereABomberEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsThereABomber) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay12IsThereABombEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsThereABomb) }, + { 0x01D8EAC0, "_ZN18CHalfLifeMultiplay14IsThereABomberEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsThereABomber) }, + { 0x01D8EB50, "_ZN18CHalfLifeMultiplay12IsThereABombEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsThereABomb) }, //{ 0x0, "_ZN18CHalfLifeMultiplay14IsMatchStartedEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsMatchStarted) }, //{ 0x0, "_ZN18CHalfLifeMultiplay16SendMOTDToClientEP7edict_s", mfunc_ptr_cast(&CHalfLifeMultiplay::SendMOTDToClient) }, //non class func @@ -2570,7 +2579,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z20SV_Career_EndRound_fv", (size_t)&SV_Career_EndRound_f }, //{ 0x0, "_Z18SV_CareerAddTask_fv", (size_t)&SV_CareerAddTask_f }, //{ 0x0, "_Z21SV_CareerMatchLimit_fv", (size_t)&SV_CareerMatchLimit_f }, - //{ 0x0, "_Z9BroadcastPKc", (size_t)&Broadcast }, + { 0x01D8B6E0, "_Z9BroadcastPKc", (size_t)&Broadcast }, { 0x01D8B780, "_Z7GetTeami", (size_t)&GetTeam }, //{ 0x0, "_Z15EndRoundMessagePKci", (size_t)&EndRoundMessage }, //{ 0x01D8BD80, "_ZL18ReadMultiplayCvarsP18CHalfLifeMultiplay", (size_t)&ReadMultiplayCvars }, @@ -2609,7 +2618,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN17CHalfLifeTraining18CheckWinConditionsEv", mfunc_ptr_cast(&CHalfLifeTraining::CheckWinConditions) }, //non-virtual func { 0x01DBBEB0, "_ZN17CHalfLifeTraining11HostageDiedEv", mfunc_ptr_cast(&CHalfLifeTraining::HostageDied) }, - //{ 0x0, "_ZN17CHalfLifeTraining12PlayerCanBuyEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerCanBuy) }, + { 0x01DBC4D0, "_ZN17CHalfLifeTraining12PlayerCanBuyEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerCanBuy) }, //CBaseGrenCatch //virtual func //{ 0x0, "_ZN14CBaseGrenCatch5SpawnEv", mfunc_ptr_cast(&CBaseGrenCatch::Spawn) }, @@ -2631,49 +2640,50 @@ FunctionHook g_FunctionHooks[] = #ifndef CareerTasks_Region //CCareerTask + //{ 0x01DDCBD0, "_ZN11CCareerTaskC2EPKc13GameEventTypeS1_ibbib", mfunc_ptr_cast(&CCareerTask::CCareerTask) }, //virtual func - //{ 0x01DDCBD0, "", mfunc_ptr_cast(&CCareerTask::CCareerTask) }, - //{ 0x0, "_ZN11CCareerTask7OnEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CCareerTask::OnEvent) }, - //{ 0x0, "_ZN11CCareerTask5ResetEv", mfunc_ptr_cast(&CCareerTask::Reset) }, - //{ 0x0, "_ZNK11CCareerTask26IsTaskCompletableThisRoundEv", mfunc_ptr_cast(&CCareerTask::IsTaskCompletableThisRound) }, + { 0x01DDD150, "_ZN11CCareerTask7OnEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CCareerTask::OnEvent_) }, + { 0x01DDCCD0, "_ZN11CCareerTask5ResetEv", mfunc_ptr_cast(&CCareerTask::Reset_) }, + { 0x01DDDDE0, "_ZNK11CCareerTask26IsTaskCompletableThisRoundEv", mfunc_ptr_cast(&CCareerTask::IsTaskCompletableThisRound_) }, //non-virtual func //{ 0x01DDCB80, "_ZN11CCareerTask7NewTaskEPKc13GameEventTypeS1_ibbib", mfunc_ptr_cast(&CCareerTask::NewTask) }, - //{ 0x0, "_ZN11CCareerTask12OnWeaponKillEiibbP11CBasePlayerS1_", mfunc_ptr_cast(&CCareerTask::OnWeaponKill) }, - //{ 0x0, "_ZN11CCareerTask14OnWeaponInjuryEiibP11CBasePlayer", mfunc_ptr_cast(&CCareerTask::OnWeaponInjury) }, + { 0x01DDCDB0, "_ZN11CCareerTask12OnWeaponKillEiibbP11CBasePlayerS1_", mfunc_ptr_cast(&CCareerTask::OnWeaponKill) }, + { 0x01DDD000, "_ZN11CCareerTask14OnWeaponInjuryEiibP11CBasePlayer", mfunc_ptr_cast(&CCareerTask::OnWeaponInjury) }, //{ 0x0, "_ZN11CCareerTask10IsCompleteEv", mfunc_ptr_cast(&CCareerTask::IsComplete) }, //{ 0x0, "_ZN11CCareerTask11GetTaskNameEv", mfunc_ptr_cast(&CCareerTask::GetTaskName) }, //{ 0x0, "_ZN11CCareerTask11GetWeaponIdEv", mfunc_ptr_cast(&CCareerTask::GetWeaponId) }, //{ 0x0, "_ZN11CCareerTask16GetWeaponClassIdEv", mfunc_ptr_cast(&CCareerTask::GetWeaponClassId) }, //{ 0x0, "_ZNK11CCareerTask10IsValidForEP11CBasePlayer ", mfunc_ptr_cast(&CCareerTask::IsValidFor) }, - //{ 0x0, "_ZN11CCareerTask23SendPartialNotificationEv", mfunc_ptr_cast(&CCareerTask::SendPartialNotification) }, + //{ 0x01DDCD50, "_ZN11CCareerTask23SendPartialNotificationEv", mfunc_ptr_cast(&CCareerTask::SendPartialNotification) }, // NOXREF //CCareerTaskManager + //{ 0x01DDD7C0, "_ZN18CCareerTaskManagerC2Ev", mfunc_ptr_cast(&CCareerTaskManager::CCareerTaskManager) }, //{ 0x01DDD750, "_ZN18CCareerTaskManager6CreateEv", mfunc_ptr_cast(&CCareerTaskManager::Create) }, - //{ 0x01DDD800, "_ZN18CCareerTaskManager5ResetEb", mfunc_ptr_cast(&CCareerTaskManager::Reset) }, - //{ 0x0, "_ZN18CCareerTaskManager7AddTaskEPKcS1_ibbb", mfunc_ptr_cast(&CCareerTaskManager::AddTask) }, - //{ 0x0, "_ZN18CCareerTaskManager11HandleEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CCareerTaskManager::HandleEvent) }, - //{ 0x0, "_ZN18CCareerTaskManager15HandleEnemyKillEbPKcbbP11CBasePlayerS3_", mfunc_ptr_cast(&CCareerTaskManager::HandleEnemyKill) }, - //{ 0x0, "_ZN18CCareerTaskManager16HandleWeaponKillEiibbP11CBasePlayerS1_", mfunc_ptr_cast(&CCareerTaskManager::HandleWeaponKill) }, - //{ 0x0, "_ZN18CCareerTaskManager11HandleDeathEiP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleDeath) }, - //{ 0x0, "_ZN18CCareerTaskManager18HandleWeaponInjuryEiibP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleWeaponInjury) }, - //{ 0x0, "_ZN18CCareerTaskManager17HandleEnemyInjuryEPKcbP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleEnemyInjury) }, - //{ 0x0, "_ZN18CCareerTaskManager19AreAllTasksCompleteEv", mfunc_ptr_cast(&CCareerTaskManager::AreAllTasksComplete) }, - //{ 0x0, "_ZN18CCareerTaskManager20GetNumRemainingTasksEv", mfunc_ptr_cast(&CCareerTaskManager::GetNumRemainingTasks) }, + { 0x01DDD800, "_ZN18CCareerTaskManager5ResetEb", mfunc_ptr_cast(&CCareerTaskManager::Reset) }, + { 0x01DDD8D0, "_ZN18CCareerTaskManager7AddTaskEPKcS1_ibbb", mfunc_ptr_cast(&CCareerTaskManager::AddTask) }, + { 0x01DDDA00, "_ZN18CCareerTaskManager11HandleEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CCareerTaskManager::HandleEvent) }, + { 0x01DDDAB0, "_ZN18CCareerTaskManager15HandleEnemyKillEbPKcbbP11CBasePlayerS3_", mfunc_ptr_cast(&CCareerTaskManager::HandleEnemyKill) }, + //{ 0x01DDDA60, "_ZN18CCareerTaskManager16HandleWeaponKillEiibbP11CBasePlayerS1_", mfunc_ptr_cast(&CCareerTaskManager::HandleWeaponKill) }, // NOXREF + { 0x01DDDC30, "_ZN18CCareerTaskManager11HandleDeathEiP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleDeath) }, + //{ 0x01DDDB80, "_ZN18CCareerTaskManager18HandleWeaponInjuryEiibP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleWeaponInjury) }, // NOXREF + { 0x01DDDBC0, "_ZN18CCareerTaskManager17HandleEnemyInjuryEPKcbP11CBasePlayer", mfunc_ptr_cast(&CCareerTaskManager::HandleEnemyInjury) }, + { 0x01DDDCD0, "_ZN18CCareerTaskManager19AreAllTasksCompleteEv", mfunc_ptr_cast(&CCareerTaskManager::AreAllTasksComplete) }, + { 0x01DDDD00, "_ZN18CCareerTaskManager20GetNumRemainingTasksEv", mfunc_ptr_cast(&CCareerTaskManager::GetNumRemainingTasks) }, { 0x01DDDD30, "_ZN18CCareerTaskManager19GetRoundElapsedTimeEv", mfunc_ptr_cast(&CCareerTaskManager::GetRoundElapsedTime) }, //{ 0x0, "_ZN18CCareerTaskManager11GetTaskTimeEv", mfunc_ptr_cast(&CCareerTaskManager::GetTaskTime) }, - //{ 0x0, "_ZN18CCareerTaskManager19SetFinishedTaskTimeEi", mfunc_ptr_cast(&CCareerTaskManager::SetFinishedTaskTime) }, + //{ 0x01DDD8B0, "_ZN18CCareerTaskManager19SetFinishedTaskTimeEi", mfunc_ptr_cast(&CCareerTaskManager::SetFinishedTaskTime) }, // NOXREF //{ 0x0, "_ZN18CCareerTaskManager19GetFinishedTaskTimeEv", mfunc_ptr_cast(&CCareerTaskManager::GetFinishedTaskTime) }, //{ 0x0, "_ZN18CCareerTaskManager20GetFinishedTaskRoundEv", mfunc_ptr_cast(&CCareerTaskManager::GetFinishedTaskRound) }, //{ 0x0, "_ZN18CCareerTaskManager8GetTasksEv", mfunc_ptr_cast(&CCareerTaskManager::GetTasks) }, - //{ 0x0, "_ZN18CCareerTaskManager20LatchRoundEndMessageEv", mfunc_ptr_cast(&CCareerTaskManager::LatchRoundEndMessage) }, - //{ 0x0, "_ZN18CCareerTaskManager22UnlatchRoundEndMessageEv", mfunc_ptr_cast(&CCareerTaskManager::UnlatchRoundEndMessage) }, + { 0x01DDDD40, "_ZN18CCareerTaskManager20LatchRoundEndMessageEv", mfunc_ptr_cast(&CCareerTaskManager::LatchRoundEndMessage) }, + { 0x01DDDD50, "_ZN18CCareerTaskManager22UnlatchRoundEndMessageEv", mfunc_ptr_cast(&CCareerTaskManager::UnlatchRoundEndMessage) }, //CPreventDefuseTask //virtual func - //{ 0x0, "", mfunc_ptr_cast(&CPreventDefuseTask::CPreventDefuseTask) },?? - //{ 0x0, "_ZN18CPreventDefuseTask7OnEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CPreventDefuseTask::OnEvent) }, - //{ 0x0, "_ZN18CPreventDefuseTask5ResetEv", mfunc_ptr_cast(&CPreventDefuseTask::Reset) }, - //{ 0x0, "_ZNK18CPreventDefuseTask26IsTaskCompletableThisRoundEv", mfunc_ptr_cast(&CPreventDefuseTask::IsTaskCompletableThisRound) }, + //{ 0x01DDCA60, "_ZN18CPreventDefuseTaskC2EPKc13GameEventTypeS1_ibbib", mfunc_ptr_cast(&CPreventDefuseTask::CPreventDefuseTask) }, + { 0x01DDCB30, "_ZN18CPreventDefuseTask7OnEventE13GameEventTypeP11CBasePlayerS2_", mfunc_ptr_cast(&CPreventDefuseTask::OnEvent_) }, + { 0x01DDCAB0, "_ZN18CPreventDefuseTask5ResetEv", mfunc_ptr_cast(&CPreventDefuseTask::Reset_) }, + { 0x01DDDDF0, "_ZNK18CPreventDefuseTask26IsTaskCompletableThisRoundEv", mfunc_ptr_cast(&CPreventDefuseTask::IsTaskCompletableThisRound_) }, //non-virtual func - //{ 0x0, "_ZN18CPreventDefuseTask7NewTaskEPKc13GameEventTypeS1_ibbib", mfunc_ptr_cast(&CPreventDefuseTask::NewTask) }, + //{ 0x01DDCA00, "_ZN18CPreventDefuseTask7NewTaskEPKc13GameEventTypeS1_ibbib", mfunc_ptr_cast(&CPreventDefuseTask::NewTask) }, #endif // CareerTasks_Region @@ -2871,7 +2881,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN4CUSP12UseDecrementEv", mfunc_ptr_cast(&CUSP::UseDecrement) }, //{ 0x0, "_ZN4CUSP8IsPistolEv", mfunc_ptr_cast(&CUSP::IsPistol) }, //non-virtual func - //@@{ 0x01D0F860, "weapon_usp", (size_t)&weapon_usp }, + { 0x01D0F860, "weapon_usp", (size_t)&weapon_usp }, //@{ 0x01D0FD50, "_ZN4CUSP7USPFireEffi", mfunc_ptr_cast(&CUSP::USPFire) }, // UNTESTED TODO: Reverse ME ////{ 0x0, "_ZN4CUSP8MakeBeamEv", mfunc_ptr_cast(&CUSP::MakeBeam) }, // NOXREF ////{ 0x0, "_ZN4CUSP10BeamUpdateEv", mfunc_ptr_cast(&CUSP::BeamUpdate) }, // NOXREF @@ -3358,49 +3368,47 @@ FunctionHook g_FunctionHooks[] = #ifndef GGrenade_Region //virtual func - //{ 0x0, "_ZN8CGrenade5SpawnEv", mfunc_ptr_cast(&CGrenade::Spawn_) }, - //{ 0x0, "_ZN8CGrenade4SaveER5CSave", mfunc_ptr_cast(&CGrenade::Save_) }, - //{ 0x0, "_ZN8CGrenade7RestoreER8CRestore", mfunc_ptr_cast(&CGrenade::Restore_) }, - //{ 0x0, "_ZN8CGrenade10ObjectCapsEv", mfunc_ptr_cast(&CGrenade::ObjectCaps_) }, - //{ 0x0, "_ZN8CGrenade6KilledEP9entvars_si", mfunc_ptr_cast(&CGrenade::Killed_) }, - //{ 0x0, "_ZN8CGrenade10BloodColorEv", mfunc_ptr_cast(&CGrenade::BloodColor_) }, - //{ 0x0, "_ZN8CGrenade3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGrenade::Use_) }, - //{ 0x0, "_ZN8CGrenade11BounceSoundEv", mfunc_ptr_cast(&CGrenade::BounceSound_) }, + { 0x01D831C0, "_ZN8CGrenade5SpawnEv", mfunc_ptr_cast(&CGrenade::Spawn_) }, + { 0x01D84820, "_ZN8CGrenade4SaveER5CSave", mfunc_ptr_cast(&CGrenade::Save_) }, + { 0x01D84850, "_ZN8CGrenade7RestoreER8CRestore", mfunc_ptr_cast(&CGrenade::Restore_) }, + { 0x01D594F0, "_ZN8CGrenade10ObjectCapsEv", mfunc_ptr_cast(&CGrenade::ObjectCaps_) }, + { 0x01D82320, "_ZN8CGrenade6KilledEP9entvars_si", mfunc_ptr_cast(&CGrenade::Killed_) }, + { 0x01D83560, "_ZN8CGrenade10BloodColorEv", mfunc_ptr_cast(&CGrenade::BloodColor_) }, + { 0x01D83720, "_ZN8CGrenade3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGrenade::Use_) }, + { 0x01D82E00, "_ZN8CGrenade11BounceSoundEv", mfunc_ptr_cast(&CGrenade::BounceSound_) }, //non-virtual func //{ 0x0, "", (size_t)&AnnounceFlashInterval }, // NOXREF - //{ 0x0, "_ZN8CGrenade7C4ThinkEv", mfunc_ptr_cast(&CGrenade::C4Think) }, - //{ 0x0, "_ZN8CGrenade17UseSatchelChargesEP9entvars_sNS_11SATCHELCODEE", mfunc_ptr_cast(&CGrenade::UseSatchelCharges) }, - //{ 0x0, "_ZN8CGrenade10ShootTimedEP9entvars_s6VectorS2_f", mfunc_ptr_cast(&CGrenade::ShootTimed) }, - //{ 0x0, "_ZN8CGrenade11ShootTimed2EP9entvars_s6VectorS2_fit", mfunc_ptr_cast(&CGrenade::ShootTimed2) }, - //{ 0x0, "_ZN8CGrenade12ShootContactEP9entvars_s6VectorS2_", mfunc_ptr_cast(&CGrenade::ShootContact) }, - //{ 0x0, "_ZN8CGrenade17ShootSmokeGrenadeEP9entvars_s6VectorS2_ft", mfunc_ptr_cast(&CGrenade::ShootSmokeGrenade) }, - //{ 0x0, "_ZN8CGrenade18ShootSatchelChargeEP9entvars_s6VectorS2_", mfunc_ptr_cast(&CGrenade::ShootSatchelCharge) }, - //{ 0x0, "_ZN8CGrenade17UseSatchelChargesEP9entvars_sNS_11SATCHELCODEE", mfunc_ptr_cast(&CGrenade::UseSatchelCharges) }, - //{ 0x0, "_ZN8CGrenade7ExplodeE6VectorS0_", mfunc_ptr_cast(&CGrenade::Explode) }, - //{ 0x0, "_ZN8CGrenade7ExplodeEP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode) }, - //{ 0x01D81010, "_ZN8CGrenade8Explode2EP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode2) }, - //{ 0x0, "_ZN8CGrenade8Explode3EP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode3) }, - //{ 0x0, "_ZN8CGrenade10SG_ExplodeEP11TraceResulti", mfunc_ptr_cast(&CGrenade::SG_Explode) }, - //{ 0x0, "_ZN8CGrenade5SmokeEv", mfunc_ptr_cast(&CGrenade::Smoke) }, - //{ 0x0, "_ZN8CGrenade6Smoke2Ev", mfunc_ptr_cast(&CGrenade::Smoke2) }, - //{ 0x0, "_ZN8CGrenade8Smoke3_AEv", mfunc_ptr_cast(&CGrenade::Smoke3_A) }, - //{ 0x0, "_ZN8CGrenade8Smoke3_BEv", mfunc_ptr_cast(&CGrenade::Smoke3_B) }, - //{ 0x0, "_ZN8CGrenade8Smoke3_CEv", mfunc_ptr_cast(&CGrenade::Smoke3_C) }, - //{ 0x0, "_ZN8CGrenade8SG_SmokeEv", mfunc_ptr_cast(&CGrenade::SG_Smoke) }, - //{ 0x0, "_ZN8CGrenade11BounceTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::BounceTouch) }, - //{ 0x0, "_ZN8CGrenade10SlideTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::SlideTouch) }, - //{ 0x0, "_ZN8CGrenade7C4TouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::C4Touch) }, - //{ 0x0, "_ZN8CGrenade12ExplodeTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::ExplodeTouch) }, - //{ 0x0, "_ZN8CGrenade16DangerSoundThinkEv", mfunc_ptr_cast(&CGrenade::DangerSoundThink) }, - //{ 0x0, "_ZN8CGrenade11PreDetonateEv", mfunc_ptr_cast(&CGrenade::PreDetonate) }, - //{ 0x0, "_ZN8CGrenade8DetonateEv", mfunc_ptr_cast(&CGrenade::Detonate) }, - //{ 0x0, "_ZN8CGrenade11SG_DetonateEv", mfunc_ptr_cast(&CGrenade::SG_Detonate) }, - //{ 0x0, "_ZN8CGrenade9Detonate2Ev", mfunc_ptr_cast(&CGrenade::Detonate2) }, - //{ 0x0, "_ZN8CGrenade9Detonate3Ev", mfunc_ptr_cast(&CGrenade::Detonate3) }, - //{ 0x0, "_ZN8CGrenade11DetonateUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGrenade::DetonateUse) }, - //{ 0x0, "_ZN8CGrenade11TumbleThinkEv", mfunc_ptr_cast(&CGrenade::TumbleThink) }, - //{ 0x0, "_ZN8CGrenade14SG_TumbleThinkEv", mfunc_ptr_cast(&CGrenade::SG_TumbleThink) }, - //{ 0x0, "_ZN8CGrenade7C4ThinkEv", mfunc_ptr_cast(&CGrenade::C4Think) }, + { 0x01D83570, "_ZN8CGrenade10ShootTimedEP9entvars_s6VectorS2_f", mfunc_ptr_cast(&CGrenade::ShootTimed) }, + { 0x01D833D0, "_ZN8CGrenade11ShootTimed2EP9entvars_s6VectorS2_fit", mfunc_ptr_cast(&CGrenade::ShootTimed2) }, + //{ 0x01D832C0, "_ZN8CGrenade12ShootContactEP9entvars_s6VectorS2_", mfunc_ptr_cast(&CGrenade::ShootContact) }, // NOXREF + { 0x01D83C90, "_ZN8CGrenade17ShootSmokeGrenadeEP9entvars_s6VectorS2_ft", mfunc_ptr_cast(&CGrenade::ShootSmokeGrenade) }, + { 0x01D839C0, "_ZN8CGrenade18ShootSatchelChargeEP9entvars_s6VectorS2_", mfunc_ptr_cast(&CGrenade::ShootSatchelCharge) }, + //{ 0x01D84760, "_ZN8CGrenade17UseSatchelChargesEP9entvars_sNS_11SATCHELCODEE", mfunc_ptr_cast(&CGrenade::UseSatchelCharges) }, // NOXREF + { 0x01D80D40, "_ZN8CGrenade7ExplodeE6VectorS0_", mfunc_ptr_cast(&CGrenade::Explode) }, + { 0x01D80DA0, "_ZN8CGrenade7ExplodeEP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode) }, + { 0x01D81010, "_ZN8CGrenade8Explode2EP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode2) }, + { 0x01D81620, "_ZN8CGrenade8Explode3EP11TraceResulti", mfunc_ptr_cast(&CGrenade::Explode3) }, + //{ 0x01D819B0, "_ZN8CGrenade10SG_ExplodeEP11TraceResulti", mfunc_ptr_cast(&CGrenade::SG_Explode) }, // NOXREF + { 0x01D82050, "_ZN8CGrenade5SmokeEv", mfunc_ptr_cast(&CGrenade::Smoke) }, + { 0x01D81F50, "_ZN8CGrenade6Smoke2Ev", mfunc_ptr_cast(&CGrenade::Smoke2) }, + { 0x01D81DF0, "_ZN8CGrenade8Smoke3_AEv", mfunc_ptr_cast(&CGrenade::Smoke3_A) }, + { 0x01D81C90, "_ZN8CGrenade8Smoke3_BEv", mfunc_ptr_cast(&CGrenade::Smoke3_B) }, + { 0x01D81B70, "_ZN8CGrenade8Smoke3_CEv", mfunc_ptr_cast(&CGrenade::Smoke3_C) }, + { 0x01D82150, "_ZN8CGrenade8SG_SmokeEv", mfunc_ptr_cast(&CGrenade::SG_Smoke) }, + { 0x01D82B10, "_ZN8CGrenade11BounceTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::BounceTouch) }, + { 0x01D82D80, "_ZN8CGrenade10SlideTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::SlideTouch) }, + { 0x01D83E60, "_ZN8CGrenade7C4ThinkEv", mfunc_ptr_cast(&CGrenade::C4Think) }, + { 0x01D84750, "_ZN8CGrenade7C4TouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::C4Touch) }, + { 0x01D82820, "_ZN8CGrenade12ExplodeTouchEP11CBaseEntity", mfunc_ptr_cast(&CGrenade::ExplodeTouch) }, + { 0x01D82A00, "_ZN8CGrenade16DangerSoundThinkEv", mfunc_ptr_cast(&CGrenade::DangerSoundThink) }, + { 0x01D823D0, "_ZN8CGrenade11PreDetonateEv", mfunc_ptr_cast(&CGrenade::PreDetonate) }, + { 0x01D82410, "_ZN8CGrenade8DetonateEv", mfunc_ptr_cast(&CGrenade::Detonate) }, + { 0x01D824A0, "_ZN8CGrenade11SG_DetonateEv", mfunc_ptr_cast(&CGrenade::SG_Detonate) }, + { 0x01D82700, "_ZN8CGrenade9Detonate2Ev", mfunc_ptr_cast(&CGrenade::Detonate2) }, + { 0x01D82790, "_ZN8CGrenade9Detonate3Ev", mfunc_ptr_cast(&CGrenade::Detonate3) }, + { 0x01D823B0, "_ZN8CGrenade11DetonateUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGrenade::DetonateUse) }, + { 0x01D82EE0, "_ZN8CGrenade11TumbleThinkEv", mfunc_ptr_cast(&CGrenade::TumbleThink) }, + { 0x01D83030, "_ZN8CGrenade14SG_TumbleThinkEv", mfunc_ptr_cast(&CGrenade::SG_TumbleThink) }, #endif // GGrenade_Region @@ -3417,7 +3425,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D5AA60, "_Z16GetSequenceFlagsPvP9entvars_s", (size_t)&GetSequenceFlags }, //{ 0x0, "_Z17GetAnimationEventPvP9entvars_sP14MonsterEvent_tffi", (size_t)&GetAnimationEvent }, //{ 0x01D5ABF0, "_Z13SetControllerPvP9entvars_sif", (size_t)&SetController }, - //{ 0x0, "_Z11SetBlendingPvP9entvars_sif", (size_t)&SetBlending }, + //{ 0x01D5AD60, "_Z11SetBlendingPvP9entvars_sif", (size_t)&SetBlending }, //{ 0x0, "_Z14FindTransitionPviiPi", (size_t)&FindTransition }, //{ 0x0, "_Z12SetBodygroupPvP9entvars_sii", (size_t)&SetBodygroup }, { 0x01D5B020, "_Z12GetBodygroupPvP9entvars_si", (size_t)&GetBodygroup }, @@ -3519,7 +3527,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D34540, "_ZN11CBotManager7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBotManager::OnEvent_) }, //non-virtual func ////{ 0x0, "", mfunc_ptr_cast(&CBotManager::CBotManager) }, - //{ 0x01D34510, "_ZNK11CBotManager17GetNavMapFilenameEv", mfunc_ptr_cast(&CBotManager::GetNavMapFilename) }, + { 0x01D34510, "_ZNK11CBotManager17GetNavMapFilenameEv", mfunc_ptr_cast(&CBotManager::GetNavMapFilename) }, { 0x01D34650, "_ZN11CBotManager10AddGrenadeEiP8CGrenade", mfunc_ptr_cast(&CBotManager::AddGrenade) }, { 0x01D346C0, "_ZN11CBotManager13RemoveGrenadeEP8CGrenade", mfunc_ptr_cast(&CBotManager::RemoveGrenade) }, //{ 0x01D346F0, "_ZN11CBotManager22ValidateActiveGrenadesEv", mfunc_ptr_cast(&CBotManager::ValidateActiveGrenades) }, // NOXREF @@ -3530,20 +3538,20 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z15NameToGameEventPKc", (size_t)&NameToGameEvent }, //CCSBotManager //virtual func - //{ 0x0, "_ZN13CCSBotManager16ClientDisconnectEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::ClientDisconnect) }, + { 0x01D23770, "_ZN13CCSBotManager16ClientDisconnectEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::ClientDisconnect_) }, //{ 0x0, "_ZN13CCSBotManager13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CCSBotManager::ClientCommand) }, - //{ 0x01D234D0, "_ZN13CCSBotManager14ServerActivateEv", mfunc_ptr_cast(&CCSBotManager::ServerActivate) }, - //{ 0x0, "_ZN13CCSBotManager16ServerDeactivateEv", mfunc_ptr_cast(&CCSBotManager::ServerDeactivate) }, - //{ 0x0, "_ZN13CCSBotManager13ServerCommandEPKc", mfunc_ptr_cast(&CCSBotManager::ServerCommand) }, - //{ 0x0, "_ZN13CCSBotManager16AddServerCommandEPKc", mfunc_ptr_cast(&CCSBotManager::AddServerCommand) }, - //{ 0x0, "_ZN13CCSBotManager17AddServerCommandsEv", mfunc_ptr_cast(&CCSBotManager::AddServerCommands) }, - //{ 0x0, "_ZN13CCSBotManager12RestartRoundEv", mfunc_ptr_cast(&CCSBotManager::RestartRound) }, - //{ 0x0, "_ZN13CCSBotManager10StartFrameEv", mfunc_ptr_cast(&CCSBotManager::StartFrame) }, + { 0x01D234D0, "_ZN13CCSBotManager14ServerActivateEv", mfunc_ptr_cast(&CCSBotManager::ServerActivate_) }, + { 0x01D23760, "_ZN13CCSBotManager16ServerDeactivateEv", mfunc_ptr_cast(&CCSBotManager::ServerDeactivate_) }, + //5@@{ 0x01D23900, "_ZN13CCSBotManager13ServerCommandEPKc", mfunc_ptr_cast(&CCSBotManager::ServerCommand_) }, + { 0x01D23520, "_ZN13CCSBotManager16AddServerCommandEPKc", mfunc_ptr_cast(&CCSBotManager::AddServerCommand_) }, + { 0x01D23540, "_ZN13CCSBotManager17AddServerCommandsEv", mfunc_ptr_cast(&CCSBotManager::AddServerCommands_) }, + { 0x01D22F40, "_ZN13CCSBotManager12RestartRoundEv", mfunc_ptr_cast(&CCSBotManager::RestartRound_) }, + //{ 0x01D23200, "_ZN13CCSBotManager10StartFrameEv", mfunc_ptr_cast(&CCSBotManager::StartFrame) }, { 0x01D25780, "_ZN13CCSBotManager7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSBotManager::OnEvent_) }, - //{ 0x0, "_ZNK13CCSBotManager17GetPlayerPriorityEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::GetPlayerPriority) }, + //{ 0x01D25970, "_ZNK13CCSBotManager17GetPlayerPriorityEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::GetPlayerPriority) }, //{ 0x0, "_ZNK13CCSBotManager17IsImportantPlayerEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::IsImportantPlayer) }, //non-virtual func - //{ 0x0, "_ZN13CCSBotManager15ValidateMapDataEv", mfunc_ptr_cast(&CCSBotManager::ValidateMapData) }, + { 0x01D24D90, "_ZN13CCSBotManager15ValidateMapDataEv", mfunc_ptr_cast(&CCSBotManager::ValidateMapData) }, //{ 0x0, "_ZNK13CCSBotManager13IsLearningMapEv", mfunc_ptr_cast(&CCSBotManager::IsLearningMap) }, //{ 0x0, "_ZN13CCSBotManager18SetLearningMapFlagEv", mfunc_ptr_cast(&CCSBotManager::SetLearningMapFlag) }, //{ 0x0, "_ZNK13CCSBotManager19IsAnalysisRequestedEv", mfunc_ptr_cast(&CCSBotManager::IsAnalysisRequested) }, @@ -3570,7 +3578,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK13CCSBotManager24GetRadioMessageTimestampE13GameEventTypei", mfunc_ptr_cast(&CCSBotManager::GetRadioMessageTimestamp) }, //{ 0x0, "_ZNK13CCSBotManager23GetRadioMessageIntervalE13GameEventTypei", mfunc_ptr_cast(&CCSBotManager::GetRadioMessageInterval) }, //{ 0x0, "_ZN13CCSBotManager24SetRadioMessageTimestampE13GameEventTypei", mfunc_ptr_cast(&CCSBotManager::SetRadioMessageTimestamp) }, - //{ 0x0, "_ZN13CCSBotManager27ResetRadioMessageTimestampsEv", mfunc_ptr_cast(&CCSBotManager::ResetRadioMessageTimestamps) }, + //{ 0x01D25AA0, "_ZN13CCSBotManager27ResetRadioMessageTimestampsEv", mfunc_ptr_cast(&CCSBotManager::ResetRadioMessageTimestamps) }, // NOXREF //{ 0x0, "_ZNK13CCSBotManager25GetLastSeenEnemyTimestampEv", mfunc_ptr_cast(&CCSBotManager::GetLastSeenEnemyTimestamp) }, //{ 0x0, "_ZN13CCSBotManager25SetLastSeenEnemyTimestampEv", mfunc_ptr_cast(&CCSBotManager::SetLastSeenEnemyTimestamp) }, //{ 0x0, "_ZNK13CCSBotManager17GetRoundStartTimeEv", mfunc_ptr_cast(&CCSBotManager::GetRoundStartTime) }, @@ -3592,21 +3600,23 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK13CCSBotManager11IsRoundOverEv", mfunc_ptr_cast(&CCSBotManager::IsRoundOver) }, //{ 0x0, "_ZNK13CCSBotManager11GetNavPlaceEv", mfunc_ptr_cast(&CCSBotManager::GetNavPlace) }, //{ 0x0, "_ZN13CCSBotManager11SetNavPlaceEj", mfunc_ptr_cast(&CCSBotManager::SetNavPlace) }, - //{ 0x0, "_ZN13CCSBotManager15MonitorBotCVarsEv", mfunc_ptr_cast(&CCSBotManager::MonitorBotCVars) }, - //{ 0x0, "_ZN13CCSBotManager16MaintainBotQuotaEv", mfunc_ptr_cast(&CCSBotManager::MaintainBotQuota) }, + //{ 0x01D24D10, "_ZN13CCSBotManager15MonitorBotCVarsEv", mfunc_ptr_cast(&CCSBotManager::MonitorBotCVars) }, + //{ 0x01D24AE0, "_ZN13CCSBotManager16MaintainBotQuotaEv", mfunc_ptr_cast(&CCSBotManager::MaintainBotQuota) }, //{ 0x0, "_ZN13CCSBotManager16GetRandomBotNameENS_9SkillTypeE", mfunc_ptr_cast(&CCSBotManager::GetRandomBotName) }, - //{ 0x0, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", mfunc_ptr_cast(&CCSBotManager::AddBot) }, - //{ 0x0, "_ZN13CCSBotManager13BotAddCommandE18BotProfileTeamTypeb", mfunc_ptr_cast(&CCSBotManager::BotAddCommand) }, + //{ 0x01D25270, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", mfunc_ptr_cast(&CCSBotManager::AddBot) }, + //{ 0x01D248B0, "_ZN13CCSBotManager13BotAddCommandE18BotProfileTeamTypeb", mfunc_ptr_cast(&CCSBotManager::BotAddCommand) }, + //{ 0x01D238A0, "_Z16PrintAllEntitiesv", (size_t)&PrintAllEntities }, // NOXREF + //{ 0x01D23020, "_Z12UTIL_DrawBoxP6Extentiiii", (size_t)&UTIL_DrawBox }, //CCSBot //{ 0x0, "_ZN6CCSBotC2Ev", mfunc_ptr_cast(&CCSBot::CCSBot) }, //virtual func //{ 0x0, "_ZN6CCSBot10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CCSBot::TakeDamage_) }, - //{ 0x0, "_ZN6CCSBot6KilledEP9entvars_si", mfunc_ptr_cast(&CCSBot::Killed_) }, + //{ 0x01D175A0, "_ZN6CCSBot6KilledEP9entvars_si", mfunc_ptr_cast(&CCSBot::Killed_) }, //{ 0x0, "_ZN6CCSBot12RoundRespawnEv", mfunc_ptr_cast(&CCSBot::RoundRespawn_) }, //{ 0x0, "_ZN6CCSBot5BlindEfffi", mfunc_ptr_cast(&CCSBot::Blind_) }, - //{ 0x0, "_ZN6CCSBot16OnTouchingWeaponEP10CWeaponBox", mfunc_ptr_cast(&CCSBot::OnTouchingWeapon_) }, - //{ 0x0, "_ZN6CCSBot10InitializeEPK10BotProfile", mfunc_ptr_cast(&CCSBot::Initialize_) }, + //{ 0x01D32370, "_ZN6CCSBot16OnTouchingWeaponEP10CWeaponBox", mfunc_ptr_cast(&CCSBot::OnTouchingWeapon_) }, + //{ 0x01D20A60, "_ZN6CCSBot10InitializeEPK10BotProfile", mfunc_ptr_cast(&CCSBot::Initialize_) }, //{ 0x0, "_ZN6CCSBot8SpawnBotEv", mfunc_ptr_cast(&CCSBot::SpawnBot_) }, { 0x01D2D370, "_ZN6CCSBot6UpkeepEv", mfunc_ptr_cast(&CCSBot::Upkeep_) }, //{ 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", mfunc_ptr_cast(&CCSBot::Update_) }, // using refs @@ -3617,7 +3627,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D2F5C0, "_ZNK6CCSBot9IsVisibleEP11CBasePlayerbPh", mfunc_ptr_cast(&CCSBot::IsVisible_) }, { 0x01D21390, "_ZNK6CCSBot18IsEnemyPartVisibleEN4CBot15VisiblePartTypeE", mfunc_ptr_cast(&CCSBot::IsEnemyPartVisible_) }, //non-virtual func - //{ 0x0, "_ZN6CCSBot10DisconnectEv", mfunc_ptr_cast(&CCSBot::Disconnect) }, + { 0x01D20EE0, "_ZN6CCSBot10DisconnectEv", mfunc_ptr_cast(&CCSBot::Disconnect) }, //{ 0x0, "_ZNK6CCSBot14GetCombatRangeEv", mfunc_ptr_cast(&CCSBot::GetCombatRange) }, //{ 0x0, "_ZNK6CCSBot7IsRogueEv", mfunc_ptr_cast(&CCSBot::IsRogue) }, //{ 0x0, "_ZN6CCSBot8SetRogueEb", mfunc_ptr_cast(&CCSBot::SetRogue) }, @@ -3629,7 +3639,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK6CCSBot20GetSafeTimeRemainingEv", mfunc_ptr_cast(&CCSBot::GetSafeTimeRemaining) }, //{ 0x0, "_ZNK6CCSBot11GetSafeTimeEv", mfunc_ptr_cast(&CCSBot::GetSafeTime) }, //{ 0x0, "_ZNK6CCSBot11IsUnhealthyEv", mfunc_ptr_cast(&CCSBot::IsUnhealthy) }, - //{ 0x0, "_ZN6CCSBot4IdleEv", mfunc_ptr_cast(&CCSBot::Idle) }, + //{ 0x01D2BE50, "_ZN6CCSBot4IdleEv", mfunc_ptr_cast(&CCSBot::Idle) }, //{ 0x0, "_ZN6CCSBot4HideEP8CNavAreaffb", mfunc_ptr_cast(&CCSBot::Hide) }, //{ 0x0, "_ZN6CCSBot4HideEPK6Vectorfb", mfunc_ptr_cast(&CCSBot::Hide) }, //{ 0x0, "_ZN6CCSBot9TryToHideEP8CNavAreaffbb", mfunc_ptr_cast(&CCSBot::TryToHide) }, @@ -3640,9 +3650,9 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK6CCSBot9IsHuntingEv", mfunc_ptr_cast(&CCSBot::IsHunting) }, //{ 0x01D2CB60, "_ZN6CCSBot6AttackEP11CBasePlayer", mfunc_ptr_cast(&CCSBot::Attack) }, //{ 0x0, "_ZN6CCSBot17FireWeaponAtEnemyEv", mfunc_ptr_cast(&CCSBot::FireWeaponAtEnemy) }, - //{ 0x0, "_ZN6CCSBot13StopAttackingEv", mfunc_ptr_cast(&CCSBot::StopAttacking) }, + //{ 0x01D2CD80, "_ZN6CCSBot13StopAttackingEv", mfunc_ptr_cast(&CCSBot::StopAttacking) }, { 0x01D2CE50, "_ZNK6CCSBot11IsAttackingEv", mfunc_ptr_cast(&CCSBot::IsAttacking) }, - //{ 0x0, "_ZN6CCSBot6MoveToEPK6Vector9RouteType", mfunc_ptr_cast(&CCSBot::MoveTo) }, + //{ 0x01D2CF40, "_ZN6CCSBot6MoveToEPK6Vector9RouteType", mfunc_ptr_cast(&CCSBot::MoveTo) }, //{ 0x0, "_ZNK6CCSBot10IsMovingToEv", mfunc_ptr_cast(&CCSBot::IsMovingTo) }, //{ 0x0, "_ZN6CCSBot9PlantBombEv", mfunc_ptr_cast(&CCSBot::PlantBomb) }, //{ 0x0, "_ZN6CCSBot9FetchBombEv", mfunc_ptr_cast(&CCSBot::FetchBomb) }, @@ -3687,7 +3697,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN6CCSBot13IgnoreEnemiesEf", mfunc_ptr_cast(&CCSBot::IgnoreEnemies) }, //{ 0x0, "_ZNK6CCSBot9GetMoraleEv", mfunc_ptr_cast(&CCSBot::GetMorale) }, //{ 0x0, "_ZN6CCSBot14IncreaseMoraleEv", mfunc_ptr_cast(&CCSBot::IncreaseMorale) }, - //{ 0x0, "_ZN6CCSBot14DecreaseMoraleEv", mfunc_ptr_cast(&CCSBot::DecreaseMorale) }, + { 0x01D184B0, "_ZN6CCSBot14DecreaseMoraleEv", mfunc_ptr_cast(&CCSBot::DecreaseMorale) }, //{ 0x0, "_ZNK6CCSBot12IsNoiseHeardEv", mfunc_ptr_cast(&CCSBot::IsNoiseHeard) }, //{ 0x0, "_ZN6CCSBot22ShouldInvestigateNoiseEPf", mfunc_ptr_cast(&CCSBot::ShouldInvestigateNoise) }, //{ 0x0, "_ZN6CCSBot16InvestigateNoiseEv", mfunc_ptr_cast(&CCSBot::InvestigateNoise) }, @@ -3809,7 +3819,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D17950, "_ZN6CCSBot13BotDeathThinkEv", mfunc_ptr_cast(&CCSBot::BotDeathThink) }, // PURE //{ 0x0, "_ZN6CCSBot16FindNearbyPlayerEv", mfunc_ptr_cast(&CCSBot::FindNearbyPlayer) }, { 0x01D186E0, "_ZN6CCSBot14AdjustSafeTimeEv", mfunc_ptr_cast(&CCSBot::AdjustSafeTime) }, - //{ 0x0, "_ZN6CCSBot8SetStateEP8BotState", mfunc_ptr_cast(&CCSBot::SetState) }, + //{ 0x01D2BD80, "_ZN6CCSBot8SetStateEP8BotState", mfunc_ptr_cast(&CCSBot::SetState) }, //{ 0x0, "_ZN6CCSBot19MoveTowardsPositionEPK6Vector", mfunc_ptr_cast(&CCSBot::MoveTowardsPosition) }, //{ 0x0, "_ZN6CCSBot20MoveAwayFromPositionEPK6Vector", mfunc_ptr_cast(&CCSBot::MoveAwayFromPosition) }, //{ 0x0, "_ZN6CCSBot22StrafeAwayFromPositionEPK6Vector", mfunc_ptr_cast(&CCSBot::StrafeAwayFromPosition) }, @@ -3841,7 +3851,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D302D0, "_ZN6CCSBot23FindMostDangerousThreatEv", mfunc_ptr_cast(&CCSBot::FindMostDangerousThreat) }, //{ 0x0, "_ZN6CCSBot22RespondToRadioCommandsEv", mfunc_ptr_cast(&CCSBot::RespondToRadioCommands) }, //{ 0x0, "_ZNK6CCSBot14IsRadioCommandE13GameEventType", mfunc_ptr_cast(&CCSBot::IsRadioCommand) }, - //{ 0x01D2BA00, "_ZN6CCSBot16EndVoiceFeedbackEb", mfunc_ptr_cast(&CCSBot::EndVoiceFeedback) }, + { 0x01D2BA00, "_ZN6CCSBot16EndVoiceFeedbackEb", mfunc_ptr_cast(&CCSBot::EndVoiceFeedback) }, //{ 0x0, "_ZN6CCSBot7AddNodeEPK6VectorS2_10NavDirTypeP8CNavNode", mfunc_ptr_cast(&CCSBot::AddNode) }, //{ 0x0, "_ZN6CCSBot17StartLearnProcessEv", mfunc_ptr_cast(&CCSBot::StartLearnProcess) }, //{ 0x01D21EF0, "_ZN6CCSBot18UpdateLearnProcessEv", mfunc_ptr_cast(&CCSBot::UpdateLearnProcess) }, @@ -3854,7 +3864,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN6CCSBot15AnalyzeBetaStepEv", mfunc_ptr_cast(&CCSBot::AnalyzeBetaStep) }, //{ 0x0, "_ZN6CCSBot16StartSaveProcessEv", mfunc_ptr_cast(&CCSBot::StartSaveProcess) }, //{ 0x01D22340, "_ZN6CCSBot17UpdateSaveProcessEv", mfunc_ptr_cast(&CCSBot::UpdateSaveProcess) }, - //{ 0x0, "_ZN6CCSBot18StartNormalProcessEv", mfunc_ptr_cast(&CCSBot::StartNormalProcess) }, + { 0x01D22450, "_ZN6CCSBot18StartNormalProcessEv", mfunc_ptr_cast(&CCSBot::StartNormalProcess) }, //{ 0x0, "_ZN6CCSBot8BotTouchEP11CBaseEntity", mfunc_ptr_cast(&CCSBot::BotTouch) }, //CSGameState //{ 0x0, "", mfunc_ptr_cast(&CSGameState::CSGameState) }, @@ -4039,7 +4049,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN4CBot5IsBotEv", mfunc_ptr_cast(&CBot::IsBot) }, //{ 0x0, "_ZN4CBot16GetAutoaimVectorEf", mfunc_ptr_cast(&CBot::GetAutoaimVector_) }, //{ 0x0, "_ZN4CBot16OnTouchingWeaponEP10CWeaponBox", mfunc_ptr_cast(&CBot::OnTouchingWeapon) }, - //{ 0x0, "_ZN4CBot10InitializeEPK10BotProfile", mfunc_ptr_cast(&CBot::Initialize_) }, + { 0x01D33540, "_ZN4CBot10InitializeEPK10BotProfile", mfunc_ptr_cast(&CBot::Initialize_) }, //{ 0x0, "_ZN4CBot8SpawnBotEv", mfunc_ptr_cast(&CBot::SpawnBot) }, //{ 0x0, "_ZN4CBot6UpkeepEv", mfunc_ptr_cast(&CBot::Upkeep) }, //{ 0x0, "_ZN4CBot6UpdateEv", mfunc_ptr_cast(&CBot::Update) }, @@ -4122,10 +4132,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "", mfunc_ptr_cast(&BotSpeakable::BotSpeakable) }, // NOXREF //{ 0x0, "", mfunc_ptr_cast(&BotSpeakable::~BotSpeakable) }, // NOXREF //BotPhrase - //{ 0x0, "", mfunc_ptr_cast(&BotPhrase::BotPhrase) }, - //{ 0x0, "", mfunc_ptr_cast(&BotPhrase::~BotPhrase) }, + //{ 0x01D196B0, "", mfunc_ptr_cast(&BotPhrase::BotPhrase) }, // NOXREF + //{ 0x01D198E0, "", mfunc_ptr_cast(&BotPhrase::~BotPhrase) }, // NOXREF //{ 0x0, "_ZN9BotPhrase13InitVoiceBankEi", mfunc_ptr_cast(&BotPhrase::InitVoiceBank) }, - //{ 0x0, "_ZNK9BotPhrase12GetSpeakableEiPf", mfunc_ptr_cast(&BotPhrase::GetSpeakable) }, + //3@@{ 0x01D19BB0, "_ZNK9BotPhrase12GetSpeakableEiPf", mfunc_ptr_cast(&BotPhrase::GetSpeakable) }, //{ 0x0, "_ZNK9BotPhrase13ClearCriteriaEv", mfunc_ptr_cast(&BotPhrase::ClearCriteria) }, //{ 0x0, "_ZNK9BotPhrase16SetPlaceCriteriaEj", mfunc_ptr_cast(&BotPhrase::SetPlaceCriteria) }, //{ 0x0, "_ZNK9BotPhrase16SetCountCriteriaEj", mfunc_ptr_cast(&BotPhrase::SetCountCriteria) }, @@ -4134,12 +4144,12 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK9BotPhrase18GetRadioEquivalentEv", mfunc_ptr_cast(&BotPhrase::GetRadioEquivalent) }, //{ 0x0, "_ZNK9BotPhrase11IsImportantEv", mfunc_ptr_cast(&BotPhrase::IsImportant) }, //{ 0x0, "_ZNK9BotPhrase7IsPlaceEv", mfunc_ptr_cast(&BotPhrase::IsPlace) }, - //{ 0x0, "_ZN9BotPhrase9RandomizeEv", mfunc_ptr_cast(&BotPhrase::Randomize) }, + //{ 0x01D19C70, "_ZN9BotPhrase9RandomizeEv", mfunc_ptr_cast(&BotPhrase::Randomize) }, // NOXREF //BotPhraseManager //{ 0x01D19D20, "", mfunc_ptr_cast(&BotPhraseManager::BotPhraseManager) }, //{ 0x0, "", mfunc_ptr_cast(&BotPhraseManager::~BotPhraseManager) }, //{ 0x01D19ED0, "_ZN16BotPhraseManager10InitializeEPKci", mfunc_ptr_cast(&BotPhraseManager::Initialize) }, - //{ 0x0, "_ZN16BotPhraseManager14OnRoundRestartEv", mfunc_ptr_cast(&BotPhraseManager::OnRoundRestart) }, + { 0x01D19DA0, "_ZN16BotPhraseManager14OnRoundRestartEv", mfunc_ptr_cast(&BotPhraseManager::OnRoundRestart) }, //{ 0x0, "_ZN16BotPhraseManager11OnMapChangeEv", mfunc_ptr_cast(&BotPhraseManager::OnMapChange) }, //{ 0x01D1A830, "_ZNK16BotPhraseManager8NameToIDEPKc", mfunc_ptr_cast(&BotPhraseManager::NameToID) }, //{ 0x01D1A8A0, "_ZNK16BotPhraseManager8IDToNameEj", mfunc_ptr_cast(&BotPhraseManager::IDToName) }, @@ -4186,7 +4196,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN19BotChatterInterface5ResetEv", mfunc_ptr_cast(&BotChatterInterface::Reset) }, //{ 0x01D1B8E0, "_ZN19BotChatterInterface6UpdateEv", mfunc_ptr_cast(&BotChatterInterface::Update) }, //{ 0x0, "_ZN19BotChatterInterface7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&BotChatterInterface::OnEvent) }, - //{ 0x0, "_ZN19BotChatterInterface7OnDeathEv", mfunc_ptr_cast(&BotChatterInterface::OnDeath) }, + //{ 0x01D1B7E0, "_ZN19BotChatterInterface7OnDeathEv", mfunc_ptr_cast(&BotChatterInterface::OnDeath) }, //{ 0x0, "_ZNK19BotChatterInterface12GetVerbosityEv", mfunc_ptr_cast(&BotChatterInterface::VerbosityType GetVerbosity) }, //{ 0x0, "_ZNK19BotChatterInterface8GetOwnerEv", mfunc_ptr_cast(&BotChatterInterface::GetOwner) }, //{ 0x0, "_ZNK19BotChatterInterface9IsTalkingEv", mfunc_ptr_cast(&BotChatterInterface::IsTalking) }, @@ -4240,8 +4250,8 @@ FunctionHook g_FunctionHooks[] = #ifndef CS_Util_Region - //{ 0x0, "_Z16UTIL_IsNameTakenPKcb", (size_t)&UTIL_IsNameTaken }, - //{ 0x0, "_Z18UTIL_ClientsInGamev", (size_t)&UTIL_ClientsInGame }, + { 0x01D36490, "_Z16UTIL_IsNameTakenPKcb", (size_t)&UTIL_IsNameTaken }, + { 0x01D365E0, "_Z18UTIL_ClientsInGamev", (size_t)&UTIL_ClientsInGame }, //{ 0x0, "_Z24UTIL_ActivePlayersInGamev", (size_t)&UTIL_ActivePlayersInGame }, //{ 0x0, "_Z17UTIL_HumansInGameb", (size_t)&UTIL_HumansInGame }, //{ 0x0, "_Z17UTIL_HumansOnTeamib", (size_t)&UTIL_HumansOnTeam }, @@ -4250,8 +4260,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z18UTIL_IsTeamAllBotsi", (size_t)&UTIL_IsTeamAllBots }, //{ 0x0, "_Z21UTIL_GetClosestPlayerPK6VectorPf", mfunc_ptr_cast(&UTIL_GetClosestPlayer) }, //{ 0x0, "_Z21UTIL_GetClosestPlayerPK6VectoriPf", mfunc_ptr_cast(&UTIL_GetClosestPlayer) }, - //{ 0x0, "_Z17UTIL_GetBotPrefixv", (size_t)&UTIL_GetBotPrefix }, - //{ 0x0, "_Z24UTIL_ConstructBotNetNamePciPK10BotProfile", (size_t)&UTIL_ConstructBotNetName }, + //{ 0x01D36F90, "_Z17UTIL_GetBotPrefixv", (size_t)&UTIL_GetBotPrefix }, // NOXREF + { 0x01D36FA0, "_Z24UTIL_ConstructBotNetNamePciPK10BotProfile", (size_t)&UTIL_ConstructBotNetName }, //{ 0x0, "_Z20UTIL_IsVisibleToTeamRK6Vectorif", (size_t)&UTIL_IsVisibleToTeam }, { 0x01D37190, "_Z19UTIL_GetLocalPlayerv", (size_t)&UTIL_GetLocalPlayer }, //{ 0x0, "_Z18UTIL_ComputeOriginP9entvars_s", mfunc_ptr_cast(&UTIL_ComputeOrigin) }, @@ -4268,14 +4278,14 @@ FunctionHook g_FunctionHooks[] = { 0x01D37700, "_Z6BotSINf", (size_t)&BotSIN }, //{ 0x01D37770, "_Z18IsGameEventAudible13GameEventTypeP11CBaseEntityS1_PfP12PriorityTypePb", (size_t)&IsGameEventAudible }, - //{ 0x01D37A00, "_Z23HintMessageToAllPlayersPKc", (size_t)&HintMessageToAllPlayers }, + { 0x01D37A00, "_Z23HintMessageToAllPlayersPKc", (size_t)&HintMessageToAllPlayers }, #endif // CS_Util_Region #ifndef CS_Init_Region //{ 0x01D206A0, "_Z17InstallBotControlv", (size_t)&InstallBotControl }, - //{ 0x0, "_Z17Bot_ServerCommandv", (size_t)&Bot_ServerCommand }, + { 0x01D20730, "_Z17Bot_ServerCommandv", (size_t)&Bot_ServerCommand }, { 0x01D20760, "_Z17Bot_RegisterCvarsv", (size_t)&Bot_RegisterCvars }, #endif // CS_Init_Region @@ -4599,7 +4609,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN17BotProfileManager5ResetEv", mfunc_ptr_cast(&BotProfileManager::Reset) }, //{ 0x0, "_ZNK17BotProfileManager10GetProfileEPKc18BotProfileTeamType", mfunc_ptr_cast(&BotProfileManager::GetProfile) }, // NOXREF //{ 0x0, "_ZNK17BotProfileManager14GetProfileListEv", mfunc_ptr_cast(&BotProfileManager::GetProfileList) }, // NOXREF - //{ 0x0, "_ZNK17BotProfileManager16GetRandomProfileE17BotDifficultyType18BotProfileTeamType", mfunc_ptr_cast(&BotProfileManager::GetRandomProfile) }, + { 0x01D36070, "_ZNK17BotProfileManager16GetRandomProfileE17BotDifficultyType18BotProfileTeamType", mfunc_ptr_cast(&BotProfileManager::GetRandomProfile) }, //{ 0x0, "_ZN17BotProfileManager13GetCustomSkinEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkin) }, { 0x01D35DD0, "_ZN17BotProfileManager22GetCustomSkinModelnameEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkinModelname) }, { 0x01D35DB0, "_ZN17BotProfileManager18GetCustomSkinFnameEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkinFname) }, @@ -4644,7 +4654,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z17SaveNavigationMapPKc", (size_t)&SaveNavigationMap }, //{ 0x0, "_Z16LoadLocationFilePKc", (size_t)&LoadLocationFile }, //{ 0x0, "_Z24SanityCheckNavigationMapPKc", (size_t)&SanityCheckNavigationMap }, - //{ 0x0, "_Z17LoadNavigationMapv", (size_t)&LoadNavigationMap }, + //{ 0x01D46310, "_Z17LoadNavigationMapv", (size_t)&LoadNavigationMap }, //IImprovEvent //virtual func //{ 0x0, "_ZN12IImprovEvent15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&IImprovEvent::OnMoveToSuccess) }, @@ -4768,7 +4778,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK10HidingSpot4SaveEij", mfunc_ptr_cast(&HidingSpot::Save) }, //{ 0x0, "_ZN10HidingSpot4LoadEP9SteamFilej", mfunc_ptr_cast(&HidingSpot::Load) }, //CNavArea - //{ 0x0, "_ZN8CNavArea4SaveEij", mfunc_ptr_cast(&CNavArea::Save) }, + //{ 0x01D44F80, "_ZN8CNavArea4SaveEij", mfunc_ptr_cast(&CNavArea::Save) }, //{ 0x0, "_ZNK8CNavArea4SaveEP8_IO_FILE", mfunc_ptr_cast(&CNavArea::Save) }, //{ 0x0, "", mfunc_ptr_cast(&CNavArea::CNavArea) }, //{ 0x0, "", mfunc_ptr_cast(&CNavArea::CNavArea) }, @@ -4828,10 +4838,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN25CollectHidingSpotsFunctor10RemoveSpotEi", mfunc_ptr_cast(&CollectHidingSpotsFunctor::RemoveSpot) }, //{ 0x0, "", mfunc_ptr_cast(&CNavAreaGrid::CNavAreaGrid) }, //{ 0x0, "", mfunc_ptr_cast(&CNavAreaGrid::~CNavAreaGrid) }, - //{ 0x0, "_ZN12CNavAreaGrid5ResetEv", mfunc_ptr_cast(&CNavAreaGrid::Reset) }, + //{ 0x01D43180, "_ZN12CNavAreaGrid5ResetEv", mfunc_ptr_cast(&CNavAreaGrid::Reset) }, // NOXREF //{ 0x0, "_ZN12CNavAreaGrid10InitializeEffff", mfunc_ptr_cast(&CNavAreaGrid::Initialize) }, //{ 0x0, "_ZN12CNavAreaGrid10AddNavAreaEP8CNavArea", mfunc_ptr_cast(&CNavAreaGrid::AddNavArea) }, - //{ 0x01D43560, "_ZN12CNavAreaGrid13RemoveNavAreaEP8CNavArea", mfunc_ptr_cast(&CNavAreaGrid__RemoveNavArea) }, + //{ 0x01D43560, "_ZN12CNavAreaGrid13RemoveNavAreaEP8CNavArea", mfunc_ptr_cast(&CNavAreaGrid::RemoveNavArea) }, //!@{ 0x01D43710, "_ZNK12CNavAreaGrid10GetNavAreaEPK6Vectorf", mfunc_ptr_cast(&CNavAreaGrid::GetNavArea) }, // Used refs //!@{ 0x01D43860, "_ZNK12CNavAreaGrid17GetNearestNavAreaEPK6Vectorb", mfunc_ptr_cast(&CNavAreaGrid::GetNearestNavArea) }, // Used refs //{ 0x0, "_ZNK12CNavAreaGrid14GetNavAreaByIDEj", mfunc_ptr_cast(&CNavAreaGrid::GetNavAreaByID) }, @@ -4840,27 +4850,27 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z18ClassifySniperSpotP10HidingSpot", (size_t)&ClassifySniperSpot }, //{ 0x0, "", (size_t)&buildGoodSizedList }, // NOXREF { 0x01D37CF0, "_Z18DestroyHidingSpotsv", (size_t)&DestroyHidingSpots }, - //{ 0x0, "_Z12EditNavAreas14NavEditCmdType", (size_t)&EditNavAreas }, + //{ 0x01D40920, "_Z12EditNavAreas14NavEditCmdType", (size_t)&EditNavAreas }, { 0x01D42540, "_Z15GetGroundHeightPK6VectorPfPS_", (size_t)&GetGroundHeight }, //{ 0x0, "_Z21GetSimpleGroundHeightPK6VectorPfPS_", (size_t)&GetSimpleGroundHeight }, //{ 0x0, "", (size_t)&IsAreaVisible }, // NOXREF - //{ 0x0, "_Z13GetMarkedAreav", (size_t)&GetMarkedArea }, - //{ 0x0, "_Z17EditNavAreasResetv", (size_t)&EditNavAreasReset }, + //{ 0x01D40250, "_Z13GetMarkedAreav", (size_t)&GetMarkedArea }, + //{ 0x01D40260, "_Z17EditNavAreasResetv", (size_t)&EditNavAreasReset }, // NOXREF //{ 0x0, "_Z15DrawHidingSpotsPK8CNavArea", (size_t)&DrawHidingSpots }, - //{ 0x0, "_Z20IncreaseDangerNearbyifP8CNavAreaPK6Vectorf", (size_t)&IncreaseDangerNearby }, - //{ 0x0, "_Z10DrawDangerv", (size_t)&DrawDanger }, + //{ 0x01D3EE10, "_Z20IncreaseDangerNearbyifP8CNavAreaPK6Vectorf", (size_t)&IncreaseDangerNearby }, + //{ 0x01D3F020, "_Z10DrawDangerv", (size_t)&DrawDanger }, //{ 0x0, "_Z14IsSpotOccupiedP11CBaseEntityPK6Vector", (size_t)&IsSpotOccupied }, //{ 0x0, "_Z20FindNearbyHidingSpotP11CBaseEntityPK6VectorP8CNavAreafbb", (size_t)&FindNearbyHidingSpot }, //{ 0x01D187B0, "_Z21FindNearbyRetreatSpotP11CBaseEntityPK6VectorP8CNavAreafib", mfunc_ptr_cast(&FindNearbyRetreatSpot) }, //{ 0x0, "_Z20IsCrossingLineOfFireRK6VectorS1_P11CBaseEntityi", (size_t)&IsCrossingLineOfFire }, //{ 0x0, "_Z20FindRandomHidingSpotP11CBaseEntityjb", (size_t)&FindRandomHidingSpot }, - //{ 0x0, "_Z17GetHidingSpotByIDj", (size_t)&GetHidingSpotByID }, - //{ 0x0, "_Z24SanityCheckNavigationMapPKc", (size_t)&SanityCheckNavigationMap }, + //{ 0x01D37FB0, "_Z17GetHidingSpotByIDj", (size_t)&GetHidingSpotByID }, + //{ 0x01D46170, "_Z24SanityCheckNavigationMapPKc", (size_t)&SanityCheckNavigationMap }, //{ 0x0, "_Z17LoadNavigationMapv", (size_t)&LoadNavigationMap }, { 0x01D39F30, "_Z24ApproachAreaAnalysisPrepv", (size_t)&ApproachAreaAnalysisPrep }, { 0x01D39FD0, "_Z31CleanupApproachAreaAnalysisPrepv", (size_t)&CleanupApproachAreaAnalysisPrep }, - //{ 0x0, "_Z14DestroyLaddersv", (size_t)&DestroyLadders }, - //{ 0x01D3A060, "_Z20DestroyNavigationMapv", (size_t)&DestroyNavigationMap }, + //{ 0x01D3A010, "_Z14DestroyLaddersv", (size_t)&DestroyLadders }, // NOXREF + { 0x01D3A060, "_Z20DestroyNavigationMapv", (size_t)&DestroyNavigationMap }, //!@{ 0x01D3A210, "_Z20StripNavigationAreasv", (size_t)&StripNavigationAreas }, //{ 0x0, "", (size_t)&FindFirstAreaInDirection }, // NOXREF //{ 0x0, "", (size_t)&testJumpDown }, // NOXREF @@ -4887,7 +4897,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CHostageImprov15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&CHostageImprov::OnMoveToSuccess) }, //{ 0x0, "_ZN14CHostageImprov15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&CHostageImprov::OnMoveToFailure) }, //{ 0x0, "_ZN14CHostageImprov8OnInjuryEf", mfunc_ptr_cast(&CHostageImprov::OnInjury) }, - //{ 0x0, "_ZNK14CHostageImprov7IsAliveEv", mfunc_ptr_cast(&CHostageImprov::IsAlive) }, + //{ 0x01D51040, "_ZNK14CHostageImprov7IsAliveEv", mfunc_ptr_cast(&CHostageImprov::IsAlive) }, //{ 0x0, "_ZN14CHostageImprov6MoveToERK6Vector", mfunc_ptr_cast(&CHostageImprov::MoveTo) }, //{ 0x0, "_ZN14CHostageImprov6LookAtERK6Vector", mfunc_ptr_cast(&CHostageImprov::LookAt) }, //{ 0x0, "_ZN14CHostageImprov11ClearLookAtEv", mfunc_ptr_cast(&CHostageImprov::ClearLookAt) }, @@ -4904,20 +4914,20 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CHostageImprov10StrafeLeftEv", mfunc_ptr_cast(&CHostageImprov::StrafeLeft) }, //{ 0x0, "_ZN14CHostageImprov11StrafeRightEv", mfunc_ptr_cast(&CHostageImprov::StrafeRight) }, //{ 0x0, "_ZN14CHostageImprov4JumpEv", mfunc_ptr_cast(&CHostageImprov::Jump) }, - //{ 0x0, "_ZN14CHostageImprov6CrouchEv", mfunc_ptr_cast(&CHostageImprov::Crouch) }, - //{ 0x0, "_ZN14CHostageImprov7StandUpEv", mfunc_ptr_cast(&CHostageImprov::StandUp) }, + //{ 0x01D56710, "_ZN14CHostageImprov6CrouchEv", mfunc_ptr_cast(&CHostageImprov::Crouch) }, + //{ 0x01D567A0, "_ZN14CHostageImprov7StandUpEv", mfunc_ptr_cast(&CHostageImprov::StandUp) }, //{ 0x0, "_ZN14CHostageImprov9TrackPathERK6Vectorf", mfunc_ptr_cast(&CHostageImprov::TrackPath) }, //{ 0x0, "_ZN14CHostageImprov11StartLadderEPK10CNavLadder15NavTraverseTypePK6VectorS6_", mfunc_ptr_cast(&CHostageImprov::StartLadder) }, //{ 0x0, "_ZN14CHostageImprov14TraverseLadderEPK10CNavLadder15NavTraverseTypePK6VectorS6_f", mfunc_ptr_cast(&CHostageImprov::TraverseLadder) }, - //{ 0x0, "_ZN14CHostageImprov30GetSimpleGroundHeightWithFloorEPK6VectorPfPS0_", mfunc_ptr_cast(&CHostageImprov::GetSimpleGroundHeightWithFloor) }, + //{ 0x01D51150, "_ZN14CHostageImprov30GetSimpleGroundHeightWithFloorEPK6VectorPfPS0_", mfunc_ptr_cast(&CHostageImprov::GetSimpleGroundHeightWithFloor) }, //{ 0x0, "_ZN14CHostageImprov3RunEv", mfunc_ptr_cast(&CHostageImprov::Run) }, //{ 0x0, "_ZN14CHostageImprov4WalkEv", mfunc_ptr_cast(&CHostageImprov::Walk) }, //{ 0x0, "_ZN14CHostageImprov4StopEv", mfunc_ptr_cast(&CHostageImprov::Stop) }, //{ 0x0, "_ZNK14CHostageImprov12GetMoveAngleEv", mfunc_ptr_cast(&CHostageImprov::GetMoveAngle) }, //{ 0x0, "_ZNK14CHostageImprov12GetFaceAngleEv", mfunc_ptr_cast(&CHostageImprov::GetFaceAngle) }, - //{ 0x0, "_ZNK14CHostageImprov7GetFeetEv", mfunc_ptr_cast(&CHostageImprov::Vector &GetFeet) }, - //{ 0x0, "_ZNK14CHostageImprov11GetCentroidEv", mfunc_ptr_cast(&CHostageImprov::Vector &GetCentroid) }, - //{ 0x0, "_ZNK14CHostageImprov7GetEyesEv", mfunc_ptr_cast(&CHostageImprov::Vector &GetEyes) }, + //{ 0x0, "_ZNK14CHostageImprov7GetFeetEv", mfunc_ptr_cast(&CHostageImprov::GetFeet) }, + //{ 0x0, "_ZNK14CHostageImprov11GetCentroidEv", mfunc_ptr_cast(&CHostageImprov::&GetCentroid) }, + //{ 0x01D52430, "_ZNK14CHostageImprov7GetEyesEv", mfunc_ptr_cast(&CHostageImprov::GetEyes) }, //{ 0x0, "_ZNK14CHostageImprov9IsRunningEv", mfunc_ptr_cast(&CHostageImprov::IsRunning) }, //{ 0x0, "_ZNK14CHostageImprov9IsWalkingEv", mfunc_ptr_cast(&CHostageImprov::IsWalking) }, //{ 0x01D56CC0, "_ZNK14CHostageImprov9IsStoppedEv", mfunc_ptr_cast(&CHostageImprov::IsStopped) }, @@ -4942,7 +4952,7 @@ FunctionHook g_FunctionHooks[] = //non-virtual func //{ 0x0, "_ZN14CHostageImprov12FaceOutwardsEv", mfunc_ptr_cast(&CHostageImprov::FaceOutwards) }, //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayEv", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay) }, - //{ 0x0, "_ZN14CHostageImprov20SetKnownGoodPositionERK6Vector", mfunc_ptr_cast(&CHostageImprov::SetKnownGoodPosition) }, + //{ 0x01D52EE0, "_ZN14CHostageImprov20SetKnownGoodPositionERK6Vector", mfunc_ptr_cast(&CHostageImprov::SetKnownGoodPosition) }, // NOXREF //{ 0x0, "_ZNK14CHostageImprov20GetKnownGoodPositionEv", mfunc_ptr_cast(&CHostageImprov::GetKnownGoodPosition) }, //{ 0x0, "_ZN14CHostageImprov24ResetToKnownGoodPositionEv", mfunc_ptr_cast(&CHostageImprov::ResetToKnownGoodPosition) }, //{ 0x0, "_ZN14CHostageImprov9ResetJumpEv", mfunc_ptr_cast(&CHostageImprov::ResetJump) }, @@ -4965,9 +4975,9 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK14CHostageImprov15GetFollowLeaderEv", mfunc_ptr_cast(&CHostageImprov::GetFollowLeader) }, //{ 0x0, "_ZN14CHostageImprov23GetClosestVisiblePlayerEi", mfunc_ptr_cast(&CHostageImprov::GetClosestVisiblePlayer) }, //{ 0x0, "_ZN14CHostageImprov25GetTimeSinceLastSawPlayerEi", mfunc_ptr_cast(&CHostageImprov::GetTimeSinceLastSawPlayer) }, - //{ 0x0, "_ZN14CHostageImprov22GetTimeSinceLastInjuryEv", mfunc_ptr_cast(&CHostageImprov::GetTimeSinceLastInjury) }, - //{ 0x0, "_ZN14CHostageImprov21GetTimeSinceLastNoiseEv", mfunc_ptr_cast(&CHostageImprov::GetTimeSinceLastNoise) }, - //{ 0x0, "_ZN14CHostageImprov17IsTerroristNearbyEv", mfunc_ptr_cast(&CHostageImprov::IsTerroristNearby) }, + //{ 0x01D55B90, "_ZN14CHostageImprov22GetTimeSinceLastInjuryEv", mfunc_ptr_cast(&CHostageImprov::GetTimeSinceLastInjury) }, // NOXREF + //{ 0x01D55BC0, "_ZN14CHostageImprov21GetTimeSinceLastNoiseEv", mfunc_ptr_cast(&CHostageImprov::GetTimeSinceLastNoise) }, // NOXREF + //{ 0x01D540C0, "_ZN14CHostageImprov17IsTerroristNearbyEv", mfunc_ptr_cast(&CHostageImprov::IsTerroristNearby) }, // NOXREF //{ 0x0, "_ZN14CHostageImprov8FrightenENS_9ScareTypeE", mfunc_ptr_cast(&CHostageImprov::Frighten) }, //{ 0x0, "_ZNK14CHostageImprov8IsScaredEv", mfunc_ptr_cast(&CHostageImprov::IsScared) }, //{ 0x0, "_ZNK14CHostageImprov17GetScareIntensityEv", mfunc_ptr_cast(&CHostageImprov::GetScareIntensity) }, @@ -4975,7 +4985,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK14CHostageImprov13GetAggressionEv", mfunc_ptr_cast(&CHostageImprov::GetAggression) }, //{ 0x0, "_ZN14CHostageImprov7ChatterE18HostageChatterTypeb", mfunc_ptr_cast(&CHostageImprov::Chatter) }, //{ 0x0, "_ZN14CHostageImprov14DelayedChatterEf18HostageChatterTypeb", mfunc_ptr_cast(&CHostageImprov::DelayedChatter) }, - //{ 0x0, "_ZN14CHostageImprov20UpdateDelayedChatterEv", mfunc_ptr_cast(&CHostageImprov::UpdateDelayedChatter) }, + //{ 0x01D55FE0, "_ZN14CHostageImprov20UpdateDelayedChatterEv", mfunc_ptr_cast(&CHostageImprov::UpdateDelayedChatter) }, // NOXREF //{ 0x0, "_ZNK14CHostageImprov9IsTalkingEv", mfunc_ptr_cast(&CHostageImprov::IsTalking) }, //{ 0x0, "_ZN14CHostageImprov22UpdateGrenadeReactionsEv", mfunc_ptr_cast(&CHostageImprov::UpdateGrenadeReactions) }, //{ 0x0, "_ZN14CHostageImprov6AfraidEv", mfunc_ptr_cast(&CHostageImprov::Afraid) }, @@ -4985,7 +4995,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CHostageImprov9CrouchDieEv", mfunc_ptr_cast(&CHostageImprov::CrouchDie) }, //{ 0x0, "_ZN14CHostageImprov6FlinchE8Activity", mfunc_ptr_cast(&CHostageImprov::Flinch) }, //{ 0x01D55E20, "_ZN14CHostageImprov18UpdateIdleActivityE8ActivityS0_", mfunc_ptr_cast(&CHostageImprov::UpdateIdleActivity) }, - //{ 0x0, "_ZN14CHostageImprov25UpdateStationaryAnimationEv", mfunc_ptr_cast(&CHostageImprov::UpdateStationaryAnimation) }, + //{ 0x01D56910, "_ZN14CHostageImprov25UpdateStationaryAnimationEv", mfunc_ptr_cast(&CHostageImprov::UpdateStationaryAnimation) }, // NOXREF //{ 0x0, "_ZNK14CHostageImprov9GetEntityEv", mfunc_ptr_cast(&CHostageImprov::GetEntity) }, //{ 0x0, "_ZN14CHostageImprov24CheckForNearbyTerroristsEv", mfunc_ptr_cast(&CHostageImprov::CheckForNearbyTerrorists) }, //{ 0x0, "_ZN14CHostageImprov14UpdatePositionEf", mfunc_ptr_cast(&CHostageImprov::UpdatePosition) }, @@ -4993,21 +5003,26 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN14CHostageImprov11FaceTowardsERK6Vectorf", mfunc_ptr_cast(&CHostageImprov::FaceTowards) }, //{ 0x0, "_ZN14CHostageImprov8GetSpeedEv", mfunc_ptr_cast(&CHostageImprov::GetSpeed) }, //{ 0x0, "_ZN14CHostageImprov12SetMoveAngleEf", mfunc_ptr_cast(&CHostageImprov::SetMoveAngle) }, - //{ 0x0, "_ZN14CHostageImprov6WiggleEv", mfunc_ptr_cast(&CHostageImprov::Wiggle) }, + //{ 0x01D56300, "_ZN14CHostageImprov6WiggleEv", mfunc_ptr_cast(&CHostageImprov::Wiggle) }, //{ 0x0, "_ZN14CHostageImprov9ClearPathEv", mfunc_ptr_cast(&CHostageImprov::ClearPath) }, - //{ 0x0, "_ZN14CHostageImprov17DiscontinuityJumpEfbb", mfunc_ptr_cast(&CHostageImprov::DiscontinuityJump) }, + //{ 0x01D511C0, "_ZN14CHostageImprov17DiscontinuityJumpEfbb", mfunc_ptr_cast(&CHostageImprov::DiscontinuityJump) }, // NOXREF //{ 0x0, "_ZN14CHostageImprov12UpdateVisionEv", mfunc_ptr_cast(&CHostageImprov::UpdateVision) }, +//HostageState + //virtual func + //{ 0x0, "_ZN12HostageStateD0Ev", mfunc_ptr_cast(&HostageState::~HostageState) }, + //{ 0x0, "_ZN12HostageStateD2Ev", mfunc_ptr_cast(&HostageState::~HostageState) }, + //{ 0x0, "_ZN12HostageState25UpdateStationaryAnimationEP14CHostageImprov", mfunc_ptr_cast(&HostageState::UpdateStationaryAnimation) }, //HostageIdleState //virtual func - //{ 0x0, "_ZN16HostageIdleState7OnEnterEP14CHostageImprov", mfunc_ptr_cast(&HostageState::OnEnter) }, - //{ 0x0, "_ZN16HostageIdleState8OnUpdateEP14CHostageImprov", mfunc_ptr_cast(&HostageState::OnUpdate) }, - //{ 0x0, "_ZN16HostageIdleState6OnExitEP14CHostageImprov", mfunc_ptr_cast(&HostageState::OnExit) }, - //{ 0x0, "_ZNK16HostageIdleState7GetNameEv", mfunc_ptr_cast(&HostageState::GetName) }, - //{ 0x0, "_ZN16HostageIdleState25UpdateStationaryAnimationEP14CHostageImprov", mfunc_ptr_cast(&HostageState::UpdateStationaryAnimation) }, - //{ 0x0, "_ZN16HostageIdleState15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&HostageState::OnMoveToSuccess) }, - //{ 0x0, "_ZN16HostageIdleState15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&HostageState::OnMoveToFailure) }, - //{ 0x0, "_ZN16HostageIdleState8OnInjuryEf", mfunc_ptr_cast(&HostageState::OnInjury) }, -//HostageIdleState + //{ 0x0, "_ZN16HostageIdleState7OnEnterEP14CHostageImprov", mfunc_ptr_cast(&HostageIdleState::OnEnter) }, + //{ 0x0, "_ZN16HostageIdleState8OnUpdateEP14CHostageImprov", mfunc_ptr_cast(&HostageIdleState::OnUpdate) }, + //{ 0x0, "_ZN16HostageIdleState6OnExitEP14CHostageImprov", mfunc_ptr_cast(&HostageIdleState::OnExit) }, + //{ 0x0, "_ZNK16HostageIdleState7GetNameEv", mfunc_ptr_cast(&HostageIdleState::GetName) }, + //{ 0x01D4BBD0, "_ZN16HostageIdleState25UpdateStationaryAnimationEP14CHostageImprov", mfunc_ptr_cast(&HostageIdleState::UpdateStationaryAnimation) }, + //{ 0x0, "_ZN16HostageIdleState15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&HostageIdleState::OnMoveToSuccess) }, + //{ 0x0, "_ZN16HostageIdleState15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&HostageIdleState::OnMoveToFailure) }, + //{ 0x0, "_ZN16HostageIdleState8OnInjuryEf", mfunc_ptr_cast(&HostageIdleState::OnInjury) }, +//HostageStateMachine //virtual func //{ 0x0, "_ZN19HostageStateMachine15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&HostageStateMachine::OnMoveToSuccess) }, //{ 0x0, "_ZN19HostageStateMachine15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&HostageStateMachine::OnMoveToFailure) }, @@ -5089,17 +5104,17 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN8CHostage11SetActivityEi", mfunc_ptr_cast(&CHostage::SetActivity) }, //{ 0x0, "_ZN8CHostage11GetActivityEv", mfunc_ptr_cast(&CHostage::GetActivity) }, //{ 0x0, "_ZN8CHostage17GetModifiedDamageEfi", mfunc_ptr_cast(&CHostage::GetModifiedDamage) }, - //{ 0x0, "_ZN8CHostage17SetFlinchActivityEv", mfunc_ptr_cast(&CHostage::SetFlinchActivity) }, + //{ 0x01D4D390, "_ZN8CHostage17SetFlinchActivityEv", mfunc_ptr_cast(&CHostage::SetFlinchActivity) }, // NOXREF //{ 0x0, "_ZN8CHostage16SetDeathActivityEv", mfunc_ptr_cast(&CHostage::SetDeathActivity) }, - //{ 0x0, "_ZN8CHostage13PlayPainSoundEv", mfunc_ptr_cast(&CHostage::PlayPainSound) }, + //{ 0x01D4D310, "_ZN8CHostage13PlayPainSoundEv", mfunc_ptr_cast(&CHostage::PlayPainSound) }, // NOXREF //{ 0x0, "_ZN8CHostage21PlayFollowRescueSoundEv", mfunc_ptr_cast(&CHostage::PlayFollowRescueSound) }, //{ 0x0, "_ZN8CHostage13AnnounceDeathEP11CBasePlayer", mfunc_ptr_cast(&CHostage::AnnounceDeath) }, - //{ 0x0, "_ZN8CHostage19ApplyHostagePenaltyEP11CBasePlayer", mfunc_ptr_cast(&CHostage::ApplyHostagePenalty) }, - //{ 0x0, "_ZN8CHostage16GiveCTTouchBonusEP11CBasePlayer", mfunc_ptr_cast(&CHostage::GiveCTTouchBonus) }, + //{ 0x01D4D6A0, "_ZN8CHostage19ApplyHostagePenaltyEP11CBasePlayer", mfunc_ptr_cast(&CHostage::ApplyHostagePenalty) }, // NOXREF + //{ 0x01D4DA80, "_ZN8CHostage16GiveCTTouchBonusEP11CBasePlayer", mfunc_ptr_cast(&CHostage::GiveCTTouchBonus) }, // NOXREF //{ 0x0, "_ZN8CHostage22SendHostagePositionMsgEv", mfunc_ptr_cast(&CHostage::SendHostagePositionMsg) }, //{ 0x0, "_ZN8CHostage19SendHostageEventMsgEv", mfunc_ptr_cast(&CHostage::SendHostageEventMsg) }, //{ 0x01D4DC10, "_ZN8CHostage8DoFollowEv", mfunc_ptr_cast(&CHostage::DoFollow) }, - //{ 0x0, "_ZN8CHostage10IsOnLadderEv", mfunc_ptr_cast(&CHostage::IsOnLadder) }, + //{ 0x01D4E380, "_ZN8CHostage10IsOnLadderEv", mfunc_ptr_cast(&CHostage::IsOnLadder) }, // NOXREF //{ 0x0, "_ZN8CHostage7PointAtERK6Vector", mfunc_ptr_cast(&CHostage::PointAt) }, //{ 0x01D4E080, "_ZN8CHostage10MoveTowardERK6Vector", mfunc_ptr_cast(&CHostage::MoveToward) }, //{ 0x01D4E3A0, "_ZN8CHostage8NavReadyEv", mfunc_ptr_cast(&CHostage::NavReady) }, @@ -5115,16 +5130,22 @@ FunctionHook g_FunctionHooks[] = //CHostageManager //{ 0x01D4EE20, "_Z21Hostage_RegisterCVarsv", (size_t)&Hostage_RegisterCVars }, // NOXREF //{ 0x01D4EE40, "_Z21InstallHostageManagerv", (size_t)&InstallHostageManager }, - - //{ 0x0, "_ZN15CHostageManager14ServerActivateEv", mfunc_ptr_cast(&CHostageManager::ServerActivate) }, + { 0x01D4EF10, "_ZN15CHostageManager14ServerActivateEv", mfunc_ptr_cast(&CHostageManager::ServerActivate) }, //{ 0x0, "_ZN15CHostageManager16ServerDeactivateEv", mfunc_ptr_cast(&CHostageManager::ServerDeactivate) }, //{ 0x01D50670, "_ZN15CHostageManager12RestartRoundEv", mfunc_ptr_cast(&CHostageManager::RestartRound) }, - //{ 0x0, "_ZN15CHostageManager10AddHostageEP8CHostage", mfunc_ptr_cast(&CHostageManager::AddHostage) }, + //{ 0x01D506A0, "_ZN15CHostageManager10AddHostageEP8CHostage", mfunc_ptr_cast(&CHostageManager::AddHostage) }, // NOXREF //{ 0x0, "_ZN15CHostageManager10GetChatterEv", mfunc_ptr_cast(&CHostageManager::GetChatter) }, //{ 0x0, "_ZNK15CHostageManager22IsNearbyHostageTalkingEP14CHostageImprov", mfunc_ptr_cast(&CHostageManager::IsNearbyHostageTalking) }, //{ 0x0, "_ZNK15CHostageManager22IsNearbyHostageJumpingEP14CHostageImprov", mfunc_ptr_cast(&CHostageManager::IsNearbyHostageJumping) }, { 0x01D50850, "_ZN15CHostageManager7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CHostageManager::OnEvent) }, //{ 0x0, "_ZN15CHostageManager17GetClosestHostageERK6VectorPf", mfunc_ptr_cast(&CHostageManager::GetClosestHostage) }, +//SimpleChatter + //{ 0x01D508A0, "_ZN13SimpleChatterC2Ev", mfunc_ptr_cast(&SimpleChatter::SimpleChatter) }, + //{ 0x01D508D0, "_ZN13SimpleChatterD2Ev", mfunc_ptr_cast(&SimpleChatter::~SimpleChatter) }, + { 0x01D50910, "_ZN13SimpleChatter8AddSoundE18HostageChatterTypePc", mfunc_ptr_cast(&SimpleChatter::AddSound) }, + //{ 0x01D50B40, "_ZN13SimpleChatter9PlaySoundEP11CBaseEntity18HostageChatterType", mfunc_ptr_cast(&SimpleChatter::PlaySound) }, + //{ 0x0, "_ZN13SimpleChatter8GetSoundE18HostageChatterTypePf", mfunc_ptr_cast(&SimpleChatter::GetSound) }, + //{ 0x0, "_ZN13SimpleChatter7ShuffleEPNS_10ChatterSetE", mfunc_ptr_cast(&SimpleChatter::Shuffle) }, //CLocalNav //{ 0x0, "_ZN9CLocalNav12SetTargetEntEP11CBaseEntity", mfunc_ptr_cast(&CLocalNav::SetTargetEnt) }, // NOXREF //{ 0x01D57420, "_ZN9CLocalNav8FindPathER6VectorS1_fi", mfunc_ptr_cast(&CLocalNav::FindPath) }, @@ -5155,31 +5176,63 @@ FunctionHook g_FunctionHooks[] = { NULL, NULL, NULL } }; +// refs for uncompleted virtual function +VirtualTableRef g_TableRefs[] = +{ + // CBaseEntity + { 0x01DF8A94, "CGib", CBASE_VIRTUAL_COUNT }, + { 0x01DFD824, "CBaseDelay", CBASE_VIRTUAL_COUNT }, + { 0x01DF607C, "CBaseEntity", CBASE_VIRTUAL_COUNT }, + { 0x01DFA894, "CGrenade", 77 }, + { 0x01DF67D4, "CBaseToggle", 60 }, + { 0x01DF652C, "CBasePlayer", 88 }, + { 0x01DF6694, "CBaseMonster", 76 }, + { 0x01DF7BB4, "C357SIGAmmo", 59 }, + { 0x01DF7AC4, "C57MMAmmo", 59 }, + { 0x01DFDA84, "CSprayCan", CBASE_VIRTUAL_COUNT }, + { 0x01DFDB74, "CBloodSplat", CBASE_VIRTUAL_COUNT }, + { 0x01DFDC6C, "CDeadHEV", 76 }, + { 0x01DFDF84, "CInfoIntermission", CBASE_VIRTUAL_COUNT }, + { 0x01DFDE94, "CRevertSaved", CBASE_VIRTUAL_COUNT }, + { 0x01DFDDA4, "CStripWeapons", CBASE_VIRTUAL_COUNT }, + { 0x01DF69B4, "CBot", 116 }, + { 0x01DF61DC, "CCSBot", 116 }, + { 0x01DF64F0, "CCSBotManager", 12 }, + + // Weapons vtable + { 0x01DF5C6C, "CUSP", 95 }, + { 0x01DFD984, "CWShield", CBASE_VIRTUAL_COUNT }, + + { NULL, NULL } // BaseClass__for_vtbl +}; + // refs AddressRef g_FunctionRefs[] = { #ifndef Function_References_Region { 0x01D626F0, "_Z13DispatchSpawnP7edict_s", (size_t)&pDispatchSpawn }, - { 0x01D3CA60, "_ZNK8CNavArea4GetZEPK6Vector", (size_t)&pGetZ__Vector }, { 0x01D43860, "_ZNK12CNavAreaGrid17GetNearestNavAreaEPK6Vectorb", (size_t)&pGetNearestNavArea }, { 0x01D43710, "_ZNK12CNavAreaGrid10GetNavAreaEPK6Vectorf", (size_t)&pGetNavArea }, - { 0x01D72480, "_ZN11CBaseEntity12FireBullets3E6VectorS0_ffiiifP9entvars_sbi", (size_t)&pFireBullets3 }, - - { 0x01DA8F90, "_ZN11CBasePlayer16UpdateClientDataEv", (size_t)&CBasePlayer__UpdateClientData }, - { 0x01D2EDD0, "_ZN6CCSBot16UpdateLookAnglesEv", (size_t)&pCCSBot__UpdateLookAngles }, { 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", (size_t)&pCCSBot__Update }, - { 0x01D68840, "_Z13ClientCommandP7edict_s", (size_t)&pClientCommand }, - - { 0x01D6EEB0, "_ZN4CGib15SpawnRandomGibsEP9entvars_sii", (size_t)&pCGib__SpawnRandomGibs }, - { 0x01D5B350, "_Z16QuaternionMatrixPfPA4_f", (size_t)&pQuaternionMatrix }, + { 0x01DAD590, "_ZN11CBasePlayer27PickPrimaryCareerTaskWeaponEv", (size_t)&pCBasePlayer__PickPrimaryCareerTaskWeapon }, + { 0x01DAD930, "_ZN11CBasePlayer29PickSecondaryCareerTaskWeaponEv", (size_t)&pCBasePlayer__PickSecondaryCareerTaskWeapon }, + { 0x01D46310, "_Z17LoadNavigationMapv", (size_t)&pLoadNavigationMap }, + { 0x01D19C70, "_ZN9BotPhrase9RandomizeEv", (size_t)&pBotPhrase__Randomize }, + + { 0x01D669A0, "_Z27HandleMenu_ChooseAppearanceP11CBasePlayeri", (size_t)&pHandleMenu_ChooseAppearance }, + { 0x01D66D10, "_Z21HandleMenu_ChooseTeamP11CBasePlayeri", (size_t)&pHandleMenu_ChooseTeam }, + { 0x01D25270, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", (size_t)&pCCSBotManager__AddBot }, + { 0x01D6EAB0, "_ZN4CGib12SpawnHeadGibEP9entvars_s", (size_t)&pCGib__SpawnHeadGib }, + #endif // Function_References_Region + { NULL, NULL, NULL } }; @@ -5190,8 +5243,8 @@ AddressRef g_DataRefs[] = { 0x01E61BD0, "g_engfuncs", (size_t)&pg_engfuncs }, { 0x01E61E48, "gpGlobals", (size_t)&pgpGlobals }, - { 0x01E2A3F8, "s_shared_token", (size_t)&ps_shared_token }, - { 0x01E13218, "s_shared_quote", (size_t)&ps_shared_quote }, + { 0x01E2A3F8, "_ZL14s_shared_token", (size_t)&ps_shared_token }, + { 0x01E13218, "_ZL14s_shared_quote", (size_t)&ps_shared_quote }, { 0x01E61BA4, "g_vecZero", (size_t)&pg_vecZero }, { 0x01E61BB4, "g_Language", (size_t)&pg_Language }, @@ -5222,19 +5275,19 @@ AddressRef g_DataRefs[] = { 0x01E75EC4, "g_sModelIndexRadio", (size_t)&pg_sModelIndexRadio }, { 0x01E75EB8, "gMultiDamage", (size_t)&pgMultiDamage }, - { 0x01E29880, "s_iBeamSprite", (size_t)&ps_iBeamSprite }, - { 0x01E29480, "cosTable", (size_t)&pcosTable }, + { 0x01E29880, "_ZL13s_iBeamSprite", (size_t)&ps_iBeamSprite }, + { 0x01E29480, "_ZL8cosTable", (size_t)&pcosTable }, { 0x01E61E4C, "WorldGraph", (size_t)&pWorldGraph }, { 0x01E61B98, "g_pGameRules", (size_t)&pg_pGameRules }, { 0x01E62560, "g_pMPGameRules", (size_t)&pg_pMPGameRules }, - { 0x01E61E70, "mp_com_token", (size_t)&pmp_com_token }, + { 0x01E61E70, "_ZL12mp_com_token", (size_t)&pmp_com_token }, - { 0x01E0B0B0, "weaponAliasInfo", (size_t)&pweaponAliasInfo }, - { 0x01E0B1E8, "weaponBuyAliasInfo", (size_t)&pweaponBuyAliasInfo }, - { 0x01E0B3F0, "weaponClassAliasInfo", (size_t)&pweaponClassAliasInfo }, + { 0x01E0B0B0, "_ZL15weaponAliasInfo", (size_t)&pweaponAliasInfo }, + { 0x01E0B1E8, "_ZL18weaponBuyAliasInfo", (size_t)&pweaponBuyAliasInfo }, + { 0x01E0B3F0, "_ZL20weaponClassAliasInfo", (size_t)&pweaponClassAliasInfo }, { 0x01E0B560, "g_autoBuyInfo", (size_t)&pg_autoBuyInfo }, - { 0x01E0B708, "weaponInfo", (size_t)&pweaponInfo }, + { 0x01E0B708, "_ZL10weaponInfo", (size_t)&pweaponInfo }, { 0x01E6AC80, "gszallsentencenames", (size_t)&pgszallsentencenames }, { 0x01E683E0, "rgsentenceg", (size_t)&prgsentenceg }, @@ -5262,10 +5315,10 @@ AddressRef g_DataRefs[] = { 0x01E1DD78, "gInitHUD", (size_t)&pgInitHUD }, { 0x01E75CFC, "g_groupmask", (size_t)&pg_groupmask }, { 0x01E75D00, "g_groupop", (size_t)&pg_groupop }, - { 0x01E21EF8, "gSizes", (size_t)&pgSizes }, + { 0x01E21EF8, "_ZL6gSizes", (size_t)&pgSizes }, { 0x01E75490, "pSoundEnt", (size_t)&ppSoundEnt }, - { 0x01E75CF8, "glSeed", (size_t)&pglSeed }, + { 0x01E75CF8, "_ZL6glSeed", (size_t)&pglSeed }, { 0x01E21598, "seed_table", (size_t)&pseed_table }, { 0x01E21998, "gEntvarsDescription", (size_t)&pgEntvarsDescription }, //{ 0x0, "gGlobalEntitySaveData", (size_t)&pgGlobalEntitySaveData }, @@ -5362,7 +5415,7 @@ AddressRef g_DataRefs[] = { 0x01E63598, "sv_aim", (size_t)&psv_aim }, { 0x01E61E6C, "sv_clienttrace", (size_t)&psv_clienttrace }, - { 0x01E61E68, "g_GameMgrHelper", (size_t)&pg_GameMgrHelper }, + { 0x01E61E68, "_ZL15g_GameMgrHelper", (size_t)&pg_GameMgrHelper }, { 0x01E22624, "voice_serverdebug", (size_t)&pvoice_serverdebug }, { 0x01E22638, "sv_alltalk", (size_t)&psv_alltalk }, @@ -5372,8 +5425,8 @@ AddressRef g_DataRefs[] = { 0x01E75E30, "g_SentBanMasks", (size_t)&pg_SentBanMasks }, { 0x01E75E28, "g_bWantModEnable", (size_t)&pg_bWantModEnable }, - { 0x01E76580, "s_tutorDisabledThisGame", (size_t)&ps_tutorDisabledThisGame }, - { 0x01E76584, "s_nextCvarCheckTime", (size_t)&ps_nextCvarCheckTime }, + { 0x01E76580, "_ZL23s_tutorDisabledThisGame", (size_t)&ps_tutorDisabledThisGame }, + { 0x01E76584, "_ZL19s_nextCvarCheckTime", (size_t)&ps_nextCvarCheckTime }, { 0x01E61B88, "g_footsteps", (size_t)&pg_footsteps }, { 0x01E61B8C, "g_psv_accelerate", (size_t)&pg_psv_accelerate }, @@ -5533,7 +5586,7 @@ AddressRef g_DataRefs[] = //{ 0x0, "_ZN9CEnvSpark10m_SaveDataE", mfunc_ptr_cast(&CEnvSpark::pm_SaveData) }, //{ 0x0, "_ZN19CMomentaryRotButton10m_SaveDataE", mfunc_ptr_cast(&CMomentaryRotButton::pm_SaveData) }, //{ 0x0, "_ZN10CEnvGlobal10m_SaveDataE", mfunc_ptr_cast(&CEnvGlobal::pm_SaveData) }, - //{ 0x0, "_ZN8CGrenade10m_SaveDataE", mfunc_ptr_cast(&CGrenade::pm_SaveData) }, + { 0x01E1B4C0, "_ZN8CGrenade10m_SaveDataE", mfunc_ptr_cast(&CGrenade::pm_SaveData) }, //{ 0x0, "_ZN9CWreckage10m_SaveDataE", mfunc_ptr_cast(&CWreckage::pm_SaveData) }, //{ 0x0, "_ZN13CCyclerSprite10m_SaveDataE", mfunc_ptr_cast(&CCyclerSprite::pm_SaveData) }, //{ 0x0, "_ZN7CCycler10m_SaveDataE", mfunc_ptr_cast(&CCycler::pm_SaveData) }, @@ -5594,11 +5647,13 @@ AddressRef g_DataRefs[] = { 0x01E75FE0, "_ZN15CBasePlayerItem13ItemInfoArrayE", mfunc_ptr_cast(&CBasePlayerItem::pItemInfoArray) }, { 0x01E75ED8, "_ZN15CBasePlayerItem13AmmoInfoArrayE", mfunc_ptr_cast(&CBasePlayerItem::pAmmoInfoArray) }, - - //{ 0x0, "_ZN13CCSBotManager17m_flNextCVarCheckE", mfunc_ptr_cast(&CCSBotManager::pm_flNextCVarCheck) }, + + { 0x01E28816, "_ZN13CCSBotManager17m_isMapDataLoadedE", mfunc_ptr_cast(&CCSBotManager::pm_isMapDataLoaded) }, + { 0x01E28818, "_ZN13CCSBotManager9m_editCmdE", mfunc_ptr_cast(&CCSBotManager::pm_editCmd) }, + { 0x01E2881C, "_ZN13CCSBotManager17m_flNextCVarCheckE", mfunc_ptr_cast(&CCSBotManager::pm_flNextCVarCheck) }, //{ 0x0, "_ZN13CCSBotManager17m_isMapDataLoadedE", mfunc_ptr_cast(&CCSBotManager::pm_isMapDataLoaded) }, { 0x01E28814, "_ZN13CCSBotManager15m_isLearningMapE", mfunc_ptr_cast(&CCSBotManager::pm_isLearningMap) }, - //{ 0x0, "_ZN13CCSBotManager21m_isAnalysisRequestedE", mfunc_ptr_cast(&CCSBotManager::pm_isAnalysisRequested) }, + { 0x01E28815, "_ZN13CCSBotManager21m_isAnalysisRequestedE", mfunc_ptr_cast(&CCSBotManager::pm_isAnalysisRequested) }, //{ 0x01E233BC, "cv_tutor_message_repeats", (size_t)&pcv_tutor_message_repeats }, //{ 0x01E233D0, "cv_tutor_debug_level", (size_t)&pcv_tutor_debug_level }, @@ -5614,50 +5669,54 @@ AddressRef g_DataRefs[] = { 0x01E11EE4, "cv_hostage_debug", (size_t)&pcv_hostage_debug }, { 0x01E11EF8, "cv_hostage_stop", (size_t)&pcv_hostage_stop }, - //{ 0x0, "TheNavLadderList", (size_t)&pTheNavLadderList }, + { 0x01E2A0E8, "TheNavLadderList", (size_t)&pTheNavLadderList }, { 0x01E2A0F4, "TheHidingSpotList", (size_t)&pTheHidingSpotList }, { 0x01E14C5C, "sPlayerModelFiles", (size_t)&psPlayerModelFiles }, //{ 0x0, "g_flTimeLimit", (size_t)&pg_flTimeLimit }, //{ 0x0, "g_flResetTime", (size_t)&pg_flResetTime }, - //{ 0x0, "g_bClientPrintEnable", (size_t)&pg_bClientPrintEnable }, + { 0x01E14C58, "g_bClientPrintEnable", (size_t)&pg_bClientPrintEnable }, { 0x01E5D6F8, "g_skipCareerInitialSpawn", (size_t)&pg_skipCareerInitialSpawn }, { 0x01E31768, "m_usResetDecals", (size_t)&pm_usResetDecals }, { 0x01E31760, "g_iShadowSprite", (size_t)&pg_iShadowSprite }, - { 0x01E31770, "g_PVSStatus", (size_t)&pg_PVSStatus }, - { 0x01E14C90, "entity_field_alias", (size_t)&pentity_field_alias }, - { 0x01E14D68, "player_field_alias", (size_t)&pplayer_field_alias }, + { 0x01E31770, "_ZL11g_PVSStatus", (size_t)&pg_PVSStatus }, + { 0x01E14C90, "_ZL18entity_field_alias", (size_t)&pentity_field_alias }, + { 0x01E14D68, "_ZL18player_field_alias", (size_t)&pplayer_field_alias }, { 0x01E14DD8, "custom_entity_field_alias", (size_t)&pcustom_entity_field_alias }, - { 0x01E2A0AC, "goodSizedAreaList", (size_t)&pgoodSizedAreaList }, - { 0x01E2A0DC, "TheNavAreaList", (size_t)&pTheNavAreaList }, - // 1E2A0E0? + { 0x01E5D718, "_ZL14g_serveractive", (size_t)&pg_serveractive }, + { 0x01E2A0AC, "_ZL17goodSizedAreaList", (size_t)&pgoodSizedAreaList }, + { 0x01E2A0DC, "TheNavAreaList", (size_t)&pTheNavAreaList }, { 0x01E29888, "TheNavAreaGrid", (size_t)&pTheNavAreaGrid }, + { 0x01E2A250, "_ZN8CNavNode6m_listE", mfunc_ptr_cast(&CNavNode::pm_list) }, //{ 0x0, "_ZN8CNavArea8m_nextIDE", mfunc_ptr_cast(&CNavArea::m_nextID) }, - { 0x01E11584, "_ZN8CNavArea14m_masterMarkerE", mfunc_ptr_cast(&CNavArea::m_masterMarker) }, - { 0x01E11588, "_ZN10HidingSpot8m_nextIDE", mfunc_ptr_cast(&HidingSpot::m_nextID) }, + { 0x01E11584, "_ZN8CNavArea14m_masterMarkerE", mfunc_ptr_cast(&CNavArea::pm_masterMarker) }, + { 0x01E11588, "_ZN10HidingSpot8m_nextIDE", mfunc_ptr_cast(&HidingSpot::pm_nextID) }, //{ 0x0, "_ZN10HidingSpot14m_masterMarkerE", mfunc_ptr_cast(&HidingSpot::m_masterMarker) }, - { 0x01E2A100, "_ZN8CNavArea9m_isResetE", mfunc_ptr_cast(&CNavArea::m_isReset) }, - { 0x01E2A0FC, "_ZN8CNavArea10m_openListE", mfunc_ptr_cast(&CNavArea::m_openList) }, + { 0x01E2A100, "_ZN8CNavArea9m_isResetE", mfunc_ptr_cast(&CNavArea::pm_isReset) }, + { 0x01E2A0FC, "_ZN8CNavArea10m_openListE", mfunc_ptr_cast(&CNavArea::pm_openList) }, - //{ 0x0, "lastDrawTimestamp", (size_t)&plastDrawTimestamp }, + { 0x01E2A104, "lastDrawTimestamp", (size_t)&plastDrawTimestamp }, + { 0x01E2A118, "_ZL13editTimestamp", (size_t)&peditTimestamp }, //{ 0x0, "goodSizedAreaList", (size_t)&pgoodSizedAreaList }, - //{ 0x0, "markedArea", (size_t)&pmarkedArea }, - //{ 0x0, "lastSelectedArea", (size_t)&plastSelectedArea }, - { 0x01E1158C, "markedCorner", (size_t)&pmarkedCorner }, - //{ 0x0, "isCreatingNavArea", (size_t)&pisCreatingNavArea }, + { 0x01E2A10C, "_ZL10markedArea", (size_t)&pmarkedArea }, + { 0x01E2A110, "_ZL16lastSelectedArea", (size_t)&plastSelectedArea }, + { 0x01E1158C, "_ZL12markedCorner", (size_t)&pmarkedCorner }, + { 0x01E2A114, "_ZL17isCreatingNavArea", (size_t)&pisCreatingNavArea }, //{ 0x0, "isAnchored", (size_t)&pisAnchored }, //{ 0x0, "anchor", (size_t)&panchor }, //{ 0x0, "isPlaceMode", (size_t)&pisPlaceMode }, - //{ 0x0, "isPlacePainting", (size_t)&pisPlacePainting }, - { 0x01E29CA4, "BlockedID", (size_t)&pBlockedID }, - { 0x01E2A120, "BlockedIDCount", (size_t)&pBlockedIDCount }, + { 0x01E2A117, "_ZL15isPlacePainting", (size_t)&pisPlacePainting }, + { 0x01E29CA4, "_ZL9BlockedID", (size_t)&pBlockedID }, + { 0x01E2A120, "_ZL14BlockedIDCount", (size_t)&pBlockedIDCount }, - { 0x01E14988, "gFunctionTable", (size_t)&pgFunctionTable }, + { 0x01E14988, "_ZL14gFunctionTable", (size_t)&pgFunctionTable }, { 0x01E14A50, "gNewDLLFunctions", (size_t)&pgNewDLLFunctions }, { 0x01E28810, "TheBots", (size_t)&pTheBots }, + + { 0x01E24950, "_ZL8taskInfo", (size_t)&ptaskInfo }, { 0x01E76594, "TheCareerTasks", (size_t)&pTheCareerTasks }, { 0x01E28C7C, "TheBotProfiles", (size_t)&pTheBotProfiles }, @@ -5668,11 +5727,12 @@ AddressRef g_DataRefs[] = { 0x01E2A25C, "g_pHostages", (size_t)&pg_pHostages }, { 0x01E2A258, "g_iHostageNumber", (size_t)&pg_iHostageNumber }, - { 0x01E16EE0, "outputLevel", (size_t)&poutputLevel }, - { 0x01E61B40, "theDebugOutputTypes", (size_t)&ptheDebugOutputTypes }, - { 0x01E61740, "theDebugBuffer", (size_t)&ptheDebugBuffer }, + { 0x01E16EE0, "_ZL11outputLevel", (size_t)&poutputLevel }, + { 0x01E61B40, "_ZL19theDebugOutputTypes", (size_t)&ptheDebugOutputTypes }, + { 0x01E61740, "_ZL14theDebugBuffer", (size_t)&ptheDebugBuffer }, - { 0x01E75D04, "g_LessCtx", (size_t)&pg_LessCtx }, + { 0x01E75D04, "_ZL9g_LessCtx", (size_t)&pg_LessCtx }, + { 0x01E62670, "g_pevLastInflictor", (size_t)&pg_pevLastInflictor }, { 0x01E62788, "g_pLastSpawn", (size_t)&pg_pLastSpawn }, { 0x01E63590, "g_pLastCTSpawn", (size_t)&pg_pLastCTSpawn }, diff --git a/regamedll/hookers/hooker.cpp b/regamedll/hookers/hooker.cpp index 3f2d6188..5579e5ab 100644 --- a/regamedll/hookers/hooker.cpp +++ b/regamedll/hookers/hooker.cpp @@ -33,8 +33,49 @@ HIDDEN Module g_EngineModule = { NULL, NULL, NULL, NULL }; extern const size_t g_BaseOffset; extern FunctionHook g_FunctionHooks[]; +extern VirtualTableRef g_TableRefs[]; extern AddressRef g_FunctionRefs[]; -extern AddressRef g_DataRefs[]; +extern AddressRef g_DataRefs[]; + +VirtualTableRef *GetVirtualTableRefAddr(const char *szClassName) +{ + VirtualTableRef *refData = g_TableRefs; + while (refData->symbolName != NULL) + { + if (!strcmp(refData->symbolName, szClassName)) + { + if (refData->originalAddress != NULL) + { + return refData; + } + } + refData++; + } + + return NULL; +} + +bool GetAddressUsingHook(size_t addr) +{ + for (FunctionHook *cfh = &g_FunctionHooks[0]; cfh->symbolName; cfh++) + { + if (addr == cfh->originalAddress) + { + return true; + } + } + return false; +} + +size_t OffsetToRebase(size_t addr) +{ + return (addr - g_GameDLLModule.base + g_BaseOffset); +} + +void *GetFunctionEntity(const char *szClassName) +{ + return Sys_GetProcAddress((HMODULE)g_GameDLLModule.base, szClassName); +} void printAddrRebase(size_t addr,const char *funcName) { @@ -100,6 +141,8 @@ void *GetFuncRefAddrOrDefault(const char *funcName, void *def) return def; } +int nCountHook = 0; + int HookGameDLL(size_t gameAddr, size_t engAddr) { if (gameAddr == NULL @@ -131,7 +174,7 @@ int HookGameDLL(size_t gameAddr, size_t engAddr) if (!GetAddress(&g_GameDLLModule, (Address *)refFunc, g_BaseOffset)) { #if _DEBUG - printf(__FUNCTION__ ": symbol not found \"%s\", symbol index: %i\n", refData->symbolName, refData->symbolIndex); + printf(__FUNCTION__ ": symbol not found \"%s\", symbol index: %i\n", refFunc->symbolName, refFunc->symbolIndex); success = false; #endif // _DEBUG } @@ -144,13 +187,26 @@ int HookGameDLL(size_t gameAddr, size_t engAddr) if (!GetAddress(&g_GameDLLModule, (Address*)hookFunc, g_BaseOffset)) { #if _DEBUG - printf(__FUNCTION__ ": symbol not found \"%s\", symbol index: %i\n", refData->symbolName, refData->symbolIndex); + printf(__FUNCTION__ ": symbol not found \"%s\", symbol index: %i\n", hookFunc->symbolName, hookFunc->symbolIndex); success = false; #endif // _DEBUG } hookFunc++; } + VirtualTableRef *refVtbl = g_TableRefs; + while (refVtbl->symbolName != NULL) + { + if (!GetAddress(&g_GameDLLModule, (Address *)refVtbl, g_BaseOffset)) + { +#if _DEBUG + printf(__FUNCTION__ ": symbol not found \"%s\"\n", refVtbl->symbolName); + success = false; +#endif // _DEBUG + } + refVtbl++; + } + if (!success) { #if _DEBUG @@ -192,7 +248,9 @@ int HookGameDLL(size_t gameAddr, size_t engAddr) { if (!HookFunction(&g_GameDLLModule, hookFunc)) return (FALSE); + hookFunc++; + nCountHook++; } } diff --git a/regamedll/hookers/hooker.h b/regamedll/hookers/hooker.h index 3529244c..d1450900 100644 --- a/regamedll/hookers/hooker.h +++ b/regamedll/hookers/hooker.h @@ -2,6 +2,10 @@ #include "osconfig.h" +extern size_t OffsetToRebase(size_t addr); +extern bool GetAddressUsingHook(size_t addr); +extern VirtualTableRef *GetVirtualTableRefAddr(const char *szClassName); +extern void *GetFunctionEntity(const char *szClassName); extern void printAddrRebase(size_t addr,const char *funcName); extern FunctionHook *GetFunctionPtrByName(const char *funcName); extern void *GetOriginalFuncAddrOrDie(const char *funcName); diff --git a/regamedll/hookers/memory.cpp b/regamedll/hookers/memory.cpp index 56148826..12846d23 100644 --- a/regamedll/hookers/memory.cpp +++ b/regamedll/hookers/memory.cpp @@ -726,7 +726,7 @@ bool HIDDEN HookFunction(Module *module, FunctionHook *hook) patch[0] = 0xE9; #if 1 - if (strcmp(hook->symbolName,"_ZN11CBasePlayer10SwitchTeamEv")==0) + if (strcmp(hook->symbolName,"_ZNK9BotPhrase12GetSpeakableEiPf")==0) { addr_orig = (void *)hook->originalAddress; @@ -777,4 +777,104 @@ void FindAllCalls(Section* section, CFuncAddr** calls, uint32_t findRefsTo) coderef_addr = MemoryFindRefForwardPrefix8(coderef_addr + 1, section->end, findRefsTo, 0xE8, true); } } -#endif \ No newline at end of file +#endif + +template +size_t vtable_size(const T &t) +{ + typedef void Function(); + Function *const *const vtable = reinterpret_cast(t); + size_t size = 0; + + byte first_addr_byte = '\x2A'; + + while (vtable[size]) + { + byte addr_byte = *((byte *)(&vtable[size]) + 3); + + if (first_addr_byte == '\x2A') + first_addr_byte = addr_byte; + + if (addr_byte != first_addr_byte) + break; + + ++size; + } + + return size; +} + +const char *stripClass(const char *str) +{ + const int BufLen = 256; + static char string[ BufLen ]; + const char pattern[] = "class "; + + int curlen = Q_strlen(str); + + Q_strncpy(string, str, curlen); + string[ curlen ] = '\0'; + + curlen = (Q_strstr(string, pattern) != NULL) ? Q_strlen(pattern) : 0; + + return &string[ curlen ]; +} + +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) + +void VirtualTableInit(void *ptr, const char *baseClass) +{ + if (!baseClass || *baseClass == '\0') + { + return; + } + + VirtualTableRef *refsVtbl = GetVirtualTableRefAddr(baseClass); + if (!refsVtbl) + { + regamedll_syserror(__FUNCTION__": Missing vtable for \"%s\"", baseClass); + } + + /* + int nCount = vtable_size(refsVtbl->originalAddress); + + if (nCount != refsVtbl->size) + regamedll_syserror(__FUNCTION__": Invalid size virtual table, expected [%d], got [%d]", nCount, refsVtbl->size); + */ + + int **ivtable = *(int ***)ptr; + int **ivtable_orig = (int **)refsVtbl->originalAddress; + + for (size_t i = 0; i < refsVtbl->size; i++) + { + if (!GetAddressUsingHook((size_t)ivtable_orig[i])) + { + EnablePageWrite((size_t)&ivtable[i], 5); + ivtable[i] = ivtable_orig[i]; + RestorePageProtection((size_t)&ivtable[i], 5); + } + } +} + +void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset) +{ + edict_t *pObject = CREATE_ENTITY(); + + void *addr = GetFunctionEntity(szClassName); + + if (addr == NULL) + { + REMOVE_ENTITY(pObject); + return; + } + + // call link to class GetClassPtr(pev); + reinterpret_cast(addr)(&pObject->v); + + void *vtable = *(void **)pObject->pvPrivateData; + printf2(__FUNCTION__ "* ADDRESS VTABLE: %p | ADDRESS VIRTUAL FUNC: %p", + OffsetToRebase((size_t)vtable), + OffsetToRebase(*(((size_t **)&vtable)[ iOffset ]))); +} + +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS \ No newline at end of file diff --git a/regamedll/hookers/memory.h b/regamedll/hookers/memory.h index 36e62195..4d07df27 100644 --- a/regamedll/hookers/memory.h +++ b/regamedll/hookers/memory.h @@ -79,6 +79,13 @@ struct FunctionHook bool bIsHooked; }; +struct VirtualTableRef +{ + size_t originalAddress; + const char *symbolName; + size_t size; +}; + struct AddressRef { // Keeps offset for SWDS on application start; during HookEngine() an real address is written here. @@ -137,4 +144,12 @@ bool HIDDEN FindDataRef(Module *module, AddressRef *ref); void FindAllCalls(Section* section, CFuncAddr** calls, uint32_t findRefsTo); #endif +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) + +const char *stripClass(const char *str); +void VirtualTableInit(void *ptr, const char *baseClass = NULL); +void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset = 0); + +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS + #endif // _MEMORY_H diff --git a/regamedll/hookers/regamedll_debug.cpp b/regamedll/hookers/regamedll_debug.cpp index 8044cc1e..0c9693a2 100644 --- a/regamedll/hookers/regamedll_debug.cpp +++ b/regamedll/hookers/regamedll_debug.cpp @@ -65,6 +65,18 @@ void Regamedll_Debug_logStrDup(const char *s, void *ptr) g_ReGameDLLDebugLog.flush(); } +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) + +extern int nCountHook; + +void Regamedll_Game_Init(void) +{ + if (!g_ReGameDLLRuntimeConfig.disableAllHooks) + printf2("[Hooker]: The total number hooks of functions is - %d", nCountHook); +} + +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS + void Regamedll_Debug_Init(void) { //g_ReGameDLLDebugLog.exceptions(std::ios::badbit | std::ios::failbit); diff --git a/regamedll/hookers/regamedll_debug.h b/regamedll/hookers/regamedll_debug.h index 43a13f33..7e3ef2b5 100644 --- a/regamedll/hookers/regamedll_debug.h +++ b/regamedll/hookers/regamedll_debug.h @@ -12,6 +12,10 @@ extern void Regamedll_Debug_logFree(void *ptr); extern void Regamedll_Debug_logStrDup(const char *s, void *ptr); extern void Regamedll_Debug_Init(void); +#if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) +extern void Regamedll_Game_Init(void); +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS + extern void _printf2(const char *fmt, ...); extern void _print_chat(class CBasePlayer *pPlayer, const char *fmt, ...); diff --git a/regamedll/msvc/ReGameDLL.vcxproj b/regamedll/msvc/ReGameDLL.vcxproj index f6dedd1d..9c6f69af 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj +++ b/regamedll/msvc/ReGameDLL.vcxproj @@ -34,17 +34,24 @@ false false - + + + + false false false false - + + + + false - false + + false false @@ -54,7 +61,10 @@ false false - + + + + false false @@ -69,25 +79,34 @@ false - false + + false false false - false + + false false - - + + + + + + false + false false false false - + + false + false false @@ -185,35 +204,35 @@ false - true + false false - true + false false - true + false false - true + false false - true + false false - true + false false - true + false false - true + false @@ -499,6 +518,7 @@ + @@ -517,10 +537,21 @@ - - - - + + + + + + + + + + + + + + false + @@ -561,6 +592,7 @@ + @@ -813,6 +845,7 @@ MultiThreadedDebug Use precompiled.h + Default true @@ -961,6 +994,7 @@ /arch:IA32 %(AdditionalOptions) Use precompiled.h + Precise true diff --git a/regamedll/msvc/ReGameDLL.vcxproj.filters b/regamedll/msvc/ReGameDLL.vcxproj.filters index 3674110a..34b10cda 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj.filters +++ b/regamedll/msvc/ReGameDLL.vcxproj.filters @@ -1106,6 +1106,12 @@ dlls + + dlls\common + + + dlls + diff --git a/regamedll/pm_shared/pm_defs.h b/regamedll/pm_shared/pm_defs.h index 835faf7c..82b196be 100644 --- a/regamedll/pm_shared/pm_defs.h +++ b/regamedll/pm_shared/pm_defs.h @@ -32,9 +32,9 @@ #pragma once #endif -#define MAX_PHYSENTS 600 // Must have room for all entities in the world. +#define MAX_PHYSENTS 600 // Must have room for all entities in the world. #define MAX_MOVEENTS 64 -#define MAX_CLIP_PLANES 5 +#define MAX_CLIP_PLANES 5 #define PM_NORMAL 0x00000000 #define PM_STUDIO_IGNORE 0x00000001 // Skip studio models diff --git a/regamedll/pm_shared/pm_math.h b/regamedll/pm_shared/pm_math.h index 30ed54f4..c4dc2c2b 100644 --- a/regamedll/pm_shared/pm_math.h +++ b/regamedll/pm_shared/pm_math.h @@ -32,9 +32,9 @@ #pragma once #endif -#define PITCH 0 // up/down -#define YAW 1 // left/right -#define ROLL 2 // fall over +#define PITCH 0 // up/down +#define YAW 1 // left/right +#define ROLL 2 // fall over NOBODY float anglemod(float a); void AngleVectors3(const vec_t *angles, vec_t *forward, vec_t *right, vec_t *up); diff --git a/regamedll/pm_shared/pm_shared.cpp b/regamedll/pm_shared/pm_shared.cpp index 8539128c..ea4753b3 100644 --- a/regamedll/pm_shared/pm_shared.cpp +++ b/regamedll/pm_shared/pm_shared.cpp @@ -1247,7 +1247,7 @@ NOXREF int PM_GetPhysEntInfo(int ent) /* <2ce21b> ../cstrike/pm_shared/pm_shared.c:3638 */ void PM_Init(struct playermove_s *ppmove) { - assert( !pm_shared_initialized ); + assert(!pm_shared_initialized); pmove = ppmove; diff --git a/regamedll/public/keydefs.h b/regamedll/public/keydefs.h index 3e335bce..d644d3b8 100644 --- a/regamedll/public/keydefs.h +++ b/regamedll/public/keydefs.h @@ -8,53 +8,53 @@ // // these are the key numbers that should be passed to Key_Event // -#define K_TAB 9 -#define K_ENTER 13 -#define K_ESCAPE 27 -#define K_SPACE 32 +#define K_TAB 9 +#define K_ENTER 13 +#define K_ESCAPE 27 +#define K_SPACE 32 // normal keys should be passed as lowercased ascii -#define K_BACKSPACE 127 -#define K_UPARROW 128 -#define K_DOWNARROW 129 -#define K_LEFTARROW 130 -#define K_RIGHTARROW 131 +#define K_BACKSPACE 127 +#define K_UPARROW 128 +#define K_DOWNARROW 129 +#define K_LEFTARROW 130 +#define K_RIGHTARROW 131 -#define K_ALT 132 -#define K_CTRL 133 -#define K_SHIFT 134 -#define K_F1 135 -#define K_F2 136 -#define K_F3 137 -#define K_F4 138 -#define K_F5 139 -#define K_F6 140 -#define K_F7 141 -#define K_F8 142 -#define K_F9 143 -#define K_F10 144 -#define K_F11 145 -#define K_F12 146 -#define K_INS 147 -#define K_DEL 148 -#define K_PGDN 149 -#define K_PGUP 150 -#define K_HOME 151 -#define K_END 152 +#define K_ALT 132 +#define K_CTRL 133 +#define K_SHIFT 134 +#define K_F1 135 +#define K_F2 136 +#define K_F3 137 +#define K_F4 138 +#define K_F5 139 +#define K_F6 140 +#define K_F7 141 +#define K_F8 142 +#define K_F9 143 +#define K_F10 144 +#define K_F11 145 +#define K_F12 146 +#define K_INS 147 +#define K_DEL 148 +#define K_PGDN 149 +#define K_PGUP 150 +#define K_HOME 151 +#define K_END 152 #define K_KP_HOME 160 #define K_KP_UPARROW 161 #define K_KP_PGUP 162 -#define K_KP_LEFTARROW 163 +#define K_KP_LEFTARROW 163 #define K_KP_5 164 #define K_KP_RIGHTARROW 165 #define K_KP_END 166 #define K_KP_DOWNARROW 167 #define K_KP_PGDN 168 -#define K_KP_ENTER 169 +#define K_KP_ENTER 169 #define K_KP_INS 170 -#define K_KP_DEL 171 +#define K_KP_DEL 171 #define K_KP_SLASH 172 #define K_KP_MINUS 173 #define K_KP_PLUS 174 @@ -66,47 +66,47 @@ // // joystick buttons // -#define K_JOY1 203 -#define K_JOY2 204 -#define K_JOY3 205 -#define K_JOY4 206 +#define K_JOY1 203 +#define K_JOY2 204 +#define K_JOY3 205 +#define K_JOY4 206 // // aux keys are for multi-buttoned joysticks to generate so they can use // the normal binding process // -#define K_AUX1 207 -#define K_AUX2 208 -#define K_AUX3 209 -#define K_AUX4 210 -#define K_AUX5 211 -#define K_AUX6 212 -#define K_AUX7 213 -#define K_AUX8 214 -#define K_AUX9 215 -#define K_AUX10 216 -#define K_AUX11 217 -#define K_AUX12 218 -#define K_AUX13 219 -#define K_AUX14 220 -#define K_AUX15 221 -#define K_AUX16 222 -#define K_AUX17 223 -#define K_AUX18 224 -#define K_AUX19 225 -#define K_AUX20 226 -#define K_AUX21 227 -#define K_AUX22 228 -#define K_AUX23 229 -#define K_AUX24 230 -#define K_AUX25 231 -#define K_AUX26 232 -#define K_AUX27 233 -#define K_AUX28 234 -#define K_AUX29 235 -#define K_AUX30 236 -#define K_AUX31 237 -#define K_AUX32 238 +#define K_AUX1 207 +#define K_AUX2 208 +#define K_AUX3 209 +#define K_AUX4 210 +#define K_AUX5 211 +#define K_AUX6 212 +#define K_AUX7 213 +#define K_AUX8 214 +#define K_AUX9 215 +#define K_AUX10 216 +#define K_AUX11 217 +#define K_AUX12 218 +#define K_AUX13 219 +#define K_AUX14 220 +#define K_AUX15 221 +#define K_AUX16 222 +#define K_AUX17 223 +#define K_AUX18 224 +#define K_AUX19 225 +#define K_AUX20 226 +#define K_AUX21 227 +#define K_AUX22 228 +#define K_AUX23 229 +#define K_AUX24 230 +#define K_AUX25 231 +#define K_AUX26 232 +#define K_AUX27 233 +#define K_AUX28 234 +#define K_AUX29 235 +#define K_AUX30 236 +#define K_AUX31 237 +#define K_AUX32 238 #define K_MWHEELDOWN 239 #define K_MWHEELUP 240 @@ -115,9 +115,9 @@ // // mouse buttons generate virtual keys // -#define K_MOUSE1 241 -#define K_MOUSE2 242 -#define K_MOUSE3 243 +#define K_MOUSE1 241 +#define K_MOUSE2 242 +#define K_MOUSE3 243 #define K_MOUSE4 244 #define K_MOUSE5 245 diff --git a/regamedll/public/tier0/platform.h b/regamedll/public/tier0/platform.h index bf9e56b6..ac16e115 100644 --- a/regamedll/public/tier0/platform.h +++ b/regamedll/public/tier0/platform.h @@ -326,7 +326,7 @@ inline float DWordSwapAsm(float f) #endif #ifdef _SGI_SOURCE -#define VALVE_BIG_ENDIAN 1 +#define VALVE_BIG_ENDIAN 1 #endif #if defined(VALVE_LITTLE_ENDIAN) diff --git a/regamedll/regamedll/dlls.h b/regamedll/regamedll/dlls.h index c525b34c..7ad93000 100644 --- a/regamedll/regamedll/dlls.h +++ b/regamedll/regamedll/dlls.h @@ -30,7 +30,7 @@ #include "extdll.h" #include "h_export.h" -//#include "schedule.h" +#include "schedule.h" #include "archtypes.h" #include "enginecallback.h" //#include "entity_state.h" @@ -61,6 +61,7 @@ #include "shake.h" #include "util.h" #include "decals.h" +#include "hltv.h" #include "cbase.h" #include "world.h" @@ -116,8 +117,6 @@ // Hostage #include "hostage/hostage.h" #include "hostage/hostage_localnav.h" -#include "hostage/hostage_states.h" -#include "hostage/hostage_improv.h" #include "airtank.h" #include "h_ai.h" diff --git a/regamedll/regamedll/platform.cpp b/regamedll/regamedll/platform.cpp index 0741a93a..da08f383 100644 --- a/regamedll/regamedll/platform.cpp +++ b/regamedll/regamedll/platform.cpp @@ -48,6 +48,10 @@ void regamedll_syserror(const char *fmt, ...) fprintf(fl, "%s\n", string); fclose(fl); +#ifdef _WIN32 + printf2(__FUNCTION__ ":: demo failed"); +#endif // _WIN32 + //TerminateProcess(GetCurrentProcess(), 1); *((int *)NULL) = 0; diff --git a/regamedll/regamedll/precompiled.h b/regamedll/regamedll/precompiled.h index f882032f..efe357c5 100644 --- a/regamedll/regamedll/precompiled.h +++ b/regamedll/regamedll/precompiled.h @@ -18,13 +18,13 @@ #include "MemPool.h" #include "engine.h" -#include "dlls.h" -#include "basetypes.h" - #ifdef HOOK_GAMEDLL #include "hooker.h" #endif // HOOK_GAMEDLL +#include "dlls.h" +#include "basetypes.h" + //valve libs stuff #include "tier0/platform.h" #include "tier0/dbg.h" diff --git a/regamedll/unittests/struct_offsets_tests.cpp b/regamedll/unittests/struct_offsets_tests.cpp index 545a6de9..8a6fef50 100644 --- a/regamedll/unittests/struct_offsets_tests.cpp +++ b/regamedll/unittests/struct_offsets_tests.cpp @@ -40,6 +40,7 @@ TEST(StructOffsets, ReversingChecks, 5000) REPEAT_SIZEOF_PRINT(CBotManager); REPEAT_SIZEOF_PRINT(CCSBotManager); REPEAT_SIZEOF_PRINT(BotPhraseManager); + REPEAT_SIZEOF_PRINT(BotPhrase); REPEAT_SIZEOF_PRINT(CBasePlayer); REPEAT_SIZEOF_PRINT(ActiveGrenade); @@ -51,10 +52,15 @@ TEST(StructOffsets, ReversingChecks, 5000) REPEAT_SIZEOF_PRINT(CGib); REPEAT_SIZEOF_PRINT(CSprayCan); REPEAT_SIZEOF_PRINT(CountdownTimer); - + REPEAT_SIZEOF_PRINT(CCareerTaskManager); + REPEAT_SIZEOF_PRINT(CCareerTask); + REPEAT_SIZEOF_PRINT(CPreventDefuseTask); + // offset the members REPEAT_OFFSETOF_PRINT(CBaseEntity, pev); REPEAT_OFFSETOF_PRINT(CBaseEntity, has_disconnected); + //REPEAT_OFFSETOF_PRINT(CPreventDefuseTask, m_bombPlantedThisRound); + //REPEAT_OFFSETOF_PRINT(CPreventDefuseTask, m_defuseStartedThisRound); // assert CHECK_CLASS_SIZE(CNavArea, 0x238u, 0x214u); @@ -62,14 +68,21 @@ TEST(StructOffsets, ReversingChecks, 5000) CHECK_CLASS_SIZE(CBasePlayer, 0x9B0, 0x9C4); CHECK_CLASS_SIZE(CHostageImprov, 0x1C8Cu, 0x1C8Cu); CHECK_CLASS_SIZE(BotPhraseManager, 0x21Cu, 0x214u); - + CHECK_CLASS_SIZE(BotPhrase, 0x50, 0x44); + CHECK_CLASS_SIZE(CHalfLifeMultiplay, 0x2D0u, 0x2C4u); CHECK_CLASS_SIZE(CHalfLifeTraining, 0x2E8u, 0x2D8u); CHECK_CLASS_SIZE(CGib, 0x98, 0xA8); CHECK_CLASS_SIZE(CSprayCan, 0x88, 0x98); + CHECK_CLASS_SIZE(CBaseEntity, 0x88, 0x98); + CHECK_CLASS_SIZE(CGrenade, 0x1E0, 0x1F4); //CHECK_CLASS_SIZE(CountdownTimer, 0xC, 0x8); + CHECK_CLASS_SIZE(CCareerTaskManager, 0x28, 0x24); + CHECK_CLASS_SIZE(CCareerTask, 0x2C, 0x2C); + CHECK_CLASS_SIZE(CPreventDefuseTask, 0x30, 0x30); //CHECK_CLASS_SIZE(CBotManager, 12u, 12); + CHECK_CLASS_SIZE(CCSBot, 11404, 11424); //CHECK_CLASS_SIZE(CCSBotManager, 740, 0x2E0u);//0x2E4u | 0x2E0u //CHECK_CLASS_SIZE(HostageStateMachine, 0x10, 0x10);