diff --git a/regamedll/build.gradle b/regamedll/build.gradle index 3c27ff69..b5fd245d 100644 --- a/regamedll/build.gradle +++ b/regamedll/build.gradle @@ -188,7 +188,7 @@ class RegamedllSrc { h.regamedll_src(CppSourceSet) { source { - srcDirs "dlls", "game_shared", "pm_shared", "regamedll", "public", "version" + srcDirs "engine", "dlls", "game_shared", "pm_shared", "regamedll", "public", "version" if (GradleCppUtils.windows) { srcDirs "testsuite" } diff --git a/regamedll/common/mathlib.h b/regamedll/common/mathlib.h index 4a350bc1..fd5d3242 100644 --- a/regamedll/common/mathlib.h +++ b/regamedll/common/mathlib.h @@ -32,6 +32,19 @@ #pragma once #endif +#ifdef HOOK_GAMEDLL + +// probably gamedll compiled with flag /fpmath:fasted, +// so we need to use type double, otherwise will be the test failed + +typedef double float_precision; + +#else // HOOK_GAMEDLL + +typedef float float_precision; + +#endif // HOOK_GAMEDLL + /* <42b7f> ../common/mathlib.h:3 */ typedef float vec_t; @@ -54,12 +67,20 @@ typedef union DLONG_u #define M_PI 3.14159265358979323846 -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) +//#ifndef max +//#define max(a,b) (((a) > (b)) ? (a) : (b)) +//#endif +// +//#ifndef min +//#define min(a,b) (((a) < (b)) ? (a) : (b)) +//#endif + +#ifndef _max +#define _max(a,b) (((a) > (b)) ? (a) : (b)) #endif -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) +#ifndef _min +#define _min(a,b) (((a) < (b)) ? (a) : (b)) #endif #define clamp(val, min, max) (((val) > (max)) ? (max) : (((val) < (min)) ? (min) : (val))) diff --git a/regamedll/dlls/activity.h b/regamedll/dlls/activity.h index fa7e71fc..9941d7e2 100644 --- a/regamedll/dlls/activity.h +++ b/regamedll/dlls/activity.h @@ -140,13 +140,16 @@ typedef enum ACT_WAVE, ACT_YES, ACT_NO, + } Activity; typedef struct { int type; char *name; + } activity_map_t; +/* size: 8, cachelines: 1, members: 2 */ extern activity_map_t activity_map[]; diff --git a/regamedll/dlls/airtank.cpp b/regamedll/dlls/airtank.cpp index 049947cc..14f60d25 100644 --- a/regamedll/dlls/airtank.cpp +++ b/regamedll/dlls/airtank.cpp @@ -16,12 +16,6 @@ TYPEDESCRIPTION (*CAirtank::pm_SaveData)[1]; #endif // HOOK_GAMEDLL -/* <4fc9> ../cstrike/dlls/airtank.cpp:29 */ -int CAirtank::BloodColor_(void) -{ - return DONT_BLEED; -} - /* <5329> ../cstrike/dlls/airtank.cpp:41 */ LINK_ENTITY_TO_CLASS(item_airtank, CAirtank); @@ -29,48 +23,77 @@ LINK_ENTITY_TO_CLASS(item_airtank, CAirtank); IMPLEMENT_SAVERESTORE(CAirtank, CGrenade); /* <50dd> ../cstrike/dlls/airtank.cpp:50 */ -void CAirtank::Spawn_(void) +void CAirtank::__MAKE_VHOOK(Spawn)(void) { -// Vector(Vector::Spawn(// float X, -// float Y, -// float Z); // 58 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 58 + Precache(); + + // motor + pev->movetype = MOVETYPE_FLY; + pev->solid = SOLID_BBOX; + + SET_MODEL(ENT(pev), "models/w_oxygen.mdl"); + UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 36)); + UTIL_SetOrigin(pev, pev->origin); + + SetTouch(&CAirtank::TankTouch); + SetThink(&CAirtank::TankThink); + + pev->flags |= FL_MONSTER; + pev->takedamage = DAMAGE_YES; + pev->health = 20; + pev->dmg = 50; + m_state = 1; } /* <4fef> ../cstrike/dlls/airtank.cpp:71 */ -void CAirtank::Precache_(void) +void CAirtank::__MAKE_VHOOK(Precache)(void) { + PRECACHE_MODEL("models/w_oxygen.mdl"); + PRECACHE_SOUND("doors/aliendoor3.wav"); } /* <503d> ../cstrike/dlls/airtank.cpp:78 */ -void CAirtank::Killed_(entvars_t *pevAttacker, int iGib) -{ -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 84 -// Vector(Vector *const this, -// const Vector &v); // 84 +void CAirtank::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) +{ + pev->owner = ENT(pevAttacker); + + // UNDONE: this should make a big bubble cloud, not an explosion + Explode(pev->origin, Vector(0, 0, -1)); } /* <5016> ../cstrike/dlls/airtank.cpp:88 */ void CAirtank::TankThink(void) { + // Fire trigger + m_state = 1; + SUB_UseTargets(this, USE_TOGGLE, 0); } /* <525d> ../cstrike/dlls/airtank.cpp:96 */ void CAirtank::TankTouch(CBaseEntity *pOther) { -// TankTouch(CAirtank *const this, -// class CBaseEntity *pOther); // 96 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 104 + if (!pOther->IsPlayer()) + { + return; + } + + if (!m_state) + { + // "no oxygen" sound + EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_swim2.wav", VOL_NORM, ATTN_NORM); + return; + } + + // give player 12 more seconds of air + pOther->pev->air_finished = gpGlobals->time + 12; + + // suit recharge sound + EMIT_SOUND(ENT(pev), CHAN_VOICE, "doors/aliendoor3.wav", VOL_NORM, ATTN_NORM); + + // recharge airtank in 30 seconds + pev->nextthink = gpGlobals->time + 30; + m_state = 0; + SUB_UseTargets(this, USE_TOGGLE, 1); } #ifdef HOOK_GAMEDLL @@ -98,11 +121,6 @@ int CAirtank::Restore(CRestore &restore) void CAirtank::Killed(entvars_t *pevAttacker, int iGib) { Killed_(pevAttacker, iGib); -} - -int CAirtank::BloodColor(void) -{ - return BloodColor_(); } #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/airtank.h b/regamedll/dlls/airtank.h index 04f23915..66a8ae9f 100644 --- a/regamedll/dlls/airtank.h +++ b/regamedll/dlls/airtank.h @@ -42,19 +42,25 @@ public: virtual int Save(CSave &save); virtual int Restore(CRestore &restore); virtual void Killed(entvars_t *pevAttacker, int iGib); - virtual int BloodColor(void); + virtual int BloodColor(void) + { + return BloodColor_(); + } public: void EXPORT TankThink(void); void EXPORT TankTouch(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL - NOBODY void Spawn_(void); - NOBODY void Precache_(void); - NOBODY int Save_(CSave &save); - NOBODY int Restore_(CRestore &restore); - NOBODY void Killed_(entvars_t *pevAttacker, int iGib); - NOBODY int BloodColor_(void); + void Spawn_(void); + void Precache_(void); + int Save_(CSave &save); + int Restore_(CRestore &restore); + void Killed_(entvars_t *pevAttacker, int iGib); + int BloodColor_(void) + { + return DONT_BLEED; + } #endif // HOOK_GAMEDLL @@ -66,6 +72,6 @@ private: }; -//NOBODY void item_airtank(entvars_t *pev); +C_DLLEXPORT void item_airtank(entvars_t *pev); #endif // AIRTANK_H diff --git a/regamedll/dlls/ammo.cpp b/regamedll/dlls/ammo.cpp index 544bfbe6..62052272 100644 --- a/regamedll/dlls/ammo.cpp +++ b/regamedll/dlls/ammo.cpp @@ -1,217 +1,307 @@ #include "precompiled.h" -/* ../cstrike/dlls/ammo.cpp:16 */ -void C9MMAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:16 */ +void C9MMAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:22 */ -void C9MMAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:22 */ +void C9MMAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:27 */ -BOOL C9MMAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C9MMAmmo *const this, -// class CBaseEntity *pOther); // 27 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:27 */ +BOOL C9MMAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_9MM_BUY, "9mm", MAX_AMMO_9MM) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:37 */ -LINK_ENTITY_TO_CLASS(ammo_9mm, C9MMAmmo); +/* ../cstrike/dlls/ammo.cpp:37 */ +LINK_ENTITY_TO_CLASS(ammo_9mm, C9MMAmmo); -/* ../cstrike/dlls/ammo.cpp:42 */ -void CBuckShotAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:42 */ +void CBuckShotAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_shotbox.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:48 */ -void CBuckShotAmmo::Precache_(void) -{ -} - -/* ../cstrike/dlls/ammo.cpp:53 */ -BOOL CBuckShotAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(CBuckShotAmmo *const this, -// class CBaseEntity *pOther); // 53 - return FALSE; -} - -/* ../cstrike/dlls/ammo.cpp:63 */ -LINK_ENTITY_TO_CLASS(ammo_buckshot, CBuckShotAmmo); - -/* ../cstrike/dlls/ammo.cpp:69 */ -void C556NatoAmmo::Spawn_(void) -{ -} - -/* ../cstrike/dlls/ammo.cpp:75 */ -void C556NatoAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:48 */ +void CBuckShotAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_shotbox.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:80 */ -BOOL C556NatoAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C556NatoAmmo *const this, -// class CBaseEntity *pOther); // 80 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:53 */ +BOOL CBuckShotAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_BUCKSHOT_BUY, "buckshot", MAX_AMMO_BUCKSHOT) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:90 */ +/* ../cstrike/dlls/ammo.cpp:63 */ +LINK_ENTITY_TO_CLASS(ammo_buckshot, CBuckShotAmmo); + +/* ../cstrike/dlls/ammo.cpp:69 */ +void C556NatoAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); +} + +/* ../cstrike/dlls/ammo.cpp:75 */ +void C556NatoAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); +} + +/* ../cstrike/dlls/ammo.cpp:80 */ +BOOL C556NatoAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_556NATO_BUY, "556Nato", MAX_AMMO_556NATO) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; +} + +/* ../cstrike/dlls/ammo.cpp:90 */ LINK_ENTITY_TO_CLASS(ammo_556nato, C556NatoAmmo); -/* ../cstrike/dlls/ammo.cpp:95 */ -void C556NatoBoxAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:95 */ +void C556NatoBoxAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:101 */ -void C556NatoBoxAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:101 */ +void C556NatoBoxAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:106 */ -BOOL C556NatoBoxAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C556NatoBoxAmmo *const this, -// class CBaseEntity *pOther); // 106 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:106 */ +BOOL C556NatoBoxAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_556NATOBOX_BUY, "556NatoBox", MAX_AMMO_556NATOBOX) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:116 */ -LINK_ENTITY_TO_CLASS(ammo_556natobox, C556NatoBoxAmmo); - -/* ../cstrike/dlls/ammo.cpp:121 */ -void C762NatoAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:116 */ +LINK_ENTITY_TO_CLASS(ammo_556natobox, C556NatoBoxAmmo); + +/* ../cstrike/dlls/ammo.cpp:121 */ +void C762NatoAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:127 */ -void C762NatoAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:127 */ +void C762NatoAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:132 */ -BOOL C762NatoAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C762NatoAmmo *const this, -// class CBaseEntity *pOther); // 132 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:132 */ +BOOL C762NatoAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_762NATO_BUY, "762Nato", MAX_AMMO_762NATO) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:142 */ -LINK_ENTITY_TO_CLASS(ammo_762nato, C762NatoAmmo); +/* ../cstrike/dlls/ammo.cpp:142 */ +LINK_ENTITY_TO_CLASS(ammo_762nato, C762NatoAmmo); -/* ../cstrike/dlls/ammo.cpp:147 */ -void C45ACPAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:147 */ +void C45ACPAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:153 */ -void C45ACPAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:153 */ +void C45ACPAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:158 */ -BOOL C45ACPAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C45ACPAmmo *const this, -// class CBaseEntity *pOther); // 158 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:158 */ +BOOL C45ACPAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_45ACP_BUY, "45acp", MAX_AMMO_45ACP) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:168 */ +/* ../cstrike/dlls/ammo.cpp:168 */ LINK_ENTITY_TO_CLASS(ammo_45acp, C45ACPAmmo); -/* ../cstrike/dlls/ammo.cpp:173 */ -void C50AEAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:173 */ +void C50AEAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:179 */ -void C50AEAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:179 */ +void C50AEAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:184 */ -BOOL C50AEAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C50AEAmmo *const this, -// class CBaseEntity *pOther); // 184 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:184 */ +BOOL C50AEAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_50AE_BUY, "50AE", MAX_AMMO_50AE) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } /* ../cstrike/dlls/ammo.cpp:194 */ LINK_ENTITY_TO_CLASS(ammo_50ae, C50AEAmmo); -/* ../cstrike/dlls/ammo.cpp:199 */ -void C338MagnumAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:199 */ +void C338MagnumAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:205 */ -void C338MagnumAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:205 */ +void C338MagnumAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:210 */ -BOOL C338MagnumAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C338MagnumAmmo *const this, -// class CBaseEntity *pOther); // 210 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:210 */ +BOOL C338MagnumAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_338MAG_BUY, "338Magnum", MAX_AMMO_338MAGNUM) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:220 */ +/* ../cstrike/dlls/ammo.cpp:220 */ LINK_ENTITY_TO_CLASS(ammo_338magnum, C338MagnumAmmo); -/* ../cstrike/dlls/ammo.cpp:226 */ -void C57MMAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:226 */ +void C57MMAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:232 */ -void C57MMAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:232 */ +void C57MMAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:237 */ -BOOL C57MMAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C57MMAmmo *const this, -// class CBaseEntity *pOther); // 237 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:237 */ +BOOL C57MMAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_57MM_BUY, "57mm", MAX_AMMO_57MM) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:247 */ +/* ../cstrike/dlls/ammo.cpp:247 */ LINK_ENTITY_TO_CLASS(ammo_57mm, C57MMAmmo); -/* ../cstrike/dlls/ammo.cpp:251 */ -void C357SIGAmmo::Spawn_(void) -{ +/* ../cstrike/dlls/ammo.cpp:251 */ +void C357SIGAmmo::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); + CBasePlayerAmmo::Spawn(); } -/* ../cstrike/dlls/ammo.cpp:257 */ -void C357SIGAmmo::Precache_(void) -{ +/* ../cstrike/dlls/ammo.cpp:257 */ +void C357SIGAmmo::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_9mmclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } -/* ../cstrike/dlls/ammo.cpp:262 */ -BOOL C357SIGAmmo::AddAmmo_(CBaseEntity *pOther) -{ -// AddAmmo(C357SIGAmmo *const this, -// class CBaseEntity *pOther); // 262 - return FALSE; +/* ../cstrike/dlls/ammo.cpp:262 */ +BOOL C357SIGAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther) +{ + if (pOther->GiveAmmo(AMMO_357SIG_BUY, "357SIG", MAX_AMMO_357SIG) == -1) + { + return FALSE; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + return TRUE; } -/* ../cstrike/dlls/ammo.cpp:272 */ +/* ../cstrike/dlls/ammo.cpp:272 */ LINK_ENTITY_TO_CLASS(ammo_357sig, C357SIGAmmo); - -#ifdef HOOK_GAMEDLL - + +#ifdef HOOK_GAMEDLL + void C9MMAmmo::Spawn(void) { Spawn_(); @@ -226,7 +316,7 @@ BOOL C9MMAmmo::AddAmmo(CBaseEntity *pOther) { return AddAmmo_(pOther); } - + void CBuckShotAmmo::Spawn(void) { Spawn_(); @@ -241,7 +331,7 @@ BOOL CBuckShotAmmo::AddAmmo(CBaseEntity *pOther) { return AddAmmo_(pOther); } - + void C556NatoAmmo::Spawn(void) { Spawn_(); @@ -256,110 +346,110 @@ BOOL C556NatoAmmo::AddAmmo(CBaseEntity *pOther) { return AddAmmo_(pOther); } - -void C556NatoBoxAmmo::Spawn(void) -{ - Spawn_(); -} - -void C556NatoBoxAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C556NatoBoxAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C762NatoAmmo::Spawn(void) -{ - Spawn_(); -} - -void C762NatoAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C762NatoAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C45ACPAmmo::Spawn(void) -{ - Spawn_(); -} - -void C45ACPAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C45ACPAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C50AEAmmo::Spawn(void) -{ - Spawn_(); -} - -void C50AEAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C50AEAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C338MagnumAmmo::Spawn(void) -{ - Spawn_(); -} - -void C338MagnumAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C338MagnumAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C57MMAmmo::Spawn(void) -{ - Spawn_(); -} - -void C57MMAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C57MMAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -void C357SIGAmmo::Spawn(void) -{ - Spawn_(); -} - -void C357SIGAmmo::Precache(void) -{ - Precache_(); -} - -BOOL C357SIGAmmo::AddAmmo(CBaseEntity *pOther) -{ - return AddAmmo_(pOther); -} - -#endif // HOOK_GAMEDLL + +void C556NatoBoxAmmo::Spawn(void) +{ + Spawn_(); +} + +void C556NatoBoxAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C556NatoBoxAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C762NatoAmmo::Spawn(void) +{ + Spawn_(); +} + +void C762NatoAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C762NatoAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C45ACPAmmo::Spawn(void) +{ + Spawn_(); +} + +void C45ACPAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C45ACPAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C50AEAmmo::Spawn(void) +{ + Spawn_(); +} + +void C50AEAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C50AEAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C338MagnumAmmo::Spawn(void) +{ + Spawn_(); +} + +void C338MagnumAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C338MagnumAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C57MMAmmo::Spawn(void) +{ + Spawn_(); +} + +void C57MMAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C57MMAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +void C357SIGAmmo::Spawn(void) +{ + Spawn_(); +} + +void C357SIGAmmo::Precache(void) +{ + Precache_(); +} + +BOOL C357SIGAmmo::AddAmmo(CBaseEntity *pOther) +{ + return AddAmmo_(pOther); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/ammo.h b/regamedll/dlls/ammo.h index 679344c0..796a07fe 100644 --- a/regamedll/dlls/ammo.h +++ b/regamedll/dlls/ammo.h @@ -41,9 +41,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -57,9 +59,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -73,9 +77,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -89,9 +95,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -105,9 +113,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -121,9 +131,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -137,9 +149,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -153,9 +167,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -169,9 +185,11 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -185,11 +203,24 @@ public: virtual BOOL AddAmmo(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); BOOL AddAmmo_(CBaseEntity *pOther); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ + +C_DLLEXPORT void ammo_9mm(entvars_t *pev); // C9MMAmmo +C_DLLEXPORT void ammo_buckshot(entvars_t *pev); // CBuckShotAmmo +C_DLLEXPORT void ammo_556nato(entvars_t *pev); // C556NatoAmmo +C_DLLEXPORT void ammo_556natobox(entvars_t *pev); // C556NatoBoxAmmo +C_DLLEXPORT void ammo_762nato(entvars_t *pev); // C762NatoAmmo +C_DLLEXPORT void ammo_45acp(entvars_t *pev); // C45ACPAmmo +C_DLLEXPORT void ammo_50ae(entvars_t *pev); // C50AEAmmo +C_DLLEXPORT void ammo_338magnum(entvars_t *pev); // C338MagnumAmmo +C_DLLEXPORT void ammo_57mm(entvars_t *pev); // C57MMAmmo +C_DLLEXPORT void ammo_357sig(entvars_t *pev); // C357SIGAmmo #endif // AMMO_H diff --git a/regamedll/dlls/animating.cpp b/regamedll/dlls/animating.cpp index f1d90ff3..338ce9b7 100644 --- a/regamedll/dlls/animating.cpp +++ b/regamedll/dlls/animating.cpp @@ -64,23 +64,44 @@ int CBaseAnimating::LookupActivity(int activity) } /* <10653> ../cstrike/dlls/animating.cpp:91 */ -NOBODY int CBaseAnimating::LookupActivityHeaviest(int activity) +int CBaseAnimating::LookupActivityHeaviest(int activity) { -// { -// void *pmodel; // 93 -// } + void *pmodel = GET_MODEL_PTR(ENT(pev)); + return ::LookupActivityHeaviest(pmodel, pev, activity); } /* <107b1> ../cstrike/dlls/animating.cpp:136 */ -NOBODY void CBaseAnimating::DispatchAnimEvents(float flInterval) +void CBaseAnimating::DispatchAnimEvents(float flInterval) { -// { -// MonsterEvent_t event; // 138 -// void *pmodel; // 140 -// float flStart; // 152 -// float flEnd; // 153 -// int index; // 160 -// } + MonsterEvent_t event; + void *pmodel = GET_MODEL_PTR(ENT(pev)); + + if (!pmodel) + { + ALERT(at_aiconsole, "Gibbed monster is thinking!\n"); + return; + } + + // FIXME: I have to do this or some events get missed, and this is probably causing the problem below + flInterval = 0.1f; + + // FIX: this still sometimes hits events twice + float flStart = pev->frame + (m_flLastEventCheck - pev->animtime) * m_flFrameRate * pev->framerate; + float flEnd = pev->frame + flInterval * m_flFrameRate * pev->framerate; + + m_fSequenceFinished = FALSE; + m_flLastEventCheck = pev->animtime + flInterval; + + if (flEnd >= 256.0f || flEnd <= 0.0f) + { + m_fSequenceFinished = TRUE; + } + + int index = 0; + while ((index = GetAnimationEvent(pmodel, pev, &event, flStart, flEnd, index)) != 0) + { + HandleAnimEvent(&event); + } } /* <106a1> ../cstrike/dlls/animating.cpp:100 */ @@ -114,7 +135,7 @@ BOOL CBaseAnimating::GetSequenceFlags(void) /* <10837> ../cstrike/dlls/animating.cpp:171 */ float CBaseAnimating::SetBoneController(int iController, float flValue) { - void *pmodel = GET_MODEL_PTR( ENT(pev) ); + void *pmodel = GET_MODEL_PTR(ENT(pev)); return SetController(pmodel, pev, iController, flValue); } @@ -131,96 +152,134 @@ void CBaseAnimating::InitBoneControllers(void) } /* <108d3> ../cstrike/dlls/animating.cpp:192 */ -NOBODY float CBaseAnimating::SetBlending(int iBlender, float flValue) +NOXREF float CBaseAnimating::SetBlending(int iBlender, float flValue) { -// { -// void *pmodel; // 194 -// } + void *pmodel = GET_MODEL_PTR(ENT(pev)); + return ::SetBlending(pmodel, pev, iBlender, flValue); } /* <1092f> ../cstrike/dlls/animating.cpp:201 */ -NOBODY void CBaseAnimating::GetBonePosition(int iBone, Vector &origin, Vector &angles) +NOXREF void CBaseAnimating::GetBonePosition(int iBone, Vector &origin, Vector &angles) { + GET_BONE_POSITION(ENT(pev), iBone, origin, angles); } /* <10984> ../cstrike/dlls/animating.cpp:208 */ -NOBODY void CBaseAnimating::GetAttachment(int iAttachment, Vector &origin, Vector &angles) +NOXREF void CBaseAnimating::GetAttachment(int iAttachment, Vector &origin, Vector &angles) { + GET_ATTACHMENT(ENT(pev), iAttachment, origin, angles); } /* <109d4> ../cstrike/dlls/animating.cpp:215 */ -NOBODY int CBaseAnimating::FindTransition(int iEndingSequence, int iGoalSequence, int *piDir) +NOXREF int CBaseAnimating::FindTransition(int iEndingSequence, int iGoalSequence, int *piDir) { -// { -// void *pmodel; // 217 -// { -// int iDir; // 221 -// int sequence; // 222 -// } -// } + void *pmodel = GET_MODEL_PTR(ENT(pev)); + + if (piDir == NULL) + { + int iDir; + int sequence = ::FindTransition(pmodel, iEndingSequence, iGoalSequence, &iDir); + + if (iDir != 1) + sequence = -1; + + return sequence; + } + + return ::FindTransition(pmodel, iEndingSequence, iGoalSequence, piDir); + } /* <10a5d> ../cstrike/dlls/animating.cpp:234 */ NOXREF void CBaseAnimating::GetAutomovement(Vector &origin, Vector &angles, float flInterval) { + ; } /* <10aad> ../cstrike/dlls/animating.cpp:239 */ -NOBODY void CBaseAnimating::SetBodygroup(int iGroup, int iValue) +NOXREF void CBaseAnimating::SetBodygroup(int iGroup, int iValue) { + ::SetBodygroup(GET_MODEL_PTR(ENT(pev)), pev, iGroup, iValue); } /* <10af0> ../cstrike/dlls/animating.cpp:244 */ -NOBODY int CBaseAnimating::GetBodygroup(int iGroup) +NOXREF int CBaseAnimating::GetBodygroup(int iGroup) { + return ::GetBodygroup(GET_MODEL_PTR(ENT(pev)), pev, iGroup); } /* <10b5f> ../cstrike/dlls/animating.cpp:250 */ -NOBODY int CBaseAnimating::ExtractBbox(int sequence, float *mins, float *maxs) +int CBaseAnimating::ExtractBbox(int sequence, float *mins, float *maxs) { + return ::ExtractBbox(GET_MODEL_PTR(ENT(pev)), sequence, mins, maxs); } /* <10b99> ../cstrike/dlls/animating.cpp:258 */ -NOBODY void CBaseAnimating::SetSequenceBox(void) +void CBaseAnimating::SetSequenceBox(void) { -// { -// class Vector mins; // 260 -// class Vector maxs; // 260 -// ExtractBbox(CBaseAnimating *const this, -// int sequence, -// float *mins, -// float *maxs); // 263 -// { -// float yaw; // 267 -// class Vector xvector; // 269 -// class Vector yvector; // 269 -// class Vector bounds; // 274 -// class Vector rmin; // 279 -// class Vector rmax; // 280 -// class Vector base; // 281 -// class Vector transformed; // 281 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 280 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 279 -// { -// int i; // 283 -// { -// int j; // 286 -// { -// int k; // 289 -// { -// int l; // 298 -// } -// } -// } -// } -// } -// } + Vector mins, maxs; + + // Get sequence bbox + if (ExtractBbox(pev->sequence, mins, maxs)) + { + // expand box for rotation + // find min / max for rotations + float yaw = pev->angles.y * (M_PI / 180.0); + + Vector xvector, yvector; + xvector.x = cos(yaw); + xvector.y = sin(yaw); + yvector.x = -sin(yaw); + yvector.y = cos(yaw); + + Vector bounds[2]; + bounds[0] = mins; + bounds[1] = maxs; + + Vector rmin(9999, 9999, 9999); + Vector rmax(-9999, -9999, -9999); + + Vector base, transformed; + for (int i = 0; i <= 1; i++) + { + base.x = bounds[i].x; + for (int j = 0; j <= 1; j++) + { + base.y = bounds[j].y; + for (int k = 0; k <= 1; k++) + { + base.z = bounds[k].z; + + // transform the point + transformed.x = xvector.x * base.x + yvector.x * base.y; + transformed.y = xvector.y * base.x + yvector.y * base.y; + transformed.z = base.z; + + if (transformed.x < rmin.x) + rmin.x = transformed.x; + + if (transformed.x > rmax.x) + rmax.x = transformed.x; + + if (transformed.y < rmin.y) + rmin.y = transformed.y; + + if (transformed.y > rmax.y) + rmax.y = transformed.y; + + if (transformed.z < rmin.z) + rmin.z = transformed.z; + + if (transformed.z > rmax.z) + rmax.z = transformed.z; + } + } + } + + rmin.z = 0; + rmax.z = rmin.z + 1; + UTIL_SetSize(pev, rmin, rmax); + } } #ifdef HOOK_GAMEDLL @@ -235,9 +294,4 @@ int CBaseAnimating::Restore(CRestore &restore) return Restore_(restore); } -//void CBaseAnimating::HandleAnimEvent(MonsterEvent_t *pEvent) -//{ -// HandleAnimEvent_(pEvent); -//} - #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/animation.cpp b/regamedll/dlls/animation.cpp index 939f273b..c2078572 100644 --- a/regamedll/dlls/animation.cpp +++ b/regamedll/dlls/animation.cpp @@ -30,94 +30,154 @@ float sclp; float sclq; /* <1523e> ../cstrike/dlls/animation.cpp:57 */ -NOBODY int ExtractBbox(void *pmodel, int sequence, float *mins, float *maxs) +int ExtractBbox(void *pmodel, int sequence, float *mins, float *maxs) { -// { -// studiohdr_t *pstudiohdr; // 59 -// mstudioseqdesc_t *pseqdesc; // 65 -// } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + + if (!pstudiohdr) + { + return 0; + } + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); + + mins[0] = pseqdesc[sequence].bbmin[0]; + mins[1] = pseqdesc[sequence].bbmin[1]; + mins[2] = pseqdesc[sequence].bbmin[2]; + + maxs[0] = pseqdesc[sequence].bbmax[0]; + maxs[1] = pseqdesc[sequence].bbmax[1]; + maxs[2] = pseqdesc[sequence].bbmax[2]; + + return 1; } /* <152c6> ../cstrike/dlls/animation.cpp:81 */ int LookupActivity(void *pmodel, entvars_t *pev, int activity) { - int i; - int weightTotal = 0; - int activitySequenceCount = 0; - int weight = 0; - int select; - - studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; - if (!pstudiohdr) - return 0; - - mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); - for (i = 0; i < pstudiohdr->numseq; i++) - { - if (pseqdesc[i].activity == activity) - { - weightTotal += pseqdesc[i].actweight; - activitySequenceCount++; - } - } - if (activitySequenceCount) - { - if (!weightTotal) - { - select = RANDOM_LONG(0, activitySequenceCount - 1); - for (i = 0; i < pstudiohdr->numseq; i++) - { - if (pseqdesc[i].activity == activity) - { - if (!select) - return i; - --select; - } - } - return ACTIVITY_NOT_AVAILABLE; - } - select = RANDOM_LONG(0, weightTotal - 1); - for (i = 0; i < pstudiohdr->numseq; i++) - { - if (pseqdesc[i].activity == activity) - { - weight += pseqdesc[i].actweight; - if (weight > select) - return i; - } - } - } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + + if (!pstudiohdr) + { + return 0; + } + + mstudioseqdesc_t *pseqdesc; + + int i; + int weightTotal = 0; + int activitySequenceCount = 0; + int weight = 0; + int select; + + pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); + + for (i = 0; i < pstudiohdr->numseq; i++) + { + if (pseqdesc[i].activity == activity) + { + weightTotal += pseqdesc[i].actweight; + ++activitySequenceCount; + } + } + + if (activitySequenceCount > 0) + { + if (weightTotal) + { + int which = RANDOM_LONG(0, weightTotal - 1); + + for (i = 0; i < pstudiohdr->numseq; i++) + { + if (pseqdesc[i].activity == activity) + { + weight += pseqdesc[i].actweight; + + if (weight > which) + { + return i; + } + } + } + } + else + { + select = RANDOM_LONG(0, activitySequenceCount - 1); + + for (i = 0; i < pstudiohdr->numseq; i++) + { + if (pseqdesc[i].activity == activity) + { + if (select == 0) + { + return i; + } + + --select; + } + } + } + } + return ACTIVITY_NOT_AVAILABLE; } /* <1539a> ../cstrike/dlls/animation.cpp:149 */ -NOBODY int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity) +int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity) { -// { -// studiohdr_t *pstudiohdr; // 151 -// mstudioseqdesc_t *pseqdesc; // 157 -// int weight; // 161 -// int seq; // 162 -// { -// int i; // 163 -// } -// } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + + if (!pstudiohdr) + { + return 0; + } + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); + int weight = 0; + int seq = ACTIVITY_NOT_AVAILABLE; + + for (int i = 0; i < pstudiohdr->numseq; i++) + { + if (pseqdesc[i].activity == activity) + { + if (pseqdesc[i].actweight > weight) + { + weight = pseqdesc[i].actweight; + seq = i; + } + } + } + + return seq; } /* <15439> ../cstrike/dlls/animation.cpp:178 */ -NOBODY void GetEyePosition(void *pmodel, float *vecEyePosition) +NOXREF void GetEyePosition(void *pmodel, float *vecEyePosition) { -// { -// studiohdr_t *pstudiohdr; // 180 -// } + studiohdr_t *pstudiohdr; + + pstudiohdr = (studiohdr_t *)pmodel; + + if (!pstudiohdr) + { + ALERT(at_console, "GetEyePosition() Can't get pstudiohdr ptr!\n"); + return; + } + + vecEyePosition[0] = pstudiohdr->eyeposition[0]; + vecEyePosition[1] = pstudiohdr->eyeposition[1]; + vecEyePosition[2] = pstudiohdr->eyeposition[2]; } /* <15485> ../cstrike/dlls/animation.cpp:193 */ int LookupSequence(void *pmodel, const char *label) { studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + { return 0; + } mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); for (int i = 0; i < pstudiohdr->numseq; i++) @@ -129,35 +189,62 @@ int LookupSequence(void *pmodel, const char *label) } /* <1518c> ../cstrike/dlls/animation.cpp:215 */ -NOBODY int IsSoundEvent(int eventNumber) +int IsSoundEvent(int eventNumber) { + if (eventNumber == SCRIPT_EVENT_SOUND || eventNumber == SCRIPT_EVENT_SOUND_VOICE) + { + return 1; + } + + return 0; } /* <15539> ../cstrike/dlls/animation.cpp:223 */ -NOBODY void SequencePrecache(void *pmodel, const char *pSequenceName) +NOXREF void SequencePrecache(void *pmodel, const char *pSequenceName) { -// { -// int index; // 225 -// LookupSequence(void *pmodel, -// const char *label); // 225 -// { -// studiohdr_t *pstudiohdr; // 228 -// mstudioseqdesc_t *pseqdesc; // 234 -// mstudioevent_t *pevent; // 235 -// { -// int i; // 240 -// IsSoundEvent(int eventNumber); // 248 -// } -// } -// } + int index = LookupSequence(pmodel, pSequenceName); + + if (index >= 0) + { + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr || index >= pstudiohdr->numseq) + { + return; + } + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + index; + mstudioevent_t *pevent = (mstudioevent_t *)((byte *)pstudiohdr + pseqdesc->eventindex); + + for (int i = 0; i < pseqdesc->numevents; i++) + { + // Don't send client-side events to the server AI + if (pevent[i].event >= EVENT_CLIENT) + continue; + + // UNDONE: Add a callback to check to see if a sound is precached yet and don't allocate a copy + // of it's name if it is. + if (IsSoundEvent(pevent[i].event)) + { + if (!Q_strlen(pevent[i].options)) + { + ALERT(at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options); + } + + PRECACHE_SOUND((char *)(gpGlobals->pStringBase + ALLOC_STRING(pevent[i].options))); + } + } + } } /* <15634> ../cstrike/dlls/animation.cpp:263 */ void GetSequenceInfo(void *pmodel, entvars_t *pev, float *pflFrameRate, float *pflGroundSpeed) { studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + { return; + } if (pev->sequence >= pstudiohdr->numseq) { @@ -183,22 +270,66 @@ void GetSequenceInfo(void *pmodel, entvars_t *pev, float *pflFrameRate, float *p int GetSequenceFlags(void *pmodel, entvars_t *pev) { studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr || pev->sequence >= pstudiohdr->numseq) + { return 0; + } mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; return pseqdesc->flags; } /* <15717> ../cstrike/dlls/animation.cpp:312 */ -NOBODY int GetAnimationEvent(void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index) +int GetAnimationEvent(void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index) { -// { -// studiohdr_t *pstudiohdr; // 314 -// int events; // 320 -// mstudioseqdesc_t *pseqdesc; // 322 -// mstudioevent_t *pevent; // 323 -// } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + + if (!pstudiohdr || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent) + { + return 0; + } + + // int events = 0; + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; + mstudioevent_t *pevent = (mstudioevent_t *)((byte *)pstudiohdr + pseqdesc->eventindex); + + if (pseqdesc->numevents == 0 || index > pseqdesc->numevents) + { + return 0; + } + + if (pseqdesc->numframes > 1) + { + flStart *= (pseqdesc->numframes - 1) / 256.0; + flEnd *= (pseqdesc->numframes - 1) / 256.0; + } + else + { + flStart = 0; + flEnd = 1.0; + } + + for (; index < pseqdesc->numevents; index++) + { + // Don't send client-side events to the server AI + if (pevent[index].event >= EVENT_CLIENT) + continue; + + if ((pevent[index].frame >= flStart && pevent[index].frame < flEnd) || + ((pseqdesc->flags & STUDIO_LOOPING) + && flEnd >= pseqdesc->numframes - 1 + && pevent[index].frame < flEnd - pseqdesc->numframes + 1)) + { + pMonsterEvent->event = pevent[index].event; + pMonsterEvent->options = pevent[index].options; + + return index + 1; + } + } + + return 0; } /* <157e1> ../cstrike/dlls/animation.cpp:359 */ @@ -207,7 +338,9 @@ float SetController(void *pmodel, entvars_t *pev, int iController, float flValue studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; if (!pstudiohdr) + { return flValue; + } int i; mstudiobonecontroller_t *pbonecontroller = (mstudiobonecontroller_t *)((byte *)pstudiohdr + pstudiohdr->bonecontrollerindex); @@ -257,36 +390,143 @@ float SetController(void *pmodel, entvars_t *pev, int iController, float flValue } /* <15883> ../cstrike/dlls/animation.cpp:414 */ -NOBODY float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue) -{ -// { -// studiohdr_t *pstudiohdr; // 416 -// mstudioseqdesc_t *pseqdesc; // 422 -// int setting; // 445 -// } +float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue) +{ + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + { + return flValue; + } + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; + + if (pseqdesc->blendtype[iBlender] == 0) + { + return flValue; + } + + if (pseqdesc->blendtype[iBlender] & (STUDIO_XR | STUDIO_YR | STUDIO_ZR)) + { + // ugly hack, invert value if end < start + if (pseqdesc->blendend[iBlender] < pseqdesc->blendstart[iBlender]) + flValue = -flValue; + + // does the controller not wrap? + if (pseqdesc->blendstart[iBlender] + 359.0 >= pseqdesc->blendend[iBlender]) + { + if (flValue > ((pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender]) / 2.0) + 180) + { + flValue = flValue - 360; + } + + if (flValue < ((pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender]) / 2.0) - 180) + { + flValue = flValue + 360; + } + } + } + + int setting = (int64_t)(255.0f * (flValue - pseqdesc->blendstart[iBlender]) / (pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender])); + + if (setting < 0) + setting = 0; + + if (setting > 255) + setting = 255; + + pev->blending[iBlender] = setting; + + return setting * (1.0 / 255.0) * (pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender]) + pseqdesc->blendstart[iBlender]; } /* <15917> ../cstrike/dlls/animation.cpp:458 */ -NOBODY int FindTransition(void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir) +int FindTransition(void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir) { -// { -// studiohdr_t *pstudiohdr; // 460 -// mstudioseqdesc_t *pseqdesc; // 466 -// int iEndNode; // 475 -// byte *pTransition; // 492 -// int iInternNode; // 494 -// int i; // 499 -// } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + { + return iGoalAnim; + } + + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); + + // bail if we're going to or from a node 0 + if (pseqdesc[iEndingAnim].entrynode == 0 || pseqdesc[iGoalAnim].entrynode == 0) + { + return iGoalAnim; + } + + int iEndNode; + + if (*piDir > 0) + { + iEndNode = pseqdesc[iEndingAnim].exitnode; + } + else + { + iEndNode = pseqdesc[iEndingAnim].entrynode; + } + + if (iEndNode == pseqdesc[iGoalAnim].entrynode) + { + *piDir = 1; + return iGoalAnim; + } + + byte *pTransition = ((byte *)pstudiohdr + pstudiohdr->transitionindex); + + int iInternNode = pTransition[(iEndNode - 1)*pstudiohdr->numtransitions + (pseqdesc[iGoalAnim].entrynode - 1)]; + + if (iInternNode == 0) + { + return iGoalAnim; + } + + // look for someone going + for (int i = 0; i < pstudiohdr->numseq; i++) + { + if (pseqdesc[i].entrynode == iEndNode && pseqdesc[i].exitnode == iInternNode) + { + *piDir = 1; + return i; + } + if (pseqdesc[i].nodeflags) + { + if (pseqdesc[i].exitnode == iEndNode && pseqdesc[i].entrynode == iInternNode) + { + *piDir = -1; + return i; + } + } + } + + ALERT(at_console, "error in transition graph"); + return iGoalAnim; } /* <159d8> ../cstrike/dlls/animation.cpp:523 */ -NOBODY void SetBodygroup(void *pmodel, entvars_t *pev, int iGroup, int iValue) +void SetBodygroup(void *pmodel, entvars_t *pev, int iGroup, int iValue) { -// { -// studiohdr_t *pstudiohdr; // 525 -// mstudiobodyparts_t *pbodypart; // 534 -// int iCurrent; // 539 -// } + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + { + return; + } + + if (iGroup > pstudiohdr->numbodyparts) + { + return; + } + + mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex) + iGroup; + + if (iValue >= pbodypart->nummodels) + { + return; + } + + int iCurrent = (pev->body / pbodypart->base) % pbodypart->nummodels; + pev->body += (iValue - iCurrent) * pbodypart->base; } /* <15a6d> ../cstrike/dlls/animation.cpp:545 */ @@ -294,11 +534,10 @@ int GetBodygroup(void *pmodel, entvars_t *pev, int iGroup) { studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; - if (!pstudiohdr) - return 0; - - if (iGroup > pstudiohdr->numbodyparts) + if (!pstudiohdr || iGroup > pstudiohdr->numbodyparts) + { return 0; + } mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex) + iGroup; diff --git a/regamedll/dlls/animation.h b/regamedll/dlls/animation.h index 4163508b..19154292 100644 --- a/regamedll/dlls/animation.h +++ b/regamedll/dlls/animation.h @@ -36,20 +36,20 @@ #include "studio.h" #include "r_studioint.h" -NOBODY int ExtractBbox(void *pmodel, int sequence, float *mins, float *maxs); +int ExtractBbox(void *pmodel, int sequence, float *mins, float *maxs); int LookupActivity(void *pmodel, entvars_t *pev, int activity); -NOBODY int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity); -NOBODY void GetEyePosition(void *pmodel, float *vecEyePosition); +int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity); +NOXREF void GetEyePosition(void *pmodel, float *vecEyePosition); int LookupSequence(void *pmodel, const char *label); -NOBODY int IsSoundEvent(int eventNumber); -NOBODY void SequencePrecache(void *pmodel, const char *pSequenceName); +int IsSoundEvent(int eventNumber); +NOXREF void SequencePrecache(void *pmodel, const char *pSequenceName); void GetSequenceInfo(void *pmodel, entvars_t *pev, float *pflFrameRate, float *pflGroundSpeed); int GetSequenceFlags(void *pmodel, entvars_t *pev); -NOBODY int GetAnimationEvent(void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index); +int GetAnimationEvent(void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index); float SetController(void *pmodel, entvars_t *pev, int iController, float flValue); -NOBODY float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue); -NOBODY int FindTransition(void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir); -NOBODY void SetBodygroup(void *pmodel, entvars_t *pev, int iGroup, int iValue); +float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue); +int FindTransition(void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir); +void SetBodygroup(void *pmodel, entvars_t *pev, int iGroup, int iValue); int GetBodygroup(void *pmodel, entvars_t *pev, int iGroup); C_DLLEXPORT int Server_GetBlendingInterface(int version, struct sv_blending_interface_s **ppinterface, struct engine_studio_api_s *pstudio, float *rotationmatrix, float *bonetransform); void AngleQuaternion(vec_t *angles, vec_t *quaternion); diff --git a/regamedll/dlls/basemonster.h b/regamedll/dlls/basemonster.h index 5f337221..fecc1673 100644 --- a/regamedll/dlls/basemonster.h +++ b/regamedll/dlls/basemonster.h @@ -70,14 +70,8 @@ public: 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 diff --git a/regamedll/dlls/bmodels.cpp b/regamedll/dlls/bmodels.cpp index 76cf8096..d1f11add 100644 --- a/regamedll/dlls/bmodels.cpp +++ b/regamedll/dlls/bmodels.cpp @@ -43,12 +43,12 @@ Vector VecBModelOrigin(entvars_t *pevBModel) LINK_ENTITY_TO_CLASS(func_wall, CFuncWall); /* <1d193> ../cstrike/dlls/bmodels.cpp:65 */ -NOBODY void CFuncWall::Spawn_(void) +NOBODY void CFuncWall::__MAKE_VHOOK(Spawn)(void) { } /* <1d873> ../cstrike/dlls/bmodels.cpp:77 */ -NOBODY void CFuncWall::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncWall::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CFuncWall *const this, // class CBaseEntity *pActivator, @@ -61,7 +61,7 @@ NOBODY void CFuncWall::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T LINK_ENTITY_TO_CLASS(func_wall_toggle, CFuncWallToggle); /* <1e28f> ../cstrike/dlls/bmodels.cpp:98 */ -NOBODY void CFuncWallToggle::Spawn_(void) +NOBODY void CFuncWallToggle::__MAKE_VHOOK(Spawn)(void) { // Spawn(CFuncWall *const this); // 100 // TurnOff(CFuncWallToggle *const this); // 102 @@ -83,7 +83,7 @@ NOBODY BOOL CFuncWallToggle::IsOn(void) } /* <1e101> ../cstrike/dlls/bmodels.cpp:130 */ -NOBODY void CFuncWallToggle::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncWallToggle::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // int status; // 132 @@ -97,7 +97,7 @@ NOBODY void CFuncWallToggle::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, LINK_ENTITY_TO_CLASS(func_conveyor, CFuncConveyor); /* <1e1c3> ../cstrike/dlls/bmodels.cpp:156 */ -NOBODY void CFuncConveyor::Spawn_(void) +NOBODY void CFuncConveyor::__MAKE_VHOOK(Spawn)(void) { // Spawn(CFuncWall *const this); // 159 // UpdateSpeed(CFuncConveyor *const this, @@ -114,7 +114,7 @@ NOBODY void CFuncConveyor::UpdateSpeed(float speed) } /* <1e021> ../cstrike/dlls/bmodels.cpp:194 */ -NOBODY void CFuncConveyor::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncConveyor::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // UpdateSpeed(CFuncConveyor *const this, // float speed); // 197 @@ -124,7 +124,7 @@ NOBODY void CFuncConveyor::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, U LINK_ENTITY_TO_CLASS(func_illusionary, CFuncIllusionary); /* <1ddc9> ../cstrike/dlls/bmodels.cpp:219 */ -NOBODY void CFuncIllusionary::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncIllusionary::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 221 @@ -133,7 +133,7 @@ NOBODY void CFuncIllusionary::KeyValue_(KeyValueData *pkvd) } /* <1d1db> ../cstrike/dlls/bmodels.cpp:230 */ -NOBODY void CFuncIllusionary::Spawn_(void) +NOBODY void CFuncIllusionary::__MAKE_VHOOK(Spawn)(void) { } @@ -141,7 +141,7 @@ NOBODY void CFuncIllusionary::Spawn_(void) LINK_ENTITY_TO_CLASS(func_monsterclip, CFuncMonsterClip); /* <1e24f> ../cstrike/dlls/bmodels.cpp:264 */ -NOBODY void CFuncMonsterClip::Spawn_(void) +NOBODY void CFuncMonsterClip::__MAKE_VHOOK(Spawn)(void) { // Spawn(CFuncWall *const this); // 266 } @@ -153,7 +153,7 @@ LINK_ENTITY_TO_CLASS(func_rotating, CFuncRotating); IMPLEMENT_SAVERESTORE(CFuncRotating, CBaseEntity); /* <1dc21> ../cstrike/dlls/bmodels.cpp:315 */ -NOBODY void CFuncRotating::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncRotating::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 317 @@ -176,13 +176,13 @@ NOBODY void CFuncRotating::KeyValue_(KeyValueData *pkvd) } /* <1d5c4> ../cstrike/dlls/bmodels.cpp:362 */ -NOBODY void CFuncRotating::Spawn_(void) +NOBODY void CFuncRotating::__MAKE_VHOOK(Spawn)(void) { // operator*(const Vector ::Spawn(// float fl); // 404 } /* <1d28a> ../cstrike/dlls/bmodels.cpp:447 */ -NOBODY void CFuncRotating::Precache_(void) +NOBODY void CFuncRotating::__MAKE_VHOOK(Precache)(void) { // { // char *szSoundFile; // 449 @@ -267,7 +267,7 @@ NOBODY void CFuncRotating::RotatingUse(CBaseEntity *pActivator, CBaseEntity *pCa } /* <1d325> ../cstrike/dlls/bmodels.cpp:706 */ -NOBODY void CFuncRotating::Blocked_(CBaseEntity *pOther) +NOBODY void CFuncRotating::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { } @@ -278,7 +278,7 @@ LINK_ENTITY_TO_CLASS(func_pendulum, CPendulum); IMPLEMENT_SAVERESTORE(CPendulum, CBaseEntity); /* <1db2a> ../cstrike/dlls/bmodels.cpp:765 */ -NOBODY void CPendulum::KeyValue_(KeyValueData *pkvd) +NOBODY void CPendulum::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 767 @@ -292,7 +292,7 @@ NOBODY void CPendulum::KeyValue_(KeyValueData *pkvd) } /* <1d9c7> ../cstrike/dlls/bmodels.cpp:782 */ -NOBODY void CPendulum::Spawn_(void) +NOBODY void CPendulum::__MAKE_VHOOK(Spawn)(void) { // Spawn(CPendulum *const this); // 782 } @@ -316,7 +316,7 @@ NOBODY void CPendulum::Stop(void) } /* <1d3a7> ../cstrike/dlls/bmodels.cpp:861 */ -NOBODY void CPendulum::Blocked_(CBaseEntity *pOther) +NOBODY void CPendulum::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { } @@ -332,7 +332,7 @@ NOBODY void CPendulum::Swing(void) } /* <1d3f5> ../cstrike/dlls/bmodels.cpp:909 */ -NOBODY void CPendulum::Touch_(CBaseEntity *pOther) +NOBODY void CPendulum::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // entvars_t *pevOther; // 911 diff --git a/regamedll/dlls/bot/cs_bot.cpp b/regamedll/dlls/bot/cs_bot.cpp index a72b70ca..b7bd3397 100644 --- a/regamedll/dlls/bot/cs_bot.cpp +++ b/regamedll/dlls/bot/cs_bot.cpp @@ -19,19 +19,19 @@ NOBODY int GetBotFollowCount(CBasePlayer *leader) } /* <2e86df> ../cstrike/dlls/bot/cs_bot.cpp:62 */ -NOBODY void CCSBot::Walk_(void) +NOBODY void CCSBot::__MAKE_VHOOK(Walk)(void) { // IsElapsed(const class CountdownTimer *const this); // 64 // Walk(CBot *const this); // 66 } /* <2e8732> ../cstrike/dlls/bot/cs_bot.cpp:80 */ -NOBODY bool CCSBot::Jump_(bool mustJump) +NOBODY bool CCSBot::__MAKE_VHOOK(Jump)(bool mustJump) { } /* <2e8e39> ../cstrike/dlls/bot/cs_bot.cpp:97 */ -NOBODY int CCSBot::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CCSBot::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // { // class CBaseEntity *attacker; // 99 @@ -57,7 +57,7 @@ NOBODY int CCSBot::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, } /* <2e8769> ../cstrike/dlls/bot/cs_bot.cpp:171 */ -NOBODY void CCSBot::Killed_(entvars_t *pevAttacker, int iGib) +NOBODY void CCSBot::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) { // { // float const deathDanger; // 178 diff --git a/regamedll/dlls/bot/cs_bot.h b/regamedll/dlls/bot/cs_bot.h index 1792b8b9..46ead337 100644 --- a/regamedll/dlls/bot/cs_bot.h +++ b/regamedll/dlls/bot/cs_bot.h @@ -45,13 +45,13 @@ #ifdef HOOK_GAMEDLL -#define navAreaCount (*pnavAreaCount) -#define currentIndex (*pcurrentIndex) +#define _navAreaCount (*pnavAreaCount) +#define _currentIndex (*pcurrentIndex) #endif // HOOK_GAMEDLL -extern int navAreaCount; -extern int currentIndex; +extern int _navAreaCount; +extern int _currentIndex; /* <3327a8> ../cstrike/dlls/bot/cs_bot.h:44 */ class BotState @@ -676,7 +676,7 @@ public: NOBODY void StartVoiceFeedback(float duration); bool IsUsingVoice(void) const { - return (m_voiceFeedbackEndTimestamp > gpGlobals->time); + return (m_voiceFeedbackEndTimestamp != 0.0f); //return (m_voiceFeedbackEndTimestamp > gpGlobals->time); } void SetEnemy(CBasePlayer *enemy); CBasePlayer *GetEnemy(void) @@ -685,7 +685,7 @@ public: } int GetNearbyEnemyCount(void) const { - return min( GetEnemiesRemaining(), m_nearbyEnemyCount ); + return _min(GetEnemiesRemaining(), m_nearbyEnemyCount); } unsigned int GetEnemyPlace(void) const { @@ -698,7 +698,7 @@ public: } int GetNearbyFriendCount(void) const { - return min( GetFriendsRemaining(), m_nearbyFriendCount ); + return _min(GetFriendsRemaining(), m_nearbyFriendCount); } CBasePlayer *GetClosestVisibleFriend(void) const { @@ -1432,7 +1432,7 @@ public: else { const float k = 1.5f; // 2.0f; - float trimSpeed = min(speed, 200.0f); + float trimSpeed = (speed < 200.0f) ? speed : 200.0f; m_cutoff.x = playerOrigin.x + k * trimSpeed * m_forward.x; m_cutoff.y = playerOrigin.y + k * trimSpeed * m_forward.y; diff --git a/regamedll/dlls/bot/cs_bot_chatter.cpp b/regamedll/dlls/bot/cs_bot_chatter.cpp index 227e6e4d..90c8a32a 100644 --- a/regamedll/dlls/bot/cs_bot_chatter.cpp +++ b/regamedll/dlls/bot/cs_bot_chatter.cpp @@ -199,11 +199,11 @@ char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const } // find phrase that meets the current criteria - int start = m_index[bankIndex]; + int start = m_index[ bankIndex ]; while (true) { - BotSpeakableVector *speakables = m_voiceBank[bankIndex]; - int &index = m_index[bankIndex]; + BotSpeakableVector *speakables = m_voiceBank[ bankIndex ]; + int &index = m_index[ bankIndex ]; #ifdef HOOK_GAMEDLL // TODO: temporary fix of std::vector padding @@ -212,8 +212,8 @@ char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const const BotSpeakable *speak = (*speakables)[index++]; - if (m_index[bankIndex] >= m_count[bankIndex]) - m_index[bankIndex] = 0; + 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 @@ -225,7 +225,7 @@ char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const // 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 (speak->m_count == UNDEFINED_COUNT || speak->m_count == _min(m_countCriteria, COUNT_MANY)) { if (duration) *duration = speak->m_duration; diff --git a/regamedll/dlls/bot/cs_bot_event.cpp b/regamedll/dlls/bot/cs_bot_event.cpp index 40beb7fd..e2cf1f5a 100644 --- a/regamedll/dlls/bot/cs_bot_event.cpp +++ b/regamedll/dlls/bot/cs_bot_event.cpp @@ -1,7 +1,7 @@ #include "precompiled.h" /* <31d087> ../cstrike/dlls/bot/cs_bot_event.cpp:22 */ -void CCSBot::OnEvent_(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { // { // class CCSBotManager *ctrl; // 63 diff --git a/regamedll/dlls/bot/cs_bot_init.cpp b/regamedll/dlls/bot/cs_bot_init.cpp index 36c18d0d..0c1894bb 100644 --- a/regamedll/dlls/bot/cs_bot_init.cpp +++ b/regamedll/dlls/bot/cs_bot_init.cpp @@ -88,7 +88,7 @@ void Bot_RegisterCvars(void) //} /* <3342ac> ../cstrike/dlls/bot/cs_bot_init.cpp:137 */ -NOBODY bool CCSBot::Initialize_(const BotProfile *profile) +NOBODY bool CCSBot::__MAKE_VHOOK(Initialize)(const BotProfile *profile) { CBot::Initialize(profile); @@ -264,7 +264,7 @@ NOBODY void CCSBot::ResetValues(void) } /* <3342e4> ../cstrike/dlls/bot/cs_bot_init.cpp:336 */ -NOBODY void CCSBot::SpawnBot_(void) +NOBODY void CCSBot::__MAKE_VHOOK(SpawnBot)(void) { // { // class CCSBotManager *ctrl; // 338 @@ -273,7 +273,7 @@ NOBODY void CCSBot::SpawnBot_(void) } /* <3338f7> ../cstrike/dlls/bot/cs_bot_init.cpp:366 */ -NOBODY void CCSBot::RoundRespawn_(void) +NOBODY void CCSBot::__MAKE_VHOOK(RoundRespawn)(void) { } diff --git a/regamedll/dlls/bot/cs_bot_learn.cpp b/regamedll/dlls/bot/cs_bot_learn.cpp index 9ee1e53c..8f12816f 100644 --- a/regamedll/dlls/bot/cs_bot_learn.cpp +++ b/regamedll/dlls/bot/cs_bot_learn.cpp @@ -13,8 +13,8 @@ const float updateTimesliceDuration = 0.0;//TODO: what value?? check it. #endif // HOOK_GAMEDLL -int navAreaCount; -int currentIndex; +int _navAreaCount; +int _currentIndex; /* <343cbe> ../cstrike/dlls/bot/cs_bot_learn.cpp:95 */ NOBODY inline class CNavNode *LadderEndSearch(CBaseEntity *entity, const Vector *pos, NavDirType mountDir) @@ -194,8 +194,8 @@ void CCSBot::StartAnalyzeAlphaProcess(void) m_processMode = PROCESS_ANALYZE_ALPHA; m_analyzeIter = TheNavAreaList.begin(); - navAreaCount = TheNavAreaList.size(); - currentIndex = 0; + _navAreaCount = TheNavAreaList.size(); + _currentIndex = 0; ApproachAreaAnalysisPrep(); DestroyHidingSpots(); diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp index d0a5bc71..4addd04a 100644 --- a/regamedll/dlls/bot/cs_bot_manager.cpp +++ b/regamedll/dlls/bot/cs_bot_manager.cpp @@ -7,34 +7,34 @@ CBotManager *TheBots = NULL; -cvar_t cv_bot_traceview = { "bot_traceview", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_stop = { "bot_stop", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_show_nav = { "bot_show_nav", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_show_danger = { "bot_show_danger", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_nav_edit = { "bot_nav_edit", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_nav_zdraw = { "bot_nav_zdraw", "4", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_walk = { "bot_walk", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_difficulty = { "bot_difficulty", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_debug = { "bot_debug", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_quicksave = { "bot_quicksave", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_quota = { "bot_quota", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_quota_match = { "bot_quota_match", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_prefix = { "bot_prefix", "", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_rogues = { "bot_allow_rogues", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_pistols = { "bot_allow_pistols", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_shotguns = { "bot_allow_shotguns", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_sub_machine_guns = { "bot_allow_sub_machine_guns", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_rifles = { "bot_allow_rifles", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_machine_guns = { "bot_allow_machine_guns", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_grenades = { "bot_allow_grenades", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_snipers = { "bot_allow_snipers", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_allow_shield = { "bot_allow_shield", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_join_team = { "bot_join_team", "any", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_join_after_player = { &unk_1EF09A, "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_auto_vacate = { "bot_auto_vacate", "1", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_zombie = { "bot_zombie", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_defer_to_human = { "bot_defer_to_human", "0", FCVAR_SERVER, 0.0f, NULL }; -cvar_t cv_bot_chatter = { "bot_chatter", "normal", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_traceview = { "bot_traceview", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_stop = { "bot_stop", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_show_nav = { "bot_show_nav", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_show_danger = { "bot_show_danger", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_nav_edit = { "bot_nav_edit", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_nav_zdraw = { "bot_nav_zdraw", "4", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_walk = { "bot_walk", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_difficulty = { "bot_difficulty", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_debug = { "bot_debug", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_quicksave = { "bot_quicksave", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_quota = { "bot_quota", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_quota_match = { "bot_quota_match", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_prefix = { "bot_prefix", "", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_rogues = { "bot_allow_rogues", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_pistols = { "bot_allow_pistols", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_shotguns = { "bot_allow_shotguns", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_sub_machine_guns = { "bot_allow_sub_machine_guns", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_rifles = { "bot_allow_rifles", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_machine_guns = { "bot_allow_machine_guns", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_grenades = { "bot_allow_grenades", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_snipers = { "bot_allow_snipers", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_allow_shield = { "bot_allow_shield", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_join_team = { "bot_join_team", "any", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_join_after_player = { &unk_1EF09A, "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_auto_vacate = { "bot_auto_vacate", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_zombie = { "bot_zombie", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_defer_to_human = { "bot_defer_to_human", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_bot_chatter = { "bot_chatter", "normal", FCVAR_SERVER, 0.0f, NULL }; cvar_t cv_bot_profile_db = { "bot_profile_db", "BotProfile.db", FCVAR_SERVER, 0.0f, NULL }; float CCSBotManager::m_flNextCVarCheck; @@ -112,7 +112,7 @@ NOBODY CCSBotManager::CCSBotManager(void) } /* <36b22a> ../cstrike/dlls/bot/cs_bot_manager.cpp:111 */ -void CCSBotManager::RestartRound_(void) +void CCSBotManager::__MAKE_VHOOK(RestartRound)(void) { // extend CBotManager::RestartRound(); @@ -159,19 +159,38 @@ NOBODY void UTIL_DrawBox(Extent *extent, int lifetime, int red, int green, int b } /* <36b13d> ../cstrike/dlls/bot/cs_bot_manager.cpp:195 */ -NOBODY void CCSBotManager::StartFrame_(void) +NOBODY void CCSBotManager::__MAKE_VHOOK(StartFrame)(void) { } /* <36b62a> ../cstrike/dlls/bot/cs_bot_manager.cpp:276 */ -NOBODY bool CCSBotManager::IsWeaponUseable(CBasePlayerItem *item) const +bool CCSBotManager::IsWeaponUseable(CBasePlayerItem *item) const { -// { -// int weaponClass; // 284 -// AllowShotguns(const class CCSBotManager *const this); // 286 -// } - return false; + if (item == NULL) + { + return false; + } + + if (item->m_iId != WEAPON_C4) + { + int weaponClass = WeaponIDToWeaponClass(item->m_iId); + + if ((!AllowShotguns() && weaponClass == WEAPONCLASS_SHOTGUN) + || (!AllowMachineGuns() && weaponClass == WEAPONCLASS_MACHINEGUN) + || (!AllowRifles() && weaponClass == WEAPONCLASS_RIFLE) + //|| (!AllowShotguns() && weaponClass == WEAPONCLASS_SHOTGUN) // TODO: already is checked shotguns! + || (!AllowSnipers() && weaponClass == WEAPONCLASS_SNIPERRIFLE) + || (!AllowSubMachineGuns() && weaponClass == WEAPONCLASS_SUBMACHINEGUN) + || (!AllowTacticalShield() && item->m_iId == WEAPON_SHIELDGUN) + || (!AllowPistols() && weaponClass == WEAPONCLASS_PISTOL) + || (!AllowGrenades() && weaponClass == WEAPONCLASS_GRENADE)) + { + return false; + } + } + + return true; } /* <36b68c> ../cstrike/dlls/bot/cs_bot_manager.cpp:306 */ @@ -187,7 +206,7 @@ NOBODY bool CCSBotManager::IsOnOffense(CBasePlayer *player) const } /* <36a3b6> ../cstrike/dlls/bot/cs_bot_manager.cpp:331 */ -void CCSBotManager::ServerActivate_(void) +void CCSBotManager::__MAKE_VHOOK(ServerActivate)(void) { DestroyNavigationMap(); IMPLEMENT_ARRAY(m_isMapDataLoaded) = false; @@ -208,7 +227,7 @@ void CCSBotManager::ServerActivate_(void) } /* <36afcd> ../cstrike/dlls/bot/cs_bot_manager.cpp:369 */ -void CCSBotManager::AddServerCommand_(const char *cmd) +void CCSBotManager::__MAKE_VHOOK(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)); @@ -218,7 +237,7 @@ void CCSBotManager::AddServerCommand_(const char *cmd) } /* <36b0e0> ../cstrike/dlls/bot/cs_bot_manager.cpp:375 */ -void CCSBotManager::AddServerCommands_(void) +void CCSBotManager::__MAKE_VHOOK(AddServerCommands)(void) { static bool fFirstTime = true; @@ -274,13 +293,13 @@ void CCSBotManager::AddServerCommands_(void) } /* <36b2ac> ../cstrike/dlls/bot/cs_bot_manager.cpp:413 */ -void CCSBotManager::ServerDeactivate_(void) +void CCSBotManager::__MAKE_VHOOK(ServerDeactivate)(void) { m_bServerActive = false; } /* <36b5fa> ../cstrike/dlls/bot/cs_bot_manager.cpp:415 */ -void CCSBotManager::ClientDisconnect_(CBasePlayer *pPlayer) +void CCSBotManager::__MAKE_VHOOK(ClientDisconnect)(CBasePlayer *pPlayer) { if (!pPlayer || !pPlayer->IsBot()) return; @@ -315,7 +334,7 @@ void PrintAllEntities(void) } /* <36ace2> ../cstrike/dlls/bot/cs_bot_manager.cpp:484 */ -void CCSBotManager::ServerCommand_(const char *pcmd) +void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd) { if (!m_bServerActive || !UTIL_IsGame("czero")) return; @@ -326,7 +345,6 @@ void CCSBotManager::ServerCommand_(const char *pcmd) 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); } @@ -352,7 +370,7 @@ void CCSBotManager::ServerCommand_(const char *pcmd) for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) { - CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( iIndex ); + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(iIndex); if (pPlayer == NULL) continue; @@ -384,7 +402,7 @@ void CCSBotManager::ServerCommand_(const char *pcmd) for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) { - CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( iIndex ); + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(iIndex); if (pPlayer == NULL) continue; @@ -460,59 +478,59 @@ void CCSBotManager::ServerCommand_(const char *pcmd) { PrintAllEntities(); } - else if (FStrEq(pcmd, "bot_nav_delete") ) + else if (FStrEq(pcmd, "bot_nav_delete")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_DELETE; } - else if (FStrEq(pcmd, "bot_nav_split") ) + else if (FStrEq(pcmd, "bot_nav_split")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_SPLIT; } - else if (FStrEq(pcmd, "bot_nav_merge") ) + else if (FStrEq(pcmd, "bot_nav_merge")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_MERGE; } - else if (FStrEq(pcmd, "bot_nav_mark") ) + else if (FStrEq(pcmd, "bot_nav_mark")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_MARK; } - else if (FStrEq(pcmd, "bot_nav_begin_area") ) + 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") ) + else if (FStrEq(pcmd, "bot_nav_end_area")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_END_AREA; } - else if (FStrEq(pcmd, "bot_nav_connect") ) + else if (FStrEq(pcmd, "bot_nav_connect")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_CONNECT; } - else if (FStrEq(pcmd, "bot_nav_disconnect") ) + else if (FStrEq(pcmd, "bot_nav_disconnect")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_DISCONNECT; } - else if (FStrEq(pcmd, "bot_nav_splice") ) + else if (FStrEq(pcmd, "bot_nav_splice")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_SPLICE; } - else if (FStrEq(pcmd, "bot_nav_crouch") ) + else if (FStrEq(pcmd, "bot_nav_crouch")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_CROUCH; } - else if (FStrEq(pcmd, "bot_nav_jump") ) + else if (FStrEq(pcmd, "bot_nav_jump")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_JUMP; } - else if (FStrEq(pcmd, "bot_nav_precise") ) + else if (FStrEq(pcmd, "bot_nav_precise")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_editCmd) = EDIT_ATTRIB_PRECISE; } - else if (FStrEq(pcmd, "bot_nav_no_jump") ) + 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") ) + else if (FStrEq(pcmd, "bot_nav_analyze")) { IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_isAnalysisRequested) = true; } @@ -591,23 +609,23 @@ void CCSBotManager::ServerCommand_(const char *pcmd) } } } - else if (FStrEq(pcmd, "bot_nav_toggle_place_mode") ) + 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") ) + 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") ) + 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") ) + 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") ) + 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 @@ -633,7 +651,7 @@ void CCSBotManager::ServerCommand_(const char *pcmd) } } } - else if (FStrEq(pcmd, "bot_memory_usage") ) + else if (FStrEq(pcmd, "bot_memory_usage")) { CONSOLE_ECHO("Memory usage:\n"); CONSOLE_ECHO(" %d bytes per bot\b", sizeof(CCSBot)); @@ -653,7 +671,7 @@ void CCSBotManager::ServerCommand_(const char *pcmd) for (SpotEncounterList::iterator siter = area->m_spotEncounterList.begin(); siter != area->m_spotEncounterList.end(); ++siter) { - // TODO: Fix me + // TODO: Fix me, this is crashed in HOOK_GAMEDLL SpotEncounter se = (*siter); encounterMem += sizeof(SpotEncounter); @@ -1108,7 +1126,7 @@ NOBODY CNavArea *CCSBotManager::GetRandomAreaInZone(const Zone *zone) const } /* <36b02d> ../cstrike/dlls/bot/cs_bot_manager.cpp:1477 */ -void CCSBotManager::OnEvent_(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +void CCSBotManager::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { switch (event) { @@ -1147,9 +1165,17 @@ void CCSBotManager::OnEvent_(GameEventType event, CBaseEntity *entity, CBaseEnti CBotManager::OnEvent(event, entity, other); } -NOBODY BOOL CCSBotManager::ClientCommand_(CBasePlayer *pPlayer, const char *pcmd) +BOOL CCSBotManager::__MAKE_VHOOK(ClientCommand)(CBasePlayer *pPlayer, const char *pcmd) { + // TODO: rly? +#ifndef REGAMEDLL_FIXES + if (pPlayer && UTIL_GetLocalPlayer()) + { + UTIL_GetLocalPlayer(); + } +#endif // REGAMEDLL_FIXES + return FALSE; } /* <36bdb3> ../cstrike/dlls/bot/cs_bot_manager.cpp:1541 */ @@ -1169,14 +1195,14 @@ void CCSBotManager::SetLooseBomb(CBaseEntity *bomb) } /* <36b14d> ../cstrike/dlls/bot/cs_bot_manager.cpp:1565 */ -NOBODY bool CCSBotManager::IsImportantPlayer_(CBasePlayer *player) +NOBODY bool CCSBotManager::__MAKE_VHOOK(IsImportantPlayer)(CBasePlayer *player) { // IsImportantPlayer(const class CCSBotManager *const this, // class CBasePlayer *player); // 1565 } /* <36b1a7> ../cstrike/dlls/bot/cs_bot_manager.cpp:1602 */ -NOBODY unsigned int CCSBotManager::GetPlayerPriority_(CBasePlayer *player) const +NOBODY unsigned int CCSBotManager::__MAKE_VHOOK(GetPlayerPriority)(CBasePlayer *player) const { // { // unsigned int const lowestPriority; // 1604 diff --git a/regamedll/dlls/bot/cs_bot_manager.h b/regamedll/dlls/bot/cs_bot_manager.h index 6756733d..82b8b7b5 100644 --- a/regamedll/dlls/bot/cs_bot_manager.h +++ b/regamedll/dlls/bot/cs_bot_manager.h @@ -113,7 +113,7 @@ public: CCSBotManager(void); public: virtual void ClientDisconnect(CBasePlayer *pPlayer); - NOBODY virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd); + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd); virtual void ServerActivate(void); virtual void ServerDeactivate(void); @@ -357,7 +357,7 @@ public: { return friendlyfire.value != 0; } - NOBODY bool IsWeaponUseable(CBasePlayerItem *item) const; + bool IsWeaponUseable(CBasePlayerItem *item) const; bool IsDefenseRushing(void) const { return m_isDefenseRushing; diff --git a/regamedll/dlls/bot/cs_bot_statemachine.cpp b/regamedll/dlls/bot/cs_bot_statemachine.cpp index d6f213e5..02a13f7c 100644 --- a/regamedll/dlls/bot/cs_bot_statemachine.cpp +++ b/regamedll/dlls/bot/cs_bot_statemachine.cpp @@ -174,20 +174,20 @@ NOBODY void CCSBot::Attack(CBasePlayer *victim) return; // change enemy - SetEnemy( victim ); + SetEnemy(victim); // Do not "re-enter" the attack state if we are already attacking if (IsAttacking()) return; if (IsAtHidingSpot()) - m_attackState.SetCrouchAndHold( (RANDOM_FLOAT(0, 100) < 60.0f) != 0 ); + m_attackState.SetCrouchAndHold((RANDOM_FLOAT(0, 100) < 60.0f) != 0); else - m_attackState.SetCrouchAndHold( 0 ); + m_attackState.SetCrouchAndHold(0); PrintIfWatched("ATTACK BEGIN (reaction time = %g (+ update time), surprise time = %g, attack delay = %g)\n"); m_isAttacking = true; - m_attackState.OnEnter( this );// TODO: Reverse me + m_attackState.OnEnter(this);// TODO: Reverse me // cheat a bit and give the bot the initial location of its victim m_lastEnemyPosition = victim->pev->origin; @@ -198,7 +198,7 @@ NOBODY void CCSBot::Attack(CBasePlayer *victim) Vector toEnemy = victim->pev->origin - pev->origin; Vector idealAngle; - idealAngle = UTIL_VecToAngles( toEnemy ); + idealAngle = UTIL_VecToAngles(toEnemy); float deltaYaw = (float)abs(m_lookYaw - idealAngle.y); @@ -213,11 +213,11 @@ NOBODY void CCSBot::Attack(CBasePlayer *victim) float turn = deltaYaw / 180.0f; float accuracy = GetProfile()->GetSkill() / (1.0f + turn); - SetAimOffset( accuracy ); + SetAimOffset(accuracy); // define time when aim offset will automatically be updated // longer time the more we had to turn (surprise) - m_aimOffsetTimestamp = gpGlobals->time + RANDOM_FLOAT( 0.25f + turn, 1.5f ); + m_aimOffsetTimestamp = gpGlobals->time + RANDOM_FLOAT(0.25f + turn, 1.5f); } /* <3b4416> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:366 */ @@ -253,7 +253,7 @@ NOBODY bool CCSBot::IsDefusingBomb(void) const /* <3b44ed> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:411 */ bool CCSBot::IsHiding(void) const { - return (m_state == static_cast( &m_hideState )); + return (m_state == static_cast(&m_hideState)); } /* <3b450f> ../cstrike/dlls/bot/cs_bot_statemachine.cpp:423 */ diff --git a/regamedll/dlls/bot/cs_bot_update.cpp b/regamedll/dlls/bot/cs_bot_update.cpp index 9cfa70f7..df3e892e 100644 --- a/regamedll/dlls/bot/cs_bot_update.cpp +++ b/regamedll/dlls/bot/cs_bot_update.cpp @@ -1,16 +1,11 @@ #include "precompiled.h" /* <3c635f> ../cstrike/dlls/bot/cs_bot_update.cpp:26 */ -void CCSBot::Upkeep_(void) +void CCSBot::__MAKE_VHOOK(Upkeep)(void) { -#ifndef HOOK_GAMEDLL - if (CCSBotManager::pm_isLearningMap || !IsAlive()) + if (IMPLEMENT_ARRAY_CLASS(CCSBotManager, m_isLearningMap) || !IsAlive()) return; -#else - if ((*CCSBotManager::pm_isLearningMap) || !IsAlive()) - return; -#endif // HOOK_GAMEDLL - + if (m_isRapidFiring) TogglePrimaryAttack(); @@ -37,7 +32,7 @@ void CCSBot::Upkeep_(void) if (IsUsingAWP() || IsUsingShotgun() || IsUsingMachinegun() || GetProfile()->GetSkill() < 0.8f || (IsActiveWeaponRecoilHigh() && !IsUsingPistol() && !IsUsingSniperRifle())) { - if (IsEnemyPartVisible( CHEST )) + if (IsEnemyPartVisible(CHEST)) { // No headshots in this game, go for the chest. aimBlocked = true; @@ -47,13 +42,13 @@ void CCSBot::Upkeep_(void) if (aimBlocked) m_aimSpot.z -= feetOffset * 0.25f; - else if (!IsEnemyPartVisible( HEAD )) + else if (!IsEnemyPartVisible(HEAD)) { - if (IsEnemyPartVisible( CHEST )) + if (IsEnemyPartVisible(CHEST)) { m_aimSpot.z -= feetOffset * 0.5f; } - else if (IsEnemyPartVisible( LEFT_SIDE )) + else if (IsEnemyPartVisible(LEFT_SIDE)) { Vector2D to = (m_enemy->pev->origin - pev->origin).Make2D(); to.NormalizeInPlace(); @@ -62,7 +57,7 @@ void CCSBot::Upkeep_(void) m_aimSpot.y += to.x * 16.0f; m_aimSpot.z -= feetOffset * 0.5f; } - else if (IsEnemyPartVisible( RIGHT_SIDE )) + else if (IsEnemyPartVisible(RIGHT_SIDE)) { Vector2D to = (m_enemy->pev->origin - pev->origin).Make2D(); to.NormalizeInPlace(); @@ -96,7 +91,7 @@ void CCSBot::Upkeep_(void) { // dont look at spots just in front of our face - it causes erratic view rotation const float tooCloseRange = 100.0f; - if ((m_lookAtSpot - pev->origin).IsLengthLessThan( tooCloseRange )) + if ((m_lookAtSpot - pev->origin).IsLengthLessThan(tooCloseRange)) m_lookAtSpotState = NOT_LOOKING_AT_SPOT; } diff --git a/regamedll/dlls/bot/cs_bot_vision.cpp b/regamedll/dlls/bot/cs_bot_vision.cpp index 5db75273..dae694dd 100644 --- a/regamedll/dlls/bot/cs_bot_vision.cpp +++ b/regamedll/dlls/bot/cs_bot_vision.cpp @@ -12,17 +12,14 @@ float StayOnLadderLine(CCSBot *me, const CNavLadder *ladder) // move toward ladder mount point switch (faceDir) { - case NORTH: - return stiffness * (ladder->m_top.x - me->pev->origin.x); - - case EAST: - return stiffness * (ladder->m_top.y - me->pev->origin.y); - - case SOUTH: - return -stiffness * (ladder->m_top.x - me->pev->origin.x); - - case WEST: - return -stiffness * (ladder->m_top.y - me->pev->origin.y); + case NORTH: + return stiffness * (ladder->m_top.x - me->pev->origin.x); + case EAST: + return stiffness * (ladder->m_top.y - me->pev->origin.y); + case SOUTH: + return -stiffness * (ladder->m_top.x - me->pev->origin.x); + case WEST: + return -stiffness * (ladder->m_top.y - me->pev->origin.y); } return 0.0f; @@ -175,7 +172,7 @@ void __declspec(naked) CCSBot::UpdateLookAngles(void) } /* <3d8c91> ../cstrike/dlls/bot/cs_bot_vision.cpp:238 */ -NOBODY bool CCSBot::IsVisible_(const Vector *pos, bool testFOV) const +NOBODY bool CCSBot::__MAKE_VHOOK(IsVisible)(const Vector *pos, bool testFOV) const { // { // const Vector *eye; // 248 @@ -187,7 +184,7 @@ NOBODY bool CCSBot::IsVisible_(const Vector *pos, bool testFOV) const } /* <3d8d9b> ../cstrike/dlls/bot/cs_bot_vision.cpp:269 */ -NOBODY bool CCSBot::IsVisible_(CBasePlayer *player, bool testFOV, unsigned char *visParts) const +NOBODY bool CCSBot::__MAKE_VHOOK(IsVisible)(CBasePlayer *player, bool testFOV, unsigned char *visParts) const { // { // float const topOfHead; // 271 @@ -207,7 +204,7 @@ NOBODY bool CCSBot::IsVisible_(CBasePlayer *player, bool testFOV, unsigned char } /* <3d8f9f> ../cstrike/dlls/bot/cs_bot_vision.cpp:302 */ -bool CCSBot::IsEnemyPartVisible_(VisiblePartType part) const +bool CCSBot::__MAKE_VHOOK(IsEnemyPartVisible)(VisiblePartType part) const { if (!IsEnemyVisible()) return false; @@ -512,7 +509,7 @@ NOBODY float CCSBot::GetRangeToNearestRecognizedEnemy(void) } /* <3da170> ../cstrike/dlls/bot/cs_bot_vision.cpp:1063 */ -NOBODY void CCSBot::Blind_(float duration, float holdTime, float fadeTime, int alpha) +NOBODY void CCSBot::__MAKE_VHOOK(Blind)(float duration, float holdTime, float fadeTime, int alpha) { // Say(BotChatterInterface *const this, // const char *phraseName, diff --git a/regamedll/dlls/bot/cs_bot_weapon.cpp b/regamedll/dlls/bot/cs_bot_weapon.cpp index e4c39644..9c8769bc 100644 --- a/regamedll/dlls/bot/cs_bot_weapon.cpp +++ b/regamedll/dlls/bot/cs_bot_weapon.cpp @@ -1,489 +1,491 @@ -#include "precompiled.h" - -/* <3eb434> ../cstrike/dlls/bot/cs_bot_weapon.cpp:17 */ -NOBODY void CCSBot::FireWeaponAtEnemy(void) -{ -// { -// class CBasePlayer *enemy; // 20 -// IsUsingSniperRifle(const class CCSBot *const this); // 29 -// { -// class Vector2D toAimSpot; // 47 -// float rangeToEnemy; // 48 -// float yaw; // 50 -// class Vector2D dir; // 51 -// float onTarget; // 53 -// float const halfSize; // 57 -// float const halfPI; // 60 -// float aimTolerance; // 61 -// { -// class CCSBotManager *ctrl; // 65 -// bool doAttack; // 67 -// IsUsingKnife(const class CCSBot *const this); // 86 -// { -// float const knifeRange; // 121 -// ForceRun(CCSBot *const this, -// float duration); // 125 -// { -// float const knifeStabChance; // 142 -// } -// } -// IsUsingPistol(const class CCSBot *const this); // 157 -// { -// float const closePistolRange; // 160 -// StartRapidFire(CCSBot *const this); // 165 -// } -// { -// float const sprayRange; // 175 -// IsUsingMachinegun(const class CCSBot *const this); // 176 -// { -// float const distantTargetRange; // 183 -// IsUsingSniperRifle(const class CCSBot *const this); // 184 -// } -// } -// } -// NormalizeInPlace(Vector2D *const this); // 48 -// DotProduct(const class Vector2D &a, -// const class Vector2D &b); // 53 -// IsUsingSniperRifle(const class CCSBot *const this); // 57 -// } -// IsActiveWeaponReloading(const class CBot *const this); // 40 -// GetTimeSinceAcquiredCurrentEnemy(const class CCSBot *const this); // 33 -// GetSurpriseDelay(const class CCSBot *const this); // 34 -// ClearSurpriseDelay(CCSBot *const this); // 37 -// IsNotMoving(const class CCSBot *const this); // 29 -// StopRapidFire(CCSBot *const this); // 24 -// } -} - -/* <3ea12d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:210 */ -void CCSBot::SetAimOffset(float accuracy) -{ - // if our accuracy is less than perfect, it will improve as we "focus in" while not rotating our view - if (accuracy < 1.0f) - { - // if we moved our view, reset our "focus" mechanism - if (IsViewMoving( 100 )) - m_aimSpreadTimestamp = gpGlobals->time; - - // focusTime is the time it takes for a bot to "focus in" for very good aim, from 2 to 5 seconds - const float focusTime = max( 5.0f * (1.0f - accuracy), 2.0f ); - - float focusInterval = gpGlobals->time - m_aimSpreadTimestamp; - float focusAccuracy = focusInterval / focusTime; - - // limit how much "focus" will help - const float maxFocusAccuracy = 0.75f; - - if (focusAccuracy > maxFocusAccuracy) - focusAccuracy = maxFocusAccuracy; - - accuracy = max( accuracy, focusAccuracy ); - } - - PrintIfWatched("Accuracy = %4.3f\n", accuracy); - - float range = (m_lastEnemyPosition - pev->origin).Length(); - const float_precision maxOffset = range * ((float_precision)m_iFOV / DEFAULT_FOV) * 0.1; - float error = maxOffset * (1 - accuracy); - +#include "precompiled.h" + +/* <3eb434> ../cstrike/dlls/bot/cs_bot_weapon.cpp:17 */ +NOBODY void CCSBot::FireWeaponAtEnemy(void) +{ +// { +// class CBasePlayer *enemy; // 20 +// IsUsingSniperRifle(const class CCSBot *const this); // 29 +// { +// class Vector2D toAimSpot; // 47 +// float rangeToEnemy; // 48 +// float yaw; // 50 +// class Vector2D dir; // 51 +// float onTarget; // 53 +// float const halfSize; // 57 +// float const halfPI; // 60 +// float aimTolerance; // 61 +// { +// class CCSBotManager *ctrl; // 65 +// bool doAttack; // 67 +// IsUsingKnife(const class CCSBot *const this); // 86 +// { +// float const knifeRange; // 121 +// ForceRun(CCSBot *const this, +// float duration); // 125 +// { +// float const knifeStabChance; // 142 +// } +// } +// IsUsingPistol(const class CCSBot *const this); // 157 +// { +// float const closePistolRange; // 160 +// StartRapidFire(CCSBot *const this); // 165 +// } +// { +// float const sprayRange; // 175 +// IsUsingMachinegun(const class CCSBot *const this); // 176 +// { +// float const distantTargetRange; // 183 +// IsUsingSniperRifle(const class CCSBot *const this); // 184 +// } +// } +// } +// NormalizeInPlace(Vector2D *const this); // 48 +// DotProduct(const class Vector2D &a, +// const class Vector2D &b); // 53 +// IsUsingSniperRifle(const class CCSBot *const this); // 57 +// } +// IsActiveWeaponReloading(const class CBot *const this); // 40 +// GetTimeSinceAcquiredCurrentEnemy(const class CCSBot *const this); // 33 +// GetSurpriseDelay(const class CCSBot *const this); // 34 +// ClearSurpriseDelay(CCSBot *const this); // 37 +// IsNotMoving(const class CCSBot *const this); // 29 +// StopRapidFire(CCSBot *const this); // 24 +// } +} + +/* <3ea12d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:210 */ +void CCSBot::SetAimOffset(float accuracy) +{ + // if our accuracy is less than perfect, it will improve as we "focus in" while not rotating our view + if (accuracy < 1.0f) + { + // if we moved our view, reset our "focus" mechanism + if (IsViewMoving(100.0f)) + { + m_aimSpreadTimestamp = gpGlobals->time; + } + + // focusTime is the time it takes for a bot to "focus in" for very good aim, from 2 to 5 seconds + const float focusTime = _max(5.0f * (1.0f - accuracy), 2.0f); + + float focusInterval = gpGlobals->time - m_aimSpreadTimestamp; + float focusAccuracy = focusInterval / focusTime; + + // limit how much "focus" will help + const float maxFocusAccuracy = 0.75f; + + if (focusAccuracy > maxFocusAccuracy) + focusAccuracy = maxFocusAccuracy; + + accuracy = _max(accuracy, focusAccuracy); + } + + PrintIfWatched("Accuracy = %4.3f\n", accuracy); + + float range = (m_lastEnemyPosition - pev->origin).Length(); + const float_precision maxOffset = range * ((float_precision)m_iFOV / DEFAULT_FOV) * 0.1; + float error = maxOffset * (1 - accuracy); + m_aimOffsetGoal[0] = RANDOM_FLOAT(-error, error); m_aimOffsetGoal[1] = RANDOM_FLOAT(-error, error); m_aimOffsetGoal[2] = RANDOM_FLOAT(-error, error); // define time when aim offset will automatically be updated - m_aimOffsetTimestamp = gpGlobals->time + RANDOM_FLOAT(0.25, 1); -} - -/* <3ea224> ../cstrike/dlls/bot/cs_bot_weapon.cpp:252 */ -void CCSBot::UpdateAimOffset(void) -{ - if (gpGlobals->time >= m_aimOffsetTimestamp) - { - SetAimOffset(GetProfile()->GetSkill()); - } - - // move current offset towards goal offset - Vector d = m_aimOffsetGoal - m_aimOffset; - const float stiffness = 0.1f; - - m_aimOffset.x += stiffness * d.x; - m_aimOffset.y += stiffness * d.y; - m_aimOffset.z += stiffness * d.z; -} - -/* <3ea2b7> ../cstrike/dlls/bot/cs_bot_weapon.cpp:271 */ -NOBODY bool CCSBot::AdjustZoom(float range) -{ -// IsUsingSniperRifle(const class CCSBot *const this); // 273 -// { -// float const sniperZoomRange; // 275 -// float const sniperFarZoomRange; // 276 -// GetZoomLevel(const class CCSBot *const this); // 282 -// GetZoomLevel(const class CCSBot *const this); // 291 -// GetZoomLevel(const class CCSBot *const this); // 300 -// } -} - -/* <3e9e2d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:320 */ -bool isSniperRifle(CBasePlayerItem *item) -{ - switch (item->m_iId) - { - case WEAPON_SCOUT: - case WEAPON_SG550: - case WEAPON_AWP: - case WEAPON_G3SG1: - break; - default: - return false; - } - - return true; -} - -/* <3ea3ab> ../cstrike/dlls/bot/cs_bot_weapon.cpp:342 */ -bool CCSBot::IsUsingAWP(void) -{ - return (m_pActiveItem && m_pActiveItem->m_iId == WEAPON_AWP); -} - -/* <3ea3ce> ../cstrike/dlls/bot/cs_bot_weapon.cpp:357 */ -NOBODY bool CCSBot::DoesActiveWeaponHaveSilencer(void) -{ -} - -/* <3ea3f1> ../cstrike/dlls/bot/cs_bot_weapon.cpp:375 */ -bool CCSBot::IsUsingSniperRifle(void) -{ - if (m_pActiveItem) - { - return isSniperRifle(m_pActiveItem); - } - return false; -} - -/* <3ea462> ../cstrike/dlls/bot/cs_bot_weapon.cpp:387 */ -NOBODY bool CCSBot::IsSniper(void) -{ -// { -// int i; // 389 -// { -// class CBasePlayerItem *item; // 391 -// isSniperRifle(CBasePlayerItem *item); // 393 -// } -// } -} - -/* <3ea4c1> ../cstrike/dlls/bot/cs_bot_weapon.cpp:405 */ -NOBODY bool CCSBot::IsSniping(void) -{ -} - -/* <3ea4e8> ../cstrike/dlls/bot/cs_bot_weapon.cpp:417 */ -bool CCSBot::IsUsingShotgun(void) -{ - return (m_pActiveItem && (m_pActiveItem->m_iId == WEAPON_XM1014 || m_pActiveItem->m_iId == WEAPON_M3)); -} - -/* <3ea50f> ../cstrike/dlls/bot/cs_bot_weapon.cpp:437 */ -bool CCSBot::IsUsingMachinegun(void) -{ - return (m_pActiveItem && m_pActiveItem->m_iId == WEAPON_M249); -} - -/* <3ea532> ../cstrike/dlls/bot/cs_bot_weapon.cpp:449 */ -NOBODY bool CCSBot::IsPrimaryWeaponEmpty(void) -{ -// { -// class CBasePlayerWeapon *gun; // 451 -// } -} - -/* <3ea578> ../cstrike/dlls/bot/cs_bot_weapon.cpp:467 */ -NOBODY bool CCSBot::IsPistolEmpty(void) -{ -// { -// class CBasePlayerWeapon *gun; // 469 -// } -} - -/* <3ea5d9> ../cstrike/dlls/bot/cs_bot_weapon.cpp:485 */ -NOBODY bool CCSBot::DoEquip(CBasePlayerWeapon *gun) -{ -// Start(IntervalTimer *const this); // 496 -} - -/* <3ea621> ../cstrike/dlls/bot/cs_bot_weapon.cpp:510 */ -NOBODY void CCSBot::EquipBestWeapon(bool mustEquip) -{ -// { -// class CCSBotManager *ctrl; // 523 -// class CBasePlayerWeapon *primary; // 525 -// GetElapsedTime(const class IntervalTimer *const this); // 513 -// { -// int weaponClass; // 528 -// AllowShotguns(const class CCSBotManager *const this); // 530 -// DoEquip(CCSBot *const this, -// class CBasePlayerWeapon *gun); // 538 -// } -// DoEquip(CCSBot *const this, -// class CBasePlayerWeapon *gun); // 545 -// EquipKnife(CCSBot *const this); // 550 -// } -} - -/* <3ea7fe> ../cstrike/dlls/bot/cs_bot_weapon.cpp:557 */ -NOBODY void CCSBot::EquipPistol(void) -{ -// { -// class CCSBotManager *ctrl; // 563 -// GetElapsedTime(const class IntervalTimer *const this); // 560 -// IsUsingPistol(const class CCSBot *const this); // 566 -// DoEquip(CCSBot *const this, -// class CBasePlayerWeapon *gun); // 567 -// } -} - -/* <3ea91a> ../cstrike/dlls/bot/cs_bot_weapon.cpp:575 */ -NOBODY void CCSBot::EquipKnife(void) -{ -// IsUsingKnife(const class CCSBot *const this); // 581 -// EquipKnife(CCSBot *const this); // 575 -} - -/* <3ea98b> ../cstrike/dlls/bot/cs_bot_weapon.cpp:589 */ -NOBODY bool CCSBot::HasGrenade(void) -{ -} - -/* <3ea9ae> ../cstrike/dlls/bot/cs_bot_weapon.cpp:598 */ -NOBODY bool CCSBot::EquipGrenade(bool noSmoke) -{ -// IsSniper(const class CCSBot *const this); // 601 -// IsUsingGrenade(const class CCSBot *const this); // 604 -// HasGrenade(const class CCSBot *const this); // 607 -} - -/* <3eaa8c> ../cstrike/dlls/bot/cs_bot_weapon.cpp:624 */ -bool CCSBot::IsUsingKnife(void) -{ - CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; - return (gun && gun->m_iId == 29); -} - -/* <3eaac2> ../cstrike/dlls/bot/cs_bot_weapon.cpp:638 */ -bool CCSBot::IsUsingPistol(void) -{ - UNTESTED - - CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; - if (gun) - { - switch (gun->m_iId) - { - case WEAPON_USP: - case WEAPON_GLOCK18: - case WEAPON_P228: - case WEAPON_DEAGLE: - case WEAPON_ELITE: - case WEAPON_FIVESEVEN: - return true; - default: - break; - } - - // TODO: check it, from the dwarf should be used function IsPistol -// { -// class CBasePlayerWeapon *gun; // 640 -// IsPistol(CBasePlayerWeapon *const this); // 642 -// } - //return gun->IsPistol(); - } - return false; -} - -/* <3eab09> ../cstrike/dlls/bot/cs_bot_weapon.cpp:652 */ -bool CCSBot::IsUsingGrenade(void) -{ - CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; - return (gun && (gun->m_iId == WEAPON_SMOKEGRENADE || gun->m_iId == WEAPON_FLASHBANG || gun->m_iId == WEAPON_HEGRENADE)); -} - -/* <3eab3f> ../cstrike/dlls/bot/cs_bot_weapon.cpp:672 */ -NOBODY bool CCSBot::IsUsingHEGrenade(void) -{ -// { -// class CBasePlayerWeapon *gun; // 674 -// } -} - -/* <3eab80> ../cstrike/dlls/bot/cs_bot_weapon.cpp:690 */ -void CCSBot::ThrowGrenade(const Vector *target) -{ - if (IsUsingGrenade() && !m_isWaitingToTossGrenade) - { - const float angleTolerance = 1.0f; - - SetLookAt("GrenadeThrow", target, PRIORITY_UNINTERRUPTABLE, 3.0f, false, angleTolerance); - - m_isWaitingToTossGrenade = true; - m_tossGrenadeTimer.Start( 3.0f ); - } -} - -/* <3eac08> ../cstrike/dlls/bot/cs_bot_weapon.cpp:709 */ -NOBODY bool CCSBot::FindGrenadeTossPathTarget(const Vector *pos) -{ -// { -// int i; // 715 -// Vector dir; // 726 -// float length; // 727 -// float const inc; // 729 -// Vector p; // 730 -// Vector visibleSpot; // 731 -// float const bufferRange; // 745 -// TraceResult result; // 747 -// Vector check; // 748 -// operator+(const Vector *const this, -// const Vector &v); // 718 -// operator-(const Vector *const this, -// const Vector &v); // 726 -// NormalizeInPlace(Vector *const this); // 727 -// Vector(Vector *const this, -// const Vector &v); // 731 -// operator+(const Vector *const this, -// const Vector &v); // 751 -// { -// float range; // 756 -// } -// operator+(const Vector *const this, -// const Vector &v); // 764 -// { -// float range; // 769 -// } -// operator+(const Vector *const this, -// const Vector &v); // 777 -// { -// float range; // 782 -// } -// operator+(const Vector *const this, -// const Vector &v); // 790 -// { -// float range; // 795 -// } -// { -// float t; // 732 -// operator*(float fl, -// const Vector &v); // 734 -// operator+(const Vector *const this, -// const Vector &v); // 734 -// } -// } -} - -/* <3eaf22> ../cstrike/dlls/bot/cs_bot_weapon.cpp:810 */ -NOBODY void CCSBot::ReloadCheck(void) -{ -// { -// float const safeReloadWaitTime; // 812 -// float const reloadAmmoRatio; // 813 -// IsActiveWeaponReloading(const class CBot *const this); // 819 -// IsPistolEmpty(const class CCSBot *const this); // 827 -// IsUsingAWP(const class CCSBot *const this); // 848 -// GetNearbyEnemyCount(const class CCSBot *const this); // 854 -// { -// float const hideChance; // 857 -// { -// float const safeTime; // 861 -// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 862 -// { -// const Vector *spot; // 865 -// } -// } -// } -// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 835 -// IsPistol(CBasePlayerWeapon *const this); // 827 -// } -} - -/* <3eb0ac> ../cstrike/dlls/bot/cs_bot_weapon.cpp:885 */ -NOBODY void CCSBot::SilencerCheck(void) -{ -// { -// float const safeSilencerWaitTime; // 887 -// IsActiveWeaponReloading(const class CBot *const this); // 889 -// DoesActiveWeaponHaveSilencer(const class CCSBot *const this); // 892 -// GetNearbyEnemyCount(const class CCSBot *const this); // 896 -// { -// bool isSilencerOn; // 899 -// class CBasePlayerWeapon *myGun; // 901 -// } -// } -} - -/* <3eb1a9> ../cstrike/dlls/bot/cs_bot_weapon.cpp:926 */ -NOBODY void CCSBot::OnTouchingWeapon_(CWeaponBox *box) -{ -// { -// class CBasePlayerItem *droppedGun; // 929 -// class CBasePlayerWeapon *myGun; // 934 -// float const safeTime; // 947 -// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 948 -// { -// int i; // 952 -// { -// int prefID; // 954 -// GetWeaponPreference(const class BotProfile *const this, -// int i); // 954 -// } -// } -// } -} - -/* <3eb277> ../cstrike/dlls/bot/cs_bot_weapon.cpp:977 */ -NOBODY bool CCSBot::IsFriendInLineOfFire(void) -{ -// { -// Vector aimDir; // 981 -// TraceResult result; // 984 -// Vector target; // 985 -// operator+(const Vector *const this, -// const Vector &v); // 980 -// operator*(float fl, -// const Vector &v); // 985 -// operator+(const Vector *const this, -// const Vector &v); // 985 -// { -// class CBaseEntity *victim; // 990 -// Instance(edict_t *pent); // 990 -// } -// } -} - -/* <3eb84d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:1009 */ -NOBODY float CCSBot::ComputeWeaponSightRange(void) -{ -// { -// Vector aimDir; // 1013 -// TraceResult result; // 1016 -// Vector target; // 1017 -// operator+(const Vector *const this, -// const Vector &v); // 1012 -// operator*(float fl, -// const Vector &v); // 1017 -// operator+(const Vector *const this, -// const Vector &v); // 1017 -// operator-(const Vector *const this, -// const Vector &v); // 1020 -// Length(const Vector *const this); // 1020 -// } -} - + m_aimOffsetTimestamp = gpGlobals->time + RANDOM_FLOAT(0.25, 1); +} + +/* <3ea224> ../cstrike/dlls/bot/cs_bot_weapon.cpp:252 */ +void CCSBot::UpdateAimOffset(void) +{ + if (gpGlobals->time >= m_aimOffsetTimestamp) + { + SetAimOffset(GetProfile()->GetSkill()); + } + + // move current offset towards goal offset + Vector d = m_aimOffsetGoal - m_aimOffset; + const float stiffness = 0.1f; + + m_aimOffset.x += stiffness * d.x; + m_aimOffset.y += stiffness * d.y; + m_aimOffset.z += stiffness * d.z; +} + +/* <3ea2b7> ../cstrike/dlls/bot/cs_bot_weapon.cpp:271 */ +NOBODY bool CCSBot::AdjustZoom(float range) +{ +// IsUsingSniperRifle(const class CCSBot *const this); // 273 +// { +// float const sniperZoomRange; // 275 +// float const sniperFarZoomRange; // 276 +// GetZoomLevel(const class CCSBot *const this); // 282 +// GetZoomLevel(const class CCSBot *const this); // 291 +// GetZoomLevel(const class CCSBot *const this); // 300 +// } +} + +/* <3e9e2d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:320 */ +bool isSniperRifle(CBasePlayerItem *item) +{ + switch (item->m_iId) + { + case WEAPON_SCOUT: + case WEAPON_SG550: + case WEAPON_AWP: + case WEAPON_G3SG1: + break; + default: + return false; + } + + return true; +} + +/* <3ea3ab> ../cstrike/dlls/bot/cs_bot_weapon.cpp:342 */ +bool CCSBot::IsUsingAWP(void) +{ + return (m_pActiveItem && m_pActiveItem->m_iId == WEAPON_AWP); +} + +/* <3ea3ce> ../cstrike/dlls/bot/cs_bot_weapon.cpp:357 */ +NOBODY bool CCSBot::DoesActiveWeaponHaveSilencer(void) +{ +} + +/* <3ea3f1> ../cstrike/dlls/bot/cs_bot_weapon.cpp:375 */ +bool CCSBot::IsUsingSniperRifle(void) +{ + if (m_pActiveItem) + { + return isSniperRifle(m_pActiveItem); + } + return false; +} + +/* <3ea462> ../cstrike/dlls/bot/cs_bot_weapon.cpp:387 */ +NOBODY bool CCSBot::IsSniper(void) +{ +// { +// int i; // 389 +// { +// class CBasePlayerItem *item; // 391 +// isSniperRifle(CBasePlayerItem *item); // 393 +// } +// } +} + +/* <3ea4c1> ../cstrike/dlls/bot/cs_bot_weapon.cpp:405 */ +NOBODY bool CCSBot::IsSniping(void) +{ +} + +/* <3ea4e8> ../cstrike/dlls/bot/cs_bot_weapon.cpp:417 */ +bool CCSBot::IsUsingShotgun(void) +{ + return (m_pActiveItem && (m_pActiveItem->m_iId == WEAPON_XM1014 || m_pActiveItem->m_iId == WEAPON_M3)); +} + +/* <3ea50f> ../cstrike/dlls/bot/cs_bot_weapon.cpp:437 */ +bool CCSBot::IsUsingMachinegun(void) +{ + return (m_pActiveItem && m_pActiveItem->m_iId == WEAPON_M249); +} + +/* <3ea532> ../cstrike/dlls/bot/cs_bot_weapon.cpp:449 */ +NOBODY bool CCSBot::IsPrimaryWeaponEmpty(void) +{ +// { +// class CBasePlayerWeapon *gun; // 451 +// } +} + +/* <3ea578> ../cstrike/dlls/bot/cs_bot_weapon.cpp:467 */ +NOBODY bool CCSBot::IsPistolEmpty(void) +{ +// { +// class CBasePlayerWeapon *gun; // 469 +// } +} + +/* <3ea5d9> ../cstrike/dlls/bot/cs_bot_weapon.cpp:485 */ +NOBODY bool CCSBot::DoEquip(CBasePlayerWeapon *gun) +{ +// Start(IntervalTimer *const this); // 496 +} + +/* <3ea621> ../cstrike/dlls/bot/cs_bot_weapon.cpp:510 */ +NOBODY void CCSBot::EquipBestWeapon(bool mustEquip) +{ +// { +// class CCSBotManager *ctrl; // 523 +// class CBasePlayerWeapon *primary; // 525 +// GetElapsedTime(const class IntervalTimer *const this); // 513 +// { +// int weaponClass; // 528 +// AllowShotguns(const class CCSBotManager *const this); // 530 +// DoEquip(CCSBot *const this, +// class CBasePlayerWeapon *gun); // 538 +// } +// DoEquip(CCSBot *const this, +// class CBasePlayerWeapon *gun); // 545 +// EquipKnife(CCSBot *const this); // 550 +// } +} + +/* <3ea7fe> ../cstrike/dlls/bot/cs_bot_weapon.cpp:557 */ +NOBODY void CCSBot::EquipPistol(void) +{ +// { +// class CCSBotManager *ctrl; // 563 +// GetElapsedTime(const class IntervalTimer *const this); // 560 +// IsUsingPistol(const class CCSBot *const this); // 566 +// DoEquip(CCSBot *const this, +// class CBasePlayerWeapon *gun); // 567 +// } +} + +/* <3ea91a> ../cstrike/dlls/bot/cs_bot_weapon.cpp:575 */ +NOBODY void CCSBot::EquipKnife(void) +{ +// IsUsingKnife(const class CCSBot *const this); // 581 +// EquipKnife(CCSBot *const this); // 575 +} + +/* <3ea98b> ../cstrike/dlls/bot/cs_bot_weapon.cpp:589 */ +NOBODY bool CCSBot::HasGrenade(void) +{ +} + +/* <3ea9ae> ../cstrike/dlls/bot/cs_bot_weapon.cpp:598 */ +NOBODY bool CCSBot::EquipGrenade(bool noSmoke) +{ +// IsSniper(const class CCSBot *const this); // 601 +// IsUsingGrenade(const class CCSBot *const this); // 604 +// HasGrenade(const class CCSBot *const this); // 607 +} + +/* <3eaa8c> ../cstrike/dlls/bot/cs_bot_weapon.cpp:624 */ +bool CCSBot::IsUsingKnife(void) +{ + CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; + return (gun && gun->m_iId == 29); +} + +/* <3eaac2> ../cstrike/dlls/bot/cs_bot_weapon.cpp:638 */ +bool CCSBot::IsUsingPistol(void) +{ + UNTESTED + + CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; + if (gun) + { + switch (gun->m_iId) + { + case WEAPON_USP: + case WEAPON_GLOCK18: + case WEAPON_P228: + case WEAPON_DEAGLE: + case WEAPON_ELITE: + case WEAPON_FIVESEVEN: + return true; + default: + break; + } + + // TODO: check it, from the dwarf should be used function IsPistol +// { +// class CBasePlayerWeapon *gun; // 640 +// IsPistol(CBasePlayerWeapon *const this); // 642 +// } + //return gun->IsPistol(); + } + return false; +} + +/* <3eab09> ../cstrike/dlls/bot/cs_bot_weapon.cpp:652 */ +bool CCSBot::IsUsingGrenade(void) +{ + CBasePlayerWeapon *gun = (CBasePlayerWeapon *)m_pActiveItem; + return (gun && (gun->m_iId == WEAPON_SMOKEGRENADE || gun->m_iId == WEAPON_FLASHBANG || gun->m_iId == WEAPON_HEGRENADE)); +} + +/* <3eab3f> ../cstrike/dlls/bot/cs_bot_weapon.cpp:672 */ +NOBODY bool CCSBot::IsUsingHEGrenade(void) +{ +// { +// class CBasePlayerWeapon *gun; // 674 +// } +} + +/* <3eab80> ../cstrike/dlls/bot/cs_bot_weapon.cpp:690 */ +void CCSBot::ThrowGrenade(const Vector *target) +{ + if (IsUsingGrenade() && !m_isWaitingToTossGrenade) + { + const float angleTolerance = 1.0f; + + SetLookAt("GrenadeThrow", target, PRIORITY_UNINTERRUPTABLE, 3.0f, false, angleTolerance); + + m_isWaitingToTossGrenade = true; + m_tossGrenadeTimer.Start(3.0f); + } +} + +/* <3eac08> ../cstrike/dlls/bot/cs_bot_weapon.cpp:709 */ +NOBODY bool CCSBot::FindGrenadeTossPathTarget(const Vector *pos) +{ +// { +// int i; // 715 +// Vector dir; // 726 +// float length; // 727 +// float const inc; // 729 +// Vector p; // 730 +// Vector visibleSpot; // 731 +// float const bufferRange; // 745 +// TraceResult result; // 747 +// Vector check; // 748 +// operator+(const Vector *const this, +// const Vector &v); // 718 +// operator-(const Vector *const this, +// const Vector &v); // 726 +// NormalizeInPlace(Vector *const this); // 727 +// Vector(Vector *const this, +// const Vector &v); // 731 +// operator+(const Vector *const this, +// const Vector &v); // 751 +// { +// float range; // 756 +// } +// operator+(const Vector *const this, +// const Vector &v); // 764 +// { +// float range; // 769 +// } +// operator+(const Vector *const this, +// const Vector &v); // 777 +// { +// float range; // 782 +// } +// operator+(const Vector *const this, +// const Vector &v); // 790 +// { +// float range; // 795 +// } +// { +// float t; // 732 +// operator*(float fl, +// const Vector &v); // 734 +// operator+(const Vector *const this, +// const Vector &v); // 734 +// } +// } +} + +/* <3eaf22> ../cstrike/dlls/bot/cs_bot_weapon.cpp:810 */ +NOBODY void CCSBot::ReloadCheck(void) +{ +// { +// float const safeReloadWaitTime; // 812 +// float const reloadAmmoRatio; // 813 +// IsActiveWeaponReloading(const class CBot *const this); // 819 +// IsPistolEmpty(const class CCSBot *const this); // 827 +// IsUsingAWP(const class CCSBot *const this); // 848 +// GetNearbyEnemyCount(const class CCSBot *const this); // 854 +// { +// float const hideChance; // 857 +// { +// float const safeTime; // 861 +// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 862 +// { +// const Vector *spot; // 865 +// } +// } +// } +// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 835 +// IsPistol(CBasePlayerWeapon *const this); // 827 +// } +} + +/* <3eb0ac> ../cstrike/dlls/bot/cs_bot_weapon.cpp:885 */ +NOBODY void CCSBot::SilencerCheck(void) +{ +// { +// float const safeSilencerWaitTime; // 887 +// IsActiveWeaponReloading(const class CBot *const this); // 889 +// DoesActiveWeaponHaveSilencer(const class CCSBot *const this); // 892 +// GetNearbyEnemyCount(const class CCSBot *const this); // 896 +// { +// bool isSilencerOn; // 899 +// class CBasePlayerWeapon *myGun; // 901 +// } +// } +} + +/* <3eb1a9> ../cstrike/dlls/bot/cs_bot_weapon.cpp:926 */ +NOBODY void CCSBot::__MAKE_VHOOK(OnTouchingWeapon)(CWeaponBox *box) +{ +// { +// class CBasePlayerItem *droppedGun; // 929 +// class CBasePlayerWeapon *myGun; // 934 +// float const safeTime; // 947 +// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 948 +// { +// int i; // 952 +// { +// int prefID; // 954 +// GetWeaponPreference(const class BotProfile *const this, +// int i); // 954 +// } +// } +// } +} + +/* <3eb277> ../cstrike/dlls/bot/cs_bot_weapon.cpp:977 */ +NOBODY bool CCSBot::IsFriendInLineOfFire(void) +{ +// { +// Vector aimDir; // 981 +// TraceResult result; // 984 +// Vector target; // 985 +// operator+(const Vector *const this, +// const Vector &v); // 980 +// operator*(float fl, +// const Vector &v); // 985 +// operator+(const Vector *const this, +// const Vector &v); // 985 +// { +// class CBaseEntity *victim; // 990 +// Instance(edict_t *pent); // 990 +// } +// } +} + +/* <3eb84d> ../cstrike/dlls/bot/cs_bot_weapon.cpp:1009 */ +NOBODY float CCSBot::ComputeWeaponSightRange(void) +{ +// { +// Vector aimDir; // 1013 +// TraceResult result; // 1016 +// Vector target; // 1017 +// operator+(const Vector *const this, +// const Vector &v); // 1012 +// operator*(float fl, +// const Vector &v); // 1017 +// operator+(const Vector *const this, +// const Vector &v); // 1017 +// operator-(const Vector *const this, +// const Vector &v); // 1020 +// Length(const Vector *const this); // 1020 +// } +} + #ifdef HOOK_GAMEDLL -void CCSBot::OnTouchingWeapon(CWeaponBox *box) -{ - OnTouchingWeapon_(box); +void CCSBot::OnTouchingWeapon(CWeaponBox *box) +{ + OnTouchingWeapon_(box); } #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/buttons.cpp b/regamedll/dlls/buttons.cpp index b1b33b6b..777ef609 100644 --- a/regamedll/dlls/buttons.cpp +++ b/regamedll/dlls/buttons.cpp @@ -64,7 +64,7 @@ IMPLEMENT_SAVERESTORE(CEnvGlobal, CBaseEntity); LINK_ENTITY_TO_CLASS(env_global, CEnvGlobal); /* <26863> ../cstrike/dlls/buttons.cpp:66 */ -NOBODY void CEnvGlobal::KeyValue_(KeyValueData *pkvd) +NOBODY void CEnvGlobal::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 70 @@ -76,14 +76,14 @@ NOBODY void CEnvGlobal::KeyValue_(KeyValueData *pkvd) } /* <26486> ../cstrike/dlls/buttons.cpp:80 */ -NOBODY void CEnvGlobal::Spawn_(void) +NOBODY void CEnvGlobal::__MAKE_VHOOK(Spawn)(void) { // EntityInTable(CGlobalState::Spawn(// string_t globalname); // 89 // Spawn(CEnvGlobal *const this); // 80 } /* <25ee7> ../cstrike/dlls/buttons.cpp:95 */ -NOBODY void CEnvGlobal::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CEnvGlobal::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // GLOBALESTATE oldState; // 97 @@ -100,7 +100,7 @@ IMPLEMENT_SAVERESTORE(CMultiSource, CBaseEntity); LINK_ENTITY_TO_CLASS(multisource, CMultiSource); /* <26d1e> ../cstrike/dlls/buttons.cpp:148 */ -NOBODY void CMultiSource::KeyValue_(KeyValueData *pkvd) +NOBODY void CMultiSource::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 150 @@ -121,12 +121,12 @@ NOBODY void CMultiSource::KeyValue_(KeyValueData *pkvd) } /* <256e2> ../cstrike/dlls/buttons.cpp:168 */ -NOBODY void CMultiSource::Spawn_(void) +NOBODY void CMultiSource::__MAKE_VHOOK(Spawn)(void) { } /* <2633b> ../cstrike/dlls/buttons.cpp:179 */ -NOBODY void CMultiSource::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CMultiSource::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // int i; // 181 @@ -142,7 +142,7 @@ NOBODY void CMultiSource::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, US } /* <26419> ../cstrike/dlls/buttons.cpp:211 */ -NOBODY BOOL CMultiSource::IsTriggered_(CBaseEntity *) +NOBODY BOOL CMultiSource::__MAKE_VHOOK(IsTriggered)(CBaseEntity *) { // { // int i; // 214 @@ -173,7 +173,7 @@ NOBODY void CMultiSource::Register(void) IMPLEMENT_SAVERESTORE(CBaseButton, CBaseToggle); /* <25709> ../cstrike/dlls/buttons.cpp:289 */ -NOBODY void CBaseButton::Precache_(void) +NOBODY void CBaseButton::__MAKE_VHOOK(Precache)(void) { // { // char *pszSound; // 291 @@ -183,7 +183,7 @@ NOBODY void CBaseButton::Precache_(void) } /* <269cb> ../cstrike/dlls/buttons.cpp:355 */ -NOBODY void CBaseButton::KeyValue_(KeyValueData *pkvd) +NOBODY void CBaseButton::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 357 @@ -195,7 +195,7 @@ NOBODY void CBaseButton::KeyValue_(KeyValueData *pkvd) } /* <26e90> ../cstrike/dlls/buttons.cpp:394 */ -NOBODY int CBaseButton::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CBaseButton::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // { // enum BUTTON_CODE code; // 396 @@ -215,7 +215,7 @@ NOBODY int CBaseButton::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttac LINK_ENTITY_TO_CLASS(func_button, CBaseButton); /* <25c2c> ../cstrike/dlls/buttons.cpp:442 */ -NOBODY void CBaseButton::Spawn_(void) +NOBODY void CBaseButton::__MAKE_VHOOK(Spawn)(void) { // { // char *pszSound; // 444 @@ -366,7 +366,7 @@ NOBODY void CBaseButton::ButtonBackHome(void) LINK_ENTITY_TO_CLASS(func_rot_button, CRotButton); /* <25a06> ../cstrike/dlls/buttons.cpp:808 */ -NOBODY void CRotButton::Spawn_(void) +NOBODY void CRotButton::__MAKE_VHOOK(Spawn)(void) { // { // char *pszSound; // 810 @@ -381,7 +381,7 @@ NOBODY void CRotButton::Spawn_(void) } /* <2577a> ../cstrike/dlls/buttons.cpp:878 */ -NOBODY int CMomentaryRotButton::ObjectCaps_(void) +NOBODY int CMomentaryRotButton::__MAKE_VHOOK(ObjectCaps)(void) { // { // int flags; // 880 @@ -395,7 +395,7 @@ IMPLEMENT_SAVERESTORE(CMomentaryRotButton, CBaseToggle); LINK_ENTITY_TO_CLASS(momentary_rot_button, CMomentaryRotButton); /* <25acc> ../cstrike/dlls/buttons.cpp:922 */ -NOBODY void CMomentaryRotButton::Spawn_(void) +NOBODY void CMomentaryRotButton::__MAKE_VHOOK(Spawn)(void) { // { // char *pszSound; // 952 @@ -412,7 +412,7 @@ NOBODY void CMomentaryRotButton::Spawn_(void) } /* <2678f> ../cstrike/dlls/buttons.cpp:958 */ -NOBODY void CMomentaryRotButton::KeyValue_(KeyValueData *pkvd) +NOBODY void CMomentaryRotButton::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 960 @@ -434,7 +434,7 @@ NOBODY void CMomentaryRotButton::PlaySound(void) } /* <27dc0> ../cstrike/dlls/buttons.cpp:982 */ -NOBODY void CMomentaryRotButton::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CMomentaryRotButton::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // UpdateTarget(CMomentaryRotButton *const this, // float value); // 987 @@ -514,17 +514,17 @@ LINK_ENTITY_TO_CLASS(env_spark, CEnvSpark); LINK_ENTITY_TO_CLASS(env_debris, CEnvSpark); /* <257b7> ../cstrike/dlls/buttons.cpp:1146 */ -NOBODY void CEnvSpark::Spawn_(void) +NOBODY void CEnvSpark::__MAKE_VHOOK(Spawn)(void) { } /* <257de> ../cstrike/dlls/buttons.cpp:1173 */ -NOBODY void CEnvSpark::Precache_(void) +NOBODY void CEnvSpark::__MAKE_VHOOK(Precache)(void) { } /* <26b97> ../cstrike/dlls/buttons.cpp:1183 */ -NOBODY void CEnvSpark::KeyValue_(KeyValueData *pkvd) +NOBODY void CEnvSpark::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 1185 @@ -564,12 +564,12 @@ NOBODY void CEnvSpark::SparkStop(CBaseEntity *pActivator, CBaseEntity *pCaller, LINK_ENTITY_TO_CLASS(button_target, CButtonTarget); /* <258ca> ../cstrike/dlls/buttons.cpp:1235 */ -NOBODY void CButtonTarget::Spawn_(void) +NOBODY void CButtonTarget::__MAKE_VHOOK(Spawn)(void) { } /* <25fc3> ../cstrike/dlls/buttons.cpp:1246 */ -NOBODY void CButtonTarget::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CButtonTarget::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CButtonTarget *const this, // class CBaseEntity *pActivator, @@ -579,7 +579,7 @@ NOBODY void CButtonTarget::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, U } /* <258f1> ../cstrike/dlls/buttons.cpp:1258 */ -NOBODY int CButtonTarget::ObjectCaps_(void) +NOBODY int CButtonTarget::__MAKE_VHOOK(ObjectCaps)(void) { // { // int caps; // 1260 @@ -587,7 +587,7 @@ NOBODY int CButtonTarget::ObjectCaps_(void) } /* <2592e> ../cstrike/dlls/buttons.cpp:1269 */ -NOBODY int CButtonTarget::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CButtonTarget::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // Instance(entvars_t *pev); // 1271 } diff --git a/regamedll/dlls/career_tasks.cpp b/regamedll/dlls/career_tasks.cpp index 42c2250f..aad86220 100644 --- a/regamedll/dlls/career_tasks.cpp +++ b/regamedll/dlls/career_tasks.cpp @@ -60,7 +60,7 @@ CPreventDefuseTask::CPreventDefuseTask(const char *taskName, GameEventType event } /* <1ef296> ../cstrike/dlls/career_tasks.cpp:147 */ -void CPreventDefuseTask::Reset_(void) +void CPreventDefuseTask::__MAKE_VHOOK(Reset)(void) { m_bombPlantedThisRound = false; m_defuseStartedThisRound = false; @@ -69,7 +69,7 @@ void CPreventDefuseTask::Reset_(void) } /* <1efbf8> ../cstrike/dlls/career_tasks.cpp:156 */ -void CPreventDefuseTask::OnEvent_(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) +void CPreventDefuseTask::__MAKE_VHOOK(OnEvent)(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) { if (IsComplete()) return; @@ -128,27 +128,27 @@ CCareerTask::CCareerTask(const char *taskName, GameEventType event, const char * if (m_isComplete) { MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); - WRITE_STRING("TASKDONE"); - WRITE_BYTE(m_id); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_id); MESSAGE_END(); } } /* <1ef211> ../cstrike/dlls/career_tasks.cpp:240 */ -void CCareerTask::Reset_(void) +void CCareerTask::__MAKE_VHOOK(Reset)(void) { m_eventsSeen = 0; m_isComplete = false; MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); - WRITE_STRING("TASKUNDONE"); - WRITE_BYTE(m_id); + 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); + WRITE_STRING("TASKPART"); + WRITE_BYTE(m_id); + WRITE_SHORT(m_eventsSeen); MESSAGE_END(); } @@ -156,9 +156,9 @@ void CCareerTask::Reset_(void) void CCareerTask::SendPartialNotification(void) { MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); - WRITE_STRING("TASKPART"); - WRITE_BYTE(m_id); - WRITE_SHORT(m_eventsSeen); + 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); @@ -254,14 +254,14 @@ void CCareerTask::OnWeaponInjury(int weaponId, int weaponClassId, bool attackerH } /* <1ef79d> ../cstrike/dlls/career_tasks.cpp:385 */ -void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlayer *pAttacker) +void CCareerTask::__MAKE_VHOOK(OnEvent)(GameEventType event, CBasePlayer *pVictim, CBasePlayer *pAttacker) { if (m_isComplete) return; if (event == m_event) { - if ((m_defuser && !pAttacker->m_bIsDefusing) || (m_vip && !pAttacker->m_bIsVIP)) + if ((m_defuser && !pAttacker->m_bIsDefusing) || (m_vip && !pAttacker->m_bIsVIP)) return; if (m_rescuer) @@ -271,32 +271,37 @@ void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlaye while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) { - CHostage *hostage = (CHostage *)hostageEntity; - - if (!hostage || hostage->pev->takedamage != DAMAGE_YES) + if (hostageEntity->pev->takedamage != DAMAGE_YES) continue; + CHostage *hostage = reinterpret_cast(hostageEntity); + if (hostage->m_improv) { if (!hostage->IsFollowingSomeone()) + { continue; + } } - else if (!hostage->m_hTargetEnt || hostage->m_State != CHostage::FOLLOW) + else if (hostage->m_hTargetEnt == NULL || 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_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")) @@ -306,12 +311,7 @@ void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlaye while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) { - CHostage *hostage = (CHostage *)hostageEntity; - - if (!hostage || hostage->IsValid()) - continue; - - if (hostage->pev->deadflag != DEAD_DEAD) + if (hostageEntity->pev->takedamage != 1.0f && hostageEntity->pev->deadflag != DEAD_DEAD) ++hostages_; } @@ -342,41 +342,49 @@ void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlaye } else if (!Q_strcmp(m_name, "winfast")) { - if (m_eventsNeeded >= (int)TheCareerTasks->GetRoundElapsedTime()) + if (m_eventsNeeded >= TheCareerTasks->GetRoundElapsedTime()) { m_eventsSeen = m_eventsNeeded; SendPartialNotification(); } } else if (IsTaskCompletableThisRound()) + { + ++m_eventsSeen; SendPartialNotification(); + } + } + else + { + ++m_eventsSeen; + SendPartialNotification(); } } } - if (event == m_event && !m_mustLive && (m_eventsSeen >= m_eventsNeeded) && IsTaskCompletableThisRound()) + 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; + m_isComplete = true; MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); - WRITE_STRING("TASKDONE"); - WRITE_BYTE(m_id); + 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(); + TheCareerTasks->SetFinishedTaskTime((int)TheCareerTasks->GetRoundElapsedTime()); + UTIL_GetLocalPlayer()->SyncRoundTimer(); } - - return; } else if (event >= EVENT_ROUND_DRAW) { @@ -387,35 +395,37 @@ void CCareerTask::OnEvent_(GameEventType event, CBasePlayer *pVictim, CBasePlaye m_eventsSeen = 0; SendPartialNotification(); m_diedThisRound = true; - } + } } else if (m_mustLive) { - CBasePlayer *player = UTIL_GetLocalPlayer(); - if (m_eventsSeen >= m_eventsNeeded && !m_diedThisRound && 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); + 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(); + TheCareerTasks->SetFinishedTaskTime((signed __int64)(TheCareerTasks->GetRoundElapsedTime())); + UTIL_GetLocalPlayer()->SyncRoundTimer(); } if (TheTutor) + { TheTutor->OnEvent(EVENT_CAREER_TASK_DONE); + } } m_diedThisRound = false; + if (m_mustLive) { m_eventsSeen = 0; @@ -509,12 +519,14 @@ void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, i m_tasks.push_back(newTask); - if (pTaskInfo->event == EVENT_ROUND_WIN && Q_strcmp(taskName, "winfast")) + if (pTaskInfo->event == EVENT_ROUND_WIN && !Q_strcmp(taskName, "winfast")) { m_taskTime = eventCount; if (isComplete) - m_finishedTaskTime = eventCount; + { + m_finishedTaskTime = eventCount; + } } return; @@ -523,8 +535,8 @@ void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, i } MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); - WRITE_STRING("TASKDONE"); - WRITE_BYTE(m_nextId); + WRITE_STRING("TASKDONE"); + WRITE_BYTE(m_nextId); MESSAGE_END(); } @@ -532,9 +544,12 @@ void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, i void CCareerTaskManager::HandleEvent(GameEventType event, CBasePlayer *pAttacker, CBasePlayer *pVictim) { if (event == EVENT_ROUND_START) + { m_roundStartTime = gpGlobals->time; + return; + } - else if ((event <= EVENT_ROUND_LOSS && event >= EVENT_ROUND_DRAW) && m_shouldLatchRoundEndMessage) + if ((event <= EVENT_ROUND_LOSS && event >= EVENT_ROUND_DRAW) && m_shouldLatchRoundEndMessage) { m_roundEndMessage = event; return; diff --git a/regamedll/dlls/career_tasks.h b/regamedll/dlls/career_tasks.h index 854fc7c0..7f2126ce 100644 --- a/regamedll/dlls/career_tasks.h +++ b/regamedll/dlls/career_tasks.h @@ -93,7 +93,7 @@ private: bool m_isComplete; const char *m_name; int m_id; - enum GameEventType m_event; + GameEventType m_event; int m_eventsNeeded; int m_eventsSeen; bool m_mustLive; diff --git a/regamedll/dlls/cbase.cpp b/regamedll/dlls/cbase.cpp index 5bc41f50..7de87ad2 100644 --- a/regamedll/dlls/cbase.cpp +++ b/regamedll/dlls/cbase.cpp @@ -67,6 +67,16 @@ static NEW_DLL_FUNCTIONS gNewDLLFunctions NULL }; +// Global Savedata for Delay +TYPEDESCRIPTION CBaseEntity::m_SaveData[] = +{ + DEFINE_FIELD(CBaseEntity, m_pGoalEnt, FIELD_CLASSPTR), + DEFINE_FIELD(CBaseEntity, m_pfnThink, FIELD_FUNCTION), // UNDONE: Build table of these!!! + DEFINE_FIELD(CBaseEntity, m_pfnTouch, FIELD_FUNCTION), + DEFINE_FIELD(CBaseEntity, m_pfnUse, FIELD_FUNCTION), + DEFINE_FIELD(CBaseEntity, m_pfnBlocked, FIELD_FUNCTION), +}; + CMemoryPool hashItemMemPool(sizeof(hash_item_t), 64); BOOL gTouchDisabled = FALSE; @@ -74,6 +84,7 @@ BOOL gTouchDisabled = FALSE; DLL_FUNCTIONS gFunctionTable; NEW_DLL_FUNCTIONS gNewDLLFunctions; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CBaseEntity, m_SaveData)[5]; CMemoryPool hashItemMemPool; BOOL gTouchDisabled; @@ -84,8 +95,11 @@ BOOL gTouchDisabled; int CaseInsensitiveHash(const char *string, int iBounds) { unsigned int hash = 0; - if (!*string) + + if (!string[0]) + { return 0; + } while (*string) { @@ -272,18 +286,22 @@ void RemoveEntityHashValue(entvars_t *pev, const char *value, hash_types_e field } /* <31125> ../cstrike/dlls/cbase.cpp:337 */ -NOBODY void printEntities(void) -{ -// { -// int i; // 339 -// { -// class hash_item_t *item; // 345 -// operator[](CUtlVector *const this, -// int i); // 341 -// ENTINDEX(edict_t *pEdict); // 343 -// ENTINDEX(edict_t *pEdict); // 348 -// } -// } +void printEntities(void) +{ + for (int i = 0; i < stringsHashTable.Count(); i++) + { + hash_item_t *item = &stringsHashTable[i]; + + if (item->pev) + { + UTIL_LogPrintf("Print: %s %i %p\n", STRING(stringsHashTable[i].pev->classname), ENTINDEX(ENT(item->pev)), item->pev); + } + + for (item = stringsHashTable[i].next; item; item = item->next) + { + UTIL_LogPrintf("Print: %s %i %p\n", STRING(item->pev->classname), ENTINDEX(ENT(item->pev)), item->pev); + } + } } /* <311e9> ../cstrike/dlls/cbase.cpp:354 */ @@ -303,33 +321,69 @@ void REMOVE_ENTITY(edict_t *e) } /* <30158> ../cstrike/dlls/cbase.cpp:375 */ -//NOBODY void CONSOLE_ECHO(char *pszMsg, ...) -//{ -// { -// va_list argptr; // 377 -// char szStr; // 378 -// } -//} +void CONSOLE_ECHO_(char *pszMsg, ...) +{ + va_list argptr; + static char szStr[1024]; + + va_start(argptr, pszMsg); + vsprintf(szStr, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(szStr); +} /* <31273> ../cstrike/dlls/cbase.cpp:386 */ -NOBODY void loopPerformance(void) +void loopPerformance(void) { -// { -// class CPerformanceCounter loopCounter; // 390 -// double start; // 393 -// int i; // 395 -// double end; // 419 -// GetCurTime(CPerformanceCounter *const this); // 393 -// { -// class CBaseEntity *pSpot; // 398 -// } -// GetCurTime(CPerformanceCounter *const this); // 419 -// GetCurTime(CPerformanceCounter *const this); // 422 -// { -// class CBaseEntity *pSpot; // 426 -// } -// GetCurTime(CPerformanceCounter *const this); // 447 -// } + CPerformanceCounter loopCounter; + loopCounter.InitializePerformanceCounter(); + + double start, end; + int i; + + start = loopCounter.GetCurTime(); + + for (i = 0; i < 100; i++) + { + CBaseEntity *pSpot; + for (pSpot = UTIL_FindEntityByString_Old(NULL, "classname", "info_player_start"); pSpot != NULL; pSpot = UTIL_FindEntityByString_Old(pSpot, "classname", "info_player_start")) + ; + + for (pSpot = UTIL_FindEntityByString_Old(NULL, "classname", "info_player_deathmatch"); pSpot != NULL; pSpot = UTIL_FindEntityByString_Old(pSpot, "classname", "info_player_deathmatch")) + ; + + for (pSpot = UTIL_FindEntityByString_Old(NULL, "classname", "player"); pSpot != NULL; pSpot = UTIL_FindEntityByString_Old(pSpot, "classname", "player")) + ; + + for (pSpot = UTIL_FindEntityByString_Old(NULL, "classname", "bodyque"); pSpot != NULL; pSpot = UTIL_FindEntityByString_Old(pSpot, "classname", "bodyque")) + ; + } + + end = loopCounter.GetCurTime(); + CONSOLE_ECHO(" Time in old search loop %.4f\n", (end - start) * 1000.0); + + // check time new search loop + start = loopCounter.GetCurTime(); + + for (i = 0; i < 100; i++) + { + CBaseEntity *pSpot; + for (pSpot = UTIL_FindEntityByString(NULL, "classname", "info_player_start"); pSpot != NULL; pSpot = UTIL_FindEntityByString(pSpot, "classname", "info_player_start")) + ; + + for (pSpot = UTIL_FindEntityByString(NULL, "classname", "info_player_deathmatch"); pSpot != NULL; pSpot = UTIL_FindEntityByString(pSpot, "classname", "info_player_deathmatch")) + ; + + for (pSpot = UTIL_FindEntityByString(NULL, "classname", "player"); pSpot != NULL; pSpot = UTIL_FindEntityByString(pSpot, "classname", "player")) + ; + + for (pSpot = UTIL_FindEntityByString(NULL, "classname", "bodyque"); pSpot != NULL; pSpot = UTIL_FindEntityByString(pSpot, "classname", "bodyque")) + ; + } + + end = loopCounter.GetCurTime(); + CONSOLE_ECHO(" Time in new search loop %.4f\n", (end - start) * 1000.0); } /* <313df> ../cstrike/dlls/cbase.cpp:451 */ @@ -340,8 +394,11 @@ C_DLLEXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion Q_memcpy(pFunctionTable, &gFunctionTable, sizeof(DLL_FUNCTIONS)); stringsHashTable.AddMultipleToTail(2048); + for (int i = 0; i < stringsHashTable.Count(); i++) + { stringsHashTable[i].next = NULL; + } EmptyEntityHashTable(); return 1; @@ -355,6 +412,7 @@ NOXREF extern "C" C_EXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion = INTERFACE_VERSION; return 0; } + Q_memcpy(pFunctionTable, &gFunctionTable, sizeof(DLL_FUNCTIONS)); return 1; } @@ -371,32 +429,65 @@ extern "C" C_EXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pFunctionTable, in return 1; } -int (*pDispatchSpawn)(edict_t *); - /* <30ab0> ../cstrike/dlls/cbase.cpp:498 */ -NOBODY int __declspec(naked) DispatchSpawn(edict_t *pent) +int DispatchSpawn(edict_t *pent) { - //Reverse me - __asm + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity != NULL) { - jmp pDispatchSpawn; + // Initialize these or entities who don't link to the world won't have anything in here + pEntity->pev->absmin = pEntity->pev->origin - Vector(1, 1, 1); + pEntity->pev->absmax = pEntity->pev->origin + Vector(1, 1, 1); + pEntity->Spawn(); + + // Try to get the pointer again, in case the spawn function deleted the entity. + // UNDONE: Spawn() should really return a code to ask that the entity be deleted, but + // that would touch too much code for me to do that right now. + pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity) + { + if (g_pGameRules && !g_pGameRules->IsAllowedToSpawn(pEntity)) + { + // return that this entity should be deleted + return -1; + } + + if (pEntity->pev->flags & FL_KILLME) + { + return -1; + } + } + + // Handle global stuff here + if (pEntity && pEntity->pev->globalname) + { + const globalentity_t *pGlobal = gGlobalState.EntityFromTable(pEntity->pev->globalname); + + if (pGlobal) + { + // Already dead? delete + if (pGlobal->state == GLOBAL_DEAD) + return -1; + + else if (!FStrEq(STRING(gpGlobals->mapname), pGlobal->levelName)) + { + // Hasn't been moved to this level yet, wait but stay alive + // In this level & not dead, continue on as normal + pEntity->MakeDormant(); + } + } + else + { + // Spawned entities default to 'On' + gGlobalState.EntityAdd(pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON); + } + } + } -// { -// class CBaseEntity *pEntity; // 500 -// GET_PRIVATE(edict_t *pent); // 500 -// operator-(const class Vector *const this, -// const class Vector &v); // 505 -// operator+(const class Vector *const this, -// const class Vector &v); // 506 -// GET_PRIVATE(edict_t *pent); // 513 -// { -// const globalentity_t *pGlobal; // 527 -// FStrEq(const char *sz1, -// const char *sz2); // 533 -// MakeDormant(CBaseEntity *const this); // 534 -// } -// } + return 0; } /* <2e8a0> ../cstrike/dlls/cbase.cpp:549 */ @@ -407,15 +498,23 @@ void DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd) EntvarsKeyvalue(VARS(pentKeyvalue), pkvd); + // If the key was an entity variable, or there's no class set yet, don't look for the object, it may + // not exist yet. if (pkvd->fHandled || !pkvd->szClassName) return; + // Get the actualy entity object CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentKeyvalue); - if (pEntity) - pEntity->KeyValue(pkvd); + if (!pEntity) + return; + + pEntity->KeyValue(pkvd); } +// HACKHACK -- this is a hack to keep the node graph entity from "touching" things (like triggers) +// while it builds the graph + /* <2e7db> ../cstrike/dlls/cbase.cpp:574 */ void DispatchTouch(edict_t *pentTouched, edict_t *pentOther) { @@ -430,62 +529,93 @@ void DispatchTouch(edict_t *pentTouched, edict_t *pentOther) } /* <2fa9b> ../cstrike/dlls/cbase.cpp:587 */ -NOBODY void DispatchUse(edict_t *pentUsed, edict_t *pentOther) +void DispatchUse(edict_t *pentUsed, edict_t *pentOther) { -// { -// class CBaseEntity *pEntity; // 589 -// class CBaseEntity *pOther; // 590 -// GET_PRIVATE(edict_t *pent); // 589 -// GET_PRIVATE(edict_t *pent); // 590 -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentUsed); + CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE(pentOther); + + if (pEntity && !(pEntity->pev->flags & FL_KILLME)) + { + pEntity->Use(pOther, pOther, USE_TOGGLE, 0); + } } /* <2fb2f> ../cstrike/dlls/cbase.cpp:596 */ -NOBODY void DispatchThink(edict_t *pent) +void DispatchThink(edict_t *pent) { -// { -// class CBaseEntity *pEntity; // 598 -// GET_PRIVATE(edict_t *pent); // 598 -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity != NULL) + { + if ((pEntity->pev->flags & FL_DORMANT)) + { + ALERT(at_error, "Dormant entity %s is thinking!!\n", STRING(pEntity->pev->classname)); + } + pEntity->Think(); + } } /* <2fb89> ../cstrike/dlls/cbase.cpp:612 */ -NOBODY void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther) +void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther) { -// { -// class CBaseEntity *pEntity; // 614 -// class CBaseEntity *pOther; // 615 -// GET_PRIVATE(edict_t *pent); // 614 -// GET_PRIVATE(edict_t *pent); // 615 -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentBlocked); + CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE(pentOther); + + if (pEntity != NULL) + { + pEntity->Blocked(pOther); + } } /* <2ff56> ../cstrike/dlls/cbase.cpp:621 */ -NOBODY void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData) +void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData) { -// { -// class CBaseEntity *pEntity; // 623 -// GET_PRIVATE(edict_t *pent); // 623 -// { -// ENTITYTABLE *pTable; // 627 -// class CSave saveHelper; // 646 -// { -// float delta; // 638 -// } -// CSave(CSave *const this, -// SAVERESTOREDATA *pdata); // 646 -// ~CSave(CSave *const this, -// intconst __in_chrg); // 646 -// } -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity != NULL && pSaveData != NULL) + { + ENTITYTABLE *pTable = &pSaveData->pTable[ pSaveData->currentIndex ]; + + if (pTable->pent != pent) + { + ALERT(at_error, "ENTITY TABLE OR INDEX IS WRONG!!!!\n"); + } + + if (pEntity->ObjectCaps() & FCAP_DONT_SAVE) + return; + + // These don't use ltime & nextthink as times really, but we'll fudge around it. + if (pEntity->pev->movetype == MOVETYPE_PUSH) + { + float_precision delta = pEntity->pev->nextthink - pEntity->pev->ltime; + pEntity->pev->ltime = gpGlobals->time; + pEntity->pev->nextthink = pEntity->pev->ltime + delta; + } + + // Remember entity position for file I/O + pTable->location = pSaveData->size; + + // Remember entity class for respawn + pTable->classname = pEntity->pev->classname; + + CSave saveHelper(pSaveData); + pEntity->Save(saveHelper); + + // Size of entity block is data size written to block + pTable->size = pSaveData->size - pTable->location; + } } +// Find the matching global entity. Spit out an error if the designer made entities of +// different classes with the same global name + /* <31697> ../cstrike/dlls/cbase.cpp:656 */ CBaseEntity *FindGlobalEntity(string_t classname, string_t globalname) { edict_t *pent = FIND_ENTITY_BY_STRING(NULL, "globalname", STRING(globalname)); CBaseEntity *pReturn = CBaseEntity::Instance(pent); - if (pReturn) + + if (pReturn != NULL) { if (!FClassnameIs(pReturn->pev, STRING(classname))) { @@ -493,88 +623,152 @@ CBaseEntity *FindGlobalEntity(string_t classname, string_t globalname) pReturn = NULL; } } + return pReturn; } /* <3179c> ../cstrike/dlls/cbase.cpp:673 */ -NOBODY int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity) +int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity) { -// { -// class CBaseEntity *pEntity; // 675 -// GET_PRIVATE(edict_t *pent); // 675 -// { -// entvars_t tmpVars; // 679 -// class Vector oldOffset; // 680 -// class CRestore restoreHelper; // 682 -// CRestore(CRestore *const this, -// SAVERESTOREDATA *pdata); // 682 -// { -// class CRestore tmpRestore; // 685 -// const globalentity_t *pGlobal; // 695 -// class CBaseEntity *pNewEntity; // 706 -// CRestore(CRestore *const this, -// SAVERESTOREDATA *pdata); // 685 -// PrecacheMode(CRestore *const this, -// BOOL mode); // 686 -// FStrEq(const char *sz1, -// const char *sz2); // 701 -// SetGlobalMode(CRestore *const this, -// int global); // 710 -// operator-(const class Vector *const this, -// const class Vector &v); // 711 -// operator+(const class Vector *const this, -// const class Vector &v); // 711 -// ~CRestore(CRestore *const this, -// intconst __in_chrg); // 685 -// ~CRestore(CRestore *const this, -// intconst __in_chrg); // 685 -// } -// GET_PRIVATE(edict_t *pent); // 738 -// { -// const globalentity_t *pGlobal; // 752 -// FStrEq(const char *sz1, -// const char *sz2); // 758 -// MakeDormant(CBaseEntity *const this); // 760 -// } -// ~CRestore(CRestore *const this, -// intconst __in_chrg); // 682 -// ~CRestore(CRestore *const this, -// intconst __in_chrg); // 682 -// } -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity && pSaveData) + { + entvars_t tmpVars; + Vector oldOffset; + CRestore restoreHelper(pSaveData); + + if (globalEntity) + { + CRestore tmpRestore(pSaveData); + tmpRestore.PrecacheMode(0); + tmpRestore.ReadEntVars("ENTVARS", &tmpVars); + + // HACKHACK - reset the save pointers, we're going to restore for real this time + pSaveData->size = pSaveData->pTable[pSaveData->currentIndex].location; + pSaveData->pCurrentData = pSaveData->pBaseData + pSaveData->size; + + const globalentity_t *pGlobal = gGlobalState.EntityFromTable(tmpVars.globalname); + + // Don't overlay any instance of the global that isn't the latest + // pSaveData->szCurrentMapName is the level this entity is coming from + // pGlobla->levelName is the last level the global entity was active in. + // If they aren't the same, then this global update is out of date. + if (!FStrEq(pSaveData->szCurrentMapName, pGlobal->levelName)) + { + return 0; + } + + // Compute the new global offset + oldOffset = pSaveData->vecLandmarkOffset; + CBaseEntity *pNewEntity = FindGlobalEntity(tmpVars.classname, tmpVars.globalname); + + if (pNewEntity != NULL) + { + // Tell the restore code we're overlaying a global entity from another level + // Don't overwrite global fields + restoreHelper.SetGlobalMode(1); + + pSaveData->vecLandmarkOffset = (pSaveData->vecLandmarkOffset - pNewEntity->pev->mins) + tmpVars.mins; + + // we're going to restore this data OVER the old entity + pEntity = pNewEntity; + pent = ENT(pEntity->pev); + + // Update the global table to say that the global definition of this entity should come from this level + gGlobalState.EntityUpdate(pEntity->pev->globalname, gpGlobals->mapname); + } + else + { + // This entity will be freed automatically by the engine. If we don't do a restore on a matching entity (below) + // or call EntityUpdate() to move it to this level, we haven't changed global state at all. + + return 0; + } + + } + + if (pEntity->ObjectCaps() & FCAP_MUST_SPAWN) + { + pEntity->Restore(restoreHelper); + pEntity->Spawn(); + } + else + { + pEntity->Restore(restoreHelper); + pEntity->Precache(); + } + + // Again, could be deleted, get the pointer again. + pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + // Is this an overriding global entity (coming over the transition), or one restoring in a level + if (globalEntity) + { + pSaveData->vecLandmarkOffset = oldOffset; + + if (pEntity != NULL) + { + UTIL_SetOrigin(pEntity->pev, pEntity->pev->origin); + pEntity->OverrideReset(); + } + } + else if (pEntity != NULL && pEntity->pev->globalname) + { + const globalentity_t *pGlobal = gGlobalState.EntityFromTable(pEntity->pev->globalname); + + if (pGlobal != NULL) + { + // Already dead? delete + if (pGlobal->state == GLOBAL_DEAD) + return -1; + + else if (!FStrEq(STRING(gpGlobals->mapname), pGlobal->levelName)) + { + // Hasn't been moved to this level yet, wait but stay alive + pEntity->MakeDormant(); + } + // In this level & not dead, continue on as normal + } + else + { + ALERT(at_error, "Global Entity %s (%s) not in table!!!\n", STRING(pEntity->pev->globalname), STRING(pEntity->pev->classname)); + + // Spawned entities default to 'On' + gGlobalState.EntityAdd(pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON); + } + } + } + + return 0; } /* <2fdcd> ../cstrike/dlls/cbase.cpp:776 */ -NOBODY void DispatchObjectCollsionBox(edict_t *pent) +void DispatchObjectCollsionBox(edict_t *pent) { -// { -// class CBaseEntity *pEntity; // 778 -// GET_PRIVATE(edict_t *pent); // 778 -// } + CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); + + if (pEntity != NULL) + { + pEntity->SetObjectCollisionBox(); + } + else + SetObjectCollisionBox(&pent->v); + } /* <2fe94> ../cstrike/dlls/cbase.cpp:788 */ -NOBODY void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) +void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) { -// { -// class CSave saveHelper; // 790 -// CSave(CSave *const this, -// SAVERESTOREDATA *pdata); // 790 -// ~CSave(CSave *const this, -// intconst __in_chrg); // 790 -// } + CSave saveHelper(pSaveData); + saveHelper.WriteFields(pname, pBaseData, pFields, fieldCount); } /* <30047> ../cstrike/dlls/cbase.cpp:795 */ -NOBODY void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) +void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) { -// { -// class CRestore restoreHelper; // 797 -// CRestore(CRestore *const this, -// SAVERESTOREDATA *pdata); // 797 -// ~CRestore(CRestore *const this, -// intconst __in_chrg); // 797 -// } + CRestore restoreHelper(pSaveData); + restoreHelper.ReadFields(pname, pBaseData, pFields, fieldCount); } /* <31a74> ../cstrike/dlls/cbase.cpp:802 */ @@ -632,7 +826,7 @@ CBaseEntity *EHANDLE::operator->(void) } /* <301be> ../cstrike/dlls/cbase.cpp:857 */ -int CBaseEntity::TakeHealth_(float flHealth, int bitsDamageType) +int CBaseEntity::__MAKE_VHOOK(TakeHealth)(float flHealth, int bitsDamageType) { if (pev->takedamage == DAMAGE_NO) return 0; @@ -649,102 +843,213 @@ int CBaseEntity::TakeHealth_(float flHealth, int bitsDamageType) } /* <305af> ../cstrike/dlls/cbase.cpp:876 */ -NOBODY int CBaseEntity::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CBaseEntity::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { -// { -// class Vector vecTemp; // 878 -// } -// TakeDamage(CBaseEntity *const this, -// entvars_t *pevInflictor, -// entvars_t *pevAttacker, -// float flDamage, -// int bitsDamageType); // 876 - return 0; + Vector vecTemp; + + if (pev->takedamage == DAMAGE_NO) + return 0; + + // UNDONE: some entity types may be immune or resistant to some bitsDamageType + // if Attacker == Inflictor, the attack was a melee or other instant-hit attack. + // (that is, no actual entity projectile was involved in the attack so use the shooter's origin). + if (pevAttacker == pevInflictor) + { + vecTemp = pevInflictor->origin - (VecBModelOrigin(pev)); + } + else + { + // an actual missile was involved. + vecTemp = pevInflictor->origin - (VecBModelOrigin(pev)); + } + + // this global is still used for glass and other non-monster killables, along with decals. + g_vecAttackDir = vecTemp.Normalize(); + + // save damage based on the target's armor level + // figure momentum add (don't let hurt brushes or other triggers move player) + if ((!FNullEnt(pevInflictor)) && (pev->movetype == MOVETYPE_WALK || pev->movetype == MOVETYPE_STEP) && (pevAttacker->solid != SOLID_TRIGGER)) + { + Vector vecDir = pev->origin - (pevInflictor->absmin + pevInflictor->absmax) * 0.5; + vecDir = vecDir.Normalize(); + + float_precision flForce = flDamage * ((32 * 32 * 72.0) / (pev->size.x * pev->size.y * pev->size.z)) * 5; + + if (flForce > 1000.0) + flForce = 1000.0; + + pev->velocity = pev->velocity + vecDir * flForce; + } + + // do the damage + pev->health -= flDamage; + if (pev->health <= 0) + { + Killed(pevAttacker, GIB_NORMAL); + return 0; + } + + return 1; } /* <2fe50> ../cstrike/dlls/cbase.cpp:927 */ -NOBODY void CBaseEntity::Killed_(entvars_t *pevAttacker, int iGib) +void CBaseEntity::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) { + pev->takedamage = DAMAGE_NO; + pev->deadflag = DEAD_DEAD; + UTIL_Remove(this); } /* <2fc1c> ../cstrike/dlls/cbase.cpp:935 */ -NOBODY CBaseEntity *CBaseEntity::GetNextTarget_(void) +CBaseEntity *CBaseEntity::__MAKE_VHOOK(GetNextTarget)(void) { -// { -// edict_t *pTarget; // 939 -// FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, -// const char *pszName); // 939 -// FNullEnt(const edict_t *pent); // 940 -// Instance(edict_t *pent); // 943 -// } - return NULL; + if (FStringNull(pev->target)) + return NULL; + + edict_t *pTarget = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(pev->target)); + + if (FNullEnt(pTarget)) + { + return NULL; + } + + return Instance(pTarget); } /* <302a6> ../cstrike/dlls/cbase.cpp:958 */ -NOBODY int CBaseEntity::Save(CSave &save) +int CBaseEntity::__MAKE_VHOOK(Save)(CSave &save) { -// Save(CBaseEntity *const this, -// class CSave &save); // 958 + if (save.WriteEntVars("ENTVARS", pev)) + { + return save.WriteFields("BASE", this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData))); + } + return 0; } /* <30440> ../cstrike/dlls/cbase.cpp:966 */ -NOBODY int CBaseEntity::Restore(CRestore &restore) +int CBaseEntity::__MAKE_VHOOK(Restore)(CRestore &restore) { -// { -// int status; // 968 -// } -// Restore(CBaseEntity *const this, -// class CRestore &restore); // 966 - return 0; + int status; + + status = restore.ReadEntVars("ENTVARS", pev); + + if (status) + { + status = restore.ReadFields("BASE", this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData))); + } + + if (pev->modelindex != 0 && !FStringNull(pev->model)) + { + Vector mins, maxs; + + // Set model is about to destroy these + mins = pev->mins; + maxs = pev->maxs; + + PRECACHE_MODEL((char *)STRING(pev->model)); + SET_MODEL(ENT(pev), STRING(pev->model)); + + // Reset them + UTIL_SetSize(pev, mins, maxs); + } + + return status; } /* <2fcf6> ../cstrike/dlls/cbase.cpp:991 */ -NOBODY void SetObjectCollisionBox(entvars_t *pev) +void SetObjectCollisionBox(entvars_t *pev) { -// operator+(const class Vector *const this, -// const class Vector &v); // 1017 -// operator+(const class Vector *const this, -// const class Vector &v); // 1018 -// { -// float max; // 996 -// float v; // 996 -// int i; // 997 -// fabs(double __x); // 1002 -// fabs(double __x); // 1005 -// } + if ((pev->solid == SOLID_BSP) && (pev->angles.x || pev->angles.y || pev->angles.z)) + { + // expand for rotation + float_precision max, v; + int i; + + max = 0; + for (i = 0 ; i < 3 ; i++) + { + v = fabs((float_precision)((float *)pev->mins)[i]); + if (v > max) + { + max = v; + } + + v = fabs((float_precision)((float *)pev->maxs)[i]); + if (v > max) + { + max = v; + } + } + for (i = 0; i < 3; i++) + { + ((float *)pev->absmin)[i] = ((float *)pev->origin)[i] - max; + ((float *)pev->absmax)[i] = ((float *)pev->origin)[i] + max; + } + } + else + { + pev->absmin = pev->origin + pev->mins; + pev->absmax = pev->origin + pev->maxs; + } + + pev->absmin.x -= 1; + pev->absmin.y -= 1; + pev->absmin.z -= 1; + + pev->absmax.x += 1; + pev->absmax.y += 1; + pev->absmax.z += 1; } /* <2fe2a> ../cstrike/dlls/cbase.cpp:1030 */ -NOBODY void CBaseEntity::SetObjectCollisionBox(void) +void CBaseEntity::__MAKE_VHOOK(SetObjectCollisionBox)(void) { ::SetObjectCollisionBox(pev); } /* <31c0e> ../cstrike/dlls/cbase.cpp:1036 */ -NOBODY int CBaseEntity::Intersects(CBaseEntity *pOther) +int CBaseEntity::Intersects(CBaseEntity *pOther) { + if (pOther->pev->absmin.x > pev->absmax.x + || pOther->pev->absmin.y > pev->absmax.y + || pOther->pev->absmin.z > pev->absmax.z + || pOther->pev->absmax.x < pev->absmin.x + || pOther->pev->absmax.y < pev->absmin.y + || pOther->pev->absmax.z < pev->absmin.z) + return 0; + return 1; } /* <31c43> ../cstrike/dlls/cbase.cpp:1048 */ void CBaseEntity::MakeDormant(void) { pev->flags |= FL_DORMANT; + + // Don't touch pev->solid = SOLID_NOT; + + // Don't move pev->movetype = MOVETYPE_NONE; + + // Don't draw pev->effects |= EF_NODRAW; + + // Don't think pev->nextthink = 0; + + // Relink UTIL_SetOrigin(pev, pev->origin); } /* <31c66> ../cstrike/dlls/cbase.cpp:1064 */ -NOBODY int CBaseEntity::IsDormant(void) +int CBaseEntity::IsDormant(void) { return (pev->flags & FL_DORMANT) == FL_DORMANT; } /* <30221> ../cstrike/dlls/cbase.cpp:1069 */ -BOOL CBaseEntity::IsInWorld_(void) +BOOL CBaseEntity::__MAKE_VHOOK(IsInWorld)(void) { // position if (pev->origin.x >= 4096.0 || pev->origin.y >= 4096.0 || pev->origin.z >= 4096.0) @@ -781,13 +1086,20 @@ int CBaseEntity::ShouldToggle(USE_TYPE useType, BOOL currentState) } /* <30258> ../cstrike/dlls/cbase.cpp:1100 */ -NOBODY int CBaseEntity::DamageDecal_(int bitsDamageType) +int CBaseEntity::__MAKE_VHOOK(DamageDecal)(int bitsDamageType) { -// DamageDecal(CBaseEntity *const this, -// int bitsDamageType); // 1100 - return 0; + if (pev->rendermode == kRenderTransAlpha) + return -1; + + if (pev->rendermode != kRenderNormal) + return DECAL_BPROOF1; + + return DECAL_GUNSHOT1 + RANDOM_LONG(0, 4); } +// NOTE: szName must be a pointer to constant memory, e.g. "monster_class" because the entity +// will keep a pointer to it after this call. + /* <31cd1> ../cstrike/dlls/cbase.cpp:1115 */ CBaseEntity *CBaseEntity::Create(char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner) { @@ -813,7 +1125,7 @@ CBaseEntity *CBaseEntity::Create(char *szName, const Vector &vecOrigin, const Ve } /* <30885> ../cstrike/dlls/cbase.cpp:1134 */ -NOBODY void OnFreeEntPrivateData(edict_t *pEnt) +void OnFreeEntPrivateData(edict_t *pEnt) { CBaseEntity *pEntity = CBaseEntity::Instance(pEnt); if (!pEntity) @@ -824,6 +1136,21 @@ NOBODY void OnFreeEntPrivateData(edict_t *pEnt) } #ifdef HOOK_GAMEDLL + +int CBaseEntity::Save(CSave &save) +{ + return Save_(save); +} + +int CBaseEntity::Restore(CRestore &restore) +{ + return Restore_(restore); +} + +void CBaseEntity::SetObjectCollisionBox(void) +{ + SetObjectCollisionBox_(); +} void CBaseEntity::TraceAttack(entvars_t *pevAttacker,float flDamage,Vector vecDir,TraceResult *ptr,int bitsDamageType) { diff --git a/regamedll/dlls/cbase.h b/regamedll/dlls/cbase.h index 53eba1fe..7a9a28ff 100644 --- a/regamedll/dlls/cbase.h +++ b/regamedll/dlls/cbase.h @@ -58,7 +58,7 @@ #define SetTouch(a)\ m_pfnTouch = static_cast(a) #define SetUse(a)\ - m_pfnUse = static_cast(a) + m_pfnUse = static_cast(a) #define SetBlocked(a)\ m_pfnBlocked = static_cast(a) @@ -187,6 +187,7 @@ typedef enum { CLASSNAME + } hash_types_e; typedef struct hash_item_s @@ -195,6 +196,7 @@ typedef struct hash_item_s struct hash_item_s *next; struct hash_item_s *lastHash; int pevIndex; + } hash_item_t; /* size: 16, cachelines: 1, members: 4 */ @@ -210,6 +212,7 @@ typedef struct locksounds float flwaitSentence; BYTE bEOFLocked; BYTE bEOFUnlocked; + } locksound_t; /* size: 36, cachelines: 1, members: 10 */ @@ -226,6 +229,7 @@ typedef enum TRAIN_SAFE, TRAIN_BLOCKING, TRAIN_FOLLOWING + } TRAIN_CODE; typedef enum @@ -234,6 +238,7 @@ typedef enum TS_AT_BOTTOM, TS_GOING_UP, TS_GOING_DOWN, + } TOGGLE_STATE; class CGrenade; @@ -342,10 +347,7 @@ public: return FCAP_ACROSS_TRANSITION; } virtual void Activate(void) {} - NOBODY virtual void SetObjectCollisionBox(void); - //{ - // ::SetObjectCollisionBox(pev); - //} + virtual void SetObjectCollisionBox(void); virtual int Classify(void) { return CLASS_NONE; @@ -355,9 +357,9 @@ public: 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 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); + virtual void Killed(entvars_t *pevAttacker, int iGib); virtual int BloodColor(void) { return DONT_BLEED; @@ -402,7 +404,7 @@ public: return (pev->velocity != g_vecZero); } virtual void OverrideReset(void) {} - NOBODY virtual int DamageDecal(int bitsDamageType); + virtual int DamageDecal(int bitsDamageType); virtual void SetToggleState(int state) {} virtual void StartSneaking(void) {} virtual void StopSneaking(void) {} @@ -443,7 +445,7 @@ public: { return ""; } - NOBODY virtual CBaseEntity *GetNextTarget(void); + virtual CBaseEntity *GetNextTarget(void); virtual void Think(void) { if (m_pfnThink) @@ -494,18 +496,14 @@ public: 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 SetObjectCollisionBox_(void); 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); @@ -546,16 +544,16 @@ public: void EXPORT SUB_DoNothing(void); void EXPORT SUB_StartFadeOut(void); void EXPORT SUB_FadeOut(void); - NOBODY void EXPORT SUB_CallUseToggle(void) + void EXPORT SUB_CallUseToggle(void) { - Use(this,this,USE_TOGGLE,0); + Use(this, this, USE_TOGGLE, 0); } NOBODY int ShouldToggle(USE_TYPE useType, BOOL currentState); NOBODY void FireBullets(ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq = 4, int iDamage = 0, entvars_t *pevAttacker = NULL); Vector FireBullets3(Vector vecSrc, Vector vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand = 0); void SUB_UseTargets(CBaseEntity *pActivator, USE_TYPE useType, float value); - NOBODY int Intersects(CBaseEntity *pOther); - NOXREF void MakeDormant(void); + int Intersects(CBaseEntity *pOther); + void MakeDormant(void); int IsDormant(void); BOOL IsLockedByMaster(void) { @@ -577,8 +575,10 @@ public: CBaseMonster *GetMonsterPointer(entvars_t *pevMonster) { CBaseEntity *pEntity = Instance(pevMonster); - if (pEntity) + if (pEntity != NULL) + { return pEntity->MyMonsterPointer(); + } return NULL; } CBaseMonster *GetMonsterPointer(edict_t *pentMonster) @@ -765,7 +765,6 @@ public: int Save_(CSave &save); int Restore_(CRestore &restore); - void HandleAnimEvent_(MonsterEvent_t *pEvent); #endif // HOOK_GAMEDLL @@ -773,21 +772,23 @@ public: float StudioFrameAdvance(float flInterval = 0.0f); BOOL GetSequenceFlags(void); int LookupActivity(int activity); - NOBODY int LookupActivityHeaviest(int activity); + int LookupActivityHeaviest(int activity); int LookupSequence(const char *label); void ResetSequenceInfo(void); - NOBODY void DispatchAnimEvents(float flFutureInterval = 0.1f); + void DispatchAnimEvents(float flFutureInterval = 0.1f); float SetBoneController(int iController, float flValue); void InitBoneControllers(void); - NOBODY float SetBlending(int iBlender, float flValue); - NOBODY void GetBonePosition(int iBone, Vector &origin, Vector &angles); + + NOXREF float SetBlending(int iBlender, float flValue); + NOXREF void GetBonePosition(int iBone, Vector &origin, Vector &angles); NOXREF void GetAutomovement(Vector &origin, Vector &angles, float flInterval = 0.1f); - NOBODY int FindTransition(int iEndingSequence, int iGoalSequence, int *piDir); - NOBODY void GetAttachment(int iAttachment, Vector &origin, Vector &angles); - NOBODY void SetBodygroup(int iGroup, int iValue); - NOBODY int GetBodygroup(int iGroup); - NOBODY int ExtractBbox(int sequence, float *mins, float *maxs); - NOBODY void SetSequenceBox(void); + NOXREF int FindTransition(int iEndingSequence, int iGoalSequence, int *piDir); + NOXREF void GetAttachment(int iAttachment, Vector &origin, Vector &angles); + NOXREF void SetBodygroup(int iGroup, int iValue); + NOXREF int GetBodygroup(int iGroup); + + int ExtractBbox(int sequence, float *mins, float *maxs); + void SetSequenceBox(void); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[5]; @@ -932,9 +933,9 @@ public: class CWorld: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); #ifdef HOOK_GAMEDLL @@ -950,24 +951,43 @@ public: class CDecal: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *); + +#ifdef HOOK_GAMEDLL + + void Spawn_(void); + void KeyValue_(KeyValueData *); + +#endif // HOOK_GAMEDLL + public: - NOBODY void StaticDecal(void); - NOBODY void TriggerDecal(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + void EXPORT StaticDecal(void); + void EXPORT TriggerDecal(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); };/* size: 152, cachelines: 3, members: 1 */ +// Body queue class here.... It's really just CBaseEntity + /* <1d9fd1> ../cstrike/dlls/world.cpp:207 */ class CCorpse: public CBaseEntity { - // TODO: back to private public: /* <1dabe0> ../cstrike/dlls/world.cpp:209 */ - virtual int ObjectCaps(void)//_ZN7CCorpse10ObjectCapsEv + virtual int ObjectCaps(void) + { + ObjectCaps_(); + } + +#ifdef HOOK_GAMEDLL + + int ObjectCaps_(void) { return FCAP_DONT_SAVE; } + +#endif // HOOK_GAMEDLL + };/* size: 152, cachelines: 3, members: 1 */ /* <170b59> ../cstrike/dlls/sound.cpp:117 */ @@ -1065,7 +1085,6 @@ public: template T *GetClassPtr(T *a) { - T *backup = a; entvars_t *pev = (entvars_t *)a; if (!pev) pev = VARS(CREATE_ENTITY()); @@ -1087,30 +1106,30 @@ int CaseInsensitiveHash(const char *string, int iBounds); void EmptyEntityHashTable(void); void AddEntityHashValue(entvars_t *pev, const char *value, hash_types_e fieldType); void RemoveEntityHashValue(entvars_t *pev, const char *value, hash_types_e fieldType); -NOBODY void printEntities(void); +void printEntities(void); edict_t *CREATE_NAMED_ENTITY(string_t iClass); void REMOVE_ENTITY(edict_t *e); -//NOBODY void CONSOLE_ECHO(char *pszMsg, ...); // already declared bot_util.cpp -NOBODY void loopPerformance(void); +void CONSOLE_ECHO_(char *pszMsg, ...); +void loopPerformance(void); extern "C" C_EXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion); NOXREF extern "C" C_EXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); extern "C" C_EXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); -NOBODY int DispatchSpawn(edict_t *pent); +int DispatchSpawn(edict_t *pent); void DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd); void DispatchTouch(edict_t *pentTouched, edict_t *pentOther); -NOBODY void DispatchUse(edict_t *pentUsed, edict_t *pentOther); -NOBODY void DispatchThink(edict_t *pent); -NOBODY void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther); -NOBODY void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData); -NOBODY int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity); +void DispatchUse(edict_t *pentUsed, edict_t *pentOther); +void DispatchThink(edict_t *pent); +void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther); +void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData); +int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity); CBaseEntity *FindGlobalEntity(string_t classname, string_t globalname); -NOBODY void DispatchObjectCollsionBox(edict_t *pent); -NOBODY void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); -NOBODY void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); -NOBODY void SetObjectCollisionBox(entvars_t *pev); -NOBODY void OnFreeEntPrivateData(edict_t *pEnt); +void DispatchObjectCollsionBox(edict_t *pent); +void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +void SetObjectCollisionBox(entvars_t *pev); +void OnFreeEntPrivateData(edict_t *pEnt); #ifdef HOOK_GAMEDLL @@ -1127,7 +1146,6 @@ typedef CBaseEntity *(CBaseEntity::*CBASE_ISTANCE_INT)(int); #endif // HOOK_GAMEDLL //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 d3e83df1..342bcdfe 100644 --- a/regamedll/dlls/cdll_dll.h +++ b/regamedll/dlls/cdll_dll.h @@ -39,13 +39,13 @@ #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_HEALTH (1<<3) -#define HIDEHUD_TIMER (1<<4) -#define HIDEHUD_MONEY (1<<5) -#define HIDEHUD_CROSSHAIR (1<<6) +#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) +#define HIDEHUD_CROSSHAIR (1 << 6) #define STATUSICON_HIDE 0 #define STATUSICON_SHOW 1 @@ -78,17 +78,16 @@ #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 MENU_KEY_1 (1<<0) +#define MENU_KEY_2 (1<<1) +#define MENU_KEY_3 (1<<2) +#define MENU_KEY_4 (1<<3) +#define MENU_KEY_5 (1<<4) +#define MENU_KEY_6 (1<<5) +#define MENU_KEY_7 (1<<6) +#define MENU_KEY_8 (1<<7) +#define MENU_KEY_9 (1<<8) +#define MENU_KEY_0 (1<<9) #define MAX_AMMO_TYPES 32 // ??? #define MAX_AMMO_SLOTS 32 // not really slots @@ -99,6 +98,36 @@ #define HUD_PRINTCENTER 4 #define WEAPON_SUIT 31 -#define WEAPON_ALLWEAPONS (~( 1 << WEAPON_SUIT )) +#define WEAPON_ALLWEAPONS (~(1 << WEAPON_SUIT)) + +// custom enum +enum VGUIMenu +{ + VGUI_Menu_Team = 2, + VGUI_Menu_MapBriefing = 4, + + VGUI_Menu_Class_T = 26, + VGUI_Menu_Class_CT, + VGUI_Menu_Buy, + VGUI_Menu_Buy_Pistol, + VGUI_Menu_Buy_ShotGun, + VGUI_Menu_Buy_Rifle, + VGUI_Menu_Buy_SubMachineGun, + VGUI_Menu_Buy_MachineGun, + VGUI_Menu_Buy_Item, +}; + +// custom enum +enum VGUIMenuSlot +{ + VGUI_MenuSlot_Buy_Pistol = 1, + VGUI_MenuSlot_Buy_ShotGun, + VGUI_MenuSlot_Buy_SubMachineGun, + VGUI_MenuSlot_Buy_Rifle, + VGUI_MenuSlot_Buy_MachineGun, + VGUI_MenuSlot_Buy_PrimAmmo, + VGUI_MenuSlot_Buy_SecAmmo, + VGUI_MenuSlot_Buy_Item, +}; #endif // CDLL_DLL_H diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 28559eb7..bd3cc4e3 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -6,8 +6,8 @@ */ #ifndef HOOK_GAMEDLL -//float g_flTimeLimit = 0; -//float g_flResetTime = 0; +float g_flTimeLimit = 0; +float g_flResetTime = 0; bool g_bClientPrintEnable = true; char *sPlayerModelFiles[] = @@ -62,8 +62,8 @@ static int g_serveractive = 0; #else -//float g_flTimeLimit; -//float g_flResetTime; +float g_flTimeLimit; +float g_flResetTime; bool g_bClientPrintEnable; char *sPlayerModelFiles[12]; @@ -81,10 +81,8 @@ unsigned short m_usResetDecals; unsigned short g_iShadowSprite; /* <47b45> ../cstrike/dlls/client.cpp:76 */ -NOXREF int CMD_ARGC_(void) +int CMD_ARGC_(void) { - UNTESTED - if (!UseBotArgs) return CMD_ARGC(); @@ -97,10 +95,8 @@ NOXREF int CMD_ARGC_(void) } /* <47b84> ../cstrike/dlls/client.cpp:90 */ -NOXREF const char *CMD_ARGV_(int i) +const char *CMD_ARGV_(int i) { - UNTESTED - if (!UseBotArgs) return CMD_ARGV(i); @@ -123,13 +119,8 @@ NOXREF void set_suicide_frame(entvars_t *pev) } /* <47a58> ../cstrike/dlls/client.cpp:192 */ -NOXREF void TeamChangeUpdate(CBasePlayer *player, int team_id) +void TeamChangeUpdate(CBasePlayer *player, int team_id) { - UNTESTED - -// { -// int t; // 194 -// } MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo); WRITE_BYTE(player->entindex()); switch (team_id) @@ -150,11 +141,13 @@ NOXREF void TeamChangeUpdate(CBasePlayer *player, int team_id) MESSAGE_END(); if (team_id != UNASSIGNED) + { player->SetScoreboardAttributes(); + } } /* <4731f> ../cstrike/dlls/client.cpp:222 */ -NOXREF void BlinkAccount(CBasePlayer *player, int numBlinks) +void BlinkAccount(CBasePlayer *player, int numBlinks) { MESSAGE_BEGIN(MSG_ONE, gmsgBlinkAcct, NULL, player->pev); WRITE_BYTE(numBlinks); @@ -216,7 +209,9 @@ void respawn(entvars_t *pev, BOOL fCopyCorpse) g_skipCareerInitialSpawn = false; } else if (pev->deadflag > DEAD_NO) + { SERVER_COMMAND("reload\n"); + } } /* <48013> ../cstrike/dlls/client.cpp:347 */ @@ -240,7 +235,9 @@ void ClientKill(edict_t *pEntity) pl->Killed(pev, GIB_NEVER); if (mp->m_pVIP == pl) + { mp->m_iConsecutiveVIP = 10; + } } } @@ -258,7 +255,7 @@ void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL f /* <4735f> ../cstrike/dlls/client.cpp:390 */ void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu) { - if (pPlayer->m_bVGUIMenus || MenuType > VGUI_MENU_BUY_ITEM) + if (pPlayer->m_bVGUIMenus || MenuType > VGUI_Menu_Buy_Item) { MESSAGE_BEGIN(MSG_ONE, gmsgVGUIMenu, NULL, pPlayer->pev); WRITE_BYTE(MenuType); @@ -528,8 +525,10 @@ void ClientPutInServer(edict_t *pEntity) CBaseEntity *Target = UTIL_FindEntityByClassname(NULL, "trigger_camera"); pPlayer->m_pIntroCamera = Target; - if (mp && mp->m_bMapHasCameras == 2) + if (mp && mp->m_bMapHasCameras == MAP_HAS_CAMERAS_INIT) + { mp->m_bMapHasCameras = (Target != NULL); + } if (pPlayer->m_pIntroCamera) Target = UTIL_FindEntityByTargetname(NULL, STRING(pPlayer->m_pIntroCamera->pev->target)); @@ -588,74 +587,309 @@ int Q_strlen_(const char *str) } /* <4bbff> ../cstrike/dlls/client.cpp:814 */ -NOBODY void Host_Say(edict_t *pEntity, int teamonly) +void Host_Say(edict_t *pEntity, int teamonly) { -// { -// class CBasePlayer *client; // 816 -// int j; // 817 -// char *p; // 818 -// char text; // 819 -// char szTemp; // 820 -// const char *cpSay; // 821 -// const char *cpSayTeam; // 822 -// const char *pcmd; // 823 -// bool bSenderDead; // 824 -// entvars_t *pev; // 827 -// class CBasePlayer *player; // 828 -// const char *placeName; // 913 -// char *pszFormat; // 933 -// char *pszConsoleFormat; // 934 -// bool consoleUsesPlaceName; // 935 -// CMD_ARGV(int i); // 823 -// CMD_ARGC(void); // 846 -// CMD_ARGC(void); // 853 -// Q_strlen(const char *str); // 910 -// { -// Place playerPlace; // 916 -// const BotPhraseList *placeList; // 917 -// int i; // 918 -// { -// const_iterator iter; // 921 -// operator++(_List_const_iterator *const this); // 921 -// } -// } -// { -// char *pAmpersand; // 1026 -// } -// edict(CBaseEntity *const this); // 1044 -// FNullEnt(const edict_t *pent); // 1044 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 1085 -// ENTINDEX(edict_t *pEdict); // 1086 -// CMD_ARGC(void); // 865 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 1101 -// ENTINDEX(edict_t *pEdict); // 1102 -// { -// char *fullText; // 1115 -// } -// { -// char *temp; // 1129 -// char *szTeam; // 1130 -// char *deadText; // 1131 -// edict(CBaseEntity *const this); // 1156 -// edict(CBaseEntity *const this); // 1156 -// } -// } + CBasePlayer *client; + int j; + char *p; + char text[128]; + char szTemp[256]; + const char *cpSay = "say"; + const char *cpSayTeam = "say_team"; + const char *pcmd = CMD_ARGV_(0); + bool bSenderDead = false; + + entvars_t *pev = &pEntity->v; + CBasePlayer *player = GetClassPtr((CBasePlayer *)pev); + + if (player->m_flLastTalk != 0.0f && gpGlobals->time - player->m_flLastTalk < 0.66f) + return; + + player->m_flLastTalk = gpGlobals->time; + + if (player->pev->deadflag != DEAD_NO) + bSenderDead = true; + + // We can get a raw string now, without the "say " prepended + if (CMD_ARGC_() == 0) + return; + + if (!Q_stricmp(pcmd, cpSay) || !Q_stricmp(pcmd, cpSayTeam)) + { + if (CMD_ARGC_() >= 2) + { + p = (char *)CMD_ARGS(); + } + else + { + // say with a blank message, nothing to do + return; + } + } + else // Raw text, need to prepend argv[0] + { + if (CMD_ARGC_() >= 2) + { + Q_sprintf(szTemp, "%s %s", (char *)pcmd, (char *)CMD_ARGS()); + } + else + { + // Just a one word command, use the first word...sigh + Q_sprintf(szTemp, "%s", (char *)pcmd); + } + + p = szTemp; + } + + // remove quotes if present + if (*p == '"') + { + p++; + p[Q_strlen(p) - 1] = '\0'; + } + + // make sure the text has content + if (!p || !p[0] || !Q_UnicodeValidate(p)) + { + // no character found, so say nothing + return; + } + + Q_StripUnprintableAndSpace(p); + + if (Q_strlen(p) <= 0) + return; + + const char *placeName = NULL; + char *pszFormat = NULL; + char *pszConsoleFormat = NULL; + bool consoleUsesPlaceName = false; + + if (teamonly) + { + if (player->m_iTeam == CT || player->m_iTeam == TERRORIST) + { + // search the place name where is located the player + Place playerPlace = TheNavAreaGrid.GetPlace(&player->pev->origin); + const BotPhraseList *placeList = TheBotPhrases->GetPlaceList(); + + for (BotPhraseList::const_iterator iter = placeList->begin(); iter != placeList->end(); ++iter) + { + if ((*iter)->GetID() == playerPlace) + { + placeName = (*iter)->GetName(); + break; + } + } + } + + if (player->m_iTeam == CT) + { + if (bSenderDead) + { + pszFormat = "#Cstrike_Chat_CT_Dead"; + pszConsoleFormat = "*DEAD*(Counter-Terrorist) %s : %s"; + } + else if (placeName != NULL) + { + pszFormat = "#Cstrike_Chat_CT_Loc"; + pszConsoleFormat = "*(Counter-Terrorist) %s @ %s : %s"; + consoleUsesPlaceName = true; + } + else + { + pszFormat = "#Cstrike_Chat_CT"; + pszConsoleFormat = "(Counter-Terrorist) %s : %s"; + } + } + else if (player->m_iTeam == TERRORIST) + { + if (bSenderDead) + { + pszFormat = "#Cstrike_Chat_T_Dead"; + pszConsoleFormat = "*DEAD*(Terrorist) %s : %s"; + } + else if (placeName != NULL) + { + pszFormat = "#Cstrike_Chat_T_Loc"; + pszConsoleFormat = "(Terrorist) %s @ %s : %s"; + consoleUsesPlaceName = true; + } + else + { + pszFormat = "#Cstrike_Chat_T"; + pszConsoleFormat = "(Terrorist) %s : %s"; + } + } + else + { + pszFormat = "#Cstrike_Chat_Spec"; + pszConsoleFormat = "(Spectator) %s : %s"; + } + } + else + { + if (bSenderDead) + { + if (player->m_iTeam == SPECTATOR) + { + pszFormat = "#Cstrike_Chat_AllSpec"; + pszConsoleFormat = "*SPEC* %s : %s"; + } + else + { + pszFormat = "#Cstrike_Chat_AllDead"; + pszConsoleFormat = "*DEAD* %s : %s"; + } + } + else + { + pszFormat = "#Cstrike_Chat_All"; + pszConsoleFormat = "%s : %s"; + } + } + + text[0] = '\0'; + + // -3 for /n and null terminator + j = sizeof(text) - 3 - Q_strlen(text) - Q_strlen(pszFormat); + + if (placeName != NULL) + { + j -= Q_strlen(placeName) + 1; + } + + if ((signed int)Q_strlen(p) > j) + p[j] = 0; + + for (char *pAmpersand = p; pAmpersand != NULL && *pAmpersand != '\0'; pAmpersand++) + { + if (pAmpersand[0] == '%') + { + if (pAmpersand[1] != 'l' && pAmpersand[1] != ' ' && pAmpersand[1] != '\0') + { + pAmpersand[0] = ' '; + } + } + } + + Q_strcat(text, p); + Q_strcat(text, "\n"); + + // loop through all players + // Start with the first player. + // This may return the world in single player if the client types something between levels or during spawn + // so check it, or it will infinite loop + + client = NULL; + while ((client = (CBasePlayer *)UTIL_FindEntityByClassname(client, "player")) != NULL) + { + if (FNullEnt(client->edict())) + break; + + if (!client->pev) + continue; + + if (client->edict() == pEntity) + continue; + + // Not a client ? (should never be true) + if (!client->IsNetClient()) + continue; + + // can the receiver hear the sender? or has he muted him? + if (gpGlobals->deathmatch != 0.0f && g_pGameRules->m_VoiceGameMgr.PlayerHasBlockedPlayer(client, player)) + continue; + + if (teamonly && client->m_iTeam != player->m_iTeam) + continue; + + if ((client->pev->deadflag != DEAD_NO && !bSenderDead) || (client->pev->deadflag == DEAD_NO && bSenderDead)) + { + if (!(player->pev->flags & FL_PROXY)) + continue; + } + + if ((client->m_iIgnoreGlobalChat == IGNOREMSG_ENEMY && client->m_iTeam == player->m_iTeam) + || client->m_iIgnoreGlobalChat == IGNOREMSG_NONE) + { + MESSAGE_BEGIN(MSG_ONE, gmsgSayText, NULL, client->pev); + WRITE_BYTE(ENTINDEX(pEntity)); + WRITE_STRING(pszFormat); + WRITE_STRING(""); + WRITE_STRING(text); + + if (placeName != NULL) + { + WRITE_STRING(placeName); + } + + MESSAGE_END(); + } + } + + char *fullText = p; + + // print to the sending client + MESSAGE_BEGIN(MSG_ONE, gmsgSayText, NULL, &pEntity->v); + WRITE_BYTE(ENTINDEX(pEntity)); + WRITE_STRING(pszFormat); + WRITE_STRING(""); + WRITE_STRING(text); + + if (placeName != NULL) + { + WRITE_STRING(placeName); + } + + MESSAGE_END(); + + // echo to server console + if (pszConsoleFormat) + { + if (placeName && consoleUsesPlaceName) + SERVER_PRINT(UTIL_VarArgs(pszConsoleFormat, STRING(player->pev->netname), placeName, text)); + else + SERVER_PRINT(UTIL_VarArgs(pszConsoleFormat, STRING(player->pev->netname), text)); + } + else + SERVER_PRINT(text); + + if (CVAR_GET_FLOAT("mp_logmessages") != 0) + { + char *temp; + char *szTeam = GetTeam(player->m_iTeam); + char *deadText = ""; + + if (teamonly) + temp = "say_team"; + else + temp = "say"; + + if (player->m_iTeam != SPECTATOR && bSenderDead) + { + deadText = " (dead)"; + } + + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" %s \"%s\"%s\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict()), + szTeam, + temp, + fullText, + deadText + ); + } } /* <4865e> ../cstrike/dlls/client.cpp:1160 */ -NOBODY inline void DropSecondary(CBasePlayer *pPlayer) +void DropSecondary(CBasePlayer *pPlayer) { - UNTESTED - if (pPlayer->HasShield()) { - // TODO: check out if (pPlayer->HasShield() && pPlayer->m_bShieldDrawn && pPlayer->m_pActiveItem != NULL) ((CBasePlayerWeapon *)pPlayer->m_pActiveItem)->SecondaryAttack(); @@ -681,598 +915,2909 @@ void DropPrimary(CBasePlayer *pPlayer) } if (pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]) + { pPlayer->DropPlayerItem(STRING(pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]->pev->classname)); + } } /* <483a2> ../cstrike/dlls/client.cpp:1197 */ -NOBODY bool CanBuyThis(CBasePlayer *pPlayer, int iWeapon) +bool CanBuyThis(CBasePlayer *pPlayer, int iWeapon) { -// { -// class CHalfLifeMultiplay *mp; // 1199 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + if (pPlayer->HasShield() && iWeapon == WEAPON_ELITE) + { + return false; + } + + if (pPlayer->HasShield() && iWeapon == WEAPON_SHIELDGUN) + { + return false; + } + + if (pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ] != NULL && pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ]->m_iId == WEAPON_ELITE && iWeapon == WEAPON_SHIELDGUN) + { + return false; + } + + if (pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ] != NULL && pPlayer->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]->m_iId == iWeapon) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cstrike_Already_Own_Weapon"); + } + + return false; + } + + if (pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ] != NULL && pPlayer->m_rgpPlayerItems[ PISTOL_SLOT ]->m_iId == iWeapon) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cstrike_Already_Own_Weapon"); + } + + return false; + } + + if (!CanBuyWeaponByMaptype(pPlayer->m_iTeam, (WeaponIdType)iWeapon, (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES))) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cannot_Buy_This"); + } + + return false; + } + + return true; } /* <48696> ../cstrike/dlls/client.cpp:1247 */ -NOBODY void BuyPistol(CBasePlayer *pPlayer, int iSlot) +void BuyPistol(CBasePlayer *pPlayer, int iSlot) { -// { -// int iWeapon; // 1249 -// int iWeaponPrice; // 1250 -// const char *pszWeapon; // 1251 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1320 -// DropSecondary(CBasePlayer *pPlayer); // 1305 -// } + int iWeapon = 0; + int iWeaponPrice = 0; + const char *pszWeapon = NULL; + + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (iSlot < 1 || iSlot > 5) + { + return; + } + + switch (iSlot) + { + case 1: + { + iWeapon = WEAPON_GLOCK18; + iWeaponPrice = GLOCK18_PRICE; + pszWeapon = "weapon_glock18"; + break; + } + case 2: + { + iWeapon = WEAPON_USP; + iWeaponPrice = USP_PRICE; + pszWeapon = "weapon_usp"; + break; + } + case 3: + { + iWeapon = WEAPON_P228; + iWeaponPrice = P228_PRICE; + pszWeapon = "weapon_p228"; + break; + } + case 4: + { + iWeapon = WEAPON_DEAGLE; + iWeaponPrice = DEAGLE_PRICE; + pszWeapon = "weapon_deagle"; + break; + } + case 5: + { + if (pPlayer->m_iTeam == CT) + { + iWeapon = WEAPON_FIVESEVEN; + iWeaponPrice = FIVESEVEN_PRICE; + pszWeapon = "weapon_fiveseven"; + } + else + { + iWeapon = WEAPON_ELITE; + iWeaponPrice = ELITE_PRICE; + pszWeapon = "weapon_elite"; + } + + break; + } + } + + if (!CanBuyThis(pPlayer, iWeapon)) + { + return; + } + + if (pPlayer->m_iAccount < iWeaponPrice) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + DropSecondary(pPlayer); + + pPlayer->GiveNamedItem(pszWeapon); + pPlayer->AddAccount(-iWeaponPrice); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <487b0> ../cstrike/dlls/client.cpp:1325 */ -NOBODY void BuyShotgun(CBasePlayer *pPlayer, int iSlot) +void BuyShotgun(CBasePlayer *pPlayer, int iSlot) { -// { -// int iWeapon; // 1327 -// int iWeaponPrice; // 1328 -// const char *pszWeapon; // 1329 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1373 -// DropPrimary(CBasePlayer *pPlayer); // 1359 -// } + int iWeapon = 0; + int iWeaponPrice = 0; + const char *pszWeapon = NULL; + + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (iSlot < 1 || iSlot > 2) + { + return; + } + + switch (iSlot) + { + case 1: + { + iWeapon = WEAPON_M3; + iWeaponPrice = M3_PRICE; + pszWeapon = "weapon_m3"; + break; + } + case 2: + { + iWeapon = WEAPON_XM1014; + iWeaponPrice = XM1014_PRICE; + pszWeapon = "weapon_xm1014"; + break; + } + } + + if (!CanBuyThis(pPlayer, iWeapon)) + { + return; + } + + if (pPlayer->m_iAccount < iWeaponPrice) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + DropPrimary(pPlayer); + + pPlayer->GiveNamedItem(pszWeapon); + pPlayer->AddAccount(-iWeaponPrice); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <488b5> ../cstrike/dlls/client.cpp:1378 */ -NOBODY void BuySubMachineGun(CBasePlayer *pPlayer, int iSlot) +void BuySubMachineGun(CBasePlayer *pPlayer, int iSlot) { -// { -// int iWeapon; // 1380 -// int iWeaponPrice; // 1381 -// const char *pszWeapon; // 1382 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1445 -// DropPrimary(CBasePlayer *pPlayer); // 1431 -// } + int iWeapon = 0; + int iWeaponPrice = 0; + const char *pszWeapon = NULL; + + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (iSlot < 1 || iSlot > 4) + { + return; + } + + switch (iSlot) + { + case 1: + { + if (pPlayer->m_iTeam == CT) + { + iWeapon = WEAPON_TMP; + iWeaponPrice = TMP_PRICE; + pszWeapon = "weapon_tmp"; + } + else + { + iWeapon = WEAPON_MAC10; + iWeaponPrice = MAC10_PRICE; + pszWeapon = "weapon_mac10"; + } + + break; + } + case 2: + { + iWeapon = WEAPON_MP5N; + iWeaponPrice = MP5NAVY_PRICE; + pszWeapon = "weapon_mp5navy"; + break; + } + case 3: + { + iWeapon = WEAPON_UMP45; + iWeaponPrice = UMP45_PRICE; + pszWeapon = "weapon_mp5navy"; + break; + } + case 4: + { + iWeapon = WEAPON_P90; + iWeaponPrice = P90_PRICE; + pszWeapon = "weapon_p90"; + break; + } + } + + if (!CanBuyThis(pPlayer, iWeapon)) + { + return; + } + + if (pPlayer->m_iAccount < iWeaponPrice) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + DropPrimary(pPlayer); + + pPlayer->GiveNamedItem(pszWeapon); + pPlayer->AddAccount(-iWeaponPrice); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <489bb> ../cstrike/dlls/client.cpp:1450 */ -NOBODY void BuyWeaponByWeaponID(CBasePlayer *pPlayer, WeaponIdType weaponID) +void BuyWeaponByWeaponID(CBasePlayer *pPlayer, WeaponIdType weaponID) { -// { -// const class WeaponInfoStruct *info; // 1463 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1493 -// DropPrimary(CBasePlayer *pPlayer); // 1474 -// DropSecondary(CBasePlayer *pPlayer); // 1478 -// } + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (!CanBuyThis(pPlayer, weaponID)) + { + return; + } + + WeaponInfoStruct *info = GetWeaponInfo(weaponID); + + if (!info || !info->entityName) + { + return; + } + + if (pPlayer->m_iAccount < info->cost) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + if (IsPrimaryWeapon(weaponID)) + { + DropPrimary(pPlayer); + } + else + { + DropSecondary(pPlayer); + } + + pPlayer->GiveNamedItem(info->entityName); + pPlayer->AddAccount(-info->cost); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <48adf> ../cstrike/dlls/client.cpp:1498 */ -NOBODY void BuyRifle(CBasePlayer *pPlayer, int iSlot) +void BuyRifle(CBasePlayer *pPlayer, int iSlot) { -// { -// int iWeapon; // 1500 -// int iWeaponPrice; // 1501 -// bool bIsCT; // 1502 -// const char *pszWeapon; // 1503 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1624 -// DropPrimary(CBasePlayer *pPlayer); // 1610 -// } + int iWeapon = 0; + int iWeaponPrice = 0; + bool bIsCT = false; + const char *pszWeapon = NULL; + + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (iSlot < 1 || iSlot > 6) + { + return; + } + + if (pPlayer->m_iTeam == CT) + bIsCT = true; + + switch (iSlot) + { + case 2: + { + if (bIsCT) + { + iWeapon = WEAPON_SCOUT; + iWeaponPrice = SCOUT_PRICE; + pszWeapon = "weapon_scout"; + } + else + { + iWeapon = WEAPON_AK47; + iWeaponPrice = AK47_PRICE; + pszWeapon = "weapon_ak47"; + } + + break; + } + case 3: + { + if (bIsCT) + { + iWeapon = WEAPON_M4A1; + iWeaponPrice = M4A1_PRICE; + pszWeapon = "weapon_m4a1"; + } + else + { + iWeapon = WEAPON_SCOUT; + iWeaponPrice = SCOUT_PRICE; + pszWeapon = "weapon_scout"; + } + + break; + } + case 4: + { + if (bIsCT) + { + iWeapon = WEAPON_AUG; + iWeaponPrice = AUG_PRICE; + pszWeapon = "weapon_aug"; + } + else + { + iWeapon = WEAPON_SG552; + iWeaponPrice = SG552_PRICE; + pszWeapon = "weapon_sg552"; + } + + break; + } + case 5: + { + if (bIsCT) + { + iWeapon = WEAPON_SG550; + iWeaponPrice = SG550_PRICE; + pszWeapon = "weapon_sg550"; + } + else + { + iWeapon = WEAPON_AWP; + iWeaponPrice = AWP_PRICE; + pszWeapon = "weapon_awp"; + } + + break; + } + case 6: + { + if (bIsCT) + { + iWeapon = WEAPON_AWP; + iWeaponPrice = AWP_PRICE; + pszWeapon = "weapon_awp"; + } + else + { + iWeapon = WEAPON_G3SG1; + iWeaponPrice = G3SG1_PRICE; + pszWeapon = "weapon_g3sg1"; + } + + break; + } + default: + { + if (bIsCT) + { + iWeapon = WEAPON_FAMAS; + iWeaponPrice = FAMAS_PRICE; + pszWeapon = "weapon_famas"; + } + else + { + iWeapon = WEAPON_GALIL; + iWeaponPrice = GALIL_PRICE; + pszWeapon = "weapon_galil"; + } + + break; + } + } + + if (!CanBuyThis(pPlayer, iWeapon)) + { + return; + } + + if (pPlayer->m_iAccount < iWeaponPrice) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + DropPrimary(pPlayer); + + pPlayer->GiveNamedItem(pszWeapon); + pPlayer->AddAccount(-iWeaponPrice); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <48bf5> ../cstrike/dlls/client.cpp:1629 */ -NOBODY void BuyMachineGun(CBasePlayer *pPlayer, int iSlot) +void BuyMachineGun(CBasePlayer *pPlayer, int iSlot) { -// { -// int iWeapon; // 1631 -// int iWeaponPrice; // 1632 -// const char *pszWeapon; // 1633 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 1672 -// DropPrimary(CBasePlayer *pPlayer); // 1658 -// } + int iWeapon = WEAPON_M249; + int iWeaponPrice = M249_PRICE; + const char *pszWeapon = "weapon_m249"; + + if (!pPlayer->CanPlayerBuy(true)) + { + return; + } + + if (iSlot != 1) + { + return; + } + + if (!CanBuyThis(pPlayer, iWeapon)) + { + return; + } + + if (pPlayer->m_iAccount < iWeaponPrice) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + DropPrimary(pPlayer); + + pPlayer->GiveNamedItem(pszWeapon); + pPlayer->AddAccount(-iWeaponPrice); + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } } /* <473f8> ../cstrike/dlls/client.cpp:1677 */ -NOBODY void BuyItem(CBasePlayer *pPlayer, int iSlot) +void BuyItem(CBasePlayer *pPlayer, int iSlot) { -// { -// int iItem; // 1679 -// int iItemPrice; // 1680 -// const char *pszItem; // 1681 -// { -// int fullArmor; // 1743 -// int helmet; // 1744 -// int price; // 1746 -// int enoughMoney; // 1746 -// } -// } -} + //int iItem = 0; + int iItemPrice = 0; + const char *pszItem = NULL; -void (*pHandleMenu_ChooseAppearance)(void); + if (!pPlayer->CanPlayerBuy(true)) + return; + + if (pPlayer->m_iTeam == CT) + { + if (iSlot < 1 || iSlot > 8) + return; + } + else + { + if (iSlot < 1 || iSlot > 6) + return; + } + + int fullArmor = (pPlayer->pev->armorvalue >= 100); + int helmet = (pPlayer->m_iKevlar == ARMOR_TYPE_HELMET); + //int price; + int enoughMoney = 1; + + switch (iSlot) + { + case MENU_SLOT_ITEM_VEST: + { + if (fullArmor) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_Kevlar"); + } + + return; + } + + if (pPlayer->m_iAccount >= KEVLAR_PRICE) + { + if (helmet) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_Helmet_Bought_Kevlar"); + } + } + + pszItem = "item_kevlar"; + iItemPrice = KEVLAR_PRICE; + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_VESTHELM: + { + if (fullArmor) + { + if (helmet) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_Kevlar_Helmet"); + } + + return; + } + + if (pPlayer->m_iAccount >= HELMET_PRICE) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_Kevlar_Bought_Helmet"); + } + + pszItem = "item_assaultsuit"; + iItemPrice = HELMET_PRICE; + } + else + enoughMoney = 0; + + break; + } + else + { + if (helmet) + { + if (pPlayer->m_iAccount >= KEVLAR_PRICE) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_Helmet_Bought_Kevlar"); + } + + pszItem = "item_assaultsuit"; + iItemPrice = KEVLAR_PRICE; + } + else + enoughMoney = 0; + } + else + { + if (pPlayer->m_iAccount >= ASSAULTSUIT_PRICE) + { + pszItem = "item_assaultsuit"; + iItemPrice = ASSAULTSUIT_PRICE; + } + else + enoughMoney = 0; + } + } + + break; + } + case MENU_SLOT_ITEM_FLASHGREN: + { + if (pPlayer->AmmoInventory(pPlayer->GetAmmoIndex("Flashbang")) >= 2) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cannot_Carry_Anymore"); + } + + return; + } + + if (pPlayer->m_iAccount >= FLASHBANG_PRICE) + { + pszItem = "weapon_flashbang"; + iItemPrice = FLASHBANG_PRICE; + + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_HEGREN: + { + if (pPlayer->AmmoInventory(pPlayer->GetAmmoIndex("HEGrenade")) >= 1) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cannot_Carry_Anymore"); + } + + return; + } + + if (pPlayer->m_iAccount >= HEGRENADE_PRICE) + { + pszItem = "weapon_hegrenade"; + iItemPrice = HEGRENADE_PRICE; + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_SMOKEGREN: + { + if (pPlayer->AmmoInventory(pPlayer->GetAmmoIndex("SmokeGrenade")) >= 1) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cannot_Carry_Anymore"); + } + + return; + } + + if (pPlayer->m_iAccount >= SMOKEGRENADE_PRICE) + { + pszItem = "weapon_smokegrenade"; + iItemPrice = SMOKEGRENADE_PRICE; + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_NVG: + { + if (pPlayer->m_bHasNightVision) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_One"); + } + + return; + } + + if (pPlayer->m_iAccount >= NVG_PRICE) + { + if (!(pPlayer->m_flDisplayHistory & DHF_NIGHTVISION)) + { + pPlayer->HintMessage("#Hint_use_nightvision"); + pPlayer->m_flDisplayHistory |= DHF_NIGHTVISION; + } + + EMIT_SOUND(ENT(pPlayer->pev), CHAN_ITEM, "items/equip_nvg.wav", VOL_NORM, ATTN_NORM); + + pPlayer->m_bHasNightVision = true; + pPlayer->AddAccount(-NVG_PRICE); + + SendItemStatus(pPlayer); + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_DEFUSEKIT: + { + if (pPlayer->m_iTeam != CT || !g_pGameRules->m_bMapHasBombTarget) + { + return; + } + + if (pPlayer->m_bHasDefuser) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Already_Have_One"); + } + + return; + } + + if (pPlayer->m_iAccount >= DEFUSEKIT_PRICE) + { + pPlayer->m_bHasDefuser = true; + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pPlayer->pev); + WRITE_BYTE(STATUSICON_SHOW); + WRITE_STRING("defuser"); + WRITE_BYTE(0); + WRITE_BYTE(160); + WRITE_BYTE(0); + MESSAGE_END(); + + pPlayer->pev->body = 1; + pPlayer->AddAccount(-DEFUSEKIT_PRICE); + + EMIT_SOUND(ENT(pPlayer->pev), CHAN_ITEM, "items/kevlar.wav", VOL_NORM, ATTN_NORM); + SendItemStatus(pPlayer); + } + else + enoughMoney = 0; + + break; + } + case MENU_SLOT_ITEM_SHIELD: + { + if (!CanBuyThis(pPlayer, WEAPON_SHIELDGUN)) + { + return; + } + + if (pPlayer->m_iAccount >= SHIELDGUN_PRICE) + { + DropPrimary(pPlayer); + + pPlayer->GiveShield(true); + pPlayer->AddAccount(-SHIELDGUN_PRICE); + + EMIT_SOUND(ENT(pPlayer->pev), CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM); + } + else + enoughMoney = 0; + + break; + } + } + + if (!enoughMoney) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(pPlayer, 2); + } + + return; + } + + if (pszItem != NULL) + { + pPlayer->GiveNamedItem(pszItem); + pPlayer->AddAccount(-iItemPrice); + } + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } +} /* <48d40> ../cstrike/dlls/client.cpp:1998 */ -NOBODY void __declspec(naked) HandleMenu_ChooseAppearance(CBasePlayer *player, int slot) +void HandleMenu_ChooseAppearance(CBasePlayer *player, int slot) { - __asm + CHalfLifeMultiplay *mp = g_pGameRules; + int numSkins = UTIL_IsGame("czero") ? CZ_NUM_SKIN : CS_NUM_SKIN; + + struct + { + ModelName model_id; + char *model_name; + int model_name_index; + + } appearance; + + Q_memset(&appearance, 0, sizeof(appearance)); + + if (player->m_iTeam == TERRORIST) { - jmp pHandleMenu_ChooseAppearance + if ((slot > numSkins || slot < 1) && (!TheBotProfiles->GetCustomSkin(slot) || !player->IsBot())) + { + slot = RANDOM_LONG(1, numSkins); + } + + switch (slot) + { + case 1: + appearance.model_id = MODEL_TERROR; + appearance.model_name = "terror"; + break; + case 2: + appearance.model_id = MODEL_LEET; + appearance.model_name = "leet"; + break; + case 3: + appearance.model_id = MODEL_ARCTIC; + appearance.model_name = "arctic"; + break; + case 4: + appearance.model_id = MODEL_GUERILLA; + appearance.model_name = "guerilla"; + break; + case 5: + if (UTIL_IsGame("czero")) + { + appearance.model_id = MODEL_MILITIA; + appearance.model_name = "militia"; + break; + } + default: + if (TheBotProfiles->GetCustomSkinModelname(slot) && player->IsBot()) + { + appearance.model_name = (char *)TheBotProfiles->GetCustomSkinModelname(slot); + } + else + { + appearance.model_id = MODEL_TERROR; + appearance.model_name = "terror"; + } + break; + } + + // default T model models/player/terror/terror.mdl + appearance.model_name_index = 8; + + } + else if (player->m_iTeam == CT) + { + if ((slot > numSkins || slot < 1) && (!TheBotProfiles->GetCustomSkin(slot) || !player->IsBot())) + { + slot = RANDOM_LONG(1, numSkins); + } + + switch (slot) + { + case 1: + appearance.model_id = MODEL_URBAN; + appearance.model_name = "urban"; + break; + case 2: + appearance.model_id = MODEL_GSG9; + appearance.model_name = "gsg9"; + break; + case 3: + appearance.model_id = MODEL_SAS; + appearance.model_name = "sas"; + break; + case 4: + appearance.model_id = MODEL_GIGN; + appearance.model_name = "gign"; + break; + case 5: + if (UTIL_IsGame("czero")) + { + appearance.model_id = MODEL_SPETSNAZ; + appearance.model_name = "spetsnaz"; + break; + } + default: + if (TheBotProfiles->GetCustomSkinModelname(slot) && player->IsBot()) + { + appearance.model_name = (char *)TheBotProfiles->GetCustomSkinModelname(slot); + } + else + { + appearance.model_id = MODEL_URBAN; + appearance.model_name = "urban"; + } + break; + } + + // default CT model models/player/urban/urban.mdl + appearance.model_name_index = 9; + } + + player->m_iMenu = Menu_OFF; + + if (player->m_iJoiningState != JOINED) + { + if (player->m_iJoiningState == PICKINGTEAM) + { + player->m_iJoiningState = GETINTOGAME; + + if (mp->IsCareer()) + { + if (!player->IsBot()) + { + mp->CheckWinConditions(); + } + } + } + } + else + mp->CheckWinConditions(); + + player->pev->body = 0; + player->m_iModelName = appearance.model_id; + + SET_CLIENT_KEY_VALUE(player->entindex(), GET_INFO_BUFFER(player->edict()), "model", appearance.model_name); + player->SetNewPlayerModel(sPlayerModelFiles[ appearance.model_name_index ]); + + if (mp->m_iMapHasVIPSafetyZone == MAP_VIP_SAFETYZONE_INIT) + { + if ((UTIL_FindEntityByClassname(NULL, "func_vip_safetyzone")) != NULL) + mp->m_iMapHasVIPSafetyZone = MAP_HAVE_VIP_SAFETYZONE_YES; + else + mp->m_iMapHasVIPSafetyZone = MAP_HAVE_VIP_SAFETYZONE_NO; + } + + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + if (!mp->m_pVIP && player->m_iTeam == CT) + { + player->MakeVIP(); + } } -// { -// class CHalfLifeMultiplay *mp; // 2000 -// class appearance; // 2007 -// int numSkins; // 2009 -// edict(CBaseEntity *const this); // 2183 -// entindex(CBaseEntity *const this); // 2183 -// } } -void (*pHandleMenu_ChooseTeam)(void); - /* <48e4b> ../cstrike/dlls/client.cpp:2214 */ -NOBODY BOOL __declspec(naked) HandleMenu_ChooseTeam(CBasePlayer *player, int slot) +BOOL HandleMenu_ChooseTeam(CBasePlayer *player, int slot) { - __asm + CHalfLifeMultiplay *mp = g_pGameRules; + TeamName team = UNASSIGNED; + int oldTeam; + char *szOldTeam; + char *szNewTeam; + const char *szName; + + if (player->m_bIsVIP) { - jmp pHandleMenu_ChooseTeam + if (player->pev->deadflag == DEAD_NO) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Cannot_Switch_From_VIP"); + CLIENT_COMMAND(ENT(player->pev), "slot10\n"); + + return TRUE; + } + + if (g_pGameRules->IsVIPQueueEmpty()) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Cannot_Switch_From_VIP"); + CLIENT_COMMAND(ENT(player->pev), "slot10\n"); + + return TRUE; + } } -// { -// class CHalfLifeMultiplay *mp; // 2216 -// enum TeamName team; // 2217 -// edict_t *pentSpawnSpot; // 2218 -// int oldTeam; // 2525 -// char *szOldTeam; // 2540 -// char *szNewTeam; // 2541 -// edict(CBaseEntity *const this); // 2235 -// edict(CBaseEntity *const this); // 2323 -// edict(CBaseEntity *const this); // 2323 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2331 -// TeamChangeUpdate(CBasePlayer *player, -// int team_id); // 2349 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2336 -// edict(CBaseEntity *const this); // 2337 -// ENTINDEX(edict_t *pEdict); // 2337 -// VARS(edict_t *pent); // 2352 -// Vector(Vector *const this, -// const Vector &v); // 2352 -// VARS(edict_t *pent); // 2352 -// Vector(Vector *const this, -// const Vector &v); // 2352 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2355 -// edict(CBaseEntity *const this); // 2356 -// ENTINDEX(edict_t *pEdict); // 2356 -// { -// bool madeRoom; // 2402 -// } -// edict(CBaseEntity *const this); // 2378 -// { -// cvar_t humans_join_team; // 2435 -// int humanTeam; // 2436 -// } -// { -// bool isCZero; // 2494 -// } -// TeamChangeUpdate(CBasePlayer *player, -// int team_id); // 2531 -// edict(CBaseEntity *const this); // 2548 -// edict(CBaseEntity *const this); // 2548 -// edict(CBaseEntity *const this); // 2371 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 2363 -// CheckStartMoney(void); // 2466 -// } + + switch (slot) + { + case MENU_SLOT_TEAM_TERRORIST: + team = TERRORIST; + break; + case MENU_SLOT_TEAM_CT: + team = CT; + break; + case MENU_SLOT_TEAM_VIP: + { + if (mp->m_iMapHasVIPSafetyZone != MAP_HAVE_VIP_SAFETYZONE_YES || player->m_iTeam != CT) + { + return FALSE; + } + + mp->AddToVIPQueue(player); + CLIENT_COMMAND(ENT(player->pev), "slot10\n"); + return TRUE; + } + case MENU_SLOT_TEAM_RANDOM: + { + team = SelectDefaultTeam(); + + if (team == UNASSIGNED) + { + bool madeRoom = false; + if (cv_bot_auto_vacate.value > 0.0f && !player->IsBot()) + { + team = (RANDOM_LONG(0, 1) == 0) ? TERRORIST : CT; + + if (UTIL_KickBotFromTeam(team)) + madeRoom = true; + else + { + if (team == CT) + team = TERRORIST; + else + team = CT; + + if (UTIL_KickBotFromTeam(team)) + { + madeRoom = true; + } + } + } + + if (!madeRoom) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#All_Teams_Full"); + return FALSE; + } + } + break; + } + case MENU_SLOT_TEAM_SPECT: + { + if (!allow_spectators.value) + { + if (!(player->pev->flags & FL_PROXY)) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Cannot_Be_Spectator"); + CLIENT_COMMAND(ENT(player->pev), "slot10\n"); + + return FALSE; + } + } + + if (player->m_iTeam == SPECTATOR) + { + return TRUE; + } + + if (!mp->IsFreezePeriod()) + { + if (player->pev->deadflag == DEAD_NO) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Cannot_Be_Spectator"); + CLIENT_COMMAND(ENT(player->pev), "slot10\n"); + + return FALSE; + } + } + + if (player->m_iTeam != UNASSIGNED) + { + if (player->pev->deadflag == DEAD_NO) + { + ClientKill(player->edict()); + player->pev->frags++; + } + } + + player->RemoveAllItems(TRUE); + player->m_bHasC4 = false; + + if (player->m_iTeam != SPECTATOR) + { + // notify other clients of player joined to team spectator + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" joined team \"SPECTATOR\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict()), + GetTeam(player->m_iTeam) + ); + } + + player->m_iTeam = SPECTATOR; + player->m_iJoiningState = JOINED; + player->m_iAccount = 0; + + MESSAGE_BEGIN(MSG_ONE, gmsgMoney, NULL, player->pev); + WRITE_LONG(player->m_iAccount); + WRITE_BYTE(0); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_BROADCAST, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(player->edict())); + WRITE_SHORT((int)player->pev->frags); + WRITE_SHORT(player->m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(0); + MESSAGE_END(); + + player->m_pIntroCamera = NULL; + player->m_bTeamChanged = true; + + TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, player); + + TeamChangeUpdate(player, player->m_iTeam); + + edict_t *pentSpawnSpot = mp->GetPlayerSpawnSpot(player); + player->StartObserver(VARS(pentSpawnSpot)->origin, VARS(pentSpawnSpot)->angles); + + MESSAGE_BEGIN(MSG_ALL, gmsgSpectator); + WRITE_BYTE(ENTINDEX(player->edict())); + WRITE_BYTE(1); + MESSAGE_END(); + + if (fadetoblack.value) + { + UTIL_ScreenFade(player, Vector(0, 0, 0), 0.001, 0, 0, 0); + } + + return TRUE; + } + } + + if (mp->TeamFull(team) && (cv_bot_auto_vacate.value <= 0.0f || player->IsBot() || !UTIL_KickBotFromTeam(team))) + { + if (team == TERRORIST) + ClientPrint(player->pev, HUD_PRINTCENTER, "#Terrorists_Full"); + else + ClientPrint(player->pev, HUD_PRINTCENTER, "#CTs_Full"); + + return FALSE; + } + + if (mp->TeamStacked(team, player->m_iTeam)) + { + if (team == TERRORIST) + ClientPrint(player->pev, HUD_PRINTCENTER, "#Too_Many_Terrorists"); + else + ClientPrint(player->pev, HUD_PRINTCENTER, "#Too_Many_CTs"); + + return FALSE; + } + + if (!player->IsBot() && team != SPECTATOR) + { + int humanTeam = UNASSIGNED; + + if (!Q_stricmp(humans_join_team.string, "CT")) + { + humanTeam = CT; + } + else if (!Q_stricmp(humans_join_team.string, "T")) + { + humanTeam = TERRORIST; + } + + if (humanTeam != UNASSIGNED && team != humanTeam) + { + if (team == TERRORIST) + ClientPrint(player->pev, HUD_PRINTCENTER, "#Humans_Join_Team_CT"); + else + ClientPrint(player->pev, HUD_PRINTCENTER, "#Humans_Join_Team_T"); + + return FALSE; + } + } + + if (player->m_bTeamChanged) + { + if (player->pev->deadflag != DEAD_NO) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Only_1_Team_Change"); + + return FALSE; + } + } + + if (player->m_iTeam == SPECTATOR && team != SPECTATOR) + { + player->m_bNotKilled = true; + player->m_iIgnoreGlobalChat = IGNOREMSG_NONE; + player->m_iTeamKills = 0; + + CheckStartMoney(); + + player->m_iAccount = (int)startmoney.value; + player->pev->solid = SOLID_NOT; + player->pev->movetype = MOVETYPE_NOCLIP; + player->pev->effects = EF_NODRAW; + player->pev->effects |= EF_NOINTERP; + player->pev->takedamage = DAMAGE_NO; + player->pev->deadflag = DEAD_DEAD; + player->pev->velocity = g_vecZero; + player->pev->punchangle = g_vecZero; + player->m_bHasNightVision = false; + player->m_iHostagesKilled = 0; + player->m_fDeadTime = 0; + player->has_disconnected = false; + player->m_iJoiningState = GETINTOGAME; + + SendItemStatus(player); + SET_CLIENT_MAXSPEED(ENT(player->pev), 1); + SET_MODEL(ENT(player->pev), "models/player.mdl"); + } + + if (!g_pGameRules->IsCareer()) + { + bool isCZero = UTIL_IsGame("czero"); + + switch (team) + { + case CT: + if (isCZero) + ShowVGUIMenu(player, VGUI_Menu_Class_CT, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6), "#CT_Select"); + else + ShowVGUIMenu(player, VGUI_Menu_Class_CT, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5), "#CT_Select"); + break; + + case TERRORIST: + if (isCZero) + ShowVGUIMenu(player, VGUI_Menu_Class_T, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6), "#Terrorist_Select"); + else + ShowVGUIMenu(player, VGUI_Menu_Class_T, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5), "#Terrorist_Select"); + break; + } + } + + player->m_iMenu = Menu_ChooseAppearance; + + if (player->pev->deadflag == DEAD_NO) + { + ClientKill(player->edict()); + } + + player->m_bTeamChanged = true; + oldTeam = player->m_iTeam; + player->m_iTeam = team; + + TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, player); + + TeamChangeUpdate(player, team); + + if (player->pev->netname) + { + szName = STRING(player->pev->netname); + + if (!szName[0]) + szName = ""; + } + else + szName = ""; + + szOldTeam = GetTeam(oldTeam); + szNewTeam = GetTeam(team); + + UTIL_ClientPrintAll(HUD_PRINTNOTIFY, (team == TERRORIST) ? "#Game_join_terrorist" : "#Game_join_ct", szName); + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" joined team \"%s\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict()), + szOldTeam, + szNewTeam + ); + + return TRUE; } /* <474a0> ../cstrike/dlls/client.cpp:2553 */ -NOBODY void Radio1(CBasePlayer *player, int slot) +void Radio1(CBasePlayer *player, int slot) { + if (player->m_flRadioTime >= gpGlobals->time) + { + return; + } + + if (player->m_iRadioMessages <= 0) + { + return; + } + + player->m_iRadioMessages--; + player->m_flRadioTime = gpGlobals->time + 1.5f; + + switch (slot) + { + case 1: + player->Radio("%!MRAD_COVERME", "#Cover_me"); + break; + case 2: + player->Radio("%!MRAD_TAKEPOINT", "#You_take_the_point"); + break; + case 3: + player->Radio("%!MRAD_POSITION", "#Hold_this_position"); + break; + case 4: + player->Radio("%!MRAD_REGROUP", "#Regroup_team"); + break; + case 5: + player->Radio("%!MRAD_FOLLOWME", "#Follow_me"); + break; + case 6: + player->Radio("%!MRAD_HITASSIST", "#Taking_fire"); + break; + } + + TheBots->OnEvent((GameEventType)(EVENT_START_RADIO_1 + slot), player); } /* <474ca> ../cstrike/dlls/client.cpp:2596 */ -NOBODY void Radio2(CBasePlayer *player, int slot) +void Radio2(CBasePlayer *player, int slot) { + if (player->m_flRadioTime >= gpGlobals->time) + { + return; + } + + if (player->m_iRadioMessages <= 0) + { + return; + } + + player->m_iRadioMessages--; + player->m_flRadioTime = gpGlobals->time + 1.5f; + + switch (slot) + { + case 1: + player->Radio("%!MRAD_GO", "#Go_go_go"); + break; + case 2: + player->Radio("%!MRAD_FALLBACK", "#Team_fall_back"); + break; + case 3: + player->Radio("%!MRAD_STICKTOG", "#Stick_together_team"); + break; + case 4: + player->Radio("%!MRAD_GETINPOS", "#Get_in_position_and_wait"); + break; + case 5: + player->Radio("%!MRAD_STORMFRONT", "#Storm_the_front"); + break; + case 6: + player->Radio("%!MRAD_REPORTIN", "#Report_in_team"); + break; + } + + TheBots->OnEvent((GameEventType)(EVENT_START_RADIO_2 + slot), player); } /* <474f4> ../cstrike/dlls/client.cpp:2639 */ -NOBODY void Radio3(CBasePlayer *player, int slot) +void Radio3(CBasePlayer *player, int slot) { + if (player->m_flRadioTime >= gpGlobals->time) + { + return; + } + + if (player->m_iRadioMessages <= 0) + { + return; + } + + player->m_iRadioMessages--; + player->m_flRadioTime = gpGlobals->time + 1.5f; + + switch (slot) + { + case 1: + if (RANDOM_LONG(0, 1)) + player->Radio("%!MRAD_AFFIRM", "#Affirmative"); + else + player->Radio("%!MRAD_ROGER", "#Roger_that"); + + break; + case 2: + player->Radio("%!MRAD_ENEMYSPOT", "#Enemy_spotted"); + break; + case 3: + player->Radio("%!MRAD_BACKUP", "#Need_backup"); + break; + case 4: + player->Radio("%!MRAD_CLEAR", "#Sector_clear"); + break; + case 5: + player->Radio("%!MRAD_INPOS", "#In_position"); + break; + case 6: + player->Radio("%!MRAD_REPRTINGIN", "#Reporting_in"); + break; + case 7: + player->Radio("%!MRAD_BLOW", "#Get_out_of_there"); + break; + case 8: + player->Radio("%!MRAD_NEGATIVE", "#Negative"); + break; + case 9: + player->Radio("%!MRAD_ENEMYDOWN", "#Enemy_down"); + break; + } + + TheBots->OnEvent((GameEventType)(EVENT_START_RADIO_3 + slot), player); } /* <49402> ../cstrike/dlls/client.cpp:2698 */ -NOBODY bool BuyGunAmmo(CBasePlayer &player, CBasePlayerItem &weapon, bool bBlinkMoney) +bool BuyGunAmmo(CBasePlayer *player, CBasePlayerItem *weapon, bool bBlinkMoney) { -// { -// int nAmmo; // 2706 -// int cost; // 2719 -// const char *classname; // 2720 -// iMaxAmmo1(CBasePlayerItem *const this); // 2713 -// BlinkAccount(CBasePlayer *player, -// int numBlinks); // 2873 -// } + int cost; + const char *classname; + + if (!player->CanPlayerBuy(true)) + { + return false; + } + + int nAmmo = weapon->PrimaryAmmoIndex(); + if (nAmmo == -1) + { + return false; + } + + if (player->m_rgAmmo[ nAmmo ] >= weapon->iMaxAmmo1()) + { + return false; + } + + switch (weapon->m_iId) + { + case WEAPON_AWP: + cost = AMMO_338MAG_PRICE; + classname = "ammo_338magnum"; + break; + case WEAPON_SCOUT: + case WEAPON_G3SG1: + case WEAPON_AK47: + cost = AMMO_762MM_PRICE; + classname = "ammo_762nato"; + break; + case WEAPON_XM1014: + case WEAPON_M3: + cost = AMMO_BUCKSHOT_PRICE; + classname = "ammo_buckshot"; + break; + case WEAPON_MAC10: + case WEAPON_UMP45: + case WEAPON_USP: + cost = AMMO_45ACP_PRICE; + classname = "ammo_45acp"; + break; + case WEAPON_M249: + cost = AMMO_556MM_PRICE; + classname = "ammo_556natobox"; + break; + case WEAPON_FIVESEVEN: + case WEAPON_P90: + cost = AMMO_57MM_PRICE; + classname = "ammo_57mm"; + break; + case WEAPON_ELITE: + case WEAPON_GLOCK18: + case WEAPON_MP5N: + case WEAPON_TMP: + cost = AMMO_9MM_PRICE; + classname = "ammo_9mm"; + break; + case WEAPON_DEAGLE: + cost = AMMO_50AE_PRICE; + classname = "ammo_50ae"; + break; + case WEAPON_P228: + cost = AMMO_357SIG_PRICE; + classname = "ammo_357sig"; + break; + case WEAPON_AUG: + case WEAPON_SG550: + case WEAPON_GALIL: + case WEAPON_FAMAS: + case WEAPON_M4A1: + case WEAPON_SG552: + cost = AMMO_556MM_PRICE; + classname = "ammo_556nato"; + break; + default: + ALERT(at_console, "Tried to buy ammo for an unrecognized gun\n"); + return false; + } + + if (player->m_iAccount >= cost) + { + player->GiveNamedItem(classname); + player->AddAccount(-cost); + return true; + } + + if (bBlinkMoney) + { + if (g_bClientPrintEnable) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Not_Enough_Money"); + BlinkAccount(player, 2); + } + } + + return false; } /* <4751e> ../cstrike/dlls/client.cpp:2884 */ -NOBODY bool BuyAmmo(CBasePlayer *player, int nSlot, bool bBlinkMoney) +bool BuyAmmo(CBasePlayer *player, int nSlot, bool bBlinkMoney) { -// { -// class CBasePlayerItem *pItem; // 2901 -// } + if (!player->CanPlayerBuy(true)) + { + return false; + } + + if (nSlot < PRIMARY_WEAPON_SLOT || nSlot > PISTOL_SLOT) + { + return false; + } + + CBasePlayerItem *pItem = player->m_rgpPlayerItems[ nSlot ]; + + if (player->HasShield()) + { + if (player->m_rgpPlayerItems[ PISTOL_SLOT ]) + pItem = player->m_rgpPlayerItems[ PISTOL_SLOT ]; + } + + if (pItem != NULL) + { + while (BuyGunAmmo(player, pItem, bBlinkMoney)) + { + pItem = pItem->m_pNext; + + if (!pItem) + { + return true; + } + } + } + + return false; } /* <4bb4a> ../cstrike/dlls/client.cpp:2933 */ -NOBODY CBaseEntity *EntityFromUserID(int userID) +CBaseEntity *EntityFromUserID(int userID) { -// { -// class CBaseEntity *pTempEntity; // 2935 -// class CBasePlayer *pTempPlayer; // 2936 -// edict(CBaseEntity *const this); // 2945 -// edict(CBaseEntity *const this); // 2939 -// FNullEnt(const edict_t *pent); // 2939 -// } + CBaseEntity *pTempEntity = NULL; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (pTempPlayer->m_iTeam != UNASSIGNED && userID == GETPLAYERUSERID(pTempEntity->edict())) + { + return pTempPlayer; + } + } + + return NULL; } /* <4baa5> ../cstrike/dlls/client.cpp:2958 */ -NOBODY int CountPlayersInServer(void) +NOXREF int CountPlayersInServer(void) { -// { -// int count; // 2960 -// class CBaseEntity *pTempEntity; // 2961 -// class CBasePlayer *pTempPlayer; // 2962 -// edict(CBaseEntity *const this); // 2965 -// FNullEnt(const edict_t *pent); // 2965 -// } + int count = 0; + CBaseEntity *pTempEntity = NULL; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (pTempPlayer->m_iTeam != UNASSIGNED) + { + count++; + } + } + + return count; } /* <4958c> ../cstrike/dlls/client.cpp:2983 */ -NOBODY BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand) +BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand) { -// { -// BOOL bRetVal; // 2985 -// char *pszFailItem; // 2986 -// enum WeaponIdType weaponID; // 2988 -// const char *weaponFailName; // 2989 -// FStrEq(const char *sz1, -// const char *sz2); // 3014 -// FStrEq(const char *sz1, -// const char *sz2); // 3030 -// FStrEq(const char *sz1, -// const char *sz2); // 3046 -// FStrEq(const char *sz1, -// const char *sz2); // 3051 -// FStrEq(const char *sz1, -// const char *sz2); // 3056 -// FStrEq(const char *sz1, -// const char *sz2); // 3061 -// FStrEq(const char *sz1, -// const char *sz2); // 3066 -// FStrEq(const char *sz1, -// const char *sz2); // 3071 -// FStrEq(const char *sz1, -// const char *sz2); // 3076 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3081 -// { -// class CHalfLifeMultiplay *mp; // 2993 -// } -// BuyAmmo(CBasePlayer *player, -// int nSlot, -// bool bBlinkMoney); // 3020 -// BuyAmmo(CBasePlayer *player, -// int nSlot, -// bool bBlinkMoney); // 3036 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3054 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3049 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3059 -// BuyAmmo(CBasePlayer *player, -// int nSlot, -// bool bBlinkMoney); // 3022 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3074 -// BuyAmmo(CBasePlayer *player, -// int nSlot, -// bool bBlinkMoney); // 3038 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3064 -// BuyItem(CBasePlayer *pPlayer, -// int iSlot); // 3069 -// FStrEq(const char *sz1, -// const char *sz2); // 3088 -// } + BOOL bRetVal = FALSE; + //char *pszFailItem; + + WeaponIdType weaponID = WEAPON_NONE; + const char *weaponFailName = BuyAliasToWeaponID(pszCommand, weaponID); + + if (weaponID != WEAPON_NONE) + { + if (CanBuyWeaponByMaptype(pPlayer->m_iTeam, weaponID, (g_pGameRules->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES))) + { + bRetVal = TRUE; + BuyWeaponByWeaponID(pPlayer, weaponID); + } + else if (weaponFailName != NULL) + { + bRetVal = TRUE; + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Alias_Not_Avail", weaponFailName); + } + } + else + { + bRetVal = TRUE; + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Cannot_Buy_This"); + } + } + } + else + { + if (FStrEq(pszCommand, "primammo")) + { + bRetVal = TRUE; + if (BuyAmmo(pPlayer, PRIMARY_WEAPON_SLOT, true)) + { + while (BuyAmmo(pPlayer, PRIMARY_WEAPON_SLOT, false)) + ; + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } + } + } + else if (FStrEq(pszCommand, "secammo")) + { + bRetVal = TRUE; + if (BuyAmmo(pPlayer, PISTOL_SLOT, true)) + { + while (BuyAmmo(pPlayer, PISTOL_SLOT, false)) + ; + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); + } + } + } + else if (FStrEq(pszCommand, "vest")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_VEST); + } + else if (FStrEq(pszCommand, "vesthelm")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_VESTHELM); + } + else if (FStrEq(pszCommand, "flash")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_FLASHGREN); + } + else if (FStrEq(pszCommand, "hegren")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_HEGREN); + } + else if (FStrEq(pszCommand, "sgren")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_SMOKEGREN); + } + else if (FStrEq(pszCommand, "nvgs")) + { + bRetVal = TRUE; + BuyItem(pPlayer, MENU_SLOT_ITEM_NVG); + } + else if (FStrEq(pszCommand, "defuser")) + { + bRetVal = TRUE; + if (pPlayer->m_iTeam != CT) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Alias_Not_Avail", "#Bomb_Defusal_Kit"); + } + } + else + BuyItem(pPlayer, MENU_SLOT_ITEM_DEFUSEKIT); + } + else if (FStrEq(pszCommand, "shield")) + { + bRetVal = TRUE; + if (pPlayer->m_iTeam != CT) + { + if (g_bClientPrintEnable) + { + ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#Alias_Not_Avail", "#TactShield_Desc"); + } + } + else + BuyItem(pPlayer, MENU_SLOT_ITEM_SHIELD); + } + } + + pPlayer->BuildRebuyStruct(); + return bRetVal; } /* <49c3e> ../cstrike/dlls/client.cpp:3113 */ -NOBODY BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand) +BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand) { -// { -// BOOL bRetVal; // 3115 -// FStrEq(const char *sz1, -// const char *sz2); // 3118 -// FStrEq(const char *sz1, -// const char *sz2); // 3123 -// FStrEq(const char *sz1, -// const char *sz2); // 3128 -// FStrEq(const char *sz1, -// const char *sz2); // 3133 -// FStrEq(const char *sz1, -// const char *sz2); // 3138 -// FStrEq(const char *sz1, -// const char *sz2); // 3143 -// FStrEq(const char *sz1, -// const char *sz2); // 3149 -// FStrEq(const char *sz1, -// const char *sz2); // 3154 -// FStrEq(const char *sz1, -// const char *sz2); // 3159 -// FStrEq(const char *sz1, -// const char *sz2); // 3164 -// FStrEq(const char *sz1, -// const char *sz2); // 3169 -// FStrEq(const char *sz1, -// const char *sz2); // 3174 -// FStrEq(const char *sz1, -// const char *sz2); // 3180 -// FStrEq(const char *sz1, -// const char *sz2); // 3185 -// FStrEq(const char *sz1, -// const char *sz2); // 3190 -// FStrEq(const char *sz1, -// const char *sz2); // 3195 -// FStrEq(const char *sz1, -// const char *sz2); // 3200 -// FStrEq(const char *sz1, -// const char *sz2); // 3205 -// FStrEq(const char *sz1, -// const char *sz2); // 3210 -// FStrEq(const char *sz1, -// const char *sz2); // 3215 -// FStrEq(const char *sz1, -// const char *sz2); // 3220 -// Radio3(CBasePlayer *player, -// int slot); // 3223 -// Radio1(CBasePlayer *player, -// int slot); // 3121 -// Radio1(CBasePlayer *player, -// int slot); // 3131 -// Radio2(CBasePlayer *player, -// int slot); // 3152 -// Radio1(CBasePlayer *player, -// int slot); // 3126 -// Radio1(CBasePlayer *player, -// int slot); // 3136 -// Radio1(CBasePlayer *player, -// int slot); // 3141 -// Radio1(CBasePlayer *player, -// int slot); // 3146 -// Radio3(CBasePlayer *player, -// int slot); // 3183 -// Radio2(CBasePlayer *player, -// int slot); // 3157 -// Radio2(CBasePlayer *player, -// int slot); // 3162 -// Radio2(CBasePlayer *player, -// int slot); // 3167 -// Radio2(CBasePlayer *player, -// int slot); // 3172 -// Radio2(CBasePlayer *player, -// int slot); // 3177 -// Radio3(CBasePlayer *player, -// int slot); // 3188 -// Radio3(CBasePlayer *player, -// int slot); // 3193 -// Radio3(CBasePlayer *player, -// int slot); // 3198 -// Radio3(CBasePlayer *player, -// int slot); // 3203 -// Radio3(CBasePlayer *player, -// int slot); // 3208 -// Radio3(CBasePlayer *player, -// int slot); // 3213 -// Radio3(CBasePlayer *player, -// int slot); // 3218 -// } + BOOL bRetVal = FALSE; + + if (FStrEq(pszCommand, "coverme")) + { + bRetVal = TRUE; + Radio1(pPlayer, 1); + } + else if (FStrEq(pszCommand, "takepoint")) + { + bRetVal = TRUE; + Radio1(pPlayer, 2); + } + else if (FStrEq(pszCommand, "holdpos")) + { + bRetVal = TRUE; + Radio1(pPlayer, 3); + } + else if (FStrEq(pszCommand, "regroup")) + { + bRetVal = TRUE; + Radio1(pPlayer, 4); + } + else if (FStrEq(pszCommand, "followme")) + { + bRetVal = TRUE; + Radio1(pPlayer, 5); + } + else if (FStrEq(pszCommand, "takingfire")) + { + bRetVal = TRUE; + Radio1(pPlayer, 6); + } + else if (FStrEq(pszCommand, "go")) + { + bRetVal = TRUE; + Radio2(pPlayer, 1); + } + else if (FStrEq(pszCommand, "fallback")) + { + bRetVal = TRUE; + Radio2(pPlayer, 2); + } + else if (FStrEq(pszCommand, "sticktog")) + { + bRetVal = TRUE; + Radio2(pPlayer, 3); + } + else if (FStrEq(pszCommand, "getinpos")) + { + bRetVal = TRUE; + Radio2(pPlayer, 4); + } + else if (FStrEq(pszCommand, "stormfront")) + { + bRetVal = TRUE; + Radio2(pPlayer, 5); + } + else if (FStrEq(pszCommand, "report")) + { + bRetVal = TRUE; + Radio2(pPlayer, 6); + } + else if (FStrEq(pszCommand, "roger")) + { + bRetVal = TRUE; + Radio3(pPlayer, 1); + } + else if (FStrEq(pszCommand, "enemyspot")) + { + bRetVal = TRUE; + Radio3(pPlayer, 2); + } + else if (FStrEq(pszCommand, "needbackup")) + { + bRetVal = TRUE; + Radio3(pPlayer, 3); + } + else if (FStrEq(pszCommand, "sectorclear")) + { + bRetVal = TRUE; + Radio3(pPlayer, 4); + } + else if (FStrEq(pszCommand, "inposition")) + { + bRetVal = TRUE; + Radio3(pPlayer, 5); + } + else if (FStrEq(pszCommand, "reportingin")) + { + bRetVal = TRUE; + Radio3(pPlayer, 6); + } + else if (FStrEq(pszCommand, "getout")) + { + bRetVal = TRUE; + Radio3(pPlayer, 7); + } + else if (FStrEq(pszCommand, "negative")) + { + bRetVal = TRUE; + Radio3(pPlayer, 8); + } + else if (FStrEq(pszCommand, "enemydown")) + { + bRetVal = TRUE; + Radio3(pPlayer, 9); + } + + return bRetVal; } -void (*pClientCommand)(edict_t *pEntity); +// Use CMD_ARGV, CMD_ARGV, and CMD_ARGC to get pointers the character string command. /* <4c6c1> ../cstrike/dlls/client.cpp:3234 */ -NOBODY void __declspec(naked) ClientCommand(edict_t *pEntity) +void ClientCommand(edict_t *pEntity) { - __asm + const char *pcmd = CMD_ARGV_(0); + const char *pstr = NULL; + CHalfLifeMultiplay *mp = g_pGameRules; + + // Is the client spawned yet? + if (!pEntity->pvPrivateData) + return; + + entvars_t *pev = &pEntity->v; + CBasePlayer *player = GetClassPtr((CBasePlayer *)pev); + + if (FStrEq(pcmd, "say")) { - jmp pClientCommand + if (gpGlobals->time >= player->m_flLastCommandTime[0]) + { + player->m_flLastCommandTime[0] = gpGlobals->time + 0.3f; + Host_Say(pEntity, 0); + } + } + else if (FStrEq(pcmd, "say_team")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[1]) + { + player->m_flLastCommandTime[1] = gpGlobals->time + 0.3f; + Host_Say(pEntity, 1); + } + } + else if (FStrEq(pcmd, "fullupdate")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[2]) + { + player->m_flLastCommandTime[2] = gpGlobals->time + 0.6f; + player->ForceClientDllUpdate(); + } + } + else if (FStrEq(pcmd, "vote")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[3]) + { + player->m_flLastCommandTime[3] = gpGlobals->time + 0.3f; + + if (gpGlobals->time < player->m_flNextVoteTime) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Wait_3_Seconds"); + return; + } + + player->m_flNextVoteTime = gpGlobals->time + 3; + + if (player->m_iTeam != UNASSIGNED) + { + int iVoteID; + int iVoteFail = 0; + int iNumArgs = CMD_ARGC_(); + const char *pszArg1 = CMD_ARGV_(1); + int iVoteLength = Q_strlen(pszArg1); + + if (iNumArgs != 2 || iVoteLength <= 0 || iVoteLength > 6) + { + iVoteFail = 1; + } + + iVoteID = Q_atoi(pszArg1); + if (iVoteID <= 0) + { + iVoteFail = 1; + } + + if (iVoteFail) + { + ListPlayers(player); + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_vote_usage"); + return; + } + + if (CountTeamPlayers(player->m_iTeam) < 3) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Cannot_Vote_With_Less_Than_Three"); + return; + } + + CBaseEntity *pKickEntity = EntityFromUserID(iVoteID); + if (pKickEntity != NULL) + { + CBasePlayer *pKickPlayer = GetClassPtr((CBasePlayer *)pKickEntity->pev); + + if (pKickPlayer->m_iTeam != player->m_iTeam) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_vote_players_on_your_team"); + return; + } + + if (pKickPlayer == player) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_vote_not_yourself"); + return; + } + + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_vote_cast", UTIL_dtos1(iVoteID)); + player->m_iCurrentKickVote = iVoteID; + ProcessKickVote(player, pKickPlayer); + } + else + { + ListPlayers(player); + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_vote_player_not_found", UTIL_dtos1(iVoteID)); + } + } + } + } + else if (FStrEq(pcmd, "listmaps")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[5]) + { + player->m_flLastCommandTime[5] = gpGlobals->time + 0.3f; + mp->DisplayMaps(player, 0); + } + } + else if (FStrEq(pcmd, "votemap")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[4]) + { + player->m_flLastCommandTime[4] = gpGlobals->time + 0.3f; + + if (gpGlobals->time < player->m_flNextVoteTime) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Wait_3_Seconds"); + return; + } + + player->m_flNextVoteTime = gpGlobals->time + 3; + + if (player->m_iTeam != UNASSIGNED) + { + if (gpGlobals->time < 180) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Cannot_Vote_Map"); + return; + } + + int iFailed = 0; + int iNumArgs = CMD_ARGC_(); + const char *pszArg1 = CMD_ARGV_(1); + int iVoteLength = Q_strlen(pszArg1); + + if (iNumArgs != 2 || iVoteLength > 5) + { + iFailed = 1; + } + + int iVoteID = Q_atoi(pszArg1); + if (iVoteID < 1 || iVoteID > MAX_VOTE_MAPS) + { + iFailed = 1; + } + + if (iVoteID > GetMapCount()) + { + iFailed = 1; + } + + if (iFailed) + { + mp->DisplayMaps(player, 0); + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_votemap_usage"); + return; + } + + if (CountTeamPlayers(player->m_iTeam) < 2) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Cannot_Vote_Need_More_People"); + return; + } + + if (player->m_iMapVote) + { + mp->m_iMapVotes[ player->m_iMapVote ]--; + + if (mp->m_iMapVotes[player->m_iMapVote] < 0) + { + mp->m_iMapVotes[player->m_iMapVote] = 0; + } + } + + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_voted_for_map", UTIL_dtos1(iVoteID)); + player->m_iMapVote = iVoteID; + mp->ProcessMapVote(player, iVoteID); + } + } + } + else if (FStrEq(pcmd, "timeleft")) + { + if (gpGlobals->time > player->m_iTimeCheckAllowed) + { + player->m_iTimeCheckAllowed = (int)(gpGlobals->time + 1); + + if (!timelimit.value) + { + ClientPrint(player->pev, HUD_PRINTTALK, "#Game_no_timelimit"); + return; + } + + int iTimeRemaining = (int)(g_flTimeLimit - gpGlobals->time); + + if (iTimeRemaining < 0) + iTimeRemaining = 0; + + int iMinutes = (int)(iTimeRemaining % 60); + int iSeconds = (int)(iTimeRemaining / 60); + + char secs[5]; + char *temp = UTIL_dtos2(iMinutes); + + if (iMinutes >= 10) + { + secs[0] = temp[0]; + secs[1] = temp[1]; + secs[2] = '\0'; + } + else + { + secs[0] = '0'; + secs[1] = temp[0]; + secs[2] = '\0'; + } + + ClientPrint(player->pev, HUD_PRINTTALK, "#Game_timelimit", UTIL_dtos1(iSeconds), secs); + } + } + else if (FStrEq(pcmd, "listplayers")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[6]) + { + player->m_flLastCommandTime[6] = gpGlobals->time + 0.3f; + ListPlayers(player); + } + } + else if (FStrEq(pcmd, "client_buy_open")) + { + if (player->m_iMenu == Menu_OFF) + { + player->m_iMenu = Menu_ClientBuy; + } + + if (player->m_signals.GetState() & SIGNAL_BUY) + { + if (TheTutor) + { + TheTutor->OnEvent(EVENT_TUTOR_BUY_MENU_OPENNED); + } + } + else + { + MESSAGE_BEGIN(MSG_ONE, gmsgBuyClose, NULL, player->pev); + MESSAGE_END(); + } + } + else if (FStrEq(pcmd, "client_buy_close")) + { + if (player->m_iMenu == Menu_ClientBuy) + { + player->m_iMenu = Menu_OFF; + } + } + else if (FStrEq(pcmd, "menuselect")) + { + int slot = Q_atoi(CMD_ARGV_(1)); + + if (player->m_iJoiningState == JOINED || (player->m_iMenu != SPECTATOR && player->m_iMenu != TERRORIST)) + { + if (slot == 10) + { + player->m_iMenu = Menu_OFF; + } + } + + switch (player->m_iMenu) + { + case Menu_OFF: + break; + + case Menu_ChooseTeam: + { + if (!player->m_bVGUIMenus && !HandleMenu_ChooseTeam(player, slot)) + { + if (player->m_iJoiningState == JOINED) + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_0), "#IG_Team_Select"); + else + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5), "#Team_Select"); + + player->m_iMenu = Menu_ChooseTeam; + } + break; + } + case Menu_IGChooseTeam: + { + if (!player->m_bVGUIMenus) + { + HandleMenu_ChooseTeam(player, slot); + } + break; + } + case Menu_ChooseAppearance: + { + if (!player->m_bVGUIMenus) + { + HandleMenu_ChooseAppearance(player, slot); + } + break; + } + case Menu_Buy: + { + if (!player->m_bVGUIMenus) + { + switch (slot) + { + case VGUI_MenuSlot_Buy_Pistol: + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Pistol, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_0), "#CT_BuyPistol"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Pistol, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_0), "#T_BuyPistol"); + + player->m_iMenu = Menu_BuyPistol; + break; + } + case VGUI_MenuSlot_Buy_ShotGun: + { + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES && player->m_iTeam == TERRORIST) + ShowVGUIMenu(player, VGUI_Menu_Buy_ShotGun, MENU_KEY_0, "#AS_BuyShotgun"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_ShotGun, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_0), "#BuyShotgun"); + + player->m_iMenu = Menu_BuyShotgun; + break; + } + case VGUI_MenuSlot_Buy_SubMachineGun: + { + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_SubMachineGun, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_0), "#AS_CT_BuySubMachineGun"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_SubMachineGun, (MENU_KEY_1 | MENU_KEY_3 | MENU_KEY_0), "#AS_T_BuySubMachineGun"); + } + else + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_SubMachineGun, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_0), "#CT_BuySubMachineGun"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_SubMachineGun, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_0), "#T_BuySubMachineGun"); + } + + player->m_iMenu = Menu_BuySubMachineGun; + break; + } + case VGUI_MenuSlot_Buy_Rifle: + { + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Rifle, (MENU_KEY_1 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_0), "#AS_CT_BuyRifle"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Rifle, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_0), "#AS_T_BuyRifle"); + } + else + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Rifle, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#CT_BuyRifle"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Rifle, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#T_BuyRifle"); + } + + player->m_iMenu = Menu_BuyRifle; + break; + } + case VGUI_MenuSlot_Buy_MachineGun: + { + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES && player->m_iTeam == TERRORIST) + ShowVGUIMenu(player, VGUI_Menu_Buy_MachineGun, MENU_KEY_0, "#AS_T_BuyMachineGun"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_MachineGun, (MENU_KEY_1 | MENU_KEY_0), "#BuyMachineGun"); + + player->m_iMenu = Menu_BuyMachineGun; + break; + } + case VGUI_MenuSlot_Buy_PrimAmmo: + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + if (BuyAmmo(player, PRIMARY_WEAPON_SLOT, true)) + { + while (BuyAmmo(player, PRIMARY_WEAPON_SLOT, false)) + ; + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, player); + } + } + + player->BuildRebuyStruct(); + } + break; + } + case VGUI_MenuSlot_Buy_SecAmmo: + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + if (BuyAmmo(player, PISTOL_SLOT, true)) + { + while (BuyAmmo(player, PISTOL_SLOT, false)) + ; + + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, player); + } + } + + player->BuildRebuyStruct(); + } + } + case VGUI_MenuSlot_Buy_Item: + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + if (mp->m_bMapHasBombTarget) + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_7 | MENU_KEY_8 | MENU_KEY_0), "#DCT_BuyItem"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#DT_BuyItem"); + } + else + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_8 | MENU_KEY_0), "#CT_BuyItem"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#T_BuyItem"); + } + + player->m_iMenu = Menu_BuyItem; + } + break; + } + } + } + break; + } + case Menu_BuyPistol: + { + if (!player->m_bVGUIMenus) + { + BuyPistol(player, slot); + } + break; + } + case Menu_BuyShotgun: + { + if (!player->m_bVGUIMenus) + { + BuyShotgun(player, slot); + } + break; + } + case Menu_BuySubMachineGun: + { + if (!player->m_bVGUIMenus) + { + BuySubMachineGun(player, slot); + } + break; + } + case Menu_BuyRifle: + { + if (!player->m_bVGUIMenus) + { + BuyRifle(player, slot); + } + break; + } + case Menu_BuyMachineGun: + { + if (!player->m_bVGUIMenus) + { + BuyMachineGun(player, slot); + } + break; + } + case Menu_BuyItem: + { + if (!player->m_bVGUIMenus) + { + BuyItem(player, slot); + } + break; + } + case Menu_Radio1: + { + Radio1(player, slot); + break; + } + case Menu_Radio2: + { + Radio2(player, slot); + break; + } + case Menu_Radio3: + { + Radio3(player, slot); + break; + } + default: + ALERT(at_console, "ClientCommand(): Invalid menu selected\n"); + break; + } + } + else if (FStrEq(pcmd, "chooseteam")) + { + if (player->m_iMenu == Menu_ChooseAppearance) + { + return; + } + + if (player->m_bTeamChanged) + { + if (player->pev->deadflag != DEAD_NO) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Only_1_Team_Change"); + return; + } + } + + if (!mp->IsCareer()) + { + if (mp->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES && player->m_iJoiningState == JOINED && player->m_iTeam == CT) + { + if (mp->IsFreezePeriod() || player->pev->deadflag != DEAD_NO) + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#IG_VIP_Team_Select_Spect"); + else + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_5 | MENU_KEY_0), "#IG_VIP_Team_Select"); + } + else + { + if (mp->IsFreezePeriod() || player->pev->deadflag != DEAD_NO) + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#IG_Team_Select_Spect"); + else + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_0), "#IG_Team_Select"); + } + + player->m_iMenu = Menu_ChooseTeam; + } + } + else if (FStrEq(pcmd, "showbriefing")) + { + if (player->m_iMenu == Menu_OFF) + { + if (g_szMapBriefingText[0] != '\0') + { + if (player->m_iTeam != UNASSIGNED && !(player->m_afPhysicsFlags & PFLAG_OBSERVER)) + { + player->MenuPrint(g_szMapBriefingText); + player->m_bMissionBriefing = true; + } + } + } + } + else if (FStrEq(pcmd, "ignoremsg")) + { + if (player->m_iIgnoreGlobalChat == IGNOREMSG_NONE) + { + player->m_iIgnoreGlobalChat = IGNOREMSG_ENEMY; + ClientPrint(player->pev, HUD_PRINTCENTER, "#Ignore_Broadcast_Messages"); + } + else if (player->m_iIgnoreGlobalChat == IGNOREMSG_ENEMY) + { + player->m_iIgnoreGlobalChat = IGNOREMSG_TEAM; + ClientPrint(player->pev, HUD_PRINTCENTER, "#Ignore_Broadcast_Team_Messages"); + } + else if (player->m_iIgnoreGlobalChat == IGNOREMSG_TEAM) + { + player->m_iIgnoreGlobalChat = IGNOREMSG_NONE; + ClientPrint(player->pev, HUD_PRINTCENTER, "#Accept_All_Messages"); + } + } + else if (FStrEq(pcmd, "ignorerad")) + { + player->m_bIgnoreRadio = !player->m_bIgnoreRadio; + ClientPrint(player->pev, HUD_PRINTCENTER, player->m_bIgnoreRadio ? "#Ignore_Radio" : "#Accept_Radio"); + } + else if (FStrEq(pcmd, "become_vip")) + { + if (player->m_iJoiningState != JOINED || player->m_iTeam != CT) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Command_Not_Available"); + return; + } + + mp->AddToVIPQueue(player); + } + else if (FStrEq(pcmd, "spectate") && (player->pev->flags & FL_PROXY)) // always allow proxies to become a spectator + { + // clients wants to become a spectator + HandleMenu_ChooseTeam(player, MENU_SLOT_TEAM_SPECT); + } + else if (FStrEq(pcmd, "specmode")) + { + // new spectator mode + int mode = Q_atoi(CMD_ARGV_(1)); + + if (player->IsObserver() && player->CanSwitchObserverModes()) + player->Observer_SetMode(mode); + else + player->m_iObserverLastMode = mode; + + if (mode == OBS_CHASE_FREE) + { + MESSAGE_BEGIN(MSG_ONE, gmsgADStop, NULL, player->pev); + MESSAGE_END(); + } + } + else if (FStrEq(pcmd, "spec_set_ad")) + { + float val = Q_atof(CMD_ARGV_(1)); + player->SetObserverAutoDirector(val > 0.0f); + } + else if (FStrEq(pcmd, "follownext")) + { + // follow next player + int arg = Q_atoi(CMD_ARGV_(1)); + + if (player->IsObserver() && player->CanSwitchObserverModes()) + { + player->Observer_FindNextPlayer(arg != 0); + } + } + else if (FStrEq(pcmd, "follow")) + { + if (player->IsObserver() && player->CanSwitchObserverModes()) + { + player->Observer_FindNextPlayer(false, CMD_ARGV_(1)); + } + } + else + { + if (mp->ClientCommand_DeadOrAlive(GetClassPtr((CBasePlayer *)pev), pcmd)) + return; + + if (TheBots->ClientCommand(GetClassPtr((CBasePlayer *)pev), pcmd)) + return; + + if (FStrEq(pcmd, "mp_debug")) + { + UTIL_SetDprintfFlags(CMD_ARGV_(1)); + } + else if (FStrEq(pcmd, "jointeam")) + { + if (player->m_iMenu == Menu_ChooseAppearance) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Command_Not_Available"); + return; + } + + int slot = Q_atoi(CMD_ARGV_(1)); + if (HandleMenu_ChooseTeam(player, slot)) + { + if (slot == MENU_SLOT_TEAM_VIP || slot == MENU_SLOT_TEAM_SPECT || player->m_bIsVIP) + { + player->m_iMenu = Menu_OFF; + } + else + player->m_iMenu = Menu_ChooseAppearance; + } + else + { + if (player->m_iJoiningState == JOINED) + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_0), "#IG_Team_Select"); + else + ShowVGUIMenu(player, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5), "#Team_Select"); + + player->m_iMenu = Menu_ChooseTeam; + } + } + else if (FStrEq(pcmd, "joinclass")) + { + int slot = Q_atoi(CMD_ARGV_(1)); + + if (player->m_iMenu != Menu_ChooseAppearance) + { + ClientPrint(player->pev, HUD_PRINTCENTER, "#Command_Not_Available"); + return; + } + + HandleMenu_ChooseAppearance(player, slot); + } + else if (player->pev->deadflag == DEAD_NO) + { + if (FStrEq(pcmd, "nightvision")) + { + if (gpGlobals->time >= player->m_flLastCommandTime[7]) + { + player->m_flLastCommandTime[7] = gpGlobals->time + 0.3f; + + if (!player->m_bHasNightVision) + return; + + if (player->m_bNightVisionOn) + { + EMIT_SOUND(ENT(player->pev), CHAN_ITEM, "items/nvg_off.wav", RANDOM_FLOAT(0.92, 1), ATTN_NORM); + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, player->pev); + WRITE_BYTE(0); // disable nightvision + MESSAGE_END(); + + player->m_bNightVisionOn = false; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pObserver = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pObserver && pObserver->IsObservingPlayer(player)) + { + EMIT_SOUND(ENT(pObserver->pev), CHAN_ITEM, "items/nvg_off.wav", RANDOM_FLOAT(0.92, 1), ATTN_NORM); + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pObserver->pev); + WRITE_BYTE(0); // disable nightvision + MESSAGE_END(); + + pObserver->m_bNightVisionOn = false; + } + } + } + else + { + EMIT_SOUND(ENT(player->pev), CHAN_ITEM, "items/nvg_on.wav", RANDOM_FLOAT(0.92, 1), ATTN_NORM); + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, player->pev); + WRITE_BYTE(1); // enable nightvision + MESSAGE_END(); + + player->m_bNightVisionOn = true; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pObserver = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pObserver && pObserver->IsObservingPlayer(player)) + { + EMIT_SOUND(ENT(pObserver->pev), CHAN_ITEM, "items/nvg_on.wav", RANDOM_FLOAT(0.92, 1), ATTN_NORM); + + MESSAGE_BEGIN(MSG_ONE, gmsgNVGToggle, NULL, pObserver->pev); + WRITE_BYTE(1); // enable nightvision + MESSAGE_END(); + + pObserver->m_bNightVisionOn = true; + } + } + } + } + } + else if (FStrEq(pcmd, "radio1")) + { + ShowMenu(player, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), -1, FALSE, "#RadioA"); + player->m_iMenu = Menu_Radio1; + } + else if (FStrEq(pcmd, "radio2")) + { + ShowMenu(player, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), -1, FALSE, "#RadioB"); + player->m_iMenu = Menu_Radio2; + return; + } + else if (FStrEq(pcmd, "radio3")) + { + ShowMenu(player, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_7 | MENU_KEY_8 | MENU_KEY_9 | MENU_KEY_0), -1, FALSE, "#RadioC"); + player->m_iMenu = Menu_Radio3; + } + else if (FStrEq(pcmd, "drop")) + { + // player is dropping an item. + if (player->HasShield()) + { + if (player->m_pActiveItem && player->m_pActiveItem->m_iId == WEAPON_C4) + { + player->DropPlayerItem("weapon_c4"); + } + else + player->DropShield(); + } + else + player->DropPlayerItem(CMD_ARGV_(1)); + } + else if (FStrEq(pcmd, "fov")) + { +#if 0 + if (g_flWeaponCheat && CMD_ARGC() > 1) + GetClassPtr((CBasePlayer *)pev)->m_iFOV = Q_atoi(CMD_ARGV(1)); + else + CLIENT_PRINTF(pEntity, print_console, UTIL_VarArgs("\"fov\" is \"%d\"\n", (int)GetClassPtr((CBasePlayer *)pev)->m_iFOV)); +#endif + } + else if (FStrEq(pcmd, "use")) + { + GetClassPtr((CBasePlayer *)pev)->SelectItem(CMD_ARGV_(1)); + } + else if (((pstr = Q_strstr(pcmd, "weapon_")) != NULL) && (pstr == pcmd)) + { + GetClassPtr((CBasePlayer *)pev)->SelectItem(pcmd); + } + else if (FStrEq(pcmd, "lastinv")) + { + GetClassPtr((CBasePlayer *)pev)->SelectLastItem(); + } + else if (FStrEq(pcmd, "buyammo1")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + BuyAmmo(player, PRIMARY_WEAPON_SLOT, true); + player->BuildRebuyStruct(); + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, player); + } + } + } + else if (FStrEq(pcmd, "buyammo2")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + BuyAmmo(player, PISTOL_SLOT, true); + player->BuildRebuyStruct(); + if (TheTutor) + { + TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, player); + } + } + } + else if (FStrEq(pcmd, "buyequip")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + if (mp->m_bMapHasBombTarget) + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_7 | MENU_KEY_8 | MENU_KEY_0), "#DCT_BuyItem"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#DT_BuyItem"); + } + else + { + if (player->m_iTeam == CT) + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_8 | MENU_KEY_0), "#CT_BuyItem"); + else + ShowVGUIMenu(player, VGUI_Menu_Buy_Item, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0), "#T_BuyItem"); + } + + player->m_iMenu = Menu_BuyItem; + } + } + else if (FStrEq(pcmd, "buy")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + ShowVGUIMenu(player, VGUI_Menu_Buy, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_7 | MENU_KEY_8 | MENU_KEY_0), "#Buy"); + player->m_iMenu = Menu_Buy; + + if (TheBots) + { + TheBots->OnEvent(EVENT_TUTOR_BUY_MENU_OPENNED); + } + } + } + else if (FStrEq(pcmd, "cl_setautobuy")) + { + player->ClearAutoBuyData(); + + for (int i = 1; i < CMD_ARGC_(); i++) + { + player->AddAutoBuyData(CMD_ARGV_(i)); + } + + bool oldval = g_bClientPrintEnable; + g_bClientPrintEnable = false; + player->AutoBuy(); + g_bClientPrintEnable = oldval; + } + else if (FStrEq(pcmd, "cl_setrebuy")) + { + if (CMD_ARGC_() == 2) + { + player->InitRebuyData(CMD_ARGV_(1)); + + bool oldval = g_bClientPrintEnable; + g_bClientPrintEnable = false; + player->Rebuy(); + g_bClientPrintEnable = oldval; + } + } + else if (FStrEq(pcmd, "cl_autobuy")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + bool oldval = g_bClientPrintEnable; + g_bClientPrintEnable = false; + player->AutoBuy(); + g_bClientPrintEnable = oldval; + } + } + else if (FStrEq(pcmd, "cl_rebuy")) + { + if (player->m_signals.GetState() & SIGNAL_BUY) + { + bool oldval = g_bClientPrintEnable; + g_bClientPrintEnable = false; + player->Rebuy(); + g_bClientPrintEnable = oldval; + } + } + else if (FStrEq(pcmd, "smartradio")) + { + player->SmartRadio(); + } + else + { + if (HandleBuyAliasCommands(player, pcmd)) + return; + + if (HandleRadioAliasCommands(player, pcmd)) + return; + + if (!g_pGameRules->ClientCommand(GetClassPtr((CBasePlayer *)pev), pcmd)) + { + // tell the user they entered an unknown command + char command[128]; + + // check the length of the command (prevents crash) + // max total length is 192 ...and we're adding a string below ("Unknown command: %s\n") + Q_strncpy(command, pcmd, sizeof(command) - 1); + command[sizeof(command) - 1] = '\0'; + + // tell the user they entered an unknown command + ClientPrint(&pEntity->v, HUD_PRINTCONSOLE, "#Game_unknown_command", command); + } + } + } } -// { -// const char *pcmd; // 3236 -// const char *pstr; // 3237 -// class CHalfLifeMultiplay *mp; // 3239 -// entvars_t *pev; // 3245 -// class CBasePlayer *player; // 3246 -// CMD_ARGV(int i); // 3236 -// FStrEq(const char *sz1, -// const char *sz2); // 3248 -// FStrEq(const char *sz1, -// const char *sz2); // 3256 -// FStrEq(const char *sz1, -// const char *sz2); // 3264 -// FStrEq(const char *sz1, -// const char *sz2); // 3273 -// { -// int iVoteID; // 3294 -// int iVoteFail; // 3295 -// int iNumArgs; // 3296 -// const char *pszArg1; // 3297 -// int iVoteLength; // 3298 -// class CBaseEntity *pKickEntity; // 3332 -// class CBasePlayer *pKickPlayer; // 3342 -// CMD_ARGC(void); // 3296 -// CMD_ARGV(int i); // 3297 -// atoi(const char *__nptr); // 3309 -// CountTeamPlayers(int iTeam); // 3326 -// } -// FStrEq(const char *sz1, -// const char *sz2); // 3363 -// FStrEq(const char *sz1, -// const char *sz2); // 3371 -// { -// int iFailed; // 3377 -// int iVote; // 3406 -// CMD_ARGC(void); // 3400 -// CMD_ARGV(int i); // 3406 -// atoi(const char *__nptr); // 3406 -// } -// FStrEq(const char *sz1, -// const char *sz2); // 3448 -// { -// int iTimeRemaining; // 3454 -// int iMinutes; // 3458 -// int iSeconds; // 3458 -// char secs; // 3462 -// char *temp; // 3463 -// } -// FStrEq(const char *sz1, -// const char *sz2); // 3488 -// FStrEq(const char *sz1, -// const char *sz2); // 3496 -// IsObserver(CBasePlayer *const this); // 3930 -// atoi(const char *__nptr); // 3932 -// IsObserver(CBasePlayer *const this); // 3937 -// { -// int slot; // 3966 -// atoi(const char *__nptr); // 3966 -// } -// { -// int i; // 4037 -// { -// class CBasePlayer *pObserver; // 4039 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 4042 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 4043 -// } -// } -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 4030 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 4031 -// { -// int i; // 4059 -// { -// class CBasePlayer *pObserver; // 4061 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 4064 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 4065 -// } -// } -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 4052 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 4053 -// strstr(const char *__haystack, -// const char *__needle); // 4114 -// { -// bool oldval; // 4234 -// } -// { -// bool oldval; // 4246 -// } -// { -// char command; // 4270 -// } -// { -// bool oldval; // 4221 -// } -// { -// bool oldval; // 4210 -// { -// int arg; // 4205 -// } -// } -// { -// int slot; // 3996 -// atoi(const char *__nptr); // 3996 -// } -// { -// float val; // 3925 -// atof(const char *__nptr); // 3925 -// SetObserverAutoDirector(CBasePlayer *const this, -// bool val); // 3926 -// } -// { -// int mode; // 3901 -// atoi(const char *__nptr); // 3901 -// IsObserver(CBasePlayer *const this); // 3903 -// { -// int gmsgADStop; // 3918 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 3919 -// } -// } -// { -// int slot; // 3523 -// atoi(const char *__nptr); // 3523 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 3504 -// } } /* <4b959> ../cstrike/dlls/client.cpp:4282 */ -NOBODY void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) +void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) { -// { -// class CBasePlayer *pPlayer; // 4288 -// const char *szBufferName; // 4289 -// int iClientIndex; // 4290 -// entindex(CBaseEntity *const this); // 4290 -// FStrEq(const char *sz1, -// const char *sz2); // 4293 -// { -// char szName; // 4295 -// { -// char *pPct; // 4300 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 4331 -// } -// } + // Is the client spawned yet? + if (!pEntity->pvPrivateData) + { + return; + } + + CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pEntity); + + char *szBufferName = GET_KEY_VALUE(infobuffer, "name"); + int iClientIndex = pPlayer->entindex(); + + // msg everyone if someone changes their name, and it isn't the first time (changing no name to current name) + if (pEntity->v.netname && STRING(pEntity->v.netname)[0] != '\0' && !FStrEq(STRING(pEntity->v.netname), szBufferName)) + { + char szName[32]; + Q_snprintf(szName, sizeof(szName), "%s", szBufferName); + + // First parse the name and remove any %'s + for (char *pPct = szName; pPct != NULL && *pPct != '\0'; pPct++) + { + // Replace it with a space + if (*pPct == '%' || *pPct == '&') + *pPct = ' '; + } + + if (szName[0] == '#') + szName[0] = '*'; + + if (pPlayer->pev->deadflag != DEAD_NO) + { + pPlayer->m_bHasChangedName = true; + Q_snprintf(pPlayer->m_szNewName, sizeof(pPlayer->m_szNewName), "%s", szName); + ClientPrint(pPlayer->pev, HUD_PRINTTALK, "#Name_change_at_respawn"); + SET_CLIENT_KEY_VALUE(iClientIndex, infobuffer, "name", (char *)STRING(pEntity->v.netname)); + } + else + { + // Set the name + SET_CLIENT_KEY_VALUE(iClientIndex, infobuffer, "name", szName); + + MESSAGE_BEGIN(MSG_BROADCAST, gmsgSayText); + WRITE_BYTE(iClientIndex); + WRITE_STRING("#Cstrike_Name_Change"); + WRITE_STRING(STRING(pEntity->v.netname)); + WRITE_STRING(szName); + MESSAGE_END(); + + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" changed name to \"%s\"\n", + STRING(pEntity->v.netname), + GETPLAYERUSERID(pEntity), + GETPLAYERAUTHID(pEntity), + GetTeam(pPlayer->m_iTeam), + szName + ); + } + } + + g_pGameRules->ClientUserInfoChanged(GetClassPtr((CBasePlayer *)&pEntity->v), infobuffer); } /* <4a378> ../cstrike/dlls/client.cpp:4362 */ @@ -1356,7 +3901,9 @@ void PlayerPreThink(edict_t *pEntity) CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity); if (pPlayer) + { pPlayer->PreThink(); + } } /* <4a47c> ../cstrike/dlls/client.cpp:4475 */ @@ -1366,7 +3913,9 @@ void PlayerPostThink(edict_t *pEntity) CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity); if (pPlayer) + { pPlayer->PostThink(); + } } /* <4a4f4> ../cstrike/dlls/client.cpp:4486 */ @@ -1376,40 +3925,52 @@ void ParmsNewLevel(void) } /* <4a50d> ../cstrike/dlls/client.cpp:4491 */ -NOBODY void ParmsChangeLevel(void) +void ParmsChangeLevel(void) { -// { -// SAVERESTOREDATA *pSaveData; // 4494 -// } + // retrieve the pointer to the save data + SAVERESTOREDATA *pSaveData = (SAVERESTOREDATA *)gpGlobals->pSaveData; + + if (pSaveData) + { + pSaveData->connectionCount = BuildChangeList(pSaveData->levelList, MAX_LEVEL_CONNECTIONS); + } } /* <4a548> ../cstrike/dlls/client.cpp:4504 */ -NOBODY void StartFrame(void) +void StartFrame(void) { - if (g_pGameRules) + if (g_pGameRules != NULL) + { g_pGameRules->Think(); + } if (g_fGameOver) return; CLocalNav::Think(); + static cvar_t *skill = NULL; - if (!skill) + { skill = CVAR_GET_POINTER("skill"); + } - gpGlobals->teamplay = 1; + gpGlobals->teamplay = 1.0f; + + if (skill != NULL) + g_iSkillLevel = (int)skill->value; - if (skill) - g_iSkillLevel = skill->value; else g_iSkillLevel = 0; + TheBots->StartFrame(); + if (TheTutor) + { TheTutor->StartFrame(gpGlobals->time); + } ++g_ulFrameCount; - } /* <4a581> ../cstrike/dlls/client.cpp:4534 */ @@ -1911,7 +4472,7 @@ void SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs return; } - CBasePlayer *pPlayer = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pClient )); + CBasePlayer *pPlayer = reinterpret_cast(CBasePlayer::Instance(pClient)); if (pPlayer->pev->iuser2 && pPlayer->m_hObserverTarget) { @@ -1934,7 +4495,7 @@ void SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs } /* <4aa75> ../cstrike/dlls/client.cpp:5226 */ -NOXREF void ResetPlayerPVS(edict_t *client, int clientnum) +void ResetPlayerPVS(edict_t *client, int clientnum) { PLAYERPVSSTATUS *pvs = &g_PVSStatus[clientnum]; @@ -1945,7 +4506,7 @@ NOXREF void ResetPlayerPVS(edict_t *client, int clientnum) } /* <4aae8> ../cstrike/dlls/client.cpp:5240 */ -NOXREF bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum) +bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum) { PLAYERPVSSTATUS *pvs = &g_PVSStatus[clientnum]; if (pvs->headnode != client->headnode || pvs->num_leafs != client->num_leafs) @@ -1960,7 +4521,7 @@ NOXREF bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum) } /* <475e3> ../cstrike/dlls/client.cpp:5263 */ -NOXREF void MarkEntityInPVS(int clientnum, int entitynum, float time, bool inpvs) +void MarkEntityInPVS(int clientnum, int entitynum, float time, bool inpvs) { PLAYERPVSSTATUS *pvs; ENTITYPVSSTATUS *es; @@ -1975,7 +4536,7 @@ NOXREF void MarkEntityInPVS(int clientnum, int entitynum, float time, bool inpvs } /* <47581> ../cstrike/dlls/client.cpp:5275 */ -NOXREF bool CheckEntityRecentlyInPVS(int clientnum, int entitynum, float currenttime) +bool CheckEntityRecentlyInPVS(int clientnum, int entitynum, float currenttime) { PLAYERPVSSTATUS *pvs; ENTITYPVSSTATUS *es; @@ -1983,8 +4544,10 @@ NOXREF bool CheckEntityRecentlyInPVS(int clientnum, int entitynum, float current pvs = &g_PVSStatus[clientnum]; es = &pvs->m_Status[entitynum]; - if (es->m_fTimeEnteredPVS && es->m_fTimeEnteredPVS + 1.0 >= currenttime) + if (es->m_fTimeEnteredPVS && es->m_fTimeEnteredPVS + 1.0f >= currenttime) + { return true; + } return false; } @@ -2178,7 +4741,7 @@ void CreateBaseline(int player, int eindex, struct entity_state_s *baseline, str } /* <47d8a> ../cstrike/dlls/client.cpp:5586 */ -NOXREF void Entity_FieldInit(struct delta_s *pFields) +void Entity_FieldInit(struct delta_s *pFields) { entity_field_alias[ FIELD_ORIGIN0 ].field = DELTA_FINDFIELD(pFields, entity_field_alias[ FIELD_ORIGIN0 ].name); entity_field_alias[ FIELD_ORIGIN1 ].field = DELTA_FINDFIELD(pFields, entity_field_alias[ FIELD_ORIGIN1 ].name); @@ -2240,7 +4803,7 @@ void Entity_Encode(struct delta_s *pFields, const unsigned char *from, const uns } /* <47cb4> ../cstrike/dlls/client.cpp:5662 */ -NOXREF void Player_FieldInit(struct delta_s *pFields) +void Player_FieldInit(struct delta_s *pFields) { player_field_alias[ FIELD_ORIGIN0 ].field = DELTA_FINDFIELD(pFields, player_field_alias[ FIELD_ORIGIN0 ].name); player_field_alias[ FIELD_ORIGIN1 ].field = DELTA_FINDFIELD(pFields, player_field_alias[ FIELD_ORIGIN1 ].name); @@ -2363,12 +4926,14 @@ void RegisterEncoders(void) int GetWeaponData(edict_s *player, struct weapon_data_s *info) { entvars_t *pev = &player->v; - CBasePlayer *pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pl = reinterpret_cast(CBasePlayer::Instance(pev)); Q_memset(info, 0, sizeof(weapon_data_t) * MAX_WEAPONS); if (!pl) + { return 1; + } for (int i = 0; i < MAX_ITEM_TYPES; i++) { @@ -2376,7 +4941,7 @@ int GetWeaponData(edict_s *player, struct weapon_data_s *info) while (pPlayerItem != NULL) { - CBasePlayerWeapon *gun = reinterpret_cast< CBasePlayerWeapon * >(pPlayerItem->GetWeaponPtr()); + CBasePlayerWeapon *gun = reinterpret_cast(pPlayerItem->GetWeaponPtr()); if (gun && gun->UseDecrement()) { @@ -2390,10 +4955,10 @@ int GetWeaponData(edict_s *player, struct weapon_data_s *info) item->m_iId = II.iId; item->m_iClip = gun->m_iClip; - item->m_flTimeWeaponIdle = max(gun->m_flTimeWeaponIdle, -0.001); - item->m_flNextPrimaryAttack = max(gun->m_flNextPrimaryAttack, -0.001); - item->m_flNextSecondaryAttack = max(gun->m_flNextSecondaryAttack, -0.001); - item->m_flNextReload = max(gun->m_flNextReload, -0.001); + item->m_flTimeWeaponIdle = _max(gun->m_flTimeWeaponIdle, -0.001); + item->m_flNextPrimaryAttack = _max(gun->m_flNextPrimaryAttack, -0.001); + item->m_flNextSecondaryAttack = _max(gun->m_flNextSecondaryAttack, -0.001); + item->m_flNextReload = _max(gun->m_flNextReload, -0.001); item->m_fInReload = gun->m_fInReload; item->m_fInSpecialReload = gun->m_fInSpecialReload; item->m_fInZoom = gun->m_iShotsFired; @@ -2416,17 +4981,19 @@ int GetWeaponData(edict_s *player, struct weapon_data_s *info) void UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) { if (!ent || !ent->pvPrivateData) + { return; + } entvars_t *pevOrg = NULL; entvars_t *pev = (entvars_t *)&ent->v; - CBasePlayer *pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pl = reinterpret_cast(CBasePlayer::Instance(pev)); if (pl->pev->iuser1 == OBS_IN_EYE && pl->m_hObserverTarget) { pevOrg = pev; pev = pl->m_hObserverTarget->pev; - pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + pl = reinterpret_cast(CBasePlayer::Instance(pev)); } cd->flags = pev->flags; @@ -2510,7 +5077,7 @@ void UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientd ItemInfo II; Q_memset(&II, 0, sizeof(II)); - CBasePlayerWeapon *gun = reinterpret_cast< CBasePlayerWeapon * >(pl->m_pActiveItem->GetWeaponPtr()); + CBasePlayerWeapon *gun = reinterpret_cast(pl->m_pActiveItem->GetWeaponPtr()); if (gun != NULL && gun->UseDecrement() && gun->GetItemInfo(&II)) { @@ -2535,13 +5102,17 @@ void UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientd void CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed) { entvars_t *pev = (entvars_t *)&player->v; - CBasePlayer *pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pl = reinterpret_cast(CBasePlayer::Instance(pev)); if (!pl) + { return; + } if (pl->pev->groupinfo) + { UTIL_SetGroupTrace(pl->pev->groupinfo, GROUP_OP_AND); + } pl->random_seed = random_seed; } @@ -2550,7 +5121,7 @@ void CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int r void CmdEnd(const edict_t *player) { entvars_t *pev = (entvars_t *)&player->v; - CBasePlayer *pl = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pl = reinterpret_cast(CBasePlayer::Instance(pev)); if (!pl) return; @@ -2592,13 +5163,13 @@ void CreateInstancedBaselines(void) int iret = 0; entity_state_t state; - Q_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 ); + // iret = ENGINE_INSTANCE_BASELINE(pc->pev->classname, &state); // Destroy objects. - // UTIL_Remove( pc ); + // UTIL_Remove(pc); } /* <4b77c> ../cstrike/dlls/client.cpp:6179 */ diff --git a/regamedll/dlls/client.h b/regamedll/dlls/client.h index 8dff2d5d..d1ec407e 100644 --- a/regamedll/dlls/client.h +++ b/regamedll/dlls/client.h @@ -32,6 +32,35 @@ #pragma once #endif +// custom enum +enum ChooseTeamMenuSlot +{ + MENU_SLOT_TEAM_UNDEFINED = -1, + + MENU_SLOT_TEAM_TERRORIST = 1, + MENU_SLOT_TEAM_CT, + MENU_SLOT_TEAM_VIP, + + MENU_SLOT_TEAM_RANDOM = 5, + MENU_SLOT_TEAM_SPECT +}; + +// custom enum +enum BuyItemMenuSlot +{ + MENU_SLOT_ITEM_VEST = 1, + MENU_SLOT_ITEM_VESTHELM, + MENU_SLOT_ITEM_FLASHGREN, + MENU_SLOT_ITEM_HEGREN, + MENU_SLOT_ITEM_SMOKEGREN, + MENU_SLOT_ITEM_NVG, + MENU_SLOT_ITEM_DEFUSEKIT, + MENU_SLOT_ITEM_SHIELD, +}; + +#define CS_NUM_SKIN 4 +#define CZ_NUM_SKIN 5 + #define FIELD_ORIGIN0 0 #define FIELD_ORIGIN1 1 #define FIELD_ORIGIN2 2 @@ -55,6 +84,7 @@ typedef struct { float m_fTimeEnteredPVS; + } ENTITYPVSSTATUS; /* size: 4, cachelines: 1, members: 1 */ @@ -63,7 +93,8 @@ typedef struct ENTITYPVSSTATUS m_Status[1380]; int headnode; int num_leafs; - short int leafnums[MAX_ENT_LEAFS]; + short int leafnums[ MAX_ENT_LEAFS ]; + } PLAYERPVSSTATUS; /* size: 5624, cachelines: 88, members: 4 */ @@ -71,13 +102,14 @@ typedef struct { char name[32]; int field; + } entity_field_alias_t; /* size: 36, cachelines: 1, members: 2 */ #ifdef HOOK_GAMEDLL -//#define g_flTimeLimit (*pg_flTimeLimit) -//#define g_flResetTime (*pg_flResetTime) +#define g_flTimeLimit (*pg_flTimeLimit) +#define g_flResetTime (*pg_flResetTime) #define g_bClientPrintEnable (*pg_bClientPrintEnable) #define g_PVSStatus (*pg_PVSStatus) @@ -96,7 +128,7 @@ extern PLAYERPVSSTATUS g_PVSStatus[32]; #ifdef HOOK_GAMEDLL -extern float g_flTimeLimit; +extern float g_flTimeLimit;// exported extern float g_flResetTime; extern bool g_bClientPrintEnable; extern bool g_skipCareerInitialSpawn; @@ -113,11 +145,11 @@ extern int g_serveractive; extern unsigned short m_usResetDecals; extern unsigned short g_iShadowSprite; -NOXREF int CMD_ARGC_(void); -NOXREF const char *CMD_ARGV_(int i); +int CMD_ARGC_(void); +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); +void TeamChangeUpdate(CBasePlayer *player, int team_id); +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); @@ -125,43 +157,44 @@ 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); +void ListPlayers(CBasePlayer *current); C_DLLEXPORT int CountTeamPlayers(int iTeam); void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer); TeamName SelectDefaultTeam(void); void CheckStartMoney(void); 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); -NOBODY void BuyPistol(CBasePlayer *pPlayer, int iSlot); -NOBODY void BuyShotgun(CBasePlayer *pPlayer, int iSlot); -NOBODY void BuySubMachineGun(CBasePlayer *pPlayer, int iSlot); -NOBODY void BuyWeaponByWeaponID(CBasePlayer *pPlayer, WeaponIdType weaponID); -NOBODY void BuyRifle(CBasePlayer *pPlayer, int iSlot); -NOBODY void BuyMachineGun(CBasePlayer *pPlayer, int iSlot); -NOBODY void BuyItem(CBasePlayer *pPlayer, int iSlot); -NOBODY void HandleMenu_ChooseAppearance(CBasePlayer *player, int slot); -NOBODY BOOL HandleMenu_ChooseTeam(CBasePlayer *player, int slot); -NOBODY void Radio1(CBasePlayer *player, int slot); -NOBODY void Radio2(CBasePlayer *player, int slot); -NOBODY void Radio3(CBasePlayer *player, int slot); -NOBODY bool BuyGunAmmo(CBasePlayer &player, CBasePlayerItem &weapon, bool bBlinkMoney); -NOBODY bool BuyAmmo(CBasePlayer *player, int nSlot, bool bBlinkMoney); -NOBODY CBaseEntity *EntityFromUserID(int userID); -NOBODY int CountPlayersInServer(void); -NOBODY BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); -NOBODY BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); -NOBODY void ClientCommand(edict_t *pEntity); -NOBODY void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); -NOBODY void ServerDeactivate(void); +void Host_Say(edict_t *pEntity, int teamonly); +void DropSecondary(CBasePlayer *pPlayer); +void DropPrimary(CBasePlayer *pPlayer); +bool CanBuyThis(CBasePlayer *pPlayer, int iWeapon); +void BuyPistol(CBasePlayer *pPlayer, int iSlot); +void BuyShotgun(CBasePlayer *pPlayer, int iSlot); +void BuySubMachineGun(CBasePlayer *pPlayer, int iSlot); +void BuyWeaponByWeaponID(CBasePlayer *pPlayer, WeaponIdType weaponID); +void BuyRifle(CBasePlayer *pPlayer, int iSlot); +void BuyMachineGun(CBasePlayer *pPlayer, int iSlot); +void BuyItem(CBasePlayer *pPlayer, int iSlot); +void HandleMenu_ChooseAppearance(CBasePlayer *player, int slot); +BOOL HandleMenu_ChooseTeam(CBasePlayer *player, int slot); +void Radio1(CBasePlayer *player, int slot); +void Radio2(CBasePlayer *player, int slot); +void Radio3(CBasePlayer *player, int slot); +bool BuyGunAmmo(CBasePlayer *player, CBasePlayerItem *weapon, bool bBlinkMoney); +bool BuyAmmo(CBasePlayer *player, int nSlot, bool bBlinkMoney); +CBaseEntity *EntityFromUserID(int userID); +NOXREF int CountPlayersInServer(void); +BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); +BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); +void ClientCommand(edict_t *pEntity); +void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); +void ServerDeactivate(void); 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); +void ParmsChangeLevel(void); +void StartFrame(void); void ClientPrecache(void); const char *GetGameDescription(void); void Sys_Error(const char *error_string); @@ -170,15 +203,15 @@ void SpectatorConnect(edict_t *pEntity); void SpectatorDisconnect(edict_t *pEntity); void SpectatorThink(edict_t *pEntity); void SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas); -NOXREF void ResetPlayerPVS(edict_t *client, int clientnum); -NOXREF bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum); -NOXREF void MarkEntityInPVS(int clientnum, int entitynum, float time, bool inpvs); -NOXREF bool CheckEntityRecentlyInPVS(int clientnum, int entitynum, float currenttime); +void ResetPlayerPVS(edict_t *client, int clientnum); +bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum); +void MarkEntityInPVS(int clientnum, int entitynum, float time, bool inpvs); +bool CheckEntityRecentlyInPVS(int clientnum, int entitynum, float currenttime); int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet); void CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, Vector player_mins, Vector player_maxs); -NOXREF void Entity_FieldInit(struct delta_s *pFields); +void Entity_FieldInit(struct delta_s *pFields); void Entity_Encode(struct delta_s *pFields, const unsigned char *from, const unsigned char *to); -NOXREF void Player_FieldInit(struct delta_s *pFields); +void Player_FieldInit(struct delta_s *pFields); void Player_Encode(struct delta_s *pFields, const unsigned char *from, const unsigned char *to); void Custom_Entity_FieldInit(delta_s *pFields); void Custom_Encode(struct delta_s *pFields, const unsigned char *from, const unsigned char *to); @@ -193,9 +226,4 @@ void CreateInstancedBaselines(void); int InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message); 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 734047d8..ecb59f52 100644 --- a/regamedll/dlls/combat.cpp +++ b/regamedll/dlls/combat.cpp @@ -2,7 +2,7 @@ #define GERMAN_GIB_COUNT 4 #define HUMAN_GIB_COUNT 6 -#define ALIEN_GIB_COUNT 4 +#define ALIEN_GIB_COUNT 4 /* <5f4cb> ../cstrike/dlls/combat.cpp:52 */ void CGib::LimitVelocity(void) @@ -131,7 +131,7 @@ void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human) } /* <5f58a> ../cstrike/dlls/combat.cpp:263 */ -BOOL CBaseMonster::HasHumanGibs_(void) +BOOL CBaseMonster::__MAKE_VHOOK(HasHumanGibs)(void) { int myClass = Classify(); @@ -145,7 +145,7 @@ BOOL CBaseMonster::HasHumanGibs_(void) } /* <5f5ca> ../cstrike/dlls/combat.cpp:278 */ -BOOL CBaseMonster::HasAlienGibs_(void) +BOOL CBaseMonster::__MAKE_VHOOK(HasAlienGibs)(void) { int myClass = Classify(); if (myClass == CLASS_ALIEN_MILITARY @@ -160,7 +160,7 @@ BOOL CBaseMonster::HasAlienGibs_(void) } /* <5f60a> ../cstrike/dlls/combat.cpp:295 */ -void CBaseMonster::FadeMonster_(void) +void CBaseMonster::__MAKE_VHOOK(FadeMonster)(void) { StopAnimation(); @@ -174,7 +174,7 @@ void CBaseMonster::FadeMonster_(void) } /* <60a59> ../cstrike/dlls/combat.cpp:310 */ -void CBaseMonster::GibMonster_(void) +void CBaseMonster::__MAKE_VHOOK(GibMonster)(void) { TraceResult tr; BOOL gibbed = FALSE; @@ -219,7 +219,7 @@ void CBaseMonster::GibMonster_(void) } /* <5f65e> ../cstrike/dlls/combat.cpp:355 */ -NOBODY Activity CBaseMonster::GetDeathActivity_(void) +NOBODY Activity CBaseMonster::__MAKE_VHOOK(GetDeathActivity)(void) { // { // Activity deathActivity; // 357 @@ -255,7 +255,7 @@ NOBODY Activity CBaseMonster::GetSmallFlinchActivity(void) } /* <5f8a6> ../cstrike/dlls/combat.cpp:525 */ -void CBaseMonster::BecomeDead_(void) +void CBaseMonster::__MAKE_VHOOK(BecomeDead)(void) { // don't let autoaim aim at corpses. pev->takedamage = DAMAGE_YES; @@ -324,10 +324,10 @@ void CBaseMonster::CallGibMonster(void) } /* <5f938> ../cstrike/dlls/combat.cpp:598 */ -void CBaseMonster::Killed_(entvars_t *pevAttacker, int iGib) +void CBaseMonster::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) { - unsigned int cCount = 0; - BOOL fDone = FALSE; + // unsigned int cCount = 0; + // BOOL fDone = FALSE; if (HasMemory(bits_MEMORY_KILLED)) { @@ -450,7 +450,7 @@ void CGib::BounceGibTouch(CBaseEntity *pOther) if (m_material != matNone && !RANDOM_LONG(0, 2)) { float zvel = fabs(pev->velocity.z); - float volume = 0.8 * min(1, zvel / 450); + float volume = 0.8 * _min(1, zvel / 450); CBreakable::MaterialSoundRandom(edict(), (Materials)m_material, volume); } @@ -525,7 +525,7 @@ void CGib::Spawn(const char *szGibModel) } /* <60aea> ../cstrike/dlls/combat.cpp:815 */ -int CBaseMonster::TakeHealth_(float flHealth, int bitsDamageType) +int CBaseMonster::__MAKE_VHOOK(TakeHealth)(float flHealth, int bitsDamageType) { if (pev->takedamage == DAMAGE_NO) return 0; @@ -546,7 +546,7 @@ int CBaseMonster::TakeHealth_(float flHealth, int bitsDamageType) // When a monster is poisoned via an arrow etc it takes all the poison damage at once. /* <60d7a> ../cstrike/dlls/combat.cpp:845 */ -int CBaseMonster::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CBaseMonster::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { float flTake; Vector vecDir; @@ -556,7 +556,7 @@ int CBaseMonster::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, f if (!IsAlive()) { - return DeadTakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType);// Reverse me + return DeadTakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType); } if (pev->deadflag == DEAD_NO) @@ -1070,7 +1070,7 @@ NOBODY CBaseEntity *CBaseMonster::CheckTraceHullAttack(float flDist, int iDamage } /* <61ae6> ../cstrike/dlls/combat.cpp:1490 */ -NOBODY BOOL CBaseMonster::FInViewCone_(CBaseEntity *pEntity) +NOBODY BOOL CBaseMonster::__MAKE_VHOOK(FInViewCone)(CBaseEntity *pEntity) { // { // class Vector2D vec2LOS; // 1492 @@ -1085,7 +1085,7 @@ NOBODY BOOL CBaseMonster::FInViewCone_(CBaseEntity *pEntity) } /* <61be6> ../cstrike/dlls/combat.cpp:1517 */ -NOBODY BOOL CBaseMonster::FInViewCone_(Vector *pOrigin) +NOBODY BOOL CBaseMonster::__MAKE_VHOOK(FInViewCone)(Vector *pOrigin) { // { // class Vector2D vec2LOS; // 1519 @@ -1100,7 +1100,7 @@ NOBODY BOOL CBaseMonster::FInViewCone_(Vector *pOrigin) } /* <5ecb4> ../cstrike/dlls/combat.cpp:1543 */ -NOBODY BOOL CBaseEntity::FVisible_(CBaseEntity *pEntity) +NOBODY BOOL CBaseEntity::__MAKE_VHOOK(FVisible)(CBaseEntity *pEntity) { // { // TraceResult tr; // 1545 @@ -1113,7 +1113,7 @@ NOBODY BOOL CBaseEntity::FVisible_(CBaseEntity *pEntity) } /* <5e9bb> ../cstrike/dlls/combat.cpp:1576 */ -NOBODY BOOL CBaseEntity::FVisible_(Vector &vecOrigin) +NOBODY BOOL CBaseEntity::__MAKE_VHOOK(FVisible)(Vector &vecOrigin) { // { // TraceResult tr; // 1578 @@ -1123,7 +1123,7 @@ NOBODY BOOL CBaseEntity::FVisible_(Vector &vecOrigin) } /* <5e872> ../cstrike/dlls/combat.cpp:1600 */ -void CBaseEntity::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBaseEntity::__MAKE_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { Vector vecOrigin = ptr->vecEndPos - vecDir * 4; @@ -1142,7 +1142,7 @@ void CBaseEntity::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector ve } /* <61ce5> ../cstrike/dlls/combat.cpp:1647 */ -void CBaseMonster::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBaseMonster::__MAKE_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { Vector vecOrigin = ptr->vecEndPos - vecDir * 4; @@ -1550,7 +1550,7 @@ Vector __declspec(naked) CBaseEntity::FireBullets3(Vector vecSrc, Vector vecDirS } /* <5eb17> ../cstrike/dlls/combat.cpp:2075 */ -void CBaseEntity::TraceBleed_(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBaseEntity::__MAKE_VHOOK(TraceBleed)(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { if (BloodColor() == DONT_BLEED) return; diff --git a/regamedll/dlls/debug.cpp b/regamedll/dlls/debug.cpp index bd8e4370..d9a9ea4c 100644 --- a/regamedll/dlls/debug.cpp +++ b/regamedll/dlls/debug.cpp @@ -5,18 +5,18 @@ */ #ifndef HOOK_GAMEDLL -DebugOutputLevel outputLevel[NUM_LEVELS] = +DebugOutputLevel outputLevel[ NUM_LEVELS ] = { - { "bot", DEBUG_BOT }, - { "career", DEBUG_CAREER }, - { "tutor", DEBUG_TUTOR }, - { "stats", DEBUG_STATS }, - { "hostage", DEBUG_HOSTAGE }, - { "all", DEBUG_ALL } + { "bot", DEBUG_BOT }, + { "career", DEBUG_CAREER }, + { "tutor", DEBUG_TUTOR }, + { "stats", DEBUG_STATS }, + { "hostage", DEBUG_HOSTAGE }, + { "all", DEBUG_ALL } }; unsigned int theDebugOutputTypes; -static char theDebugBuffer[DebugBufferSize]; +static char theDebugBuffer[ DebugBufferSize ]; #else // HOOK_GAMEDLL @@ -27,7 +27,7 @@ char theDebugBuffer[ DebugBufferSize ]; #endif // HOOK_GAMEDLL /* <22fe8b> ../cstrike/dlls/debug.cpp:39 */ -NOXREF bool IsDeveloper(void) +bool IsDeveloper(void) { return (CVAR_GET_FLOAT("developer") > 0.0); } @@ -35,143 +35,203 @@ NOXREF bool IsDeveloper(void) /* <22ff69> ../cstrike/dlls/debug.cpp:45 */ NOXREF void UTIL_DPrintf(DebugOutputType outputType, char *pszMsg, ...) { - va_list argptr; - va_start(argptr, pszMsg); + if (!IsDeveloper()) + return; - if (IsDeveloper()) + if (theDebugOutputTypes & outputType) { - if (theDebugOutputTypes & outputType) - { -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(theDebugBuffer, DebugBufferSize, pszMsg, argptr); -#else - vsprintf(theDebugBuffer, pszMsg, argptr); -#endif // REGAMEDLL_FIXES - SERVER_PRINT(theDebugBuffer); - } - } -} - -// OVERLOAD -void UTIL_DPrintf(char *pszMsg, ...) -{ - va_list argptr; - va_start(argptr, pszMsg); - - if (IsDeveloper()) - { -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(theDebugBuffer, DebugBufferSize, pszMsg, argptr); -#else + va_list argptr; + va_start(argptr, pszMsg); vsprintf(theDebugBuffer, pszMsg, argptr); -#endif // REGAMEDLL_FIXES + va_end(argptr); + SERVER_PRINT(theDebugBuffer); } } +/* <22fe23> ../cstrike/dlls/debug.cpp:56 */ +void UTIL_DPrintf(char *pszMsg, ...) +{ + if (!IsDeveloper()) + return; + + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); +} + /* <22fe97> ../cstrike/dlls/debug.cpp:78 */ -NOXREF void PrintDebugFlags(void) +void PrintDebugFlags(void) { char *tmp; - char *state; int remainder = DebugBufferSize; - theDebugBuffer[0] = 0; + theDebugBuffer[0] = '\0'; tmp = BufPrintf(theDebugBuffer, remainder, "mp_debug:\n"); for (int i = 0; i < NUM_LEVELS - 1; i++) { - DebugOutputLevel *level = &outputLevel[i]; - if (theDebugOutputTypes & level->value) - state = "on"; - else - state = "off"; + DebugOutputLevel level = outputLevel[i]; - tmp = BufPrintf(tmp, remainder, " %s: %s\n", level->name, state); + tmp = BufPrintf(tmp, remainder, " %s: %s\n", level.name, (theDebugOutputTypes & level.value) ? "on" : "off"); } SERVER_PRINT(theDebugBuffer); } /* <22fed4> ../cstrike/dlls/debug.cpp:94 */ -NOBODY void SetDebugFlag(const char *flagStr, bool state) +void SetDebugFlag(const char *flagStr, bool state) { -// { -// enum DebugOutputType flag; // 96 -// { -// int i; // 97 -// { -// class DebugOutputLevel level; // 99 -// FStrEq(const char *sz1, -// const char *sz2); // 100 -// } -// } -// } + if (flagStr != NULL) + { + DebugOutputType flag; + for (int i = 0; i < ARRAYSIZE(outputLevel); i++) + { + DebugOutputLevel level = outputLevel[ i ]; + + if (FStrEq(level.name, flagStr)) + { + flag = level.value; + + if (state) + theDebugOutputTypes |= flag; + else + theDebugOutputTypes &= ~flag; + + SERVER_PRINT(SharedVarArgs("mp_debug: %s is now %s\n", flagStr, state ? "on" : "off")); + return; + } + } + } + + SERVER_PRINT(SharedVarArgs("mp_debug: unknown variable '%s'\n", flagStr)); } /* <23001f> ../cstrike/dlls/debug.cpp:126 */ -NOBODY void PrintDebugFlag(const char *flagStr) +void PrintDebugFlag(const char *flagStr) { -// { -// enum DebugOutputType flag; // 128 -// { -// int i; // 129 -// { -// class DebugOutputLevel level; // 131 -// FStrEq(const char *sz1, -// const char *sz2); // 132 -// } -// } -// } + if (flagStr != NULL) + { + DebugOutputType flag; + for (int i = 0; i < ARRAYSIZE(outputLevel); i++) + { + DebugOutputLevel level = outputLevel[ i ]; + + if (FStrEq(level.name, flagStr)) + { + flag = level.value; + SERVER_PRINT(SharedVarArgs("mp_debug: %s is %s\n", flagStr, (flag & theDebugOutputTypes) ? "on" : "off")); + return; + } + } + } + + SERVER_PRINT(SharedVarArgs("mp_debug: unknown variable '%s'\n", flagStr)); } /* <2300a9> ../cstrike/dlls/debug.cpp:149 */ -NOBODY void UTIL_SetDprintfFlags(const char *flagStr) +void UTIL_SetDprintfFlags(const char *flagStr) { -// IsDeveloper(void); // 151 -// PrintDebugFlags(void); // 156 + if (!IsDeveloper()) + return; + + if (flagStr != NULL && flagStr[0] != '\0') + { + if (flagStr[0] == '+') + SetDebugFlag(&flagStr[1], true); + + else if (flagStr[0] == '-') + SetDebugFlag(&flagStr[1], false); + else + PrintDebugFlag(flagStr); + } + else + PrintDebugFlags(); } /* <23012d> ../cstrike/dlls/debug.cpp:175 */ -NOBODY void UTIL_BotDPrintf(char *pszMsg, ...) +NOXREF void UTIL_BotDPrintf(char *pszMsg, ...) { -// IsDeveloper(void); // 177 -// { -// va_list argptr; // 182 -// } + if (!IsDeveloper()) + return; + + if (theDebugOutputTypes & DEBUG_BOT) + { + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); + } } /* <230181> ../cstrike/dlls/debug.cpp:193 */ -NOBODY void UTIL_CareerDPrintf(char *pszMsg, ...) +void UTIL_CareerDPrintf(char *pszMsg, ...) { -// IsDeveloper(void); // 195 -// { -// va_list argptr; // 200 -// } + if (!IsDeveloper()) + return; + + if (theDebugOutputTypes & DEBUG_CAREER) + { + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); + } } /* <2301d5> ../cstrike/dlls/debug.cpp:211 */ -NOBODY void UTIL_TutorDPrintf(char *pszMsg, ...) +NOXREF void UTIL_TutorDPrintf(char *pszMsg, ...) { -// IsDeveloper(void); // 213 -// { -// va_list argptr; // 218 -// } + if (!IsDeveloper()) + return; + + if (theDebugOutputTypes & DEBUG_TUTOR) + { + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); + } } /* <230229> ../cstrike/dlls/debug.cpp:229 */ -NOBODY void UTIL_StatsDPrintf(char *pszMsg, ...) +NOXREF void UTIL_StatsDPrintf(char *pszMsg, ...) { -// IsDeveloper(void); // 231 -// { -// va_list argptr; // 236 -// } + if (!IsDeveloper()) + return; + + if (theDebugOutputTypes & DEBUG_STATS) + { + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); + } } /* <23027d> ../cstrike/dlls/debug.cpp:247 */ -NOBODY void UTIL_HostageDPrintf(char *pszMsg, ...) +NOXREF void UTIL_HostageDPrintf(char *pszMsg, ...) { -// IsDeveloper(void); // 249 -// { -// va_list argptr; // 254 -// } + if (!IsDeveloper()) + return; + + if (theDebugOutputTypes & DEBUG_HOSTAGE) + { + va_list argptr; + va_start(argptr, pszMsg); + vsprintf(theDebugBuffer, pszMsg, argptr); + va_end(argptr); + + SERVER_PRINT(theDebugBuffer); + } } diff --git a/regamedll/dlls/debug.h b/regamedll/dlls/debug.h index f94a1a54..0776ae6d 100644 --- a/regamedll/dlls/debug.h +++ b/regamedll/dlls/debug.h @@ -37,19 +37,21 @@ const int DebugBufferSize = 1024; typedef enum { - DEBUG_NONE = 0, - DEBUG_BOT, - DEBUG_CAREER, - DEBUG_TUTOR, - DEBUG_STATS, - DEBUG_HOSTAGE, - DEBUG_ALL = 0xFFFFFFFF, + DEBUG_NONE = 0, + DEBUG_BOT = (1<<0), + DEBUG_CAREER = (1<<1), + DEBUG_TUTOR = (1<<2), + DEBUG_STATS = (1<<3), + DEBUG_HOSTAGE = (1<<4), + DEBUG_ALL = 0xFFFFFFFF, + } DebugOutputType; struct DebugOutputLevel { const char *name; DebugOutputType value; + };/* size: 8, cachelines: 1, members: 2 */ #ifdef HOOK_GAMEDLL @@ -60,23 +62,24 @@ struct DebugOutputLevel #endif // HOOK_GAMEDLL -extern DebugOutputLevel outputLevel[NUM_LEVELS]; +extern DebugOutputLevel outputLevel[ NUM_LEVELS ]; extern unsigned int theDebugOutputTypes; -extern char theDebugBuffer[DebugBufferSize]; +extern char theDebugBuffer[ DebugBufferSize ]; -NOXREF bool IsDeveloper(void); -NOBODY void UTIL_DPrintf(DebugOutputType outputType, char *pszMsg, ...); +bool IsDeveloper(void); +NOXREF void UTIL_DPrintf(DebugOutputType outputType, char *pszMsg, ...); void UTIL_DPrintf(char *pszMsg, ...); -NOXREF void PrintDebugFlags(void); +void PrintDebugFlags(void); -NOBODY void SetDebugFlag(const char *flagStr, bool state); -NOBODY void PrintDebugFlag(const char *flagStr); -NOBODY void UTIL_SetDprintfFlags(const char *flagStr); -NOBODY void UTIL_BotDPrintf(char *pszMsg, ...); -NOBODY void UTIL_CareerDPrintf(char *pszMsg, ...); -NOBODY void UTIL_TutorDPrintf(char *pszMsg, ...); -NOBODY void UTIL_StatsDPrintf(char *pszMsg, ...); -NOBODY void UTIL_HostageDPrintf(char *pszMsg, ...); +void SetDebugFlag(const char *flagStr, bool state); +void PrintDebugFlag(const char *flagStr); +void UTIL_SetDprintfFlags(const char *flagStr); + +NOXREF void UTIL_BotDPrintf(char *pszMsg, ...); +void UTIL_CareerDPrintf(char *pszMsg, ...); +NOXREF void UTIL_TutorDPrintf(char *pszMsg, ...); +NOXREF void UTIL_StatsDPrintf(char *pszMsg, ...); +NOXREF void UTIL_HostageDPrintf(char *pszMsg, ...); #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/doors.cpp b/regamedll/dlls/doors.cpp index 5c0eb2a7..131aab12 100644 --- a/regamedll/dlls/doors.cpp +++ b/regamedll/dlls/doors.cpp @@ -56,7 +56,7 @@ NOBODY void PlayLockSounds(entvars_t *pev, locksound_t *pls, int flocked, int fb } /* <69a4f> ../cstrike/dlls/doors.cpp:201 */ -NOBODY void CBaseDoor::KeyValue_(KeyValueData *pkvd) +NOBODY void CBaseDoor::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 204 @@ -75,7 +75,7 @@ LINK_ENTITY_TO_CLASS(func_door, CBaseDoor); LINK_ENTITY_TO_CLASS(func_water, CBaseDoor); /* <690bc> ../cstrike/dlls/doors.cpp:285 */ -NOBODY void CBaseDoor::Spawn_(void) +NOBODY void CBaseDoor::__MAKE_VHOOK(Spawn)(void) { // fabs(double __x); // 312 // fabs(double __x); // 312 @@ -87,12 +87,12 @@ NOBODY void CBaseDoor::Spawn_(void) } /* <69949> ../cstrike/dlls/doors.cpp:334 */ -NOBODY void CBaseDoor::Restart_(void) +NOBODY void CBaseDoor::__MAKE_VHOOK(Restart)(void) { } /* <69289> ../cstrike/dlls/doors.cpp:350 */ -NOBODY void CBaseDoor::SetToggleState_(int state) +NOBODY void CBaseDoor::__MAKE_VHOOK(SetToggleState)(int state) { // SetToggleState(CBaseDoor *const this, // int state); // 350 @@ -102,7 +102,7 @@ NOBODY void CBaseDoor::SetToggleState_(int state) #define noiseArrived noise2 /* <6924c> ../cstrike/dlls/doors.cpp:359 */ -NOBODY void CBaseDoor::Precache_(void) +NOBODY void CBaseDoor::__MAKE_VHOOK(Precache)(void) { // { // char *pszSound; // 361 @@ -120,7 +120,7 @@ NOBODY void CBaseDoor::DoorTouch(CBaseEntity *pOther) } /* <6a33b> ../cstrike/dlls/doors.cpp:543 */ -NOBODY void CBaseDoor::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CBaseDoor::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // DoorActivate(CBaseDoor *const this); // 548 } @@ -208,7 +208,7 @@ NOBODY void CBaseDoor::DoorHitBottom(void) } /* <6a465> ../cstrike/dlls/doors.cpp:817 */ -NOBODY void CBaseDoor::Blocked_(CBaseEntity *pOther) +NOBODY void CBaseDoor::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { // { // edict_t *pentTarget; // 819 @@ -223,7 +223,7 @@ NOBODY void CBaseDoor::Blocked_(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(func_door_rotating, CRotDoor); /* <698be> ../cstrike/dlls/doors.cpp:946 */ -NOBODY void CRotDoor::Restart_(void) +NOBODY void CRotDoor::__MAKE_VHOOK(Restart)(void) { // operator*(const Vector ::Restart(// float fl); // 953 // { @@ -234,7 +234,7 @@ NOBODY void CRotDoor::Restart_(void) } /* <69177> ../cstrike/dlls/doors.cpp:978 */ -NOBODY void CRotDoor::Spawn_(void) +NOBODY void CRotDoor::__MAKE_VHOOK(Spawn)(void) { // operator*(const class Vector *const this, // float fl); // 986 @@ -250,7 +250,7 @@ NOBODY void CRotDoor::Spawn_(void) } /* <68fcc> ../cstrike/dlls/doors.cpp:1028 */ -NOBODY void CRotDoor::SetToggleState_(int state) +NOBODY void CRotDoor::__MAKE_VHOOK(SetToggleState)(int state) { } @@ -261,7 +261,7 @@ LINK_ENTITY_TO_CLASS(momentary_door, CMomentaryDoor); IMPLEMENT_SAVERESTORE(CMomentaryDoor, CBaseToggle); /* <69001> ../cstrike/dlls/doors.cpp:1065 */ -NOBODY void CMomentaryDoor::Spawn_(void) +NOBODY void CMomentaryDoor::__MAKE_VHOOK(Spawn)(void) { // fabs(double __x); // 1082 // fabs(double __x); // 1082 @@ -273,12 +273,12 @@ NOBODY void CMomentaryDoor::Spawn_(void) } /* <68fa5> ../cstrike/dlls/doors.cpp:1096 */ -NOBODY void CMomentaryDoor::Precache_(void) +NOBODY void CMomentaryDoor::__MAKE_VHOOK(Precache)(void) { } /* <69970> ../cstrike/dlls/doors.cpp:1143 */ -NOBODY void CMomentaryDoor::KeyValue_(KeyValueData *pkvd) +NOBODY void CMomentaryDoor::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 1146 @@ -291,7 +291,7 @@ NOBODY void CMomentaryDoor::KeyValue_(KeyValueData *pkvd) } /* <6953e> ../cstrike/dlls/doors.cpp:1165 */ -NOBODY void CMomentaryDoor::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CMomentaryDoor::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // Vector move; // 1172 diff --git a/regamedll/dlls/effects.cpp b/regamedll/dlls/effects.cpp index 57273527..04fa58f3 100644 --- a/regamedll/dlls/effects.cpp +++ b/regamedll/dlls/effects.cpp @@ -61,12 +61,12 @@ TYPEDESCRIPTION CGibShooter::m_SaveData[] = #else -TYPEDESCRIPTION (*CBubbling::pm_SaveData)[3]; -TYPEDESCRIPTION (*CLightning::pm_SaveData)[13]; -TYPEDESCRIPTION (*CLaser::pm_SaveData)[3]; -TYPEDESCRIPTION (*CGlow::pm_SaveData)[2]; -TYPEDESCRIPTION (*CSprite::pm_SaveData)[2]; -TYPEDESCRIPTION (*CGibShooter::pm_SaveData)[7]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CBubbling, m_SaveData)[3]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CLightning, m_SaveData)[13]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CLaser, m_SaveData)[3]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CGlow, m_SaveData)[2]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CSprite, m_SaveData)[2]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CGibShooter, m_SaveData)[7]; #endif // HOOK_GAMEDLL @@ -80,241 +80,315 @@ LINK_ENTITY_TO_CLASS(env_bubbles, CBubbling); IMPLEMENT_SAVERESTORE(CBubbling, CBaseEntity); /* <7344d> ../cstrike/dlls/effects.cpp:73 */ -NOBODY void CBubbling::Spawn_(void) +void CBubbling::__MAKE_VHOOK(Spawn)(void) { -// { -// int speed; // 81 -// } + Precache(); + SET_MODEL(ENT(pev), STRING(pev->model)); // Set size + + // Remove model & collisions + pev->solid = SOLID_NOT; + + // The engine won't draw this model if this is set to 0 and blending is on + pev->renderamt = 0; + pev->rendermode = kRenderTransTexture; + + int speed = (pev->speed > 0) ? pev->speed : -pev->speed; + + // HACKHACK!!! - Speed in rendercolor + pev->rendercolor.x = (speed >> 8); + pev->rendercolor.y = (speed & 255); + pev->rendercolor.z = (pev->speed < 0) ? 1 : 0; + + if (!(pev->spawnflags & SF_BUBBLES_STARTOFF)) + { + SetThink(&CBubbling::FizzThink); + + pev->nextthink = gpGlobals->time + 2.0; + m_state = 1; + } + else + m_state = 0; } /* <73489> ../cstrike/dlls/effects.cpp:99 */ -NOBODY void CBubbling::Precache_(void) +void CBubbling::__MAKE_VHOOK(Precache)(void) { + // Precache bubble sprite + m_bubbleModel = PRECACHE_MODEL("sprites/bubble.spr"); } /* <742a4> ../cstrike/dlls/effects.cpp:105 */ -NOBODY void CBubbling::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CBubbling::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// Use(CBubbling *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 105 + if (ShouldToggle(useType, m_state)) + m_state = !m_state; + + if (m_state) + { + SetThink(&CBubbling::FizzThink); + pev->nextthink = gpGlobals->time + 0.1; + } + else + { + SetThink(NULL); + pev->nextthink = 0; + } } /* <74aae> ../cstrike/dlls/effects.cpp:123 */ -NOBODY void CBubbling::KeyValue_(KeyValueData *pkvd) +void CBubbling::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 125 -// FStrEq(const char *sz1, -// const char *sz2); // 130 -// KeyValue(CBubbling *const this, -// KeyValueData *pkvd); // 123 -// atoi(const char *__nptr); // 127 -// atoi(const char *__nptr); // 132 + if (FStrEq(pkvd->szKeyName, "density")) + { + m_density = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "frequency")) + { + m_frequency = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "current")) + { + pev->speed = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBaseEntity::KeyValue(pkvd); } /* <73d03> ../cstrike/dlls/effects.cpp:145 */ -NOBODY void CBubbling::FizzThink(void) +void CBubbling::FizzThink(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 147 -// edict(CBaseEntity *const this); // 149 -// ENTINDEX(edict_t *pEdict); // 149 + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, VecBModelOrigin(pev)); + WRITE_BYTE(TE_FIZZ); + WRITE_SHORT(ENTINDEX(edict())); + WRITE_SHORT(m_bubbleModel); + WRITE_BYTE(m_density); + MESSAGE_END(); + + if (m_frequency > 19) + pev->nextthink = gpGlobals->time + 0.5; + else + pev->nextthink = gpGlobals->time + 2.5 - (0.1 * m_frequency); } /* <7620c> ../cstrike/dlls/effects.cpp:166 */ LINK_ENTITY_TO_CLASS(beam, CBeam); /* <734b0> ../cstrike/dlls/effects.cpp:168 */ -NOBODY void CBeam::Spawn_(void) +void CBeam::__MAKE_VHOOK(Spawn)(void) { + // Remove model & collisions + pev->solid = SOLID_NOT; + Precache(); } /* <734d6> ../cstrike/dlls/effects.cpp:174 */ -NOBODY void CBeam::Precache_(void) +void CBeam::__MAKE_VHOOK(Precache)(void) { -// ENTINDEX(edict_t *pEdict); // 177 -// SetStartEntity(CBeam *const this, -// int entityIndex); // 177 -// ENTINDEX(edict_t *pEdict); // 179 -// SetEndEntity(CBeam *const this, -// int entityIndex); // 179 + if (pev->owner) + { + SetStartEntity(ENTINDEX(pev->owner)); + } + if (pev->aiment) + { + SetEndEntity(ENTINDEX(pev->aiment)); + } } /* <762d8> ../cstrike/dlls/effects.cpp:182 */ -NOBODY void CBeam::SetStartEntity(int entityIndex) +void CBeam::SetStartEntity(int entityIndex) { + pev->sequence = (entityIndex & 0x0FFF) | ((pev->sequence & 0xF000) << 12); + pev->owner = INDEXENT(entityIndex); } /* <76303> ../cstrike/dlls/effects.cpp:188 */ -NOBODY void CBeam::SetEndEntity(int entityIndex) +void CBeam::SetEndEntity(int entityIndex) { + pev->skin = (entityIndex & 0x0FFF) | ((pev->skin & 0xF000) << 12); + pev->aiment = INDEXENT(entityIndex); } /* <7632e> ../cstrike/dlls/effects.cpp:196 */ -NOBODY const Vector &CBeam::GetStartPos(void) +const Vector &CBeam::GetStartPos(void) { if (GetType() == BEAM_ENTS) { - edict_t *pent = INDEXENT( GetStartEntity() ); + edict_t *pent = INDEXENT(GetStartEntity()); return pent->v.origin; } return pev->origin; -// { -// edict_t *pent; // 200 -// } -// GetType(CBeam *const this); // 198 -// GetStartPos(CBeam *const this); // 196 } /* <7639a> ../cstrike/dlls/effects.cpp:207 */ -NOBODY const Vector &CBeam::GetEndPos(void) +const Vector &CBeam::GetEndPos(void) { -// { -// int type; // 209 -// edict_t *pent; // 215 -// GetType(CBeam *const this); // 209 -// } -// GetEndPos(CBeam *const this); // 207 + int type = GetType(); + if (type == BEAM_POINTS || type == BEAM_HOSE) + { + return pev->angles; + } + + edict_t *pent = INDEXENT(GetEndEntity()); + if (pent) + { + return pent->v.origin; + } + + return pev->angles; } /* <76540> ../cstrike/dlls/effects.cpp:222 */ -NOBODY CBeam *CBeam::BeamCreate(const char *pSpriteName, int width) +CBeam *CBeam::BeamCreate(const char *pSpriteName, int width) { -// { -// class CBeam *pBeam; // 225 -// GetClassPtr(CBeam *a); // 225 -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 226 -// } + // Create a new entity with CBeam private data + CBeam *pBeam = GetClassPtr((CBeam *)NULL); + + if (pBeam->pev->classname) + RemoveEntityHashValue(pBeam->pev, STRING(pBeam->pev->classname), CLASSNAME); + + MAKE_STRING_CLASS("beam", pBeam->pev); + AddEntityHashValue(pBeam->pev, STRING(pBeam->pev->classname), CLASSNAME); + + pBeam->BeamInit(pSpriteName, width); + + return pBeam; } /* <76422> ../cstrike/dlls/effects.cpp:234 */ -NOBODY void CBeam::BeamInit(const char *pSpriteName, int width) +void CBeam::BeamInit(const char *pSpriteName, int width) { -// SetNoise(CBeam *const this, -// int amplitude); // 239 -// SetColor(CBeam *const this, -// int r, -// int g, -// int b); // 237 -// SetBrightness(CBeam *const this, -// int brightness); // 238 -// SetFrame(CBeam *const this, -// float frame); // 240 -// SetScrollRate(CBeam *const this, -// int speed); // 241 -// SetWidth(CBeam *const this, -// int width); // 244 -// SetTexture(CBeam *const this, -// int spriteIndex); // 243 + pev->flags |= FL_CUSTOMENTITY; + + SetColor(255, 255, 255); + SetBrightness(255); + SetNoise(0); + SetFrame(0); + SetScrollRate(0); + pev->model = MAKE_STRING(pSpriteName); + SetTexture(PRECACHE_MODEL((char *)pSpriteName)); + SetWidth(width); + + pev->skin = 0; + pev->sequence = 0; + pev->rendermode = 0; } /* <76a56> ../cstrike/dlls/effects.cpp:251 */ -NOBODY void CBeam::PointsInit(const Vector &start, const Vector &end) +void CBeam::PointsInit(const Vector &start, const Vector &end) { -// SetType(CBeam *const this, -// int type); // 253 -// SetStartPos(CBeam *const this, -// const Vector &pos); // 254 -// SetEndPos(CBeam *const this, -// const Vector &pos); // 255 -// SetStartAttachment(CBeam *const this, -// int attachment); // 256 -// SetEndAttachment(CBeam *const this, -// int attachment); // 257 + SetType(BEAM_POINTS); + SetStartPos(start); + SetEndPos(end); + SetStartAttachment(0); + SetEndAttachment(0); + RelinkBeam(); } /* <7695b> ../cstrike/dlls/effects.cpp:262 */ -NOBODY void CBeam::HoseInit(const Vector &start, const Vector &direction) +void CBeam::HoseInit(const Vector &start, const Vector &direction) { -// SetType(CBeam *const this, -// int type); // 264 -// SetStartPos(CBeam *const this, -// const Vector &pos); // 265 -// SetEndPos(CBeam *const this, -// const Vector &pos); // 266 -// SetStartAttachment(CBeam *const this, -// int attachment); // 267 -// SetEndAttachment(CBeam *const this, -// int attachment); // 268 + SetType(BEAM_HOSE); + SetStartPos(start); + SetEndPos(direction); + SetStartAttachment(0); + SetEndAttachment(0); + RelinkBeam(); } /* <76887> ../cstrike/dlls/effects.cpp:273 */ -NOBODY void CBeam::PointEntInit(const Vector &start, int endIndex) +void CBeam::PointEntInit(const Vector &start, int endIndex) { -// SetType(CBeam *const this, -// int type); // 275 -// SetStartPos(CBeam *const this, -// const Vector &pos); // 276 -// SetEndEntity(CBeam *const this, -// int entityIndex); // 277 -// SetStartAttachment(CBeam *const this, -// int attachment); // 278 -// SetEndAttachment(CBeam *const this, -// int attachment); // 279 + SetType(BEAM_ENTPOINT); + SetStartPos(start); + SetEndEntity(endIndex); + SetStartAttachment(0); + SetEndAttachment(0); + RelinkBeam(); } /* <767ab> ../cstrike/dlls/effects.cpp:283 */ -NOBODY void CBeam::EntsInit(int startIndex, int endIndex) +void CBeam::EntsInit(int startIndex, int endIndex) { -// SetType(CBeam *const this, -// int type); // 285 -// SetStartEntity(CBeam *const this, -// int entityIndex); // 286 -// SetEndEntity(CBeam *const this, -// int entityIndex); // 287 -// SetStartAttachment(CBeam *const this, -// int attachment); // 288 -// SetEndAttachment(CBeam *const this, -// int attachment); // 289 + SetType(BEAM_ENTS); + SetStartEntity(startIndex); + SetEndEntity(endIndex); + SetStartAttachment(0); + SetEndAttachment(0); + RelinkBeam(); } /* <7663a> ../cstrike/dlls/effects.cpp:294 */ -NOBODY void CBeam::RelinkBeam(void) +void CBeam::RelinkBeam(void) { -// { -// const Vector &startPos; // 296 -// const Vector &endPos; // 296 -// GetStartPos(CBeam *const this); // 296 -// GetEndPos(CBeam *const this); // 296 -// operator-(const Vector *const this, -// const Vector &v); // 304 -// operator-(const Vector *const this, -// const Vector &v); // 305 -// } + const Vector &startPos = GetStartPos(); + const Vector &endPos = GetEndPos(); + + pev->mins.x = _min(startPos.x, endPos.x); + pev->mins.y = _min(startPos.y, endPos.y); + pev->mins.z = _min(startPos.z, endPos.z); + + pev->maxs.x = _max(startPos.x, endPos.x); + pev->maxs.y = _max(startPos.y, endPos.y); + pev->maxs.z = _max(startPos.z, endPos.z); + + pev->mins = pev->mins - pev->origin; + pev->maxs = pev->maxs - pev->origin; + + UTIL_SetSize(pev, pev->mins, pev->maxs); + UTIL_SetOrigin(pev, pev->origin); } /* <77305> ../cstrike/dlls/effects.cpp:311 */ -NOBODY void CBeam::TriggerTouch(CBaseEntity *pOther) +void CBeam::TriggerTouch(CBaseEntity *pOther) { -// { -// class CBaseEntity *pOwner; // 317 -// Instance(edict_t *pent); // 317 -// } + if (pOther->pev->flags & (FL_CLIENT | FL_MONSTER)) + { + if (pev->owner) + { + CBaseEntity *pOwner = CBaseEntity::Instance(pev->owner); + pOwner->Use(pOther, this, USE_TOGGLE, 0); + } + ALERT(at_console, "Firing targets!!!\n"); + } } /* <773e2> ../cstrike/dlls/effects.cpp:325 */ -NOBODY CBaseEntity *CBeam::RandomTargetname(const char *szName) +CBaseEntity *CBeam::RandomTargetname(const char *szName) { -// { -// int total; // 327 -// class CBaseEntity *pEntity; // 329 -// class CBaseEntity *pNewEntity; // 330 -// } + int total = 0; + + CBaseEntity *pEntity = NULL; + CBaseEntity *pNewEntity = NULL; + + while ((pNewEntity = UTIL_FindEntityByTargetname(pNewEntity, szName)) != NULL) + { + total++; + + if (RANDOM_LONG(0, total - 1) < 1) + pEntity = pNewEntity; + } + + return pEntity; } /* <77431> ../cstrike/dlls/effects.cpp:341 */ -NOBODY void CBeam::DoSparks(const Vector &start, const Vector &end) +void CBeam::DoSparks(const Vector &start, const Vector &end) { -// DoSparks(CBeam *const this, -// const Vector &start, -// const Vector &end); // 341 + if (pev->spawnflags & (SF_BEAM_SPARKSTART | SF_BEAM_SPARKEND)) + { + if (pev->spawnflags & SF_BEAM_SPARKSTART) + { + UTIL_Sparks(start); + } + if (pev->spawnflags & SF_BEAM_SPARKEND) + { + UTIL_Sparks(end); + } + } } /* <774c2> ../cstrike/dlls/effects.cpp:402 */ @@ -327,230 +401,509 @@ LINK_ENTITY_TO_CLASS(env_beam, CLightning); IMPLEMENT_SAVERESTORE(CLightning, CBeam); /* <744b2> ../cstrike/dlls/effects.cpp:444 */ -NOBODY void CLightning::Spawn_(void) +void CLightning::__MAKE_VHOOK(Spawn)(void) { -// Spawn(CLightning *const this); // 444 + if (FStringNull(m_iszSpriteName)) + { + SetThink(&CLightning::SUB_Remove); + return; + } + + // Remove model & collisions + pev->solid = SOLID_NOT; + Precache(); + + pev->dmgtime = gpGlobals->time; + + if (ServerSide()) + { + SetThink(NULL); + if (pev->dmg > 0) + { + SetThink(&CLightning::DamageThink); + pev->nextthink = gpGlobals->time + 0.1f; + } + if (pev->targetname) + { + if (!(pev->spawnflags & SF_BEAM_STARTON)) + { + pev->effects = EF_NODRAW; + m_active = 0; + pev->nextthink = 0; + } + else + m_active = 1; + + SetUse(&CLightning::ToggleUse); + } + } + else + { + m_active = 0; + if (!FStringNull(pev->targetname)) + { + SetUse(&CLightning::StrikeUse); + } + if (FStringNull(pev->targetname) || (pev->spawnflags & SF_BEAM_STARTON)) + { + SetThink(&CLightning::StrikeThink); + pev->nextthink = gpGlobals->time + 1.0f; + } + } } /* <7357f> ../cstrike/dlls/effects.cpp:493 */ -NOBODY void CLightning::Precache_(void) +void CLightning::__MAKE_VHOOK(Precache)(void) { + m_spriteTexture = PRECACHE_MODEL((char *)STRING(m_iszSpriteName)); + CBeam::Precache(); } /* <786a1> ../cstrike/dlls/effects.cpp:500 */ -NOBODY void CLightning::Activate_(void) +void CLightning::__MAKE_VHOOK(Activate)(void) { -// ServerSide(CLightning *const this); // 502 + if (ServerSide()) + BeamUpdateVars(); } /* <7536c> ../cstrike/dlls/effects.cpp:507 */ -NOBODY void CLightning::KeyValue_(KeyValueData *pkvd) +void CLightning::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 509 -// FStrEq(const char *sz1, -// const char *sz2); // 514 -// KeyValue(CLightning *const this, -// KeyValueData *pkvd); // 507 + if (FStrEq(pkvd->szKeyName, "LightningStart")) + { + m_iszStartEntity = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "LightningEnd")) + { + m_iszEndEntity = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "life")) + { + m_life = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "BoltWidth")) + { + m_boltWidth = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "NoiseAmplitude")) + { + m_noiseAmplitude = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "TextureScroll")) + { + m_speed = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "StrikeTime")) + { + m_restrike = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "texture")) + { + m_iszSpriteName = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "framestart")) + { + m_frameStart = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "Radius")) + { + m_radius = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "damage")) + { + pev->dmg = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBeam::KeyValue(pkvd); } /* <75ad3> ../cstrike/dlls/effects.cpp:569 */ -NOBODY void CLightning::ToggleUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CLightning::ToggleUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// ToggleUse(CLightning *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 569 + if (!ShouldToggle(useType, m_active)) + return; + + if (m_active) + { + m_active = 0; + pev->effects |= EF_NODRAW; + pev->nextthink = 0; + } + else + { + m_active = 1; + pev->effects &= ~EF_NODRAW; + DoSparks(GetStartPos(), GetEndPos()); + + if (pev->dmg > 0) + { + pev->nextthink = gpGlobals->time; + pev->dmgtime = gpGlobals->time; + } + } } /* <7422d> ../cstrike/dlls/effects.cpp:593 */ -NOBODY void CLightning::StrikeUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CLightning::StrikeUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// StrikeUse(CLightning *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 593 + if (!ShouldToggle(useType, m_active)) + return; + + if (m_active) + { + m_active = 0; + SetThink(NULL); + } + else + { + SetThink(&CLightning::StrikeThink); + pev->nextthink = gpGlobals->time + 0.1f; + } + + if (!(pev->spawnflags & SF_BEAM_TOGGLE)) + SetUse(NULL); } /* <71e66> ../cstrike/dlls/effects.cpp:614 */ -NOBODY int IsPointEntity(CBaseEntity *pEnt) +int IsPointEntity(CBaseEntity *pEnt) { + if (!pEnt->pev->modelindex) + return 1; + + if (FClassnameIs(pEnt->pev, "info_target") || FClassnameIs(pEnt->pev, "info_landmark") || FClassnameIs(pEnt->pev, "path_corner")) + { + return 1; + } + return 0; } /* <77f64> ../cstrike/dlls/effects.cpp:625 */ -NOBODY void CLightning::StrikeThink(void) +void CLightning::StrikeThink(void) { -// { -// class CBaseEntity *pStart; // 653 -// class CBaseEntity *pEnd; // 654 -// { -// class CBaseEntity *pStart; // 644 -// RandomTargetname(CBeam *const this, -// const char *szName); // 644 -// } -// RandomTargetname(CBeam *const this, -// const char *szName); // 653 -// RandomTargetname(CBeam *const this, -// const char *szName); // 654 -// IsPointEntity(CBaseEntity *pEnt); // 658 -// IsPointEntity(CBaseEntity *pEnt); // 658 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 667 -// IsPointEntity(CBaseEntity *pEnt); // 668 -// IsPointEntity(CBaseEntity *pEnt); // 668 -// entindex(CBaseEntity *const this); // 704 -// entindex(CBaseEntity *const this); // 705 -// IsPointEntity(CBaseEntity *pEnt); // 670 -// IsPointEntity(CBaseEntity *pEnt); // 677 -// entindex(CBaseEntity *const this); // 680 -// DoSparks(CBeam *const this, -// const Vector &start, -// const Vector &end); // 720 -// { -// TraceResult tr; // 723 -// BeamDamageInstant(CBeam *const this, -// TraceResult *ptr, -// float damage); // 725 -// } -// } + if (m_life != 0.0f) + { + if (pev->spawnflags & SF_BEAM_RANDOM) + pev->nextthink = gpGlobals->time + m_life + RANDOM_FLOAT(0, m_restrike); + else + pev->nextthink = gpGlobals->time + m_life + m_restrike; + } + m_active = 1; + + if (FStringNull(m_iszEndEntity)) + { + if (FStringNull(m_iszStartEntity)) + { + RandomArea(); + } + else + { + CBaseEntity *pStart = RandomTargetname(STRING(m_iszStartEntity)); + if (pStart != NULL) + RandomPoint(pStart->pev->origin); + else + ALERT(at_console, "env_beam: unknown entity \"%s\"\n", STRING(m_iszStartEntity)); + } + return; + } + + CBaseEntity *pStart = RandomTargetname(STRING(m_iszStartEntity)); + CBaseEntity *pEnd = RandomTargetname(STRING(m_iszEndEntity)); + + if (pStart != NULL && pEnd != NULL) + { + if (IsPointEntity(pStart) || IsPointEntity(pEnd)) + { + if (pev->spawnflags & SF_BEAM_RING) + { + // don't work + return; + } + } + + MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); + + if (IsPointEntity(pStart) || IsPointEntity(pEnd)) + { + // One point entity must be in pEnd + if (!IsPointEntity(pEnd)) + { + CBaseEntity *pTemp; + pTemp = pStart; + pStart = pEnd; + pEnd = pTemp; + } + + // One sided + if (!IsPointEntity(pStart)) + { + WRITE_BYTE(TE_BEAMENTPOINT); + WRITE_SHORT(pStart->entindex()); + WRITE_COORD(pEnd->pev->origin.x); + WRITE_COORD(pEnd->pev->origin.y); + WRITE_COORD(pEnd->pev->origin.z); + } + else + { + WRITE_BYTE(TE_BEAMPOINTS); + WRITE_COORD(pStart->pev->origin.x); + WRITE_COORD(pStart->pev->origin.y); + WRITE_COORD(pStart->pev->origin.z); + WRITE_COORD(pEnd->pev->origin.x); + WRITE_COORD(pEnd->pev->origin.y); + WRITE_COORD(pEnd->pev->origin.z); + } + + + } + else + { + if (pev->spawnflags & SF_BEAM_RING) + WRITE_BYTE(TE_BEAMRING); + else + WRITE_BYTE(TE_BEAMENTS); + WRITE_SHORT(pStart->entindex()); + WRITE_SHORT(pEnd->entindex()); + } + + WRITE_SHORT(m_spriteTexture); + WRITE_BYTE(m_frameStart); // framestart + WRITE_BYTE((int)pev->framerate); // framerate + WRITE_BYTE((int)(m_life*10.0)); // life + WRITE_BYTE(m_boltWidth); // width + WRITE_BYTE(m_noiseAmplitude); // noise + WRITE_BYTE((int)pev->rendercolor.x); // r, g, b + WRITE_BYTE((int)pev->rendercolor.y); // r, g, b + WRITE_BYTE((int)pev->rendercolor.z); // r, g, b + WRITE_BYTE(pev->renderamt); // brightness + WRITE_BYTE(m_speed); // speed + MESSAGE_END(); + + DoSparks(pStart->pev->origin, pEnd->pev->origin); + + if (pev->dmg > 0) + { + TraceResult tr; + UTIL_TraceLine(pStart->pev->origin, pEnd->pev->origin, dont_ignore_monsters, NULL, &tr); + BeamDamageInstant(&tr, pev->dmg); + } + } } /* <77680> ../cstrike/dlls/effects.cpp:731 */ -NOBODY void CBeam::BeamDamage(TraceResult *ptr) +void CBeam::BeamDamage(TraceResult *ptr) { -// { -// class CBaseEntity *pHit; // 736 -// Instance(edict_t *pent); // 736 -// operator-(const Vector *const this, -// const Vector &v); // 740 -// Normalize(const Vector *const this); // 740 -// } + RelinkBeam(); + + if (ptr->flFraction != 1.0f && ptr->pHit != NULL) + { + CBaseEntity *pHit = CBaseEntity::Instance(ptr->pHit); + + if (pHit != NULL) + { + ClearMultiDamage(); + pHit->TraceAttack(pev, pev->dmg * (gpGlobals->time - pev->dmgtime), (ptr->vecEndPos - pev->origin).Normalize(), ptr, DMG_ENERGYBEAM); + ApplyMultiDamage(pev, pev); + + if (pev->spawnflags & SF_BEAM_DECALS) + { + if (pHit->IsBSPModel()) + { + UTIL_DecalTrace(ptr, DECAL_BIGSHOT1 + RANDOM_LONG(0, 4)); + } + } + } + } + + pev->dmgtime = gpGlobals->time; } /* <777dd> ../cstrike/dlls/effects.cpp:753 */ -NOBODY void CLightning::DamageThink(void) +void CLightning::DamageThink(void) { -// { -// TraceResult tr; // 756 -// GetEndPos(CBeam *const this); // 757 -// GetStartPos(CBeam *const this); // 757 -// } + pev->nextthink = gpGlobals->time + 0.1; + + TraceResult tr; + UTIL_TraceLine(GetStartPos(), GetEndPos(), dont_ignore_monsters, NULL, &tr); + BeamDamage(&tr); } /* <77a90> ../cstrike/dlls/effects.cpp:763 */ -NOBODY void CLightning::Zap(const Vector &vecSrc, const Vector &vecDest) +void CLightning::Zap(const Vector &vecSrc, const Vector &vecDest) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 765 -// DoSparks(CBeam *const this, -// const Vector &start, -// const Vector &end); // 786 + MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); + WRITE_BYTE(TE_BEAMPOINTS); + WRITE_COORD(vecSrc.x); + WRITE_COORD(vecSrc.y); + WRITE_COORD(vecSrc.z); + WRITE_COORD(vecDest.x); + WRITE_COORD(vecDest.y); + WRITE_COORD(vecDest.z); + WRITE_SHORT(m_spriteTexture); + WRITE_BYTE(m_frameStart); // framestart + WRITE_BYTE((int)pev->framerate); // framerate + WRITE_BYTE((int)(m_life * 10.0)); // life + WRITE_BYTE(m_boltWidth); // width + WRITE_BYTE(m_noiseAmplitude); // noise + WRITE_BYTE((int)pev->rendercolor.x); // r, g, b + WRITE_BYTE((int)pev->rendercolor.y); // r, g, b + WRITE_BYTE((int)pev->rendercolor.z); // r, g, b + WRITE_BYTE((int)pev->renderamt); // brightness + WRITE_BYTE(m_speed); // speed + MESSAGE_END(); + + DoSparks(vecSrc, vecDest); } /* <77b45> ../cstrike/dlls/effects.cpp:789 */ -NOBODY void CLightning::RandomArea(void) -{ -// { -// int iLoops; // 791 -// { -// Vector vecSrc; // 795 -// Vector vecDir1; // 797 -// TraceResult tr1; // 799 -// Vector vecDir2; // 805 -// TraceResult tr2; // 810 -// Vector(Vector *const this, -// const Vector &v); // 795 -// Normalize(const Vector *const this); // 798 -// operator*(const Vector *const this, -// float fl); // 800 -// operator+(const Vector *const this, -// const Vector &v); // 800 -// DotProduct(Vector &a, -// const Vector &b); // 808 -// Normalize(const Vector *const this); // 809 -// operator*(const Vector *const this, -// float fl); // 811 -// operator+(const Vector *const this, -// const Vector &v); // 811 -// operator-(const Vector *const this, -// const Vector &v); // 816 -// Length(const Vector *const this); // 816 -// } -// } +void CLightning::RandomArea(void) +{ + for (int iLoops = 0; iLoops < 10; iLoops++) + { + Vector vecSrc = pev->origin; + Vector vecDir1 = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1)); + vecDir1 = vecDir1.Normalize(); + + TraceResult tr1; + UTIL_TraceLine(vecSrc, vecSrc + vecDir1 * m_radius, ignore_monsters, ENT(pev), &tr1); + + if (tr1.flFraction == 1.0f) + continue; + + Vector vecDir2; + do + { + vecDir2 = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1)); + } + while (DotProduct(vecDir1, vecDir2) > 0); + + vecDir2 = vecDir2.Normalize(); + + TraceResult tr2; + UTIL_TraceLine(vecSrc, vecSrc + vecDir2 * m_radius, ignore_monsters, ENT(pev), &tr2); + + if (tr2.flFraction == 1.0f) + continue; + + if ((tr1.vecEndPos - tr2.vecEndPos).Length() < m_radius * 0.1f) + continue; + + UTIL_TraceLine(tr1.vecEndPos, tr2.vecEndPos, ignore_monsters, ENT(pev), &tr2); + + if (tr2.flFraction != 1.0f) + continue; + + Zap(tr1.vecEndPos, tr2.vecEndPos); + break; + } } /* <77de8> ../cstrike/dlls/effects.cpp:831 */ -NOBODY void CLightning::RandomPoint(Vector &vecSrc) +void CLightning::RandomPoint(Vector &vecSrc) { -// { -// int iLoops; // 833 -// { -// Vector vecDir1; // 837 -// TraceResult tr1; // 839 -// Normalize(const Vector *const this); // 838 -// operator*(const Vector *const this, -// float fl); // 840 -// operator+(const Vector *const this, -// const Vector &v); // 840 -// operator-(const Vector *const this, -// const Vector &v); // 842 -// Length(const Vector *const this); // 842 -// } -// } + int iLoops = 0; + + for (iLoops = 0; iLoops < 10; iLoops++) + { + Vector vecDir1 = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1)); + vecDir1 = vecDir1.Normalize(); + + TraceResult tr1; + UTIL_TraceLine(vecSrc, vecSrc + vecDir1 * m_radius, ignore_monsters, ENT(pev), &tr1); + + if ((tr1.vecEndPos - vecSrc).Length() < m_radius * 0.1f) + continue; + + if (tr1.flFraction == 1.0f) + continue; + + Zap(vecSrc, tr1.vecEndPos); + break; + } } /* <78313> ../cstrike/dlls/effects.cpp:855 */ -NOBODY void CLightning::BeamUpdateVars(void) +void CLightning::BeamUpdateVars(void) { -// { -// int beamType; // 857 -// int pointStart; // 858 -// int pointEnd; // 858 -// edict_t *pStart; // 860 -// edict_t *pEnd; // 861 -// FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, -// const char *pszName); // 860 -// FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, -// const char *pszName); // 861 -// Instance(edict_t *pent); // 862 -// IsPointEntity(CBaseEntity *pEnt); // 862 -// Instance(edict_t *pent); // 863 -// IsPointEntity(CBaseEntity *pEnt); // 863 -// SetTexture(CBeam *const this, -// int spriteIndex); // 870 -// SetType(CBeam *const this, -// int type); // 892 -// SetStartPos(CBeam *const this, -// const Vector &pos); // 895 -// ENTINDEX(edict_t *pEdict); // 903 -// SetStartEntity(CBeam *const this, -// int entityIndex); // 903 -// ENTINDEX(edict_t *pEdict); // 904 -// SetEndEntity(CBeam *const this, -// int entityIndex); // 904 -// SetWidth(CBeam *const this, -// int width); // 909 -// SetNoise(CBeam *const this, -// int amplitude); // 910 -// SetScrollRate(CBeam *const this, -// int speed); // 912 -// SetFrame(CBeam *const this, -// float frame); // 911 -// SetFlags(CBeam *const this, -// int flags); // 916 -// SetEndEntity(CBeam *const this, -// int entityIndex); // 899 -// SetEndPos(CBeam *const this, -// const Vector &pos); // 897 -// SetFlags(CBeam *const this, -// int flags); // 914 -// } + int beamType; + int pointStart, pointEnd; + + edict_t *pStart = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(m_iszStartEntity)); + edict_t *pEnd = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(m_iszEndEntity)); + + pointStart = IsPointEntity(CBaseEntity::Instance(pStart)); + pointEnd = IsPointEntity(CBaseEntity::Instance(pEnd)); + + pev->skin = 0; + pev->sequence = 0; + pev->rendermode = 0; + pev->flags |= FL_CUSTOMENTITY; + pev->model = m_iszSpriteName; + SetTexture(m_spriteTexture); + + beamType = BEAM_ENTS; + if (pointStart || pointEnd) + { + // One point entity must be in pStart + if (!pointStart) + { + edict_t *pTemp; + // Swap start & end + pTemp = pStart; + pStart = pEnd; + pEnd = pTemp; + + int swap = pointStart; + pointStart = pointEnd; + pointEnd = swap; + } + if (!pointEnd) + beamType = BEAM_ENTPOINT; + else + beamType = BEAM_POINTS; + } + + SetType(beamType); + if (beamType == BEAM_POINTS || beamType == BEAM_ENTPOINT || beamType == BEAM_HOSE) + { + SetStartPos(pStart->v.origin); + + if (beamType == BEAM_POINTS || beamType == BEAM_HOSE) + SetEndPos(pEnd->v.origin); + else + SetEndEntity(ENTINDEX(pEnd)); + } + else + { + SetStartEntity(ENTINDEX(pStart)); + SetEndEntity(ENTINDEX(pEnd)); + } + + RelinkBeam(); + + SetWidth(m_boltWidth); + SetNoise(m_noiseAmplitude); + SetFrame(m_frameStart); + SetScrollRate(m_speed); + + if (pev->spawnflags & SF_BEAM_SHADEIN) + { + SetFlags(BEAM_FSHADEIN); + } + else if (pev->spawnflags & SF_BEAM_SHADEOUT) + { + SetFlags(BEAM_FSHADEOUT); + } } /* <786d8> ../cstrike/dlls/effects.cpp:920 */ @@ -560,86 +913,164 @@ LINK_ENTITY_TO_CLASS(env_laser, CLaser); IMPLEMENT_SAVERESTORE(CLaser, CBeam); /* <76b3f> ../cstrike/dlls/effects.cpp:931 */ -NOBODY void CLaser::Spawn_(void) +void CLaser::__MAKE_VHOOK(Spawn)(void) { -// Spawn(CLaser *const this); // 931 + if (FStringNull(pev->model)) + { + SetThink(&CLaser::SUB_Remove); + return; + } + + // Remove model & collisions + pev->solid = SOLID_NOT; + Precache(); + + SetThink(&CLaser::StrikeThink); + pev->flags |= FL_CUSTOMENTITY; + + PointsInit(pev->origin, pev->origin); + + if (!m_pSprite && m_iszSpriteName) + m_pSprite = CSprite::SpriteCreate(STRING(m_iszSpriteName), pev->origin, TRUE); + else + m_pSprite = NULL; + + if (m_pSprite) + m_pSprite->SetTransparency(kRenderGlow, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, pev->renderamt, pev->renderfx); + + if (pev->targetname && !(pev->spawnflags & SF_BEAM_STARTON)) + TurnOff(); + else + TurnOn(); } /* <73d82> ../cstrike/dlls/effects.cpp:960 */ -NOBODY void CLaser::Precache_(void) +void CLaser::__MAKE_VHOOK(Precache)(void) { -// Precache(CLaser *const this); // 960 + pev->modelindex = PRECACHE_MODEL((char *)STRING(pev->model)); + + if (m_iszSpriteName) + { + PRECACHE_MODEL((char *)STRING(m_iszSpriteName)); + } } /* <74ff2> ../cstrike/dlls/effects.cpp:968 */ -NOBODY void CLaser::KeyValue_(KeyValueData *pkvd) +void CLaser::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 970 -// FStrEq(const char *sz1, -// const char *sz2); // 975 -// KeyValue(CLaser *const this, -// KeyValueData *pkvd); // 968 -// atof(const char *__nptr); // 977 -// SetWidth(CBeam *const this, -// int width); // 977 + if (FStrEq(pkvd->szKeyName, "LaserTarget")) + { + pev->message = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "width")) + { + SetWidth(Q_atoi(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "NoiseAmplitude")) + { + SetNoise(Q_atoi(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "TextureScroll")) + { + SetScrollRate(Q_atoi(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "texture")) + { + pev->model = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "EndSprite")) + { + m_iszSpriteName = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "framestart")) + { + pev->frame = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "damage")) + { + pev->dmg = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBeam::KeyValue(pkvd); } /* <787a8> ../cstrike/dlls/effects.cpp:1015 */ -NOBODY int CLaser::IsOn(void) +int CLaser::IsOn(void) { + if (pev->effects & EF_NODRAW) + return 0; + + return 1; } /* <787c9> ../cstrike/dlls/effects.cpp:1023 */ -NOBODY void CLaser::TurnOff(void) +void CLaser::TurnOff(void) { -// TurnOff(CSprite *const this); // 1028 + pev->effects |= EF_NODRAW; + pev->nextthink = 0; + + if (m_pSprite) + m_pSprite->TurnOff(); } /* <78804> ../cstrike/dlls/effects.cpp:1032 */ -NOBODY void CLaser::TurnOn(void) +void CLaser::TurnOn(void) { -// TurnOn(CSprite *const this); // 1036 + pev->effects &= ~EF_NODRAW; + + if (m_pSprite) + m_pSprite->TurnOn(); + + pev->dmgtime = gpGlobals->time; + pev->nextthink = gpGlobals->time; } /* <75f0a> ../cstrike/dlls/effects.cpp:1042 */ -NOBODY void CLaser::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CLaser::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// int active; // 1044 -// IsOn(CLaser *const this); // 1044 -// TurnOff(CLaser *const this); // 1050 -// TurnOn(CLaser *const this); // 1054 -// } -// Use(CLaser *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 1042 + int active = IsOn(); + + if (!ShouldToggle(useType, active)) + return; + + if (active) + TurnOff(); + else + TurnOn(); } /* <78841> ../cstrike/dlls/effects.cpp:1059 */ -NOBODY void CLaser::FireAtPoint(TraceResult &tr) +void CLaser::FireAtPoint(TraceResult &tr) { -// SetEndPos(CBeam *const this, -// const Vector &pos); // 1061 -// GetStartPos(CBeam *const this); // 1066 -// DoSparks(CBeam *const this, -// const Vector &start, -// const Vector &end); // 1066 + SetEndPos(tr.vecEndPos); + + if (m_pSprite) + UTIL_SetOrigin(m_pSprite->pev, tr.vecEndPos); + + BeamDamage(&tr); + DoSparks(GetStartPos(), tr.vecEndPos); } /* <778f6> ../cstrike/dlls/effects.cpp:1069 */ -NOBODY void CLaser::StrikeThink(void) +void CLaser::StrikeThink(void) { -// { -// class CBaseEntity *pEnd; // 1071 -// TraceResult tr; // 1076 -// RandomTargetname(CBeam *const this, -// const char *szName); // 1071 -// FireAtPoint(CLaser *const this, -// TraceResult &tr); // 1079 -// } + CBaseEntity *pEnd = RandomTargetname(STRING(pev->message)); + + if (pEnd) + m_firePosition = pEnd->pev->origin; + + TraceResult tr; + UTIL_TraceLine(pev->origin, m_firePosition, dont_ignore_monsters, NULL, &tr); + FireAtPoint(tr); + pev->nextthink = gpGlobals->time + 0.1f; } /* <7894f> ../cstrike/dlls/effects.cpp:1099 */ @@ -649,37 +1080,95 @@ LINK_ENTITY_TO_CLASS(env_glow, CGlow); IMPLEMENT_SAVERESTORE(CGlow, CPointEntity); /* <735a6> ../cstrike/dlls/effects.cpp:1109 */ -NOBODY void CGlow::Spawn_(void) +void CGlow::__MAKE_VHOOK(Spawn)(void) { + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + + PRECACHE_MODEL((char *)STRING(pev->model)); + SET_MODEL(ENT(pev), STRING(pev->model)); + + m_maxFrame = (float)MODEL_FRAMES(pev->modelindex) - 1; + + if (m_maxFrame > 1.0f && pev->framerate != 0.0f) + { + pev->nextthink = gpGlobals->time + 0.1f; + } + + m_lastTime = gpGlobals->time; } /* <74606> ../cstrike/dlls/effects.cpp:1127 */ -NOBODY void CGlow::Think_(void) +void CGlow::__MAKE_VHOOK(Think)(void) { -// Animate(CGlow::Think(// float frames); // 1129 + Animate(pev->framerate * (gpGlobals->time - m_lastTime)); + + pev->nextthink = gpGlobals->time + 0.1f; + m_lastTime = gpGlobals->time; } /* <78a1f> ../cstrike/dlls/effects.cpp:1136 */ -NOBODY void CGlow::Animate(float frames) +void CGlow::Animate(float frames) { + if (m_maxFrame > 0) + pev->frame = fmod((float_precision)(pev->frame + frames), (float_precision)m_maxFrame); } /* <78a4a> ../cstrike/dlls/effects.cpp:1157 */ LINK_ENTITY_TO_CLASS(env_bombglow, CBombGlow); /* <735cd> ../cstrike/dlls/effects.cpp:1161 */ -NOBODY void CBombGlow::Spawn(void) +void CBombGlow::__MAKE_VHOOK(Spawn)(void) { +#ifdef REGAMEDLL_FIXES + PRECACHE_MODEL("sprites/flare1.spr"); +#endif // REGAMEDLLFIXES + + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + pev->nextthink = gpGlobals->time + 0.05; + pev->rendermode = kRenderGlow; + pev->rendercolor.x = 255; + pev->rendercolor.y = 15; + pev->rendercolor.z = 15; + pev->renderamt = 100; + pev->renderfx = kRenderFxNone; + + m_tmBeepPeriod = 2; + m_lastTime = gpGlobals->time; + m_bSetModel = false; } /* <73a40> ../cstrike/dlls/effects.cpp:1184 */ -NOBODY void CBombGlow::Think(void) +void CBombGlow::__MAKE_VHOOK(Think)(void) { -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 1215 + if (!m_bSetModel) + { + m_bSetModel = true; + + PRECACHE_MODEL("sprites/flare1.spr"); + SET_MODEL(ENT(pev), "sprites/flare1.spr"); + } + + pev->effects |= EF_NODRAW; + + if (gpGlobals->time > m_lastTime + m_tmBeepPeriod) + { + m_tmBeepPeriod *= 0.95f; + m_lastTime = gpGlobals->time; + + if (m_tmBeepPeriod < 0.1f) + m_tmBeepPeriod = 0.1f; + + pev->effects = 0; + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/c4_beep1.wav", VOL_NORM, 1.0); + } + + pev->nextthink = gpGlobals->time + 0.05f; } /* <78b1a> ../cstrike/dlls/effects.cpp:1226 */ @@ -689,100 +1178,193 @@ LINK_ENTITY_TO_CLASS(env_sprite, CSprite); IMPLEMENT_SAVERESTORE(CSprite, CPointEntity); /* <75dc8> ../cstrike/dlls/effects.cpp:1236 */ -NOBODY void CSprite::Spawn_(void) +void CSprite::__MAKE_VHOOK(Spawn)(void) { -// TurnOff(CSprite *const this); // 1248 -// TurnOn(CSprite *const this); // 1250 + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + + Precache(); + SET_MODEL(ENT(pev), STRING(pev->model)); + m_maxFrame = (float)MODEL_FRAMES(pev->modelindex) - 1; + + if (pev->targetname && !(pev->spawnflags & SF_SPRITE_STARTON)) + TurnOff(); + else + TurnOn(); + + // Worldcraft only sets y rotation, copy to Z + if (pev->angles.y != 0.0f && pev->angles.z == 0.0f) + { + pev->angles.z = pev->angles.y; + pev->angles.y = 0; + } } /* <75d55> ../cstrike/dlls/effects.cpp:1260 */ -NOBODY void CSprite::Restart_(void) +void CSprite::__MAKE_VHOOK(Restart)(void) { -// TurnOn(CSprite *const this); // 1270 -// Restart(CSprite *const this); // 1260 + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + + if (pev->targetname && !(pev->spawnflags & SF_SPRITE_STARTON)) + TurnOff(); + else + TurnOn(); } /* <74436> ../cstrike/dlls/effects.cpp:1273 */ -NOBODY void CSprite::Precache_(void) +void CSprite::__MAKE_VHOOK(Precache)(void) { -// SetAttachment(CSprite::Precache(// edict_t *pEntity, -// int attachment); // 1279 -// Precache(CSprite *const this); // 1273 + PRECACHE_MODEL((char *)STRING(pev->model)); + + if (pev->aiment) + { + SetAttachment(pev->aiment, pev->body); + } + else + { + pev->skin = 0; + pev->body = 0; + } } /* <78bea> ../cstrike/dlls/effects.cpp:1289 */ -NOBODY void CSprite::SpriteInit(const char *pSpriteName, const Vector &origin) +void CSprite::SpriteInit(const char *pSpriteName, const Vector &origin) { + pev->model = MAKE_STRING(pSpriteName); + pev->origin = origin; + Spawn(); } /* <78c1d> ../cstrike/dlls/effects.cpp:1296 */ -NOBODY CSprite *CSprite::SpriteCreate(const char *pSpriteName, const Vector &origin, BOOL animate) +CSprite *CSprite::SpriteCreate(const char *pSpriteName, const Vector &origin, BOOL animate) { -// { -// class CSprite *pSprite; // 1298 -// GetClassPtr(CSprite *a); // 1298 -// SpriteInit(CSprite *const this, -// const char *pSpriteName, -// const Vector &origin); // 1299 -// MAKE_STRING_CLASS(const char *str, -// entvars_t *pev); // 1300 -// TurnOn(CSprite *const this); // 1304 -// } + CSprite *pSprite = GetClassPtr((CSprite *)NULL); + pSprite->SpriteInit(pSpriteName, origin); + + if (pSprite->pev->classname) + RemoveEntityHashValue(pSprite->pev, STRING(pSprite->pev->classname), CLASSNAME); + + MAKE_STRING_CLASS("env_sprite", pSprite->pev); + AddEntityHashValue(pSprite->pev, STRING(pSprite->pev->classname), CLASSNAME); + + pSprite->pev->solid = SOLID_NOT; + pSprite->pev->movetype = MOVETYPE_NOCLIP; + + if (animate) + { + pSprite->TurnOn(); + } + + return pSprite; } /* <75679> ../cstrike/dlls/effects.cpp:1310 */ -NOBODY void CSprite::AnimateThink(void) +void CSprite::AnimateThink(void) { + Animate(pev->framerate * (gpGlobals->time - m_lastTime)); + pev->nextthink = gpGlobals->time + 0.1; + m_lastTime = gpGlobals->time; } /* <78d6b> ../cstrike/dlls/effects.cpp:1318 */ -NOBODY void CSprite::AnimateUntilDead(void) +void CSprite::AnimateUntilDead(void) { -// AnimateThink(CSprite *const this); // 1324 + if (gpGlobals->time > pev->dmgtime) + { + UTIL_Remove(this); + } + else + { + AnimateThink(); + pev->nextthink = gpGlobals->time; + } } /* <78de9> ../cstrike/dlls/effects.cpp:1329 */ -NOBODY void CSprite::Expand(float scaleSpeed, float fadeSpeed) +NOXREF void CSprite::Expand(float scaleSpeed, float fadeSpeed) { + pev->speed = scaleSpeed; + pev->health = fadeSpeed; + SetThink(&CSprite::ExpandThink); + + pev->nextthink = gpGlobals->time; + m_lastTime = gpGlobals->time; } /* <73e2e> ../cstrike/dlls/effects.cpp:1340 */ -NOBODY void CSprite::ExpandThink(void) +void CSprite::ExpandThink(void) { -// { -// float frametime; // 1342 -// } -// ExpandThink(CSprite *const this); // 1340 + float frametime = gpGlobals->time - m_lastTime; + + pev->scale += pev->speed * frametime; + pev->renderamt -= pev->health * frametime; + + if (pev->renderamt <= 0) + { + pev->renderamt = 0; + UTIL_Remove(this); + } + else + { + pev->nextthink = gpGlobals->time + 0.1f; + m_lastTime = gpGlobals->time; + } } /* <78e2e> ../cstrike/dlls/effects.cpp:1358 */ -NOBODY void CSprite::Animate(float frames) +void CSprite::Animate(float frames) { -// TurnOff(CSprite *const this); // 1365 + pev->frame += frames; + + if (pev->frame > m_maxFrame) + { + if (pev->spawnflags & SF_SPRITE_ONCE) + TurnOff(); + + else if (m_maxFrame > 0) + pev->frame = fmod((float_precision)pev->frame, (float_precision)m_maxFrame); + } } /* <78e73> ../cstrike/dlls/effects.cpp:1376 */ -NOBODY void CSprite::TurnOff(void) +void CSprite::TurnOff(void) { + pev->effects = EF_NODRAW; + pev->nextthink = 0; } /* <78e94> ../cstrike/dlls/effects.cpp:1383 */ -NOBODY void CSprite::TurnOn(void) +void CSprite::TurnOn(void) { + pev->effects = 0; + + if ((pev->framerate && m_maxFrame > 1) || (pev->spawnflags & SF_SPRITE_ONCE)) + { + SetThink(&CSprite::AnimateThink); + pev->nextthink = gpGlobals->time; + m_lastTime = gpGlobals->time; + } + + pev->frame = 0; } /* <75e27> ../cstrike/dlls/effects.cpp:1396 */ -NOBODY void CSprite::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CSprite::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// int on; // 1398 -// TurnOn(CSprite *const this); // 1407 -// } -// Use(CSprite *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 1396 + int on = pev->effects != EF_NODRAW; + + if (ShouldToggle(useType, on)) + { + if (on) + TurnOff(); + else + TurnOn(); + } } /* <7405a> ../cstrike/dlls/effects.cpp:1448 */ @@ -792,355 +1374,650 @@ IMPLEMENT_SAVERESTORE(CGibShooter, CBaseDelay); LINK_ENTITY_TO_CLASS(gibshooter, CGibShooter); /* <73dbb> ../cstrike/dlls/effects.cpp:1452 */ -NOBODY void CGibShooter::Precache_(void) +void CGibShooter::__MAKE_VHOOK(Precache)(void) { -// Precache(CGibShooter *const this); // 1452 + if (g_Language == LANGUAGE_GERMAN) + { + m_iGibModelIndex = PRECACHE_MODEL("models/germanygibs.mdl"); + } + else + { + m_iGibModelIndex = PRECACHE_MODEL("models/hgibs.mdl"); + } } /* <74886> ../cstrike/dlls/effects.cpp:1465 */ -NOBODY void CGibShooter::KeyValue_(KeyValueData *pkvd) +void CGibShooter::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 1467 -// FStrEq(const char *sz1, -// const char *sz2); // 1472 -// KeyValue(CGibShooter *const this, -// KeyValueData *pkvd); // 1465 -// atoi(const char *__nptr); // 1469 -// atof(const char *__nptr); // 1474 + if (FStrEq(pkvd->szKeyName, "m_iGibs")) + { + m_iGibs = m_iGibCapacity = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_flVelocity")) + { + m_flGibVelocity = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_flVariance")) + { + m_flVariance = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_flGibLife")) + { + m_flGibLife = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBaseDelay::KeyValue(pkvd); } /* <735f4> ../cstrike/dlls/effects.cpp:1493 */ -NOBODY void CGibShooter::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGibShooter::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { + SetThink(&CGibShooter::ShootThink); + pev->nextthink = gpGlobals->time; } /* <73cb5> ../cstrike/dlls/effects.cpp:1499 */ -NOBODY void CGibShooter::Spawn_(void) +void CGibShooter::__MAKE_VHOOK(Spawn)(void) { + Precache(); + + pev->solid = SOLID_NOT; + pev->effects = EF_NODRAW; + + if (m_flDelay == 0.0f) + { + m_flDelay = 0.1f; + } + + if (m_flGibLife == 0.0f) + { + m_flGibLife = 25; + } + + SetMovedir(pev); + pev->body = MODEL_FRAMES(m_iGibModelIndex); } /* <744ff> ../cstrike/dlls/effects.cpp:1521 */ -NOBODY CGib *CGibShooter::CreateGib_(void) +CGib *CGibShooter::__MAKE_VHOOK(CreateGib)(void) { -// { -// class CGib *pGib; // 1526 -// GetClassPtr(CGib *a); // 1526 -// } + if (CVAR_GET_FLOAT("violence_hgibs") == 0) + return NULL; + + CGib *pGib = GetClassPtr((CGib *)NULL); + + pGib->Spawn("models/hgibs.mdl"); + pGib->m_bloodColor = BLOOD_COLOR_RED; + + if (pev->body <= 1) + { + ALERT(at_aiconsole, "GibShooter Body is <= 1!\n"); + } + + // avoid throwing random amounts of the 0th gib. (skull). + pGib->pev->body = RANDOM_LONG(1, pev->body - 1); + + return pGib; } /* <75751> ../cstrike/dlls/effects.cpp:1541 */ -NOBODY void CGibShooter::ShootThink(void) -{ -// { -// Vector vecShootDir; // 1545 -// class CGib *pGib; // 1554 -// operator*(const Vector *const this, -// float fl); // 1549 -// operator*(const Vector *const this, -// float fl); // 1549 -// operator+(const Vector *const this, -// const Vector &v); // 1549 -// operator*(const Vector *const this, -// float fl); // 1550 -// operator*(const Vector *const this, -// float fl); // 1550 -// operator+(const Vector *const this, -// const Vector &v); // 1550 -// operator*(const Vector *const this, -// float fl); // 1551 -// operator*(const Vector *const this, -// float fl); // 1551 -// operator+(const Vector *const this, -// const Vector &v); // 1551 -// Normalize(const Vector *const this); // 1553 -// { -// float thinkTime; // 1564 -// operator*(const Vector *const this, -// float fl); // 1559 -// } -// } +void CGibShooter::ShootThink(void) +{ + pev->nextthink = m_flDelay + gpGlobals->time; + + Vector vecShootDir; + vecShootDir = pev->movedir; + + float rnd_right = RANDOM_FLOAT(-1, 1); + float rnd_forward = RANDOM_FLOAT(-1, 1); + float rnd_up = RANDOM_FLOAT(-1, 1); + + // right + vecShootDir[0] = (vecShootDir[0] + (rnd_right * gpGlobals->v_right[0]) * m_flVariance); + vecShootDir[1] = (vecShootDir[1] + (rnd_right * gpGlobals->v_right[1]) * m_flVariance); + vecShootDir[2] = (vecShootDir[2] + (rnd_right * gpGlobals->v_right[2]) * m_flVariance); + + // forward + vecShootDir[0] = (vecShootDir[0] + (rnd_forward * gpGlobals->v_forward[0]) * m_flVariance); + vecShootDir[1] = (vecShootDir[1] + (rnd_forward * gpGlobals->v_forward[1]) * m_flVariance); + vecShootDir[2] = (vecShootDir[2] + (rnd_forward * gpGlobals->v_forward[2]) * m_flVariance); + + // up + vecShootDir[0] = (vecShootDir[0] + (rnd_up * gpGlobals->v_up[0]) * m_flVariance); + vecShootDir[1] = (vecShootDir[1] + (rnd_up * gpGlobals->v_up[1]) * m_flVariance); + vecShootDir[2] = (vecShootDir[2] + (rnd_up * gpGlobals->v_up[2]) * m_flVariance); + + vecShootDir = vecShootDir.Normalize(); + CGib *pGib = CreateGib(); + + if (pGib) + { + pGib->pev->origin = pev->origin; + pGib->pev->velocity = vecShootDir * m_flGibVelocity; + + pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200); + pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300); + + float thinkTime = pGib->pev->nextthink - gpGlobals->time; + + pGib->m_lifeTime = (m_flGibLife * RANDOM_FLOAT(0.95, 1.05)); // +/- 5% + if (pGib->m_lifeTime < thinkTime) + { + pGib->pev->nextthink = gpGlobals->time + pGib->m_lifeTime; + pGib->m_lifeTime = 0; + } + + } + + if (--m_iGibs <= 0) + { + if (pev->spawnflags & SF_GIBSHOOTER_REPEATABLE) + { + m_iGibs = m_iGibCapacity; + SetThink(NULL); + pev->nextthink = gpGlobals->time; + } + else + { + SetThink(&CGibShooter::SUB_Remove); + pev->nextthink = gpGlobals->time; + } + } } /* <78f87> ../cstrike/dlls/effects.cpp:1600 */ LINK_ENTITY_TO_CLASS(env_shooter, CEnvShooter); /* <749e7> ../cstrike/dlls/effects.cpp:1602 */ -NOBODY void CEnvShooter::KeyValue_(KeyValueData *pkvd) +NOBODY void CEnvShooter::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// { -// int iNoise; // 1611 -// } -// FStrEq(const char *sz1, -// const char *sz2); // 1604 -// FStrEq(const char *sz1, -// const char *sz2); // 1609 -// KeyValue(CEnvShooter *const this, -// KeyValueData *pkvd); // 1602 + if (FStrEq(pkvd->szKeyName, "shootmodel")) + { + pev->model = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "shootsounds")) + { + int iNoise = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + + switch(iNoise) + { + case 0: + m_iGibMaterial = matGlass; + break; + case 1: + m_iGibMaterial = matWood; + break; + case 2: + m_iGibMaterial = matMetal; + break; + case 3: + m_iGibMaterial = matFlesh; + break; + case 4: + m_iGibMaterial = matRocks; + break; + + default: + case -1: + m_iGibMaterial = matNone; + break; + } + } + else + CGibShooter::KeyValue(pkvd); } /* <73cdc> ../cstrike/dlls/effects.cpp:1644 */ -NOBODY void CEnvShooter::Precache_(void) +void CEnvShooter::__MAKE_VHOOK(Precache)(void) { + m_iGibModelIndex = PRECACHE_MODEL((char *)STRING(pev->model)); + CBreakable::MaterialSoundPrecache((Materials)m_iGibMaterial); } /* <7464b> ../cstrike/dlls/effects.cpp:1651 */ -NOBODY CGib *CEnvShooter::CreateGib_(void) +CGib *CEnvShooter::__MAKE_VHOOK(CreateGib)(void) { -// { -// class CGib *pGib; // 1653 -// int bodyPart; // 1657 -// GetClassPtr(CGib *a); // 1653 -// } + CGib *pGib = GetClassPtr((CGib *)NULL); + + pGib->Spawn(STRING(pev->model)); + + int bodyPart = 0; + + if (pev->body > 1) + bodyPart = RANDOM_LONG(0, pev->body - 1); + + pGib->pev->body = bodyPart; + pGib->m_bloodColor = DONT_BLEED; + pGib->m_material = m_iGibMaterial; + + pGib->pev->rendermode = pev->rendermode; + pGib->pev->renderamt = pev->renderamt; + pGib->pev->rendercolor = pev->rendercolor; + pGib->pev->renderfx = pev->renderfx; + pGib->pev->scale = pev->scale; + pGib->pev->skin = pev->skin; + + return pGib; } /* <79057> ../cstrike/dlls/effects.cpp:1696 */ LINK_ENTITY_TO_CLASS(test_effect, CTestEffect); /* <73656> ../cstrike/dlls/effects.cpp:1698 */ -NOBODY void CTestEffect::Spawn_(void) +void CTestEffect::__MAKE_VHOOK(Spawn)(void) { + Precache(); } /* <7367c> ../cstrike/dlls/effects.cpp:1703 */ -NOBODY void CTestEffect::Precache_(void) +void CTestEffect::__MAKE_VHOOK(Precache)(void) { + PRECACHE_MODEL("sprites/lgtning.spr"); } /* <76e39> ../cstrike/dlls/effects.cpp:1708 */ -NOBODY void CTestEffect::TestThink(void) +void CTestEffect::TestThink(void) { -// { -// int i; // 1710 -// float t; // 1711 -// { -// class CBeam *pbeam; // 1715 -// TraceResult tr; // 1717 -// Vector vecSrc; // 1719 -// Vector vecDir; // 1720 -// Normalize(const Vector *const this); // 1721 -// BeamCreate(const char *pSpriteName, -// int width); // 1715 -// Vector(Vector *const this, -// const Vector &v); // 1719 -// operator*(const Vector *const this, -// float fl); // 1722 -// operator+(const Vector *const this, -// const Vector &v); // 1722 -// PointsInit(CBeam *const this, -// const Vector &start, -// const Vector &end); // 1724 -// SetColor(CBeam *const this, -// int r, -// int g, -// int b); // 1726 -// SetWidth(CBeam *const this, -// int width); // 1727 -// SetScrollRate(CBeam *const this, -// int speed); // 1728 -// } -// SetBrightness(CBeam *const this, -// int brightness); // 1740 -// } + int i; + float t = (gpGlobals->time - m_flStartTime); + + if (m_iBeam < 24) + { + CBeam *pbeam = CBeam::BeamCreate("sprites/lgtning.spr", 100); + + TraceResult tr; + Vector vecSrc = pev->origin; + Vector vecDir = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1),RANDOM_FLOAT(-1, 1)); + vecDir = vecDir.Normalize(); + + UTIL_TraceLine(vecSrc, vecSrc + vecDir * 128, ignore_monsters, ENT(pev), &tr); + + pbeam->PointsInit(vecSrc, tr.vecEndPos); + pbeam->SetColor(255, 180, 100); + pbeam->SetWidth(100); + pbeam->SetScrollRate(12); + + m_flBeamTime[m_iBeam] = gpGlobals->time; + m_pBeam[m_iBeam] = pbeam; + m_iBeam++; + + } + + if (t < 3.0) + { + for (i = 0; i < m_iBeam; i++) + { + t = (gpGlobals->time - m_flBeamTime[i]) / (3 + m_flStartTime - m_flBeamTime[i]); + m_pBeam[i]->SetBrightness(255 * t); + } + pev->nextthink = gpGlobals->time + 0.1f; + } + else + { + for (i = 0; i < m_iBeam; i++) + { + UTIL_Remove(m_pBeam[i]); + } + + m_flStartTime = gpGlobals->time; + m_iBeam = 0; + SetThink(NULL); + } } /* <736a2> ../cstrike/dlls/effects.cpp:1759 */ -NOBODY void CTestEffect::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CTestEffect::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { + SetThink(&CTestEffect::TestThink); + + pev->nextthink = gpGlobals->time + 0.1f; + m_flStartTime = gpGlobals->time; } /* <79127> ../cstrike/dlls/effects.cpp:1788 */ LINK_ENTITY_TO_CLASS(env_blood, CBlood); /* <73c8f> ../cstrike/dlls/effects.cpp:1797 */ -NOBODY void CBlood::Spawn_(void) +void CBlood::__MAKE_VHOOK(Spawn)(void) { + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + + SetMovedir(pev); } /* <74c34> ../cstrike/dlls/effects.cpp:1807 */ -NOBODY void CBlood::KeyValue_(KeyValueData *pkvd) +void CBlood::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 1809 -// FStrEq(const char *sz1, -// const char *sz2); // 1824 -// KeyValue(CBaseEntity *const this, -// KeyValueData *pkvd); // 1830 -// { -// int color; // 1811 -// atoi(const char *__nptr); // 1811 -// SetColor(CBlood *const this, -// int color); // 1818 -// SetColor(CBlood *const this, -// int color); // 1815 -// } -// KeyValue(CBlood *const this, -// KeyValueData *pkvd); // 1807 + if (FStrEq(pkvd->szKeyName, "color")) + { + int color = Q_atoi(pkvd->szValue); + switch (color) + { + case 1: + SetColor(BLOOD_COLOR_YELLOW); + break; + default: + SetColor(BLOOD_COLOR_RED); + break; + } + + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "amount")) + { + SetBloodAmount(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else + CPointEntity::KeyValue(pkvd); } /* <791f7> ../cstrike/dlls/effects.cpp:1834 */ -NOBODY Vector CBlood::Direction(void) +Vector CBlood::Direction(void) { + if (pev->spawnflags & SF_BLOOD_RANDOM) + return UTIL_RandomBloodVector(); + + return pev->movedir; } /* <79256> ../cstrike/dlls/effects.cpp:1843 */ -NOBODY Vector CBlood::BloodPosition(CBaseEntity *pActivator) +Vector CBlood::BloodPosition(CBaseEntity *pActivator) { -// { -// edict_t *pPlayer; // 1847 -// operator+(const Vector *const this, -// const Vector &v); // 1856 -// operator+(const Vector *const this, -// const Vector &v); // 1856 -// edict(CBaseEntity *const this); // 1851 -// } -// Vector(Vector *const this, -// const Vector &v); // 1859 + if (pev->spawnflags & SF_BLOOD_PLAYER) + { + edict_t *pPlayer; + + if (pActivator && pActivator->IsPlayer()) + pPlayer = pActivator->edict(); + else + pPlayer = INDEXENT(1); + + if (pPlayer) + { + return (pPlayer->v.origin + pPlayer->v.view_ofs) + Vector(RANDOM_FLOAT(-10, 10), RANDOM_FLOAT(-10, 10), RANDOM_FLOAT(-10, 10)); + } + } + + return pev->origin; } /* <79351> ../cstrike/dlls/effects.cpp:1863 */ -NOBODY void CBlood::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CBlood::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// Color(CBlood *const this); // 1866 -// Direction(CBlood *const this); // 1866 -// { -// Vector forward; // 1872 -// Vector start; // 1873 -// TraceResult tr; // 1874 -// Direction(CBlood *const this); // 1872 -// BloodAmount(CBlood *const this); // 1876 -// operator*(const Vector *const this, -// float fl); // 1876 -// operator*(const Vector *const this, -// float fl); // 1876 -// operator+(const Vector *const this, -// const Vector &v); // 1876 -// Color(CBlood *const this); // 1878 -// } -// Direction(CBlood *const this); // 1868 -// Color(CBlood *const this); // 1868 + if (pev->spawnflags & SF_BLOOD_STREAM) + UTIL_BloodStream(BloodPosition(pActivator), Direction(), (Color() == BLOOD_COLOR_RED) ? 70 : Color(), (int)BloodAmount()); + else + UTIL_BloodDrips(BloodPosition(pActivator), Direction(), Color(), (int)BloodAmount()); + + if (pev->spawnflags & SF_BLOOD_DECAL) + { + Vector forward = Direction(); + Vector start = BloodPosition(pActivator); + + TraceResult tr; + UTIL_TraceLine(start, start + forward * BloodAmount() * 2, ignore_monsters, NULL, &tr); + + if (tr.flFraction != 1.0f) + { + UTIL_BloodDecalTrace(&tr, Color()); + } + } } /* <79594> ../cstrike/dlls/effects.cpp:1905 */ LINK_ENTITY_TO_CLASS(env_shake, CShake); /* <73705> ../cstrike/dlls/effects.cpp:1919 */ -NOBODY void CShake::Spawn_(void) +void CShake::__MAKE_VHOOK(Spawn)(void) { + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; + + if (pev->spawnflags & SF_SHAKE_EVERYONE) + pev->dmg = 0; } /* <74d76> ../cstrike/dlls/effects.cpp:1931 */ -NOBODY void CShake::KeyValue_(KeyValueData *pkvd) +void CShake::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 1933 -// FStrEq(const char *sz1, -// const char *sz2); // 1938 -// KeyValue(CShake *const this, -// KeyValueData *pkvd); // 1931 -// atof(const char *__nptr); // 1935 -// atof(const char *__nptr); // 1940 + if (FStrEq(pkvd->szKeyName, "amplitude")) + { + SetAmplitude(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "frequency")) + { + SetFrequency(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "duration")) + { + SetDuration(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "radius")) + { + SetRadius(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else + CPointEntity::KeyValue(pkvd); } /* <73c2d> ../cstrike/dlls/effects.cpp:1958 */ -NOBODY void CShake::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CShake::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { + UTIL_ScreenShake(pev->origin, Amplitude(), Frequency(), Duration(), Radius()); } /* <79664> ../cstrike/dlls/effects.cpp:1979 */ LINK_ENTITY_TO_CLASS(env_fade, CFade); /* <7372b> ../cstrike/dlls/effects.cpp:1987 */ -NOBODY void CFade::Spawn_(void) +void CFade::__MAKE_VHOOK(Spawn)(void) { + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = 0; + pev->frame = 0; } /* <74efa> ../cstrike/dlls/effects.cpp:1996 */ -NOBODY void CFade::KeyValue_(KeyValueData *pkvd) +void CFade::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 1998 -// FStrEq(const char *sz1, -// const char *sz2); // 2003 -// KeyValue(CBaseEntity *const this, -// KeyValueData *pkvd); // 2009 -// atof(const char *__nptr); // 2000 -// KeyValue(CFade *const this, -// KeyValueData *pkvd); // 1996 + if (FStrEq(pkvd->szKeyName, "duration")) + { + SetDuration(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "holdtime")) + { + SetHoldTime(Q_atof(pkvd->szValue)); + pkvd->fHandled = TRUE; + } + else + CPointEntity::KeyValue(pkvd); } /* <73bb4> ../cstrike/dlls/effects.cpp:2013 */ -NOBODY void CFade::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CFade::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// int fadeFlags; // 2015 -// } + int fadeFlags = 0; + + if (!(pev->spawnflags & SF_FADE_IN)) + fadeFlags |= FFADE_OUT; + + if (pev->spawnflags & SF_FADE_MODULATE) + fadeFlags |= FFADE_MODULATE; + + if (pev->spawnflags & SF_FADE_ONLYONE) + { + if (pActivator->IsNetClient()) + { + UTIL_ScreenFade(pActivator, pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, fadeFlags); + } + } + else + UTIL_ScreenFadeAll(pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, fadeFlags); + + SUB_UseTargets(this, USE_TOGGLE, 0); } /* <79734> ../cstrike/dlls/effects.cpp:2048 */ LINK_ENTITY_TO_CLASS(env_message, CMessage); /* <73751> ../cstrike/dlls/effects.cpp:2051 */ -NOBODY void CMessage::Spawn_(void) +void CMessage::__MAKE_VHOOK(Spawn)(void) { + Precache(); + + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + + switch (pev->impulse) + { + case 1: // Medium radius + pev->speed = ATTN_STATIC; + break; + + case 2: // Large radius + pev->speed = ATTN_NORM; + break; + + case 3: //EVERYWHERE + pev->speed = ATTN_NONE; + break; + + default: + case 0: // Small radius + pev->speed = ATTN_IDLE; + break; + } + pev->impulse = 0; + + // No volume, use normal + if (pev->scale <= 0.0f) + pev->scale = 1.0; } /* <73df7> ../cstrike/dlls/effects.cpp:2085 */ -NOBODY void CMessage::Precache_(void) +void CMessage::__MAKE_VHOOK(Precache)(void) { -// Precache(CMessage *const this); // 2085 + if (pev->noise) + { + PRECACHE_SOUND((char *)STRING(pev->noise)); + } } /* <74765> ../cstrike/dlls/effects.cpp:2091 */ -NOBODY void CMessage::KeyValue_(KeyValueData *pkvd) +void CMessage::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 2093 -// FStrEq(const char *sz1, -// const char *sz2); // 2098 -// KeyValue(CMessage *const this, -// KeyValueData *pkvd); // 2091 -// atof(const char *__nptr); // 2100 + if (FStrEq(pkvd->szKeyName, "messagesound")) + { + pev->noise = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "messagevolume")) + { + pev->scale = Q_atof(pkvd->szValue) * 0.1; + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "messageattenuation")) + { + pev->impulse = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CPointEntity::KeyValue(pkvd); } /* <73aa5> ../cstrike/dlls/effects.cpp:2113 */ -NOBODY void CMessage::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CMessage::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// class CBaseEntity *pPlayer; // 2115 -// Instance(edict_t *pent); // 2125 -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 2132 -// } + CBaseEntity *pPlayer = NULL; + + if (pev->spawnflags & SF_MESSAGE_ALL) + UTIL_ShowMessageAll(STRING(pev->message)); + else + { + if (pActivator && pActivator->IsPlayer()) + pPlayer = pActivator; + else + { + pPlayer = CBaseEntity::Instance(INDEXENT(1)); + } + + if (pPlayer) + UTIL_ShowMessage(STRING(pev->message), pPlayer); + } + if (pev->noise) + { + EMIT_SOUND(edict(), CHAN_BODY, STRING(pev->noise), pev->scale, pev->speed); + } + if (pev->spawnflags & SF_MESSAGE_ONCE) + UTIL_Remove(this); + + SUB_UseTargets(this, USE_TOGGLE, 0); } /* <79804> ../cstrike/dlls/effects.cpp:2160 */ LINK_ENTITY_TO_CLASS(env_funnel, CEnvFunnel); /* <73778> ../cstrike/dlls/effects.cpp:2155 */ -NOBODY void CEnvFunnel::Precache_(void) +void CEnvFunnel::__MAKE_VHOOK(Precache)(void) { + m_iSprite = PRECACHE_MODEL("sprites/flare6.spr"); } /* <7379f> ../cstrike/dlls/effects.cpp:2162 */ -NOBODY void CEnvFunnel::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CEnvFunnel::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2164 + MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); + WRITE_BYTE(TE_LARGEFUNNEL); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT(m_iSprite); + + // funnel flows in reverse? + if (pev->spawnflags & SF_FUNNEL_REVERSE) + { + WRITE_SHORT(1); + } + else + { + WRITE_SHORT(0); + } + + + MESSAGE_END(); + + SetThink(&CEnvFunnel::SUB_Remove); + pev->nextthink = gpGlobals->time; } /* <7382b> ../cstrike/dlls/effects.cpp:2187 */ -NOBODY void CEnvFunnel::Spawn_(void) +void CEnvFunnel::__MAKE_VHOOK(Spawn)(void) { + Precache(); + pev->solid = SOLID_NOT; + pev->effects = EF_NODRAW; } /* <73852> ../cstrike/dlls/effects.cpp:2207 */ -NOBODY void CEnvBeverage::Precache_(void) +void CEnvBeverage::__MAKE_VHOOK(Precache)(void) { PRECACHE_MODEL("models/can.mdl"); PRECACHE_SOUND("weapons/g_bounce3.wav"); @@ -1150,70 +2027,115 @@ NOBODY void CEnvBeverage::Precache_(void) LINK_ENTITY_TO_CLASS(env_beverage, CEnvBeverage); /* <7439c> ../cstrike/dlls/effects.cpp:2215 */ -NOBODY void CEnvBeverage::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CEnvBeverage::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// class CBaseEntity *pCan; // 2223 -// } -// Use(CEnvBeverage *const this, -// class CBaseEntity *pActivator, -// class CBaseEntity *pCaller, -// USE_TYPE useType, -// float value); // 2215 + if (pev->frags != 0.0f || pev->health <= 0.0f) + { + // no more cans while one is waiting in the dispenser, or if I'm out of cans. + return; + } + + CBaseEntity *pCan = CBaseEntity::Create("item_sodacan", pev->origin, pev->angles, edict()); + + if (pev->skin == 6) + { + // random + pCan->pev->skin = RANDOM_LONG(0, 5); + } + else + pCan->pev->skin = pev->skin; + + pev->frags = 1; + pev->health--; } /* <73879> ../cstrike/dlls/effects.cpp:2242 */ -NOBODY void CEnvBeverage::Spawn_(void) +void CEnvBeverage::__MAKE_VHOOK(Spawn)(void) { + Precache(); + pev->solid = SOLID_NOT; + pev->effects = EF_NODRAW; + pev->frags = 0; + + if (pev->health == 0.0f) + { + pev->health = 10; + } } /* <738a0> ../cstrike/dlls/effects.cpp:2267 */ -NOBODY void CItemSoda::Precache_(void) +void CItemSoda::__MAKE_VHOOK(Precache)(void) { + ; } /* <799a4> ../cstrike/dlls/effects.cpp:2271 */ LINK_ENTITY_TO_CLASS(item_sodacan, CItemSoda); /* <738c6> ../cstrike/dlls/effects.cpp:2273 */ -NOBODY void CItemSoda::Spawn_(void) +void CItemSoda::__MAKE_VHOOK(Spawn)(void) { -// Vector(Vector::Spawn(// float X, -// float Y, -// float Z); // 2280 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 2280 + Precache(); + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_TOSS; + + SET_MODEL(ENT(pev), "models/can.mdl"); + UTIL_SetSize(pev, Vector(0, 0, 0), Vector(0, 0, 0)); + + SetThink(&CItemSoda::CanThink); + pev->nextthink = gpGlobals->time + 0.5f; } /* <73961> ../cstrike/dlls/effects.cpp:2286 */ -NOBODY void CItemSoda::CanThink(void) +void CItemSoda::CanThink(void) { -// EMIT_SOUND(edict_t *entity, -// int channel, -// const char *sample, -// float volume, -// float attenuation); // 2288 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 2291 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 2291 + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/g_bounce3.wav", VOL_NORM, ATTN_NORM); + + pev->solid = SOLID_TRIGGER; + UTIL_SetSize(pev, Vector(-8, -8, 0), Vector(8, 8, 8)); + + SetThink(NULL); + SetTouch(&CItemSoda::CanTouch); } /* <7431d> ../cstrike/dlls/effects.cpp:2296 */ -NOBODY void CItemSoda::CanTouch(CBaseEntity *pOther) +void CItemSoda::CanTouch(CBaseEntity *pOther) { -// CanTouch(CItemSoda *const this, -// class CBaseEntity *pOther); // 2296 + if (!pOther->IsPlayer()) + { + return; + } + + // spoit sound here + pOther->TakeHealth(1, DMG_GENERIC);// a bit of health. + + if (!FNullEnt(pev->owner)) + { + // tell the machine the can was taken + pev->owner->v.frags = 0; + } + + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; + pev->effects = EF_NODRAW; + + SetTouch(NULL); + SetThink(&CItemSoda::SUB_Remove); + pev->nextthink = gpGlobals->time; } #ifdef HOOK_GAMEDLL +void CBombGlow::Spawn(void) +{ + Spawn_(); +} + +void CBombGlow::Think(void) +{ + Think_(); +} + void CSprite::Spawn(void) { Spawn_(); diff --git a/regamedll/dlls/effects.h b/regamedll/dlls/effects.h index c77f1491..c5606825 100644 --- a/regamedll/dlls/effects.h +++ b/regamedll/dlls/effects.h @@ -72,16 +72,16 @@ class CSprite: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void Restart(void); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual void Precache(void); + virtual void Restart(void); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -96,19 +96,19 @@ public: if (pev->spawnflags & SF_SPRITE_TEMPORARY) flags = FCAP_DONT_SAVE; - return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION)|flags; + return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | flags; } void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #endif // HOOK_GAMEDLL public: - NOBODY void EXPORT AnimateThink(void); - NOBODY void EXPORT ExpandThink(void); + void EXPORT AnimateThink(void); + void EXPORT ExpandThink(void); - NOBODY void Animate(float frames); - NOBODY void Expand(float scaleSpeed, float fadeSpeed); - NOBODY void SpriteInit(const char *pSpriteName, const Vector &origin); + void Animate(float frames); + NOXREF void Expand(float scaleSpeed, float fadeSpeed); + void SpriteInit(const char *pSpriteName, const Vector &origin); void SetAttachment(edict_t *pEntity, int attachment) { @@ -120,8 +120,8 @@ public: pev->movetype = MOVETYPE_FOLLOW; } } - NOBODY void TurnOff(void); - NOBODY void TurnOn(void); + void TurnOff(void); + void TurnOn(void); float Frames(void) { return m_maxFrame; @@ -161,8 +161,8 @@ public: pev->nextthink = gpGlobals->time; } - NOBODY void EXPORT AnimateUntilDead(void); - NOBODY static CSprite *SpriteCreate(const char *pSpriteName, const Vector &origin, BOOL animate); + void EXPORT AnimateUntilDead(void); + static CSprite *SpriteCreate(const char *pSpriteName, const Vector &origin, BOOL animate); static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[2]; @@ -177,13 +177,13 @@ private: class CBeam: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual void Precache(void); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual Vector Center(void) + virtual Vector Center(void) { return Center_(); } @@ -198,7 +198,7 @@ public: if (pev->spawnflags & SF_BEAM_TEMPORARY) flags = FCAP_DONT_SAVE; - return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION)|flags; + return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | flags; } Vector Center_(void) { @@ -208,15 +208,15 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void EXPORT TriggerTouch(CBaseEntity *pOther); + void EXPORT TriggerTouch(CBaseEntity *pOther); void SetType(int type) { - pev->rendermode = (pev->rendermode & 0xF0)|(type & 0x0F); + pev->rendermode = (pev->rendermode & 0xF0) | (type & 0x0F); } void SetFlags(int flags) { - pev->rendermode = (pev->rendermode & 0x0F)|(flags&0xF0); + pev->rendermode = (pev->rendermode & 0x0F) | (flags & 0xF0); } void SetStartPos(const Vector &pos) { @@ -226,8 +226,8 @@ public: { pev->angles = pos; } - NOBODY void SetStartEntity(int entityIndex); - NOBODY void SetEndEntity(int entityIndex); + void SetStartEntity(int entityIndex); + void SetEndEntity(int entityIndex); void SetStartAttachment(int attachment) { pev->sequence = (pev->sequence & 0x0FFF) | ((attachment & 0xF) << 12); @@ -283,8 +283,8 @@ public: return pev->skin & 0xFFF; } - NOBODY const Vector &GetStartPos(void); - NOBODY const Vector &GetEndPos(void); + const Vector &GetStartPos(void); + const Vector &GetEndPos(void); int GetTexture(void) { @@ -311,17 +311,17 @@ public: return pev->animtime; } - NOBODY void RelinkBeam(void); - NOBODY void DoSparks(const Vector &start, const Vector &end); - NOBODY CBaseEntity *RandomTargetname(const char *szName); - NOBODY void BeamDamage(TraceResult *ptr); - NOBODY void BeamInit(const char *pSpriteName, int width); - NOBODY void PointsInit(const Vector &start, const Vector &end); - NOBODY void PointEntInit(const Vector &start, int endIndex); - NOBODY void EntsInit(int startIndex, int endIndex); - NOBODY void HoseInit(const Vector &start, const Vector &direction); + void RelinkBeam(void); + void DoSparks(const Vector &start, const Vector &end); + CBaseEntity *RandomTargetname(const char *szName); + void BeamDamage(TraceResult *ptr); + void BeamInit(const char *pSpriteName, int width); + void PointsInit(const Vector &start, const Vector &end); + void PointEntInit(const Vector &start, int endIndex); + void EntsInit(int startIndex, int endIndex); + void HoseInit(const Vector &start, const Vector &direction); - NOBODY static CBeam *BeamCreate(const char *pSpriteName, int width); + static CBeam *BeamCreate(const char *pSpriteName, int width); void LiveForTime(float time) { @@ -341,12 +341,12 @@ public: class CLaser: public CBeam { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -360,12 +360,12 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void TurnOn(void); - NOBODY void TurnOff(void); - NOBODY int IsOn(void); + void TurnOn(void); + void TurnOff(void); + int IsOn(void); - NOBODY void FireAtPoint(TraceResult &point); - NOBODY void EXPORT StrikeThink(void); + void FireAtPoint(TraceResult &point); + void EXPORT StrikeThink(void); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[3]; @@ -381,16 +381,16 @@ public: class CBubbling: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -401,7 +401,7 @@ public: int Restore_(CRestore &restore); int ObjectCaps_(void) { - return CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; + return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION); } void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); @@ -425,12 +425,12 @@ public: class CLightning: public CBeam { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual void Activate(void); + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual void Activate(void); #ifdef HOOK_GAMEDLL @@ -486,10 +486,10 @@ public: class CGlow: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual void Think(void); + virtual void Spawn(void); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual void Think(void); #ifdef HOOK_GAMEDLL @@ -500,7 +500,7 @@ public: #endif // HOOK_GAMEDLL - NOBODY void Animate(float frames); + void Animate(float frames); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[2]; @@ -517,6 +517,13 @@ public: virtual void Spawn(void); virtual void Think(void); +#ifdef HOOK_GAMEDLL + + void Spawn_(void); + void Think_(void); + +#endif // HOOK_GAMEDLL + public: float m_lastTime; float m_tmBeepPeriod; @@ -571,7 +578,7 @@ class CEnvShooter: public CGibShooter public: virtual void Precache(void); virtual void KeyValue(KeyValueData *pkvd); - CGib *CreateGib(void); + virtual CGib *CreateGib(void); #ifdef HOOK_GAMEDLL @@ -589,14 +596,16 @@ public: class CTestEffect: public CBaseDelay { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void Precache(void); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + #endif // HOOK_GAMEDLL public: @@ -617,14 +626,16 @@ public: class CBlood: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL + void Spawn_(void); void KeyValue_(KeyValueData *pkvd); void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + #endif // HOOK_GAMEDLL public: @@ -659,9 +670,9 @@ public: class CShake: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -719,14 +730,16 @@ public: class CFade: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL + void Spawn_(void); void KeyValue_(KeyValueData *pkvd); void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + #endif // HOOK_GAMEDLL public: @@ -757,16 +770,18 @@ public: class CMessage: public CPointEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); void KeyValue_(KeyValueData *pkvd); void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + #endif // HOOK_GAMEDLL };/* size: 152, cachelines: 3, members: 1 */ @@ -775,9 +790,9 @@ public: class CEnvFunnel: public CBaseDelay { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void Precache(void); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -796,9 +811,9 @@ public: class CEnvBeverage: public CBaseDelay { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void Precache(void); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -814,12 +829,14 @@ public: class CItemSoda: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); + virtual void Spawn(void); + virtual void Precache(void); #ifdef HOOK_GAMEDLL + void Spawn_(void); void Precache_(void); + #endif // HOOK_GAMEDLL public: @@ -828,6 +845,27 @@ public: };/* size: 152, cachelines: 3, members: 1 */ -NOBODY int IsPointEntity(CBaseEntity *pEnt); +int IsPointEntity(CBaseEntity *pEnt); + +// linked objects +C_DLLEXPORT void info_target(entvars_t *pev); +C_DLLEXPORT void env_bubbles(entvars_t *pev); +C_DLLEXPORT void beam(entvars_t *pev); +C_DLLEXPORT void env_lightning(entvars_t *pev); +C_DLLEXPORT void env_beam(entvars_t *pev); +C_DLLEXPORT void env_laser(entvars_t *pev); +C_DLLEXPORT void env_glow(entvars_t *pev); +C_DLLEXPORT void env_bombglow(entvars_t *pev); +C_DLLEXPORT void env_sprite(entvars_t *pev); +C_DLLEXPORT void gibshooter(entvars_t *pev); +C_DLLEXPORT void env_shooter(entvars_t *pev); +C_DLLEXPORT void test_effect(entvars_t *pev); +C_DLLEXPORT void env_blood(entvars_t *pev); +C_DLLEXPORT void env_shake(entvars_t *pev); +C_DLLEXPORT void env_fade(entvars_t *pev); +C_DLLEXPORT void env_message(entvars_t *pev); +C_DLLEXPORT void env_funnel(entvars_t *pev); +C_DLLEXPORT void env_beverage(entvars_t *pev); +C_DLLEXPORT void item_sodacan(entvars_t *pev); #endif // EFFECTS_H diff --git a/regamedll/dlls/enginecallback.h b/regamedll/dlls/enginecallback.h index de93921f..b701538c 100644 --- a/regamedll/dlls/enginecallback.h +++ b/regamedll/dlls/enginecallback.h @@ -85,8 +85,12 @@ 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_FILE_SIZE (*g_engfuncs.pfnGetFileSize) #define GET_APPROX_WAVE_PLAY_LEN (*g_engfuncs.pfnGetApproxWavePlayLen) #define IS_CAREER_MATCH (*g_engfuncs.pfnIsCareerMatch) +#define GET_LOCALIZED_STRING_LENGTH (*g_engfuncs.pfnGetLocalizedStringLength) +#define REGISTER_TUTOR_MESSAGE_SHOWN (*g_engfuncs.pfnRegisterTutorMessageShown) +#define GET_TIMES_TUTOR_MESSAGE_SHOWN (*g_engfuncs.pfnGetTimesTutorMessageShown) #define ENG_CHECK_PARM (*g_engfuncs.pfnEngCheckParm) /* <472a4> ../cstrike/dlls/enginecallback.h:77 */ @@ -157,6 +161,7 @@ inline void *GET_PRIVATE(edict_t *pent) #define SET_KEY_VALUE (*g_engfuncs.pfnSetKeyValue) #define SET_CLIENT_KEY_VALUE (*g_engfuncs.pfnSetClientKeyValue) #define IS_MAP_VALID (*g_engfuncs.pfnIsMapValid) +#define STATIC_DECAL (*g_engfuncs.pfnStaticDecal) #define IS_DEDICATED_SERVER (*g_engfuncs.pfnIsDedicatedServer) #define PRECACHE_EVENT (*g_engfuncs.pfnPrecacheEvent) #define PLAYBACK_EVENT_FULL (*g_engfuncs.pfnPlaybackEvent) @@ -171,6 +176,7 @@ inline void *GET_PRIVATE(edict_t *pent) #define DELTA_FINDFIELD (*g_engfuncs.pfnDeltaFindField) #define DELTA_SETBYINDEX (*g_engfuncs.pfnDeltaSetFieldByIndex) #define DELTA_UNSETBYINDEX (*g_engfuncs.pfnDeltaUnsetFieldByIndex) +#define REMOVE_KEY_VALUE (*g_engfuncs.pfnInfo_RemoveKey) #define SET_PHYSICS_KEY_VALUE (*g_engfuncs.pfnSetPhysicsKeyValue) #define ENGINE_GETPHYSINFO (*g_engfuncs.pfnGetPhysicsInfoString) #define ENGINE_SETGROUPMASK (*g_engfuncs.pfnSetGroupMask) diff --git a/regamedll/dlls/explode.cpp b/regamedll/dlls/explode.cpp index 782b12fd..f75a3c09 100644 --- a/regamedll/dlls/explode.cpp +++ b/regamedll/dlls/explode.cpp @@ -21,25 +21,58 @@ TYPEDESCRIPTION (*CEnvExplosion::pm_SaveData)[2]; LINK_ENTITY_TO_CLASS(spark_shower, CShower); /* <7f49c> ../cstrike/dlls/explode.cpp:39 */ -NOBODY void CShower::Spawn_(void) +void CShower::__MAKE_VHOOK(Spawn)(void) { -// operator*(float fl, -// const Vector &v); // 41 -// edict(CBaseEntity *const this); // 52 + pev->velocity = RANDOM_FLOAT(200, 300) * pev->angles; + pev->velocity.x += RANDOM_FLOAT(-100, 100); + pev->velocity.y += RANDOM_FLOAT(-100, 100); + + if (pev->velocity.z >= 0) + pev->velocity.z += 200; + else + pev->velocity.z -= 200; + + pev->movetype = MOVETYPE_BOUNCE; + pev->gravity = 0.5f; + pev->nextthink = gpGlobals->time + 0.1f; + pev->solid = SOLID_NOT; + + // Need a model, just use the grenade, we don't draw it anyway + SET_MODEL(edict(), "models/grenade.mdl"); + UTIL_SetSize(pev, g_vecZero, g_vecZero); + + pev->effects |= EF_NODRAW; + pev->speed = RANDOM_FLOAT(0.5, 1.5); + pev->angles = g_vecZero; } /* <7f475> ../cstrike/dlls/explode.cpp:61 */ -NOBODY void CShower::Think_(void) +void CShower::__MAKE_VHOOK(Think)(void) { + UTIL_Sparks(pev->origin); + + pev->speed -= 0.1f; + + if (pev->speed > 0) + pev->nextthink = gpGlobals->time + 0.1f; + else + UTIL_Remove(this); + + pev->flags &= ~FL_ONGROUND; } /* <7f122> ../cstrike/dlls/explode.cpp:73 */ -NOBODY void CShower::Touch_(CBaseEntity *pOther) +void CShower::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { -// operator*(const Vector *const this, -// float fl); // 76 -// operator*(const Vector *const this, -// float fl); // 78 + if (pev->flags & FL_ONGROUND) + pev->velocity = pev->velocity * 0.1f; + else + pev->velocity = pev->velocity * 0.6f; + + if ((pev->velocity.x * pev->velocity.x + pev->velocity.y * pev->velocity.y) < 10.0f) + { + pev->speed = 0; + } } /* <7f566> ../cstrike/dlls/explode.cpp:106 */ @@ -49,75 +82,166 @@ IMPLEMENT_SAVERESTORE(CEnvExplosion, CBaseMonster); LINK_ENTITY_TO_CLASS(env_explosion, CEnvExplosion); /* <7f5b2> ../cstrike/dlls/explode.cpp:109 */ -NOBODY void CEnvExplosion::KeyValue_(KeyValueData *pkvd) +void CEnvExplosion::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 111 -// KeyValue(CBaseEntity *const this, -// KeyValueData *pkvd); // 117 -// KeyValue(CEnvExplosion *const this, -// KeyValueData *pkvd); // 109 + if (FStrEq(pkvd->szKeyName, "iMagnitude")) + { + m_iMagnitude = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBaseEntity::KeyValue(pkvd); } - /* <7f1a5> ../cstrike/dlls/explode.cpp:120 */ -NOBODY void CEnvExplosion::Spawn_(void) +void CEnvExplosion::__MAKE_VHOOK(Spawn)(void) { -// { -// float flSpriteScale; // 133 -// } + pev->solid = SOLID_NOT; + pev->effects = EF_NODRAW; + pev->movetype = MOVETYPE_NONE; + + float flSpriteScale = (m_iMagnitude - 50) * 0.6f; + + if (flSpriteScale < 10.0f) + { + flSpriteScale = 10.0f; + } + + m_spriteScale = (int)flSpriteScale; } /* <7f233> ../cstrike/dlls/explode.cpp:150 */ -NOBODY void CEnvExplosion::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CEnvExplosion::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// TraceResult tr; // 152 -// Vector vecSpot; // 157 -// operator+(const Vector *const this, -// const Vector &v); // 159 -// operator+(const Vector *const this, -// const Vector &v); // 161 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 189 -// { -// int sparkCount; // 226 -// { -// int i; // 228 -// } -// } -// operator*(const Vector *const this, -// float fl); // 166 -// operator*(const Vector *const this, -// float fl); // 166 -// operator+(const Vector *const this, -// const Vector &v); // 166 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 202 -// } + TraceResult tr; + + pev->model = iStringNull;//invisible + pev->solid = SOLID_NOT;//intangible + + 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); + + // Pull out of the wall a bit + if (tr.flFraction != 1.0f) + { + pev->origin = tr.vecEndPos + (tr.vecPlaneNormal * (m_iMagnitude - 24) * 0.6f); + } + else + { + pev->origin = pev->origin; + } + + // draw decal + if (! (pev->spawnflags & SF_ENVEXPLOSION_NODECAL)) + { + if (RANDOM_FLOAT(0, 1) < 0.5) + { + UTIL_DecalTrace(&tr, DECAL_SCORCH1); + } + else + { + UTIL_DecalTrace(&tr, DECAL_SCORCH2); + } + } + + // draw fireball + if (!(pev->spawnflags & SF_ENVEXPLOSION_NOFIREBALL)) + { + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_EXPLOSION); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT(g_sModelIndexFireball); + WRITE_BYTE((byte)m_spriteScale); // scale * 10 + WRITE_BYTE(15); // framerate + WRITE_BYTE(TE_EXPLFLAG_NONE); + MESSAGE_END(); + } + else + { + MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pev->origin); + WRITE_BYTE(TE_EXPLOSION); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT(g_sModelIndexFireball); + WRITE_BYTE(0); // no sprite + WRITE_BYTE(15); // framerate + WRITE_BYTE(TE_EXPLFLAG_NONE); + MESSAGE_END(); + } + + // do damage + if (!(pev->spawnflags & SF_ENVEXPLOSION_NODAMAGE)) + { + RadiusDamage(pev, pev, m_iMagnitude, CLASS_NONE, DMG_BLAST); + } + + SetThink(&CEnvExplosion::Smoke); + pev->nextthink = gpGlobals->time + 0.3f; + + // draw sparks + if (!(pev->spawnflags & SF_ENVEXPLOSION_NOSPARKS)) + { + int sparkCount = RANDOM_LONG(0, 3); + + for (int i = 0; i < sparkCount; i++) + { + Create("spark_shower", pev->origin, tr.vecPlaneNormal, NULL); + } + } } /* <7f1e1> ../cstrike/dlls/explode.cpp:235 */ -NOBODY void CEnvExplosion::Smoke(void) +void CEnvExplosion::Smoke(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 239 + if (!(pev->spawnflags & SF_ENVEXPLOSION_NOSMOKE)) + { + MESSAGE_BEGIN(MSG_PAS, 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((byte)m_spriteScale); // scale * 10 + WRITE_BYTE(12); // framerate + MESSAGE_END(); + } + + if (!(pev->spawnflags & SF_ENVEXPLOSION_REPEATABLE)) + { + UTIL_Remove(this); + } } +// HACKHACK -- create one of these and fake a keyvalue to get the right explosion setup + /* <7f7f4> ../cstrike/dlls/explode.cpp:258 */ -NOBODY void ExplosionCreate(Vector ¢er, Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage) +void ExplosionCreate(Vector ¢er, Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage) { -// { -// KeyValueData kvd; // 260 -// char buf; // 261 -// class CBaseEntity *pExplosion; // 263 -// } + KeyValueData kvd; + char buf[128]; + + CBaseEntity *pExplosion = CBaseEntity::Create("env_explosion", center, angles, pOwner); + + Q_sprintf(buf, "%3d", magnitude); + + kvd.szKeyName = "iMagnitude"; + kvd.szValue = buf; + + pExplosion->KeyValue(&kvd); + + if (!doDamage) + { + pExplosion->pev->spawnflags |= SF_ENVEXPLOSION_NODAMAGE; + } + + pExplosion->Spawn(); + pExplosion->Use(NULL, NULL, USE_TOGGLE, 0); } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/explode.h b/regamedll/dlls/explode.h index aca5562e..64d38ccd 100644 --- a/regamedll/dlls/explode.h +++ b/regamedll/dlls/explode.h @@ -43,13 +43,13 @@ class CShower: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual void Think(void); - NOBODY virtual void Touch(CBaseEntity *pOther); + virtual void Think(void); + virtual void Touch(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL @@ -69,11 +69,11 @@ public: class CEnvExplosion: public CBaseMonster { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); #ifdef HOOK_GAMEDLL @@ -86,7 +86,7 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void EXPORT Smoke(void); + void EXPORT Smoke(void); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[2]; @@ -97,6 +97,10 @@ public: };/* size: 412, cachelines: 7, members: 4 */ -NOBODY void ExplosionCreate(Vector ¢er, Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage); +void ExplosionCreate(Vector ¢er, Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage); + +// linked objects +C_DLLEXPORT void spark_shower(entvars_t *pev); +C_DLLEXPORT void env_explosion(entvars_t *pev); #endif // EXPLODE_H diff --git a/regamedll/dlls/extdll.h b/regamedll/dlls/extdll.h index a6fa8848..a3698070 100644 --- a/regamedll/dlls/extdll.h +++ b/regamedll/dlls/extdll.h @@ -87,7 +87,6 @@ typedef float vec_t; // needed before including progdefs.h #include "vector.h" // Defining it as a (bogus) struct helps enforce type-checking #define vec3_t Vector -#define TI_LOX // Shared engine/DLL constants #include "const.h" diff --git a/regamedll/dlls/func_break.cpp b/regamedll/dlls/func_break.cpp index 32fc73af..81195cf0 100644 --- a/regamedll/dlls/func_break.cpp +++ b/regamedll/dlls/func_break.cpp @@ -122,7 +122,7 @@ TYPEDESCRIPTION (*CPushable::pm_SaveData)[2]; #endif // HOOK_GAMEDLL /* <85bf3> ../cstrike/dlls/func_break.cpp:76 */ -NOBODY void CBreakable::KeyValue_(KeyValueData *pkvd) +NOBODY void CBreakable::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 90 @@ -158,12 +158,12 @@ LINK_ENTITY_TO_CLASS(func_breakable, CBreakable); IMPLEMENT_SAVERESTORE(CBreakable, CBaseEntity); /* <85663> ../cstrike/dlls/func_break.cpp:157 */ -NOBODY void CBreakable::Spawn_(void) +NOBODY void CBreakable::__MAKE_VHOOK(Spawn)(void) { } /* <8568a> ../cstrike/dlls/func_break.cpp:191 */ -NOBODY void CBreakable::Restart_(void) +NOBODY void CBreakable::__MAKE_VHOOK(Restart)(void) { } @@ -178,7 +178,6 @@ const char **CBreakable::MaterialSoundList(Materials precacheMaterial, int &soun { pSoundList = pSoundsWood; soundCount = ARRAYSIZE(pSoundsWood); - const int dad = ARRAYSIZE(pSoundsConcrete); break; } case matFlesh: @@ -218,15 +217,17 @@ const char **CBreakable::MaterialSoundList(Materials precacheMaterial, int &soun } /* <86526> ../cstrike/dlls/func_break.cpp:303 */ -NOBODY void CBreakable::MaterialSoundPrecache(Materials precacheMaterial) -{ -// { -// const char ** pSoundList; // 305 -// int i; // 306 -// int soundCount; // 306 -// MaterialSoundList(Materials precacheMaterial, -// int &soundCount); // 308 -// } +void CBreakable::MaterialSoundPrecache(Materials precacheMaterial) +{ + const char **pSoundList; + int i, soundCount = 0; + + pSoundList = MaterialSoundList(precacheMaterial, soundCount); + + for (i = 0; i < soundCount; i++) + { + PRECACHE_SOUND((char *)pSoundList[i]); + } } /* <86598> ../cstrike/dlls/func_break.cpp:316 */ @@ -236,11 +237,13 @@ void CBreakable::MaterialSoundRandom(edict_t *pEdict, Materials soundMaterial, f const char **pSoundList = MaterialSoundList(soundMaterial, soundCount); if (soundCount) + { EMIT_SOUND(pEdict, CHAN_BODY, pSoundList[ RANDOM_LONG(0, soundCount - 1) ], volume, 1.0); + } } /* <8634b> ../cstrike/dlls/func_break.cpp:328 */ -NOBODY void CBreakable::Precache_(void) +NOBODY void CBreakable::__MAKE_VHOOK(Precache)(void) { // { // const char *pGibName; // 330 @@ -271,7 +274,7 @@ NOBODY void CBreakable::BreakTouch(CBaseEntity *pOther) } /* <85f2d> ../cstrike/dlls/func_break.cpp:538 */ -NOBODY void CBreakable::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CBreakable::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CBreakable *const this, // class CBaseEntity *pActivator, @@ -281,7 +284,7 @@ NOBODY void CBreakable::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_ } /* <85964> ../cstrike/dlls/func_break.cpp:554 */ -NOBODY void CBreakable::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +NOBODY void CBreakable::__MAKE_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { // { // float flVolume; // 565 @@ -301,7 +304,7 @@ NOBODY void CBreakable::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vec } /* <86719> ../cstrike/dlls/func_break.cpp:588 */ -NOBODY int CBreakable::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CBreakable::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // { // Vector vecTemp; // 590 @@ -367,7 +370,7 @@ NOBODY BOOL CBreakable::IsBreakable(void) } /* <85a99> ../cstrike/dlls/func_break.cpp:839 */ -NOBODY int CBreakable::DamageDecal_(int bitsDamageType) +NOBODY int CBreakable::__MAKE_VHOOK(DamageDecal)(int bitsDamageType) { // DamageDecal(CBreakable *const this, // int bitsDamageType); // 839 @@ -380,12 +383,12 @@ LINK_ENTITY_TO_CLASS(func_pushable, CPushable); IMPLEMENT_SAVERESTORE(CPushable, CBreakable); /* <856d7> ../cstrike/dlls/func_break.cpp:893 */ -NOBODY void CPushable::Spawn_(void) +NOBODY void CPushable::__MAKE_VHOOK(Spawn)(void) { } /* <863eb> ../cstrike/dlls/func_break.cpp:920 */ -NOBODY void CPushable::Precache_(void) +NOBODY void CPushable::__MAKE_VHOOK(Precache)(void) { // { // int i; // 922 @@ -393,7 +396,7 @@ NOBODY void CPushable::Precache_(void) } /* <85fa3> ../cstrike/dlls/func_break.cpp:930 */ -NOBODY void CPushable::KeyValue_(KeyValueData *pkvd) +NOBODY void CPushable::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // { // int bbox; // 934 @@ -410,7 +413,7 @@ NOBODY void CPushable::KeyValue_(KeyValueData *pkvd) } /* <86c0d> ../cstrike/dlls/func_break.cpp:969 */ -NOBODY void CPushable::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CPushable::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CPushable *const this, // class CBaseEntity *pActivator, @@ -422,7 +425,7 @@ NOBODY void CPushable::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T } /* <86b99> ../cstrike/dlls/func_break.cpp:983 */ -NOBODY void CPushable::Touch_(CBaseEntity *pOther) +NOBODY void CPushable::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // FClassnameIs(entvars_t *pev, // const char *szClassname); // 985 @@ -449,7 +452,7 @@ NOBODY void CPushable::Move(CBaseEntity *pOther, int push) } /* <868b0> ../cstrike/dlls/func_break.cpp:1061 */ -NOBODY int CPushable::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CPushable::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // TakeDamage(CPushable *const this, // entvars_t *pevInflictor, diff --git a/regamedll/dlls/func_break.h b/regamedll/dlls/func_break.h index e7ef5297..df642cb3 100644 --- a/regamedll/dlls/func_break.h +++ b/regamedll/dlls/func_break.h @@ -136,7 +136,7 @@ public: pev->impulse = magnitude; } - NOBODY static void MaterialSoundPrecache(Materials precacheMaterial); + static void MaterialSoundPrecache(Materials precacheMaterial); static void MaterialSoundRandom(edict_t *pEdict, Materials soundMaterial, float volume); static const char **MaterialSoundList(Materials precacheMaterial, int &soundCount); diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index ddc002be..a645d708 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -55,7 +55,7 @@ TYPEDESCRIPTION (*CFuncTankControls::pm_SaveData)[1]; #endif // HOOK_GAMEDLL /* <8ea25> ../cstrike/dlls/func_tank.cpp:177 */ -NOBODY void CFuncTank::Spawn_(void) +NOBODY void CFuncTank::__MAKE_VHOOK(Spawn)(void) { // IsActive(CFuncTank *const this); // 188 // BarrelPosition(CFuncTank *const this); // 191 @@ -65,13 +65,13 @@ NOBODY void CFuncTank::Spawn_(void) IMPLEMENT_SAVERESTORE(CFuncTank, CBaseEntity); /* <8d64d> ../cstrike/dlls/func_tank.cpp:202 */ -NOBODY void CFuncTank::Precache_(void) +NOBODY void CFuncTank::__MAKE_VHOOK(Precache)(void) { // Precache(CFuncTank *const this); // 202 } /* <8e19e> ../cstrike/dlls/func_tank.cpp:214 */ -NOBODY void CFuncTank::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTank::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 226 @@ -131,7 +131,7 @@ NOBODY void CFuncTank::KeyValue_(KeyValueData *pkvd) } /* <8dca8> ../cstrike/dlls/func_tank.cpp:329 */ -NOBODY BOOL CFuncTank::OnControls_(entvars_t *pevTest) +NOBODY BOOL CFuncTank::__MAKE_VHOOK(OnControls)(entvars_t *pevTest) { // { // Vector offset; // 334 @@ -165,7 +165,7 @@ NOBODY void CFuncTank::ControllerPostFrame(void) } /* <8ee12> ../cstrike/dlls/func_tank.cpp:424 */ -NOBODY void CFuncTank::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTank::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // IsActive(CFuncTank *const this); // 448 // IsActive(CFuncTank *const this); // 451 @@ -186,7 +186,7 @@ NOBODY BOOL CFuncTank::InRange(float range) } /* <8f717> ../cstrike/dlls/func_tank.cpp:477 */ -NOBODY void CFuncTank::Think_(void) +NOBODY void CFuncTank::__MAKE_VHOOK(Think)(void) { // fabs(double __x); // 482 // fabs(double __x); // 482 @@ -268,7 +268,7 @@ NOBODY void CFuncTank::AdjustAnglesForBarrel(Vector &angles, float distance) } /* <8d4ad> ../cstrike/dlls/func_tank.cpp:656 */ -NOBODY void CFuncTank::Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +NOBODY void CFuncTank::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { // { // class CSprite *pSprite; // 662 @@ -347,7 +347,7 @@ NOBODY void CFuncTank::StopRotSound(void) LINK_ENTITY_TO_CLASS(func_tank, CFuncTankGun); /* <8c3d5> ../cstrike/dlls/func_tank.cpp:726 */ -NOBODY void CFuncTankGun::Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +NOBODY void CFuncTankGun::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { // { // int i; // 728 @@ -368,14 +368,14 @@ LINK_ENTITY_TO_CLASS(func_tanklaser, CFuncTankLaser); IMPLEMENT_SAVERESTORE(CFuncTankLaser, CFuncTank); /* <8deed> ../cstrike/dlls/func_tank.cpp:795 */ -NOBODY void CFuncTankLaser::Activate_(void) +NOBODY void CFuncTankLaser::__MAKE_VHOOK(Activate)(void) { // GetLaser(CFuncTankLaser *const this); // 797 // Activate(CFuncTankLaser *const this); // 795 } /* <8e8ca> ../cstrike/dlls/func_tank.cpp:809 */ -NOBODY void CFuncTankLaser::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTankLaser::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 811 @@ -402,12 +402,12 @@ NOBODY CLaser *CFuncTankLaser::GetLaser(void) } /* <8f809> ../cstrike/dlls/func_tank.cpp:845 */ -NOBODY void CFuncTankLaser::Think_(void) +NOBODY void CFuncTankLaser::__MAKE_VHOOK(Think)(void) { } /* <8df51> ../cstrike/dlls/func_tank.cpp:854 */ -NOBODY void CFuncTankLaser::Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +NOBODY void CFuncTankLaser::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { // { // int i; // 856 @@ -427,13 +427,13 @@ NOBODY void CFuncTankLaser::Fire_(const Vector &barrelEnd, const Vector &forward LINK_ENTITY_TO_CLASS(func_tankrocket, CFuncTankRocket); /* <8e736> ../cstrike/dlls/func_tank.cpp:895 */ -NOBODY void CFuncTankRocket::Precache_(void) +NOBODY void CFuncTankRocket::__MAKE_VHOOK(Precache)(void) { // Precache(CFuncTank *const this); // 898 } /* <8d7b6> ../cstrike/dlls/func_tank.cpp:903 */ -NOBODY void CFuncTankRocket::Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +NOBODY void CFuncTankRocket::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { // { // int i; // 905 @@ -454,7 +454,7 @@ NOBODY void CFuncTankRocket::Fire_(const Vector &barrelEnd, const Vector &forwar LINK_ENTITY_TO_CLASS(func_tankmortar, CFuncTankMortar); /* <8e790> ../cstrike/dlls/func_tank.cpp:933 */ -NOBODY void CFuncTankMortar::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTankMortar::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 935 @@ -465,7 +465,7 @@ NOBODY void CFuncTankMortar::KeyValue_(KeyValueData *pkvd) } /* <8dbfa> ../cstrike/dlls/func_tank.cpp:945 */ -NOBODY void CFuncTankMortar::Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) +NOBODY void CFuncTankMortar::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { // { // int bulletCount; // 949 @@ -486,12 +486,12 @@ LINK_ENTITY_TO_CLASS(func_tankcontrols, CFuncTankControls); IMPLEMENT_SAVERESTORE(CFuncTankControls, CBaseEntity); /* <8d310> ../cstrike/dlls/func_tank.cpp:1003 */ -NOBODY void CFuncTankControls::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTankControls::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { } /* <8d39a> ../cstrike/dlls/func_tank.cpp:1012 */ -NOBODY void CFuncTankControls::Think_(void) +NOBODY void CFuncTankControls::__MAKE_VHOOK(Think)(void) { // { // edict_t *pTarget; // 1014 @@ -504,7 +504,7 @@ NOBODY void CFuncTankControls::Think_(void) } /* <8d373> ../cstrike/dlls/func_tank.cpp:1030 */ -NOBODY void CFuncTankControls::Spawn_(void) +NOBODY void CFuncTankControls::__MAKE_VHOOK(Spawn)(void) { } diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 713a7c9a..a156beef 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -11,88 +11,87 @@ cvar_t *g_footsteps = NULL; cvar_t *g_psv_accelerate = NULL; cvar_t *g_psv_friction = NULL; cvar_t *g_psv_stopspeed = NULL; +cvar_t displaysoundlist = { "displaysoundlist", "0", 0, 0.0f, NULL }; +cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t flashlight = { "mp_flashlight", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t decalfrequency = { "decalfrequency", "30", FCVAR_SERVER, 0.0f, NULL }; +cvar_t fadetoblack = { "mp_fadetoblack", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t fragsleft = { "mp_fragsleft", "", FCVAR_SERVER | FCVAR_UNLOGGED, 0.0f, NULL }; +cvar_t timeleft = { "mp_timeleft", "0", FCVAR_SERVER | FCVAR_UNLOGGED, 0.0f, NULL }; +cvar_t friendlyfire = { "mp_friendlyfire", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t allowmonsters = { "mp_allowmonsters", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t roundtime = { "mp_roundtime", "5", FCVAR_SERVER, 0.0f, NULL }; +cvar_t buytime = { "mp_buytime", "1.5", FCVAR_SERVER, 0.0f, NULL }; +cvar_t freezetime = { "mp_freezetime", "6", FCVAR_SERVER, 0.0f, NULL }; +cvar_t c4timer = { "mp_c4timer", "45", FCVAR_SERVER, 0.0f, NULL }; +cvar_t ghostfrequency = { "mp_ghostfrequency", "0.1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t autokick = { "mp_autokick", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t autokick_timeout = { "mp_autokick_timeout", "-1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t restartround = { "sv_restartround", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t sv_restart = { "sv_restart", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t limitteams = { "mp_limitteams", "2", FCVAR_SERVER, 0.0f, NULL }; +cvar_t autoteambalance = { "mp_autoteambalance", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t tkpunish = { "mp_tkpunish", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t hostagepenalty = { "mp_hostagepenalty", "13", FCVAR_SERVER, 0.0f, NULL }; +cvar_t mirrordamage = { "mp_mirrordamage", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t logmessages = { "mp_logmessages", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t forcecamera = { "mp_forcecamera", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t forcechasecam = { "mp_forcechasecam", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t mapvoteratio = { "mp_mapvoteratio", "0.66", FCVAR_SERVER, 0.0f, NULL }; +cvar_t logdetail = { "mp_logdetail", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t startmoney = { "mp_startmoney", "800", FCVAR_SERVER, 0.0f, NULL }; +cvar_t maxrounds = { "mp_maxrounds", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t winlimit = { "mp_winlimit", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t windifference = { "mp_windifference", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t playerid = { "mp_playerid", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t allow_spectators = { "allow_spectators", "1.0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t mp_chattime = { "mp_chattime", "10", FCVAR_SERVER, 0.0f, NULL }; +cvar_t kick_percent = { "mp_kickpercent", "0.66", FCVAR_SERVER, 0.0f, NULL }; +cvar_t humans_join_team = { "humans_join_team", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t sk_plr_9mm_bullet1 = { "sk_plr_9mm_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mm_bullet2 = { "sk_plr_9mm_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mm_bullet3 = { "sk_plr_9mm_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_357_bullet1 = { "sk_plr_357_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_357_bullet2 = { "sk_plr_357_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_357_bullet3 = { "sk_plr_357_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_bullet1 = { "sk_plr_9mmAR_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_bullet2 = { "sk_plr_9mmAR_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_bullet3 = { "sk_plr_9mmAR_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_grenade1 = { "sk_plr_9mmAR_grenade1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_grenade2 = { "sk_plr_9mmAR_grenade2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_9mmAR_grenade3 = { "sk_plr_9mmAR_grenade3", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_buckshot1 = { "sk_plr_buckshot1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_buckshot2 = { "sk_plr_buckshot2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_buckshot3 = { "sk_plr_buckshot3", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_rpg1 = { "sk_plr_rpg1", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_rpg2 = { "sk_plr_rpg2", "0", 0, 0.0f, NULL }; +cvar_t sk_plr_rpg3 = { "sk_plr_rpg3", "0", 0, 0.0f, NULL }; +cvar_t sk_12mm_bullet1 = { "sk_12mm_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_12mm_bullet2 = { "sk_12mm_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_12mm_bullet3 = { "sk_12mm_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_9mmAR_bullet1 = { "sk_9mmAR_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_9mmAR_bullet2 = { "sk_9mmAR_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_9mmAR_bullet3 = { "sk_9mmAR_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_9mm_bullet1 = { "sk_9mm_bullet1", "0", 0, 0.0f, NULL }; +cvar_t sk_9mm_bullet2 = { "sk_9mm_bullet2", "0", 0, 0.0f, NULL }; +cvar_t sk_9mm_bullet3 = { "sk_9mm_bullet3", "0", 0, 0.0f, NULL }; +cvar_t sk_suitcharger1 = { "sk_suitcharger1", "0", 0, 0.0f, NULL }; +cvar_t sk_suitcharger2 = { "sk_suitcharger2", "0", 0, 0.0f, NULL }; +cvar_t sk_suitcharger3 = { "sk_suitcharger3", "0", 0, 0.0f, NULL }; +cvar_t sk_battery1 = { "sk_battery1", "0", 0, 0.0f, NULL }; +cvar_t sk_battery2 = { "sk_battery2", "0", 0, 0.0f, NULL }; +cvar_t sk_battery3 = { "sk_battery3", "0", 0, 0.0f, NULL }; +cvar_t sk_healthcharger1 = { "sk_healthcharger1", "0", 0, 0.0f, NULL }; +cvar_t sk_healthcharger2 = { "sk_healthcharger2", "0", 0, 0.0f, NULL }; +cvar_t sk_healthcharger3 = { "sk_healthcharger3", "0", 0, 0.0f, NULL }; +cvar_t sk_healthkit1 = { "sk_healthkit1", "0", 0, 0.0f, NULL }; +cvar_t sk_healthkit2 = { "sk_healthkit2", "0", 0, 0.0f, NULL }; +cvar_t sk_healthkit3 = { "sk_healthkit3", "0", 0, 0.0f, NULL }; +cvar_t sk_scientist_heal1 = { "sk_scientist_heal1", "0", 0, 0.0f, NULL }; +cvar_t sk_scientist_heal2 = { "sk_scientist_heal2", "0", 0, 0.0f, NULL }; +cvar_t sk_scientist_heal3 = { "sk_scientist_heal3", "0", 0, 0.0f, NULL }; -cvar_t displaysoundlist = { "displaysoundlist", "0" }; -cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER }; -cvar_t flashlight = { "mp_flashlight", "0", FCVAR_SERVER }; -cvar_t decalfrequency = { "decalfrequency", "30", FCVAR_SERVER }; -cvar_t fadetoblack = { "mp_fadetoblack", "0", FCVAR_SERVER }; -cvar_t fragsleft = { "mp_fragsleft", "", FCVAR_SERVER|FCVAR_UNLOGGED }; -cvar_t timeleft = { "mp_timeleft", "0", FCVAR_SERVER|FCVAR_UNLOGGED }; -cvar_t friendlyfire = { "mp_friendlyfire", "0", FCVAR_SERVER }; -cvar_t allowmonsters = { "mp_allowmonsters", "0", FCVAR_SERVER }; -cvar_t roundtime = { "mp_roundtime", "5", FCVAR_SERVER }; -cvar_t buytime = { "mp_buytime", "1.5", FCVAR_SERVER }; -cvar_t freezetime = { "mp_freezetime", "6", FCVAR_SERVER }; -cvar_t c4timer = { "mp_c4timer", "45", FCVAR_SERVER }; -cvar_t ghostfrequency = { "mp_ghostfrequency", "0.1", FCVAR_SERVER }; -cvar_t autokick = { "mp_autokick", "1", FCVAR_SERVER }; -cvar_t autokick_timeout = { "mp_autokick_timeout", "-1", FCVAR_SERVER }; -cvar_t restartround = { "sv_restartround", "0", FCVAR_SERVER }; -cvar_t sv_restart = { "sv_restart", "0", FCVAR_SERVER }; -cvar_t limitteams = { "mp_limitteams", "2", FCVAR_SERVER }; -cvar_t autoteambalance = { "mp_autoteambalance", "1", FCVAR_SERVER }; -cvar_t tkpunish = { "mp_tkpunish", "0", FCVAR_SERVER }; -cvar_t hostagepenalty = { "mp_hostagepenalty", "13", FCVAR_SERVER }; -cvar_t mirrordamage = { "mp_mirrordamage", "0", FCVAR_SERVER }; -cvar_t logmessages = { "mp_logmessages", "1", FCVAR_SERVER }; -cvar_t forcecamera = { "mp_forcecamera", "0", FCVAR_SERVER }; -cvar_t forcechasecam = { "mp_forcechasecam", "0", FCVAR_SERVER }; -cvar_t mapvoteratio = { "mp_mapvoteratio", "0.66", FCVAR_SERVER }; -cvar_t logdetail = { "mp_logdetail", "0", FCVAR_SERVER }; -cvar_t startmoney = { "mp_startmoney", "800", FCVAR_SERVER }; -cvar_t maxrounds = { "mp_maxrounds", "0", FCVAR_SERVER }; -cvar_t winlimit = { "mp_winlimit", "0", FCVAR_SERVER }; -cvar_t windifference = { "mp_windifference", "1", FCVAR_SERVER }; -cvar_t playerid = { "mp_playerid", "0", FCVAR_SERVER }; -cvar_t allow_spectators = { "allow_spectators", "1.0", FCVAR_SERVER }; -cvar_t mp_chattime = { "mp_chattime", "10", FCVAR_SERVER }; -cvar_t kick_percent = { "mp_kickpercent", "0.66", FCVAR_SERVER }; -cvar_t humans_join_team = { "humans_join_team", "0", FCVAR_SERVER }; -cvar_t sk_plr_9mm_bullet1 = { "sk_plr_9mm_bullet1", "0" }; -cvar_t sk_plr_9mm_bullet2 = { "sk_plr_9mm_bullet2", "0" }; -cvar_t sk_plr_9mm_bullet3 = { "sk_plr_9mm_bullet3", "0" }; -cvar_t sk_plr_357_bullet1 = { "sk_plr_357_bullet1", "0" }; -cvar_t sk_plr_357_bullet2 = { "sk_plr_357_bullet2", "0" }; -cvar_t sk_plr_357_bullet3 = { "sk_plr_357_bullet3", "0" }; -cvar_t sk_plr_9mmAR_bullet1 = { "sk_plr_9mmAR_bullet1", "0" }; -cvar_t sk_plr_9mmAR_bullet2 = { "sk_plr_9mmAR_bullet2", "0" }; -cvar_t sk_plr_9mmAR_bullet3 = { "sk_plr_9mmAR_bullet3", "0" }; -cvar_t sk_plr_9mmAR_grenade1 = { "sk_plr_9mmAR_grenade1", "0" }; -cvar_t sk_plr_9mmAR_grenade2 = { "sk_plr_9mmAR_grenade2", "0" }; -cvar_t sk_plr_9mmAR_grenade3 = { "sk_plr_9mmAR_grenade3", "0" }; -cvar_t sk_plr_buckshot1 = { "sk_plr_buckshot1", "0" }; -cvar_t sk_plr_buckshot2 = { "sk_plr_buckshot2", "0" }; -cvar_t sk_plr_buckshot3 = { "sk_plr_buckshot3", "0" }; -cvar_t sk_plr_rpg1 = { "sk_plr_rpg1", "0" }; -cvar_t sk_plr_rpg2 = { "sk_plr_rpg2", "0" }; -cvar_t sk_plr_rpg3 = { "sk_plr_rpg3", "0" }; -cvar_t sk_12mm_bullet1 = { "sk_12mm_bullet1", "0" }; -cvar_t sk_12mm_bullet2 = { "sk_12mm_bullet2", "0" }; -cvar_t sk_12mm_bullet3 = { "sk_12mm_bullet3", "0" }; -cvar_t sk_9mmAR_bullet1 = { "sk_9mmAR_bullet1", "0" }; -cvar_t sk_9mmAR_bullet2 = { "sk_9mmAR_bullet2", "0" }; -cvar_t sk_9mmAR_bullet3 = { "sk_9mmAR_bullet3", "0" }; -cvar_t sk_9mm_bullet1 = { "sk_9mm_bullet1", "0" }; -cvar_t sk_9mm_bullet2 = { "sk_9mm_bullet2", "0" }; -cvar_t sk_9mm_bullet3 = { "sk_9mm_bullet3", "0" }; -cvar_t sk_suitcharger1 = { "sk_suitcharger1", "0" }; -cvar_t sk_suitcharger2 = { "sk_suitcharger2", "0" }; -cvar_t sk_suitcharger3 = { "sk_suitcharger3", "0" }; -cvar_t sk_battery1 = { "sk_battery1", "0" }; -cvar_t sk_battery2 = { "sk_battery2", "0" }; -cvar_t sk_battery3 = { "sk_battery3", "0" }; -cvar_t sk_healthcharger1 = { "sk_healthcharger1", "0" }; -cvar_t sk_healthcharger2 = { "sk_healthcharger2", "0" }; -cvar_t sk_healthcharger3 = { "sk_healthcharger3", "0" }; -cvar_t sk_healthkit1 = { "sk_healthkit1", "0" }; -cvar_t sk_healthkit2 = { "sk_healthkit2", "0" }; -cvar_t sk_healthkit3 = { "sk_healthkit3", "0" }; -cvar_t sk_scientist_heal1 = { "sk_scientist_heal1", "0" }; -cvar_t sk_scientist_heal2 = { "sk_scientist_heal2", "0" }; -cvar_t sk_scientist_heal3 = { "sk_scientist_heal3", "0" }; - -#else //HOOK_GAMEDLL +#else // HOOK_GAMEDLL cvar_t *g_psv_gravity; cvar_t *g_psv_aim; @@ -402,7 +401,7 @@ cvar_t sk_scientist_heal3; //cvar_t sk_player_leg2; //cvar_t sk_player_leg3; -#endif //HOOK_GAMEDLL +#endif // HOOK_GAMEDLL /* <9c900> ../cstrike/dlls/game.cpp:500 */ void GameDLLInit(void) diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index ed368ca9..217f166e 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -221,6 +221,6 @@ extern cvar_t sk_scientist_heal1; extern cvar_t sk_scientist_heal2; extern cvar_t sk_scientist_heal3; -NOBODY void GameDLLInit(void); +void GameDLLInit(void); #endif // GAME_H diff --git a/regamedll/dlls/gamerules.cpp b/regamedll/dlls/gamerules.cpp index 5da284d3..ae645415 100644 --- a/regamedll/dlls/gamerules.cpp +++ b/regamedll/dlls/gamerules.cpp @@ -14,53 +14,87 @@ CHalfLifeMultiplay *g_pGameRules; #endif //HOOK_GAMEDLL /* ../cstrike/dlls/gamerules.cpp:36 */ -BOOL CGameRules::CanHaveAmmo_(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry) +BOOL CGameRules::__MAKE_VHOOK(CanHaveAmmo)(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry) { - if (pszAmmoName) + int iAmmoIndex; + + if (pszAmmoName != NULL) { - int iAmmoIndex = pPlayer->GetAmmoIndex(pszAmmoName); + iAmmoIndex = pPlayer->GetAmmoIndex(pszAmmoName); if (iAmmoIndex > -1) { if (pPlayer->AmmoInventory(iAmmoIndex) < iMaxCarry) + { + // player has room for more of this type of ammo return TRUE; + } } } + return FALSE; } /* ../cstrike/dlls/gamerules.cpp:59 */ -NOBODY edict_t *CGameRules::GetPlayerSpawnSpot_(CBasePlayer *pPlayer) +edict_t *CGameRules::__MAKE_VHOOK(GetPlayerSpawnSpot)(CBasePlayer *pPlayer) { -// { -// edict_t *pentSpawnSpot; // 61 -// VARS(edict_t *pent); // 66 -// VARS(edict_t *pent); // 63 -// operator+(const Vector *const this, -// const Vector &v); // 63 -// } + edict_t *pentSpawnSpot = EntSelectSpawnPoint(pPlayer); + + pPlayer->pev->origin = VARS(pentSpawnSpot)->origin;// + Vector(0, 0, 1); + pPlayer->pev->origin.z += 1; + + pPlayer->pev->v_angle = g_vecZero; + pPlayer->pev->velocity = g_vecZero; + pPlayer->pev->angles = VARS(pentSpawnSpot)->angles; + pPlayer->pev->punchangle = g_vecZero; + pPlayer->pev->fixangle = 1; + + return pentSpawnSpot; } /* ../cstrike/dlls/gamerules.cpp:75 */ -NOBODY BOOL CGameRules::CanHavePlayerItem_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +BOOL CGameRules::__MAKE_VHOOK(CanHavePlayerItem)(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { - /*if (pPlayer->pev->deadflag != DEAD_NO) + // only living players can have items + if (pPlayer->pev->deadflag != DEAD_NO) + { return FALSE; + } CCSBotManager *ctrl = TheCSBots(); - if (!pPlayer->AddPlayerItem(pWeapon) || ctrl->IsWeaponUseable(pWeapon)) + + if (pPlayer->IsBot() && !ctrl->IsWeaponUseable(pWeapon)) { - // TODO: check it - if (pWeapon->pszAmmo1() && CanHaveAmmo(pPlayer,pWeapon->pszAmmo1(),pWeapon->iMaxAmmo1()) || !pPlayer->HasPlayerItem(pWeapon)) - { - return TRUE; - } - }*/ - return FALSE; + return FALSE; + } + + if (pWeapon->pszAmmo1()) + { + if (!CanHaveAmmo(pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1())) + { + // we can't carry anymore ammo for this gun. We can only + // have the gun if we aren't already carrying one of this type + if (pPlayer->HasPlayerItem(pWeapon)) + { + return FALSE; + } + } + } + else + { + // weapon doesn't use ammo, don't take another if you already have it. + if (pPlayer->HasPlayerItem(pWeapon)) + { + return FALSE; + } + } + + // note: will fall through to here if GetItemInfo doesn't fill the struct! + return TRUE; } /* ../cstrike/dlls/gamerules.cpp:119 */ -void CGameRules::RefreshSkillData_(void) +void CGameRules::__MAKE_VHOOK(RefreshSkillData)(void) { int iSkill = (int)CVAR_GET_FLOAT("skill"); @@ -82,38 +116,48 @@ void CGameRules::RefreshSkillData_(void) gSkillData.healthkitCapacity = 15; } +void (*pInstallGameRules)(void); + /* ../cstrike/dlls/gamerules.cpp:157 */ -NOBODY CGameRules *InstallGameRules(void) +NOBODY __declspec(naked) CGameRules *InstallGameRules(void) { + __asm + { + jmp pInstallGameRules + } +#if 0 SERVER_COMMAND("exec game.cfg\n"); SERVER_EXECUTE(); if (!gpGlobals->deathmatch) + { return new CHalfLifeTraining; + } return new CHalfLifeMultiplay; +#endif } #ifdef HOOK_GAMEDLL -BOOL CGameRules::CanHaveAmmo(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry) -{ - return CanHaveAmmo_(pPlayer,pszAmmoName,iMaxCarry); -} - -edict_t *CGameRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer) -{ - return GetPlayerSpawnSpot_(pPlayer); -} - -BOOL CGameRules::CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) -{ - return CanHavePlayerItem_(pPlayer,pWeapon); -} - void CGameRules::RefreshSkillData(void) { RefreshSkillData_(); -} +} + +edict_t *CGameRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer) +{ + return GetPlayerSpawnSpot_(pPlayer); +} + +BOOL CGameRules::CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +{ + return CanHavePlayerItem_(pPlayer, pWeapon); +} + +BOOL CGameRules::CanHaveAmmo(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry) +{ + return CanHaveAmmo_(pPlayer, pszAmmoName, iMaxCarry); +} #endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index 8065acab..cf243e67 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -34,12 +34,111 @@ #include "game_shared/voice_gamemgr.h" -#define COM_TOKEN_LEN 1500 +#define COM_TOKEN_LEN 1500 -#define MAX_RULE_BUFFER 1024 -#define MAX_VOTE_MAPS 100 -#define ITEM_RESPAWN_TIME 30 -#define MAX_VIP_QUEUES 5 +#define MAX_RULE_BUFFER 1024 +#define MAX_VOTE_MAPS 100 +#define MAX_VIP_QUEUES 5 + +#define MAX_BOMB_RADIUS 2048 + +#define MAP_VIP_SAFETYZONE_INIT 0 // initial +#define MAP_HAVE_VIP_SAFETYZONE_YES 1 // on map have of vip safety zone +#define MAP_HAVE_VIP_SAFETYZONE_NO 2 // there is no safety zone + +#define MAP_HAS_CAMERAS_INIT 2 // initial +#define MAP_HAS_CAMERAS_YES 1 // on map have of camera's + +#define ITEM_RESPAWN_TIME 30 +#define WEAPON_RESPAWN_TIME 20 +#define AMMO_RESPAWN_TIME 20 + +// longest the intermission can last, in seconds +#define MAX_INTERMISSION_TIME 120 + +// when we are within this close to running out of entities, items +// marked with the ITEM_FLAG_LIMITINWORLD will delay their respawn +#define ENTITY_INTOLERANCE 100 + +#define MAX_MOTD_CHUNK 60 +#define MAX_MOTD_LENGTH 1536 // (MAX_MOTD_CHUNK * 4) + +// custom enum +enum +{ + WINSTATUS_CTS = 1, + WINSTATUS_TERRORISTS, + WINSTATUS_DRAW, +}; + +// custom enum +enum ScenarionEventEndRound +{ + ROUND_TARGET_BOMB = 1, + ROUND_VIP_ESCAPED, + ROUND_VIP_ASSASSINATED, + ROUND_TERRORISTS_ESCAPED, + ROUND_CTS_PREVENT_ESCAPE, + ROUND_ESCAPING_TERRORISTS_NEUTRALIZED, + ROUND_BOMB_DEFUSED, + ROUND_CTS_WIN, + ROUND_TERRORISTS_WIN, + ROUND_END_DRAW, + ROUND_ALL_HOSTAGES_RESCUED, + ROUND_TARGET_SAVED, + ROUND_HOSTAGE_NOT_RESCUED, + ROUND_TERRORISTS_NOT_ESCAPED, + ROUND_VIP_NOT_ESCAPED, + ROUND_GAME_COMMENCE, +}; + +// custom enum +enum RewardAccount +{ + REWARD_TARGET_BOMB = 3500, + REWARD_VIP_ESCAPED = 3500, + REWARD_VIP_ASSASSINATED = 3250, + REWARD_TERRORISTS_ESCAPED = 3150, + REWARD_CTS_PREVENT_ESCAPE = 3500, + REWARD_ESCAPING_TERRORISTS_NEUTRALIZED = 3250, + REWARD_BOMB_DEFUSED = 3250, + REWARD_BOMB_PLANTED = 800, + REWARD_BOMB_EXPLODED = 3250, + REWARD_CTS_WIN = 3000, + REWARD_TERRORISTS_WIN = 3000, + REWARD_ALL_HOSTAGES_RESCUED = 2500, + + // the end round was by the expiration time + REWARD_TARGET_BOMB_SAVED = 3250, + REWARD_HOSTAGE_NOT_RESCUED = 3250, + REWARD_VIP_NOT_ESCAPED = 3250, + + // loser bonus + REWARD_LOSER_BONUS_DEFAULT = 1400, + REWARD_LOSER_BONUS_MIN = 1500, + REWARD_LOSER_BONUS_MAX = 3000, + REWARD_LOSER_BONUS_ADD = 500, + + REWARD_RESCUED_HOSTAGE = 750, + REWARD_KILLED_ENEMY = 300, + REWARD_KILLED_VIP = 2500, + +}; + +// custom enum +enum PaybackForBadThing +{ + PAYBACK_FOR_KILLED_TEAMMATES = -3300, +}; + +// custom enum +enum InfoMapBuyParam +{ + BUYING_EVERYONE = 0, + BUYING_ONLY_CTS, + BUYING_ONLY_TERRORISTS, + BUYING_NO_ONE, +}; enum { @@ -83,12 +182,12 @@ public: virtual BOOL IsDeathmatch(void) = 0; virtual BOOL IsTeamplay(void) { - return FALSE; + return IsTeamplay_(); } virtual BOOL IsCoOp(void) = 0; virtual const char *GetGameDescription(void) { - return "Counter-Strike"; + return GetGameDescription_(); } virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) = 0; virtual void InitHUD(CBasePlayer *pl) = 0; @@ -97,34 +196,34 @@ public: virtual float FlPlayerFallDamage(CBasePlayer *pPlayer) = 0; virtual BOOL FPlayerCanTakeDamage(CBasePlayer *pPlayer, CBaseEntity *pAttacker) { - return TRUE; + return FPlayerCanTakeDamage_(pPlayer, pAttacker); } virtual BOOL ShouldAutoAim(CBasePlayer *pPlayer, edict_t *target) { - return TRUE; + return ShouldAutoAim_(pPlayer, target); } virtual void PlayerSpawn(CBasePlayer *pPlayer) = 0; virtual void PlayerThink(CBasePlayer *pPlayer) = 0; virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer) = 0; virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer) = 0; - NOBODY virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer); + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer); virtual BOOL AllowAutoTargetCrosshair(void) { - return TRUE; + return AllowAutoTargetCrosshair_(); } virtual BOOL ClientCommand_DeadOrAlive(CBasePlayer *pPlayer, const char *pcmd) { - return FALSE; + return ClientCommand_DeadOrAlive_(pPlayer, pcmd); } virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) { - return FALSE; + return ClientCommand_(pPlayer, pcmd); } virtual void ClientUserInfoChanged(CBasePlayer *pPlayer, char *infobuffer) {} virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) = 0; virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor) = 0; - NOBODY virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem); + virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem); virtual void PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; virtual int WeaponShouldRespawn(CBasePlayerItem *pWeapon) = 0; virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon) = 0; @@ -143,7 +242,7 @@ public: virtual float FlHealthChargerRechargeTime(void) = 0; virtual float FlHEVChargerRechargeTime(void) { - return 0.0f; + return FlHEVChargerRechargeTime_(); } virtual int DeadPlayerWeapons(CBasePlayer *pPlayer) = 0; virtual int DeadPlayerAmmo(CBasePlayer *pPlayer) = 0; @@ -151,40 +250,96 @@ public: virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) = 0; virtual int GetTeamIndex(const char *pTeamName) { - return -1; + return GetTeamIndex_(pTeamName); } virtual const char *GetIndexedTeamName(int teamIndex) { - return ""; + return GetIndexedTeamName_(teamIndex); } virtual BOOL IsValidTeam(const char *pTeamName) { - return TRUE; + return IsValidTeam_(pTeamName); } virtual void ChangePlayerTeam(CBasePlayer *pPlayer, const char *pTeamName, BOOL bKill, BOOL bGib) {} virtual const char *SetDefaultPlayerTeam(CBasePlayer *pPlayer) { - return ""; + return SetDefaultPlayerTeam_(pPlayer); } virtual BOOL PlayTextureSounds(void) { - return TRUE; + return PlayTextureSounds_(); } virtual BOOL FAllowMonsters(void) = 0; virtual void EndMultiplayerGame(void) {} virtual BOOL IsFreezePeriod(void) { - return m_bFreezePeriod; + return IsFreezePeriod_(); } virtual void ServerDeactivate(void) {} virtual void CheckMapConditions(void) {} #ifdef HOOK_GAMEDLL - void RefreshSkillData_(void); - NOBODY edict_t *GetPlayerSpawnSpot_(CBasePlayer *pPlayer); - NOBODY BOOL CanHavePlayerItem_(CBasePlayer *pPlayer, CBasePlayerItem *pItem); - BOOL CanHaveAmmo_(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry); + void RefreshSkillData_(void); + BOOL IsTeamplay_(void) + { + return FALSE; + } + const char *GetGameDescription_(void) + { + return "Counter-Strike"; + } + BOOL FPlayerCanTakeDamage_(CBasePlayer *pPlayer, CBaseEntity *pAttacker) + { + return TRUE; + } + BOOL ShouldAutoAim_(CBasePlayer *pPlayer, edict_t *target) + { + return TRUE; + } + edict_t *GetPlayerSpawnSpot_(CBasePlayer *pPlayer); + BOOL AllowAutoTargetCrosshair_(void) + { + return TRUE; + } + BOOL ClientCommand_DeadOrAlive_(CBasePlayer *pPlayer, const char *pcmd) + { + return FALSE; + } + BOOL ClientCommand_(CBasePlayer *pPlayer, const char *pcmd) + { + return FALSE; + } + BOOL CanHavePlayerItem_(CBasePlayer *pPlayer, CBasePlayerItem *pItem); + BOOL CanHaveAmmo_(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry); + float FlHEVChargerRechargeTime_(void) + { + return 0.0f; + } + int GetTeamIndex_(const char *pTeamName) + { + return -1; + } + const char *GetIndexedTeamName_(int teamIndex) + { + return ""; + } + BOOL IsValidTeam_(const char *pTeamName) + { + return TRUE; + } + const char *SetDefaultPlayerTeam_(CBasePlayer *pPlayer) + { + return ""; + } + BOOL PlayTextureSounds_(void) + { + return TRUE; + } + BOOL IsFreezePeriod_(void) + { + return m_bFreezePeriod; + } #endif // HOOK_GAMEDLL @@ -192,12 +347,14 @@ public: //int **_vptr.CGameRules; BOOL m_bFreezePeriod; BOOL m_bBombDropped; + };/* size: 12, cachelines: 1, members: 3 */ class CHalfLifeRules: public CGameRules { public: CHalfLifeRules(void); + virtual void Think(void); virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity); virtual BOOL FAllowFlashlight(void) @@ -248,7 +405,53 @@ public: #ifdef HOOK_GAMEDLL - void PlayerSpawn_(CBasePlayer *pPlayer); + void Think_(void); + BOOL IsAllowedToSpawn_(CBaseEntity *pEntity); + BOOL FAllowFlashlight_(void) + { + return TRUE; + }; + BOOL FShouldSwitchWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); + BOOL GetNextBestWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon); + BOOL IsMultiplayer_(void); + BOOL IsDeathmatch_(void); + BOOL IsCoOp_(void); + BOOL ClientConnected_(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]); + void InitHUD_(CBasePlayer *pl); + void ClientDisconnected_(edict_t *pClient); + float FlPlayerFallDamage_(CBasePlayer *pPlayer); + void PlayerSpawn_(CBasePlayer *pPlayer); + void PlayerThink_(CBasePlayer *pPlayer); + BOOL FPlayerCanRespawn_(CBasePlayer *pPlayer); + float FlPlayerSpawnTime_(CBasePlayer *pPlayer); + edict_t *GetPlayerSpawnSpot_(CBasePlayer *pPlayer); + BOOL AllowAutoTargetCrosshair_(void); + int IPointsForKill_(CBasePlayer *pAttacker, CBasePlayer *pKilled); + void PlayerKilled_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); + void DeathNotice_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); + void PlayerGotWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); + int WeaponShouldRespawn_(CBasePlayerItem *pWeapon); + float FlWeaponRespawnTime_(CBasePlayerItem *pWeapon); + float FlWeaponTryRespawn_(CBasePlayerItem *pWeapon); + Vector VecWeaponRespawnSpot_(CBasePlayerItem *pWeapon); + BOOL CanHaveItem_(CBasePlayer *pPlayer, CItem *pItem); + void PlayerGotItem_(CBasePlayer *pPlayer, CItem *pItem); + int ItemShouldRespawn_(CItem *pItem); + float FlItemRespawnTime_(CItem *pItem); + Vector VecItemRespawnSpot_(CItem *pItem); + void PlayerGotAmmo_(CBasePlayer *pPlayer, char *szName, int iCount); + int AmmoShouldRespawn_(CBasePlayerAmmo *pAmmo); + float FlAmmoRespawnTime_(CBasePlayerAmmo *pAmmo); + Vector VecAmmoRespawnSpot_(CBasePlayerAmmo *pAmmo); + float FlHealthChargerRechargeTime_(void); + int DeadPlayerWeapons_(CBasePlayer *pPlayer); + int DeadPlayerAmmo_(CBasePlayer *pPlayer); + const char *GetTeamID_(CBaseEntity *pEntity) + { + return ""; + }; + int PlayerRelationship_(CBasePlayer *pPlayer, CBaseEntity *pTarget); + BOOL FAllowMonsters_(void); #endif // HOOK_GAMEDLL @@ -260,74 +463,74 @@ public: CHalfLifeMultiplay(void); public: virtual void RefreshSkillData(void); - NOBODY virtual void Think(void); - NOBODY virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity); + virtual void Think(void); + virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity); virtual BOOL FAllowFlashlight(void); virtual BOOL FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); virtual BOOL GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon); virtual BOOL IsMultiplayer(void); virtual BOOL IsDeathmatch(void); virtual BOOL IsCoOp(void); - NOBODY virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]); - NOBODY virtual void InitHUD(CBasePlayer *pl); - NOBODY virtual void ClientDisconnected(edict_t *pClient); - NOBODY virtual void UpdateGameMode(CBasePlayer *pPlayer); + virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]); + virtual void InitHUD(CBasePlayer *pl); + virtual void ClientDisconnected(edict_t *pClient); + virtual void UpdateGameMode(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); - NOBODY virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer); - NOBODY virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer); - NOBODY virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer); - NOBODY virtual BOOL AllowAutoTargetCrosshair(void); - NOBODY virtual BOOL ClientCommand_DeadOrAlive(CBasePlayer *pPlayer, const char *pcmd); - NOBODY virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd); - NOBODY virtual void ClientUserInfoChanged(CBasePlayer *pPlayer, char *infobuffer); - NOBODY virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled); - NOBODY virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); - NOBODY virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); - NOBODY virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); + virtual BOOL FPlayerCanTakeDamage(CBasePlayer *pPlayer, CBaseEntity *pAttacker); + virtual void PlayerSpawn(CBasePlayer *pPlayer); + virtual void PlayerThink(CBasePlayer *pPlayer); + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer); + virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer); + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer); + virtual BOOL AllowAutoTargetCrosshair(void); + virtual BOOL ClientCommand_DeadOrAlive(CBasePlayer *pPlayer, const char *pcmd); + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd); + virtual void ClientUserInfoChanged(CBasePlayer *pPlayer, char *infobuffer); + virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled); + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); + virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); + virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); virtual void PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); virtual int WeaponShouldRespawn(CBasePlayerItem *pWeapon); - NOBODY virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon); - NOBODY virtual float FlWeaponTryRespawn(CBasePlayerItem *pWeapon); - NOBODY virtual Vector VecWeaponRespawnSpot(CBasePlayerItem *pWeapon); + virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon); + virtual float FlWeaponTryRespawn(CBasePlayerItem *pWeapon); + virtual Vector VecWeaponRespawnSpot(CBasePlayerItem *pWeapon); virtual BOOL CanHaveItem(CBasePlayer *pPlayer, CItem *pItem); virtual void PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem); virtual int ItemShouldRespawn(CItem *pItem); virtual float FlItemRespawnTime(CItem *pItem); virtual Vector VecItemRespawnSpot(CItem *pItem); - NOBODY virtual void PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount); + virtual void PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount); virtual int AmmoShouldRespawn(CBasePlayerAmmo *pAmmo); virtual float FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo); virtual Vector VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo); - NOBODY virtual float FlHealthChargerRechargeTime(void); - NOBODY virtual float FlHEVChargerRechargeTime(void); - NOBODY virtual int DeadPlayerWeapons(CBasePlayer *pPlayer); - NOBODY virtual int DeadPlayerAmmo(CBasePlayer *pPlayer); + virtual float FlHealthChargerRechargeTime(void); + virtual float FlHEVChargerRechargeTime(void); + virtual int DeadPlayerWeapons(CBasePlayer *pPlayer); + virtual int DeadPlayerAmmo(CBasePlayer *pPlayer); virtual const char *GetTeamID(CBaseEntity *pEntity) { - return ""; + return GetTeamID_(pEntity); } - NOBODY virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget); + virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget); virtual BOOL PlayTextureSounds(void) { - return FALSE; + return PlayTextureSounds_(); } - NOBODY virtual BOOL FAllowMonsters(void); + virtual BOOL FAllowMonsters(void); virtual void EndMultiplayerGame(void) { - GoToIntermission(); - }; - NOBODY virtual void ServerDeactivate(void); - NOBODY virtual void CheckMapConditions(void); - NOBODY virtual void CleanUpMap(void); - NOBODY virtual void RestartRound(void); - NOBODY virtual void CheckWinConditions(void); + EndMultiplayerGame_(); + } + virtual void ServerDeactivate(void); + virtual void CheckMapConditions(void); + virtual void CleanUpMap(void); + virtual void RestartRound(void); + virtual void CheckWinConditions(void); virtual void RemoveGuns(void); - NOBODY virtual void GiveC4(void); - NOBODY virtual void ChangeLevel(void); - NOBODY virtual void GoToIntermission(void); + virtual void GiveC4(void); + virtual void ChangeLevel(void); + virtual void GoToIntermission(void); #ifdef HOOK_GAMEDLL @@ -377,8 +580,20 @@ public: float FlHEVChargerRechargeTime_(void); int DeadPlayerWeapons_(CBasePlayer *pPlayer); int DeadPlayerAmmo_(CBasePlayer *pPlayer); + const char *GetTeamID_(CBaseEntity *pEntity) + { + return ""; + } int PlayerRelationship_(CBasePlayer *pPlayer, CBaseEntity *pTarget); + BOOL PlayTextureSounds_(void) + { + return FALSE; + } BOOL FAllowMonsters_(void); + void EndMultiplayerGame_(void) + { + GoToIntermission(); + } void ServerDeactivate_(void); void CheckMapConditions_(void); void CleanUpMap_(void); @@ -393,10 +608,10 @@ public: public: BOOL IsCareer(void); - NOBODY void QueueCareerRoundEndMenu(float tmDelay, int iWinStatus); - NOBODY void SetCareerMatchLimit(int minWins, int winDifference); - NOBODY bool IsInCareerRound(void); - NOBODY void CareerRestart(void); + void QueueCareerRoundEndMenu(float tmDelay, int iWinStatus); + void SetCareerMatchLimit(int minWins, int winDifference); + bool IsInCareerRound(void); + void CareerRestart(void); bool ShouldSkipSpawn(void) { return m_bSkipSpawn; @@ -405,39 +620,40 @@ public: { m_bSkipSpawn = false; } - NOBODY void PlayerJoinedTeam(CBasePlayer *pPlayer); + NOXREF void PlayerJoinedTeam(CBasePlayer *pPlayer) + { + ; + } float TimeRemaining(void) { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; } - NOBODY BOOL TeamFull(int team_id); + BOOL TeamFull(int team_id); BOOL TeamStacked(int newTeam_id, int curTeam_id); - NOBODY bool IsVIPQueueEmpty(void); - NOBODY bool AddToVIPQueue(CBasePlayer *toAdd); - NOBODY void PickNextVIP(void); - NOBODY void StackVIPQueue(void); - NOBODY void ResetCurrentVIP(void); - NOBODY void BalanceTeams(void); - NOBODY void SwapAllPlayers(void); - NOBODY void UpdateTeamScores(void); - NOBODY void DisplayMaps(CBasePlayer *player, int iVote); - NOBODY void ResetAllMapVotes(void); - NOBODY void ProcessMapVote(CBasePlayer *player, int iVote); + bool IsVIPQueueEmpty(void); + bool AddToVIPQueue(CBasePlayer *toAdd); + void PickNextVIP(void); + void StackVIPQueue(void); + void ResetCurrentVIP(void); + void BalanceTeams(void); + void SwapAllPlayers(void); + void UpdateTeamScores(void); + void DisplayMaps(CBasePlayer *player, int iVote); + void ResetAllMapVotes(void); + void ProcessMapVote(CBasePlayer *player, int iVote); BOOL IsThereABomber(void); BOOL IsThereABomb(void); - NOBODY bool IsMatchStarted(void); - NOBODY void SendMOTDToClient(edict_t *client); -private: - NOBODY bool HasRoundTimeExpired(void); - NOBODY bool IsBombPlanted(void); - NOBODY void MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(int iTeam); - - inline void TerminateRound(float tmDelay, int iWinStatus) + bool IsMatchStarted(void) { - m_iRoundWinStatus = iWinStatus; - m_bRoundTerminating = true; - m_fTeamCount = gpGlobals->time + tmDelay; + return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); } + void SendMOTDToClient(edict_t *client); + +private: + bool HasRoundTimeExpired(void); + bool IsBombPlanted(void); + void MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(int iTeam); + public: CVoiceGameMgr m_VoiceGameMgr; float m_fTeamCount; @@ -503,6 +719,7 @@ public: float m_flFadeToBlackValue; CBasePlayer *m_pVIP; CBasePlayer *VIPQueue[ MAX_VIP_QUEUES ]; + protected: float m_flIntermissionEndTime; float m_flIntermissionStartTime; @@ -514,7 +731,7 @@ protected: int m_iCareerMatchWins; int m_iRoundWinDifference; float m_fCareerMatchMenuTime; - bool m_bSkipSpawn; + bool m_bSkipSpawn;//712 };/* size: 708, cachelines: 12, members: 76 */ @@ -532,6 +749,7 @@ typedef struct mapcycle_s { struct mapcycle_item_s *items; struct mapcycle_item_s *next_item; + } mapcycle_t; /* size: 8, cachelines: 1, members: 2 */ @@ -559,37 +777,11 @@ public: class CCStrikeGameMgrHelper: public IVoiceGameMgrHelper { public: - virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender) - { - return CanPlayerHearPlayer_(pListener, pSender); - } + virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender); #ifdef HOOK_GAMEDLL - bool CanPlayerHearPlayer_(CBasePlayer *pListener, CBasePlayer *pSender) - { - if (!pSender->IsPlayer() || pListener->m_iTeam != pSender->m_iTeam) - return false; - - BOOL bListenerAlive = pListener->IsAlive(); - BOOL bSenderAlive = pSender->IsAlive(); - - if (pListener->IsObserver()) - return true; - - if (bListenerAlive) - { - if (!bSenderAlive) - return false; - } - else - { - if (bSenderAlive) - return true; - } - - return (bListenerAlive == bSenderAlive); - } + bool CanPlayerHearPlayer_(CBasePlayer *pListener, CBasePlayer *pSender); #endif // HOOK_GAMEDLL @@ -617,26 +809,32 @@ CGameRules *InstallGameRules(void); * Multiplay gamerules */ -NOBODY bool IsBotSpeaking(void); -NOBODY void SV_Continue_f(void); -NOBODY void SV_Tutor_Toggle_f(void); -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); +bool IsBotSpeaking(void); +void SV_Continue_f(void); +void SV_Tutor_Toggle_f(void); +void SV_Career_Restart_f(void); +void SV_Career_EndRound_f(void); +void SV_CareerAddTask_f(void); +void SV_CareerMatchLimit_f(void); void Broadcast(const char *sentence); char *GetTeam(int teamNo); -NOBODY void EndRoundMessage(const char *sentence, int event); -NOBODY void ReadMultiplayCvars(CHalfLifeMultiplay *mp); -NOBODY void DestroyMapCycle(mapcycle_t *cycle); +void EndRoundMessage(const char *sentence, int event); +void ReadMultiplayCvars(CHalfLifeMultiplay *mp); +void DestroyMapCycle(mapcycle_t *cycle); char *MP_COM_GetToken(void); char *MP_COM_Parse(char *data); -NOXREF int MP_COM_TokenWaiting(char *buffer); +int MP_COM_TokenWaiting(char *buffer); -NOBODY int ReloadMapCycleFile(char *filename, mapcycle_t *cycle); -NOBODY int CountPlayers(void); -NOBODY void ExtractCommandString(char *s, char *szCommand); -NOBODY int GetMapCount(void); +int ReloadMapCycleFile(char *filename, mapcycle_t *cycle); +int CountPlayers(void); +void ExtractCommandString(char *s, char *szCommand); +int GetMapCount(void); + +// refs +extern void (*pInstallGameRules)(void); + +// linked objects +C_DLLEXPORT void info_map_parameters(entvars_t *pev); #endif // GAMERULES_H diff --git a/regamedll/dlls/ggrenade.cpp b/regamedll/dlls/ggrenade.cpp index c14a298f..5f8b43e6 100644 --- a/regamedll/dlls/ggrenade.cpp +++ b/regamedll/dlls/ggrenade.cpp @@ -532,7 +532,7 @@ void CGrenade::SG_Smoke(void) } /* ../cstrike/dlls/ggrenade.cpp:664 */ -void CGrenade::Killed_(entvars_t *pevAttacker, int iGib) +void CGrenade::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) { Detonate(); } @@ -758,7 +758,7 @@ void CGrenade::SlideTouch(CBaseEntity *pOther) } /* ../cstrike/dlls/ggrenade.cpp:904 */ -void CGrenade::BounceSound_(void) +void CGrenade::__MAKE_VHOOK(BounceSound)(void) { if (pev->dmg > 50) { @@ -849,7 +849,7 @@ void CGrenade::SG_TumbleThink(void) } /* ../cstrike/dlls/ggrenade.cpp:985 */ -void CGrenade::Spawn_(void) +void CGrenade::__MAKE_VHOOK(Spawn)(void) { m_iBounceCount = 0; pev->movetype = MOVETYPE_BOUNCE; @@ -977,7 +977,7 @@ CGrenade *CGrenade::ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecV } /* ../cstrike/dlls/ggrenade.cpp:1113 */ -void CGrenade::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGrenade::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { if (!m_bIsC4) return; @@ -1145,8 +1145,8 @@ void AnnounceFlashInterval(float interval, float offset) WRITE_BYTE(1); WRITE_STRING("bombticking"); WRITE_BYTE(255); - WRITE_SHORT((short)interval); // interval - WRITE_SHORT((short)offset); + WRITE_SHORT((int)interval); // interval + WRITE_SHORT((int)offset); MESSAGE_END(); } diff --git a/regamedll/dlls/h_battery.cpp b/regamedll/dlls/h_battery.cpp index 3d0d7f6a..54eb4835 100644 --- a/regamedll/dlls/h_battery.cpp +++ b/regamedll/dlls/h_battery.cpp @@ -27,7 +27,7 @@ IMPLEMENT_SAVERESTORE(CRecharge, CBaseEntity); LINK_ENTITY_TO_CLASS(func_recharge, CRecharge); /* ../cstrike/dlls/h_battery.cpp:66 */ -void CRecharge::KeyValue_(KeyValueData *pkvd) +void CRecharge::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "style") || FStrEq(pkvd->szKeyName, "height") @@ -39,7 +39,7 @@ void CRecharge::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "dmdelay")) { - m_iReactivate = atoi(pkvd->szValue); + m_iReactivate = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else @@ -47,7 +47,7 @@ void CRecharge::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/h_battery.cpp:85 */ -void CRecharge::Spawn_(void) +void CRecharge::__MAKE_VHOOK(Spawn)(void) { Precache(); @@ -63,7 +63,7 @@ void CRecharge::Spawn_(void) } /* ../cstrike/dlls/h_battery.cpp:99 */ -void CRecharge::Precache_(void) +void CRecharge::__MAKE_VHOOK(Precache)(void) { PRECACHE_SOUND("items/suitcharge1.wav"); PRECACHE_SOUND("items/suitchargeno1.wav"); @@ -71,7 +71,7 @@ void CRecharge::Precache_(void) } /* ../cstrike/dlls/h_battery.cpp:107 */ -void CRecharge::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CRecharge::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // if it's not a player, ignore if (!FClassnameIs(pActivator->pev, "player")) diff --git a/regamedll/dlls/h_cycler.cpp b/regamedll/dlls/h_cycler.cpp index a15d4c0e..f75cf6c8 100644 --- a/regamedll/dlls/h_cycler.cpp +++ b/regamedll/dlls/h_cycler.cpp @@ -34,7 +34,7 @@ TYPEDESCRIPTION (*CWreckage::pm_SaveData)[1]; IMPLEMENT_SAVERESTORE(CCycler, CBaseToggle); /* ../cstrike/dlls/h_cycler.cpp:70 */ -void CGenericCycler::Spawn_(void) +void CGenericCycler::__MAKE_VHOOK(Spawn)(void) { // Vector(Vector::Spawn(// float X, // float Y, @@ -56,7 +56,7 @@ LINK_ENTITY_TO_CLASS(cycler, CGenericCycler); LINK_ENTITY_TO_CLASS(cycler_prdroid, CCyclerProbe); /* ../cstrike/dlls/h_cycler.cpp:86 */ -void CCyclerProbe::Spawn_(void) +void CCyclerProbe::__MAKE_VHOOK(Spawn)(void) { // Vector(Vector::Spawn(// float X, // float Y, @@ -81,23 +81,23 @@ void CCycler::GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax) } /* ../cstrike/dlls/h_cycler.cpp:115 */ -void CCycler::Spawn_(void) +void CCycler::__MAKE_VHOOK(Spawn)(void) { } /* ../cstrike/dlls/h_cycler.cpp:151 */ -void CCycler::Think_(void) +void CCycler::__MAKE_VHOOK(Think)(void) { // Think(CCycler *const this); // 151 } /* ../cstrike/dlls/h_cycler.cpp:176 */ -void CCycler::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CCycler::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { } /* ../cstrike/dlls/h_cycler.cpp:189 */ -int CCycler::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CCycler::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // TakeDamage(CCycler *const this, // entvars_t *pevInflictor, @@ -113,7 +113,7 @@ LINK_ENTITY_TO_CLASS(cycler_sprite, CCyclerSprite); IMPLEMENT_SAVERESTORE(CCyclerSprite, CBaseEntity); /* ../cstrike/dlls/h_cycler.cpp:284 */ -void CCyclerSprite::Restart_(void) +void CCyclerSprite::__MAKE_VHOOK(Restart)(void) { // { // int i; // 300 @@ -121,7 +121,7 @@ void CCyclerSprite::Restart_(void) } /* ../cstrike/dlls/h_cycler.cpp:258 */ -void CCyclerSprite::Spawn_(void) +void CCyclerSprite::__MAKE_VHOOK(Spawn)(void) { // { // int i; // 279 @@ -129,7 +129,7 @@ void CCyclerSprite::Spawn_(void) } /* ../cstrike/dlls/h_cycler.cpp:305 */ -void CCyclerSprite::Think_(void) +void CCyclerSprite::__MAKE_VHOOK(Think)(void) { // ShouldAnimate(CCyclerSprite *const this); // 307 // Animate(CCyclerSprite *const this, @@ -137,12 +137,12 @@ void CCyclerSprite::Think_(void) } /* ../cstrike/dlls/h_cycler.cpp:315 */ -void CCyclerSprite::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CCyclerSprite::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { } /* ../cstrike/dlls/h_cycler.cpp:322 */ -int CCyclerSprite::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CCyclerSprite::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // Animate(CCyclerSprite *const this, // float frames); // 326 @@ -159,7 +159,7 @@ void CCyclerSprite::Animate(float frames) LINK_ENTITY_TO_CLASS(cycler_weapon, CWeaponCycler); /* ../cstrike/dlls/h_cycler.cpp:361 */ -void CWeaponCycler::Spawn_(void) +void CWeaponCycler::__MAKE_VHOOK(Spawn)(void) { // Vector(Vector::Spawn(// float X, // float Y, @@ -171,22 +171,22 @@ void CWeaponCycler::Spawn_(void) } /* ../cstrike/dlls/h_cycler.cpp:378 */ -BOOL CWeaponCycler::Deploy_(void) +BOOL CWeaponCycler::__MAKE_VHOOK(Deploy)(void) { } /* ../cstrike/dlls/h_cycler.cpp:388 */ -void CWeaponCycler::Holster_(int skiplocal) +void CWeaponCycler::__MAKE_VHOOK(Holster)(int skiplocal) { } /* ../cstrike/dlls/h_cycler.cpp:394 */ -void CWeaponCycler::PrimaryAttack_(void) +void CWeaponCycler::__MAKE_VHOOK(PrimaryAttack)(void) { } /* ../cstrike/dlls/h_cycler.cpp:403 */ -void CWeaponCycler::SecondaryAttack_(void) +void CWeaponCycler::__MAKE_VHOOK(SecondaryAttack)(void) { // { // float flFrameRate; // 405 @@ -202,18 +202,18 @@ IMPLEMENT_SAVERESTORE(CWreckage, CBaseToggle); LINK_ENTITY_TO_CLASS(cycler_wreckage, CWreckage); /* ../cstrike/dlls/h_cycler.cpp:448 */ -void CWreckage::Spawn_(void) +void CWreckage::__MAKE_VHOOK(Spawn)(void) { } /* ../cstrike/dlls/h_cycler.cpp:468 */ -void CWreckage::Precache_(void) +void CWreckage::__MAKE_VHOOK(Precache)(void) { // Precache(CWreckage *const this); // 468 } /* ../cstrike/dlls/h_cycler.cpp:474 */ -void CWreckage::Think_(void) +void CWreckage::__MAKE_VHOOK(Think)(void) { // { // Vector VecSrc; // 492 diff --git a/regamedll/dlls/h_export.cpp b/regamedll/dlls/h_export.cpp index dded6d4e..66ac7c2d 100644 --- a/regamedll/dlls/h_export.cpp +++ b/regamedll/dlls/h_export.cpp @@ -6,7 +6,7 @@ globalvars_t *gpGlobals; /* ../cstrike/dlls/h_export.cpp:58 */ C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pEnginefuncsTable,globalvars_t *pGlobals) { - memcpy(&g_engfuncs, pEnginefuncsTable, sizeof(enginefuncs_t)); + Q_memcpy(&g_engfuncs, pEnginefuncsTable, sizeof(enginefuncs_t)); gpGlobals = pGlobals; #if defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS) diff --git a/regamedll/dlls/healthkit.cpp b/regamedll/dlls/healthkit.cpp index 02d62c10..2abdb9db 100644 --- a/regamedll/dlls/healthkit.cpp +++ b/regamedll/dlls/healthkit.cpp @@ -24,7 +24,7 @@ TYPEDESCRIPTION (*CWallHealth::pm_SaveData)[5]; LINK_ENTITY_TO_CLASS(item_healthkit, CHealthKit); /* ../cstrike/dlls/healthkit.cpp:55 */ -void CHealthKit::Spawn_(void) +void CHealthKit::__MAKE_VHOOK(Spawn)(void) { Precache(); SET_MODEL(ENT(pev), "models/w_medkit.mdl"); @@ -33,14 +33,14 @@ void CHealthKit::Spawn_(void) } /* ../cstrike/dlls/healthkit.cpp:63 */ -void CHealthKit::Precache_(void) +void CHealthKit::__MAKE_VHOOK(Precache)(void) { PRECACHE_MODEL("models/w_medkit.mdl"); PRECACHE_SOUND("items/smallmedkit1.wav"); } /* ../cstrike/dlls/healthkit.cpp:69 */ -BOOL CHealthKit::MyTouch_(CBasePlayer *pPlayer) +BOOL CHealthKit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) { if (pPlayer->TakeHealth(gSkillData.healthkitCapacity, DMG_GENERIC)) { @@ -68,7 +68,7 @@ IMPLEMENT_SAVERESTORE(CWallHealth, CBaseEntity); LINK_ENTITY_TO_CLASS(func_healthcharger, CWallHealth); /* ../cstrike/dlls/healthkit.cpp:135 */ -void CWallHealth::KeyValue_(KeyValueData *pkvd) +void CWallHealth::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "style") || FStrEq(pkvd->szKeyName, "height") || FStrEq(pkvd->szKeyName, "value1") || FStrEq(pkvd->szKeyName, "value2") || FStrEq(pkvd->szKeyName, "value3")) { @@ -76,7 +76,7 @@ void CWallHealth::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "dmdelay")) { - m_iReactivate = atoi(pkvd->szValue); + m_iReactivate = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else @@ -84,7 +84,7 @@ void CWallHealth::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/healthkit.cpp:154 */ -void CWallHealth::Spawn_(void) +void CWallHealth::__MAKE_VHOOK(Spawn)(void) { Precache(); @@ -102,7 +102,7 @@ void CWallHealth::Spawn_(void) } /* ../cstrike/dlls/healthkit.cpp:169 */ -void CWallHealth::Precache_(void) +void CWallHealth::__MAKE_VHOOK(Precache)(void) { PRECACHE_SOUND("items/medshot4.wav"); PRECACHE_SOUND("items/medshotno1.wav"); @@ -110,7 +110,7 @@ void CWallHealth::Precache_(void) } /* ../cstrike/dlls/healthkit.cpp:177 */ -void CWallHealth::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CWallHealth::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Make sure that we have a caller if (!pActivator) diff --git a/regamedll/dlls/hostage/hostage.cpp b/regamedll/dlls/hostage/hostage.cpp index 8199c026..3db8cfd8 100644 --- a/regamedll/dlls/hostage/hostage.cpp +++ b/regamedll/dlls/hostage/hostage.cpp @@ -5,8 +5,8 @@ */ #ifndef HOOK_GAMEDLL -cvar_t cv_hostage_stop = { "hostage_stop", "0", FCVAR_SERVER }; -cvar_t cv_hostage_debug = { "hostage_debug", "0", FCVAR_SERVER }; +cvar_t cv_hostage_stop = { "hostage_stop", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_hostage_debug = { "hostage_debug", "0", FCVAR_SERVER, 0.0f, NULL }; #else @@ -25,7 +25,7 @@ LINK_ENTITY_TO_CLASS(hostage_entity, CHostage); LINK_ENTITY_TO_CLASS(monster_scientist, CHostage); /* <45c228> ../cstrike/dlls/hostage/hostage.cpp:54 */ -NOBODY void CHostage::Spawn_(void) +NOBODY void CHostage::__MAKE_VHOOK(Spawn)(void) { // MAKE_STRING_CLASS(const char *str, // entvars_t *pev); // 61 @@ -44,7 +44,7 @@ NOBODY void CHostage::Spawn_(void) } /* <45bf91> ../cstrike/dlls/hostage/hostage.cpp:137 */ -NOBODY void CHostage::Precache_(void) +NOBODY void CHostage::__MAKE_VHOOK(Precache)(void) { // { // int which; // 141 @@ -52,18 +52,39 @@ NOBODY void CHostage::Precache_(void) } /* <45c5ac> ../cstrike/dlls/hostage/hostage.cpp:179 */ -NOBODY void CHostage::SetActivity(int act) -{ -// { -// int sequence; // 181 -// } -// SetActivity(CHostage *const this, -// int act); // 179 +void CHostage::SetActivity(int act) +{ + if (m_Activity != act) + { + int sequence = LookupActivity(act); + + if (sequence != -1) + { + if (pev->sequence != sequence) + { + if ((m_Activity != ACT_WALK && m_Activity != ACT_RUN) || (act != ACT_WALK && act != ACT_RUN)) + { + pev->frame = 0; + } + + pev->sequence = sequence; + } + + m_Activity = act; + ResetSequenceInfo(); + } + } } +void (*pCHostage__IdleThink)(void); + /* <45f194> ../cstrike/dlls/hostage/hostage.cpp:204 */ -NOBODY void CHostage::IdleThink(void) +NOBODY void __declspec(naked) CHostage::IdleThink(void) { + __asm + { + jmp pCHostage__IdleThink + } // { // float const upkeepRate; // 220 // float flInterval; // 224 @@ -135,22 +156,46 @@ NOBODY void CHostage::Remove(void) } /* <45c624> ../cstrike/dlls/hostage/hostage.cpp:426 */ -NOBODY void CHostage::RePosition(void) -{ -// Vector(Vector::RePosition(// float X, -// float Y, -// float Z); // 449 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 449 -// edict(CBaseEntity *const this); // 451 -// SetActivity(CHostage *const this, -// int act); // 453 +void CHostage::RePosition(void) +{ + pev->health = pev->max_health; + pev->movetype = MOVETYPE_STEP; + pev->solid = SOLID_SLIDEBOX; + pev->takedamage = DAMAGE_YES; + pev->deadflag = DEAD_NO; + pev->velocity = Vector(0, 0, 0); + pev->angles = m_vStartAngles; + pev->effects &= ~EF_NODRAW; + + m_hTargetEnt = NULL; + m_hStoppedTargetEnt = NULL; + + m_bTouched = FALSE; + m_bRescueMe = FALSE; + + m_flNextRadarTime = 0; + m_vOldPos = Vector(9999, 9999, 9999); + + UTIL_SetOrigin(pev, m_vStart); + UTIL_SetSize(pev, VEC_HOSTAGE_HULL_MIN, VEC_HOSTAGE_HULL_MAX); + + DROP_TO_FLOOR(edict()); + SetActivity(ACT_IDLE); + + SetThink(&CHostage::IdleThink); + pev->nextthink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); + + m_fHasPath = FALSE; + nTargetNode = -1; + + m_flLastPathCheck = -1; + m_flPathAcquired = -1; + m_flPathCheckInterval = 0.1f; + m_flNextFullThink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); } /* <45ee7f> ../cstrike/dlls/hostage/hostage.cpp:469 */ -NOBODY int CHostage::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // { // float flActualDamage; // 471 @@ -240,7 +285,7 @@ NOBODY void CHostage::ApplyHostagePenalty(CBasePlayer *pAttacker) } /* <45cfd6> ../cstrike/dlls/hostage/hostage.cpp:740 */ -NOBODY void CHostage::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CHostage::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // class CBasePlayer *pPlayer; // 742 @@ -290,12 +335,12 @@ NOBODY void CHostage::GiveCTTouchBonus(CBasePlayer *pPlayer) } /* <45bf69> ../cstrike/dlls/hostage/hostage.cpp:869 */ -NOBODY int CHostage::ObjectCaps_(void) +NOBODY int CHostage::__MAKE_VHOOK(ObjectCaps)(void) { } /* <45c0e3> ../cstrike/dlls/hostage/hostage.cpp:876 */ -NOBODY void CHostage::Touch_(CBaseEntity *pOther) +NOBODY void CHostage::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // class Vector2D vPush; // 901 @@ -395,67 +440,58 @@ NOBODY BOOL CHostage::IsOnLadder(void) } /* <45d727> ../cstrike/dlls/hostage/hostage.cpp:1106 */ -NOBODY void CHostage::NavReady(void) +void CHostage::NavReady(void) { -// { -// class CBaseEntity *pFollowing; // 1108 -// Vector vecDest; // 1109 -// float flRadius; // 1110 -// node_index_t nindexPath; // 1111 -// GetClassPtr(CBaseEntity *a); // 1118 -// { -// TraceResult tr; // 1123 -// Vector vecDropDest; // 1124 -// edict(CBaseEntity *const this); // 1129 -// } -// SetTargetEnt(CLocalNav *const this, -// class CBaseEntity *pTarget); // 1142 -// } - CBaseEntity *pFollowing; Vector vecDest; float flRadius = 40.0; - node_index_t nindexPath; - if (!m_hTargetEnt) + { return; + } pFollowing = GetClassPtr((CBaseEntity *)m_hTargetEnt->pev); vecDest = pFollowing->pev->origin; - + if (!(pFollowing->pev->flags & FL_ONGROUND)) { TraceResult tr; - Vector vecDropDest = pFollowing->pev->origin - Vector(0, 0, 300); - + Vector vecDropDest = (pFollowing->pev->origin - Vector(0, 0, 300)); UTIL_TraceHull(vecDest, vecDropDest, ignore_monsters, human_hull, pFollowing->edict(), &tr); - if (tr.fStartSolid || tr.flFraction == 1.0) + if (tr.fStartSolid || tr.flFraction == 1.0f) + { return; + } vecDest = tr.vecEndPos; } vecDest.z += pFollowing->pev->mins.z; m_LocalNav->SetTargetEnt(pFollowing); - nindexPath = m_LocalNav->FindPath(pev->origin, vecDest, flRadius, 1);// TODO: Reverse me - if (nindexPath != -1) + node_index_t nindexPath = m_LocalNav->FindPath(pev->origin, vecDest, flRadius, 1); + if (nindexPath == -1) + { + if (!m_fHasPath) + { + m_flPathCheckInterval += 0.1; + + if (m_flPathCheckInterval >= 0.5f) + { + m_flPathCheckInterval = 0.5f; + } + } + } + else { m_fHasPath = TRUE; nTargetNode = -1; + m_flPathAcquired = gpGlobals->time; m_flPathCheckInterval = 0.5; - m_flPathAcquired = gpGlobals->time; - m_nPathNodes = m_LocalNav->SetupPathNodes(nindexPath, vecNodes, 1);// TODO: Reverse me - } - else if (!m_fHasPath) - { - m_flPathCheckInterval += 0.1; - - if (m_flPathCheckInterval >= 0.5f) - m_flPathCheckInterval = 0.5; + m_nPathNodes = m_LocalNav->SetupPathNodes(nindexPath, vecNodes, 1); } } @@ -544,14 +580,20 @@ void CHostage::PreThink(void) float flRaisedDist; float flInterval; - if (m_improv) + if (m_improv != NULL) + { return; + } if (!(pev->flags & FL_ONGROUND)) + { return; + } if (pev->velocity.Length2D() < 1) + { return; + } vecSrc = pev->origin; @@ -566,8 +608,10 @@ void CHostage::PreThink(void) TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); - if (tr.fStartSolid || tr.flFraction == 1.0 || tr.vecPlaneNormal.z > 0.7) + if (tr.fStartSolid || tr.flFraction == 1.0f || tr.vecPlaneNormal.z > 0.7f) + { return; + } flOrigDist = (tr.vecEndPos - pev->origin).Length2D(); vecSrc.z += flInterval; @@ -577,7 +621,9 @@ void CHostage::PreThink(void) TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); if (tr.fStartSolid) + { return; + } vecSrc = tr.vecEndPos; vecDest = tr.vecEndPos; @@ -585,8 +631,10 @@ void CHostage::PreThink(void) TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); - if (tr.vecPlaneNormal.z < 0.7) + if (tr.vecPlaneNormal.z < 0.7f) + { return; + } flRaisedDist = (tr.vecEndPos - pev->origin).Length2D(); @@ -618,7 +666,7 @@ NOBODY void InstallHostageManager(void) /* <45e375> ../cstrike/dlls/hostage/hostage.cpp:1443 */ NOBODY CHostageManager::CHostageManager(void) { - memset(&m_chatter, 0, sizeof(m_chatter)); + Q_memset(&m_chatter, 0, sizeof(m_chatter)); m_hostageCount = 0; // SimpleChatter(SimpleChatter *const this); // 1443 @@ -777,11 +825,15 @@ void CHostageManager::ServerDeactivate(void) } /* <45e3f7> ../cstrike/dlls/hostage/hostage.cpp:1631 */ -NOBODY void CHostageManager::RestartRound(void) -{ -// { -// int i; // 1634 -// } +void CHostageManager::RestartRound(void) +{ + for (int i = 0; i < m_hostageCount; i++) + { + if (m_hostage[ i ]->m_improv != NULL) + { + m_hostage[ i ]->m_improv->OnReset(); + } + } } /* <45e43d> ../cstrike/dlls/hostage/hostage.cpp:1640 */ @@ -846,8 +898,10 @@ void CHostageManager::OnEvent(GameEventType event, CBaseEntity *entity, CBaseEnt { CHostageImprov *improv = m_hostage[ i ]->m_improv; - if (improv) + if (improv != NULL) + { improv->OnGameEvent(event, entity, other); + } } } diff --git a/regamedll/dlls/hostage/hostage.h b/regamedll/dlls/hostage/hostage.h index 95f33d46..21a4e2b2 100644 --- a/regamedll/dlls/hostage/hostage.h +++ b/regamedll/dlls/hostage/hostage.h @@ -34,11 +34,16 @@ #include "hostage/hostage_improv.h" -#define MAX_NODES 100 -#define MAX_HOSTAGES 12 -#define MAX_HOSTAGES_NAV 20 +#define MAX_NODES 100 +#define MAX_HOSTAGES 12 +#define MAX_HOSTAGES_NAV 20 -#define HOSTAGE_STEPSIZE 26.0 +#define HOSTAGE_STEPSIZE 26.0 +#define HOSTAGE_STEPSIZE_DEFAULT 18.0 + +#define VEC_HOSTAGE_VIEW Vector(0, 0, 12) +#define VEC_HOSTAGE_HULL_MIN Vector(-10, -10, 0) +#define VEC_HOSTAGE_HULL_MAX Vector(10, 10, 62) class CHostage; class CLocalNav; @@ -106,10 +111,11 @@ public: NOBODY virtual void Touch(CBaseEntity *pOther); NOBODY virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); +public: NOBODY void EXPORT IdleThink(void); NOBODY void Remove(void); - NOBODY void RePosition(void); - NOBODY void SetActivity(int act); + void RePosition(void); + void SetActivity(int act); NOBODY int GetActivity(void); NOBODY float GetModifiedDamage(float flDamage, int nHitGroup); NOBODY void SetFlinchActivity(void); @@ -132,9 +138,18 @@ public: NOBODY bool IsFollowingSomeone(void) { UNTESTED - return ((CHostageImprov *)m_improv)->IsFollowing(); + return m_improv->IsFollowing(NULL); + } + NOBODY CBaseEntity *GetLeader(void) + { + UNTESTED + if (m_improv != NULL) + { + return m_improv->GetFollowLeader(); + } + + return NULL; } - NOBODY CBaseEntity *GetLeader(void);// NOBODY bool IsFollowing(const CBaseEntity *entity) { return (entity == m_hTargetEnt && m_State == FOLLOW); @@ -263,7 +278,7 @@ public: void ServerActivate(void); void ServerDeactivate(void); - NOBODY void RestartRound(void); + void RestartRound(void); void AddHostage(CHostage *hostage); SimpleChatter *GetChatter(void) { @@ -352,4 +367,7 @@ private: void Hostage_RegisterCVars(void); NOBODY void InstallHostageManager(void); +// refs +extern void (*pCHostage__IdleThink)(void); + #endif // HOSTAGE_H diff --git a/regamedll/dlls/hostage/hostage_improv.cpp b/regamedll/dlls/hostage/hostage_improv.cpp index 2e7cd676..61e1d9bf 100644 --- a/regamedll/dlls/hostage/hostage_improv.cpp +++ b/regamedll/dlls/hostage/hostage_improv.cpp @@ -45,12 +45,12 @@ CHostageImprov::CHostageImprov(CBaseEntity *entity) } /* <470d33> ../cstrike/dlls/hostage/hostage_improv.cpp:52 */ -NOBODY bool CHostageImprov::IsAlive(void) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsAlive)(void) const { } /* <474809> ../cstrike/dlls/hostage/hostage_improv.cpp:61 */ -NOBODY void CHostageImprov::MoveTo(const Vector &goal) +NOBODY void CHostageImprov::__MAKE_VHOOK(MoveTo)(const Vector &goal) { // Invalidate(CNavPath *const this); // 64 // MoveTo(CHostageImprov *const this, @@ -58,7 +58,7 @@ NOBODY void CHostageImprov::MoveTo(const Vector &goal) } /* <4717e4> ../cstrike/dlls/hostage/hostage_improv.cpp:78 */ -NOBODY bool CHostageImprov::GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal) +NOBODY bool CHostageImprov::__MAKE_VHOOK(GetSimpleGroundHeightWithFloor)(const Vector *pos, float *height, Vector *normal) { // GetSimpleGroundHeightWithFloor(CHostageImprov *const this, // const Vector *pos, @@ -79,22 +79,22 @@ NOBODY bool CHostageImprov::DiscontinuityJump(float ground, bool onlyJumpDown, b } /* <470d5b> ../cstrike/dlls/hostage/hostage_improv.cpp:116 */ -NOBODY void CHostageImprov::LookAt(const Vector &target) +NOBODY void CHostageImprov::__MAKE_VHOOK(LookAt)(const Vector &target) { } /* <470d97> ../cstrike/dlls/hostage/hostage_improv.cpp:126 */ -NOBODY void CHostageImprov::ClearLookAt(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(ClearLookAt)(void) { } /* <470dbf> ../cstrike/dlls/hostage/hostage_improv.cpp:135 */ -NOBODY void CHostageImprov::FaceTo(const Vector &goal) +NOBODY void CHostageImprov::__MAKE_VHOOK(FaceTo)(const Vector &goal) { } /* <470dfb> ../cstrike/dlls/hostage/hostage_improv.cpp:145 */ -NOBODY void CHostageImprov::ClearFaceTo(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(ClearFaceTo)(void) { } @@ -214,7 +214,7 @@ NOBODY void CHostageImprov::FaceOutwards(void) } /* <470e23> ../cstrike/dlls/hostage/hostage_improv.cpp:344 */ -NOBODY bool CHostageImprov::IsAtMoveGoal(float error) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsAtMoveGoal)(float error) const { // operator-(const Vector *const this, // const Vector &v); // 346 @@ -223,12 +223,12 @@ NOBODY bool CHostageImprov::IsAtMoveGoal(float error) const } /* <470eab> ../cstrike/dlls/hostage/hostage_improv.cpp:353 */ -NOBODY bool CHostageImprov::IsAtFaceGoal(void) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsAtFaceGoal)(void) const { } /* <46fb4b> ../cstrike/dlls/hostage/hostage_improv.cpp:395 */ -NOBODY bool CHostageImprov::IsFriendInTheWay(const Vector &goalPos) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsFriendInTheWay)(const Vector &goalPos) const { // { // float const avoidFriendInterval; // 403 @@ -248,7 +248,7 @@ NOBODY bool CHostageImprov::IsFriendInTheWay(const Vector &goalPos) const } /* <472b83> ../cstrike/dlls/hostage/hostage_improv.cpp:453 */ -NOBODY bool CHostageImprov::IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsFriendInTheWay)(CBaseEntity *myFriend, const Vector &goalPos) const { // { // Vector moveDir; // 460 @@ -302,7 +302,7 @@ NOBODY float CHostageImprov::GetSpeed(void) } /* <46f249> ../cstrike/dlls/hostage/hostage_improv.cpp:592 */ -NOBODY bool CHostageImprov::Jump(void) +NOBODY bool CHostageImprov::__MAKE_VHOOK(Jump)(void) { // IsElapsed(const class CountdownTimer *const this); // 604 // { @@ -316,42 +316,45 @@ NOBODY bool CHostageImprov::Jump(void) } /* <470ed3> ../cstrike/dlls/hostage/hostage_improv.cpp:632 */ -NOBODY void CHostageImprov::Run(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(Run)(void) { } /* <470efb> ../cstrike/dlls/hostage/hostage_improv.cpp:638 */ -NOBODY void CHostageImprov::Walk(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(Walk)(void) { } /* <470f23> ../cstrike/dlls/hostage/hostage_improv.cpp:644 */ -NOBODY void CHostageImprov::Stop(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(Stop)(void) { } /* <470f4c> ../cstrike/dlls/hostage/hostage_improv.cpp:655 */ -NOBODY const Vector &CHostageImprov::GetFeet(void) const +const Vector &CHostageImprov::__MAKE_VHOOK(GetFeet)(void) const { + return m_hostage->pev->origin; } /* <470f74> ../cstrike/dlls/hostage/hostage_improv.cpp:661 */ -NOBODY const Vector &CHostageImprov::GetCentroid(void) const +NOBODY const Vector &CHostageImprov::__MAKE_VHOOK(GetCentroid)(void) { + m_centroid = m_hostage->pev->origin + Vector(0, 0, 36); + return m_centroid; } /* <470f9c> ../cstrike/dlls/hostage/hostage_improv.cpp:671 */ -NOBODY const Vector &CHostageImprov::GetEyes(void) const +NOBODY const Vector &CHostageImprov::__MAKE_VHOOK(GetEyes)(void) const { } /* <470fc4> ../cstrike/dlls/hostage/hostage_improv.cpp:681 */ -NOBODY bool CHostageImprov::IsOnGround(void) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsOnGround)(void) const { } /* <470fec> ../cstrike/dlls/hostage/hostage_improv.cpp:687 */ -NOBODY bool CHostageImprov::IsMoving(void) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsMoving)(void) const { // { // float const epsilon; // 689 @@ -361,7 +364,7 @@ NOBODY bool CHostageImprov::IsMoving(void) const } /* <4715d1> ../cstrike/dlls/hostage/hostage_improv.cpp:697 */ -NOBODY bool CHostageImprov::IsVisible(const Vector &pos, bool testFOV) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsVisible)(const Vector &pos, bool testFOV) const { // { // class Vectorconst eye; // 707 @@ -372,7 +375,7 @@ NOBODY bool CHostageImprov::IsVisible(const Vector &pos, bool testFOV) const } /* <472938> ../cstrike/dlls/hostage/hostage_improv.cpp:728 */ -NOBODY bool CHostageImprov::IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance) const +NOBODY bool CHostageImprov::__MAKE_VHOOK(IsPlayerLookingAtMe)(CBasePlayer *other, float cosTolerance) const { // { // class Vector2D toOther; // 730 @@ -385,7 +388,7 @@ NOBODY bool CHostageImprov::IsPlayerLookingAtMe(CBasePlayer *other, float cosTol } /* <472a9f> ../cstrike/dlls/hostage/hostage_improv.cpp:757 */ -NOBODY CBasePlayer *CHostageImprov::IsAnyPlayerLookingAtMe(int team, float cosTolerance) const +NOBODY CBasePlayer *CHostageImprov::__MAKE_VHOOK(IsAnyPlayerLookingAtMe)(int team, float cosTolerance) const { // { // int i; // 759 @@ -397,7 +400,7 @@ NOBODY CBasePlayer *CHostageImprov::IsAnyPlayerLookingAtMe(int team, float cosTo } /* <472e7b> ../cstrike/dlls/hostage/hostage_improv.cpp:783 */ -NOBODY CBasePlayer *CHostageImprov::GetClosestPlayerByTravelDistance(int team, float *range) const +NOBODY CBasePlayer *CHostageImprov::__MAKE_VHOOK(GetClosestPlayerByTravelDistance)(int team, float *range) const { // { // class CBasePlayer *close; // 788 @@ -420,21 +423,60 @@ NOBODY CBasePlayer *CHostageImprov::GetClosestPlayerByTravelDistance(int team, f } /* <47166d> ../cstrike/dlls/hostage/hostage_improv.cpp:822 */ -NOBODY void CHostageImprov::OnReset(void) +void CHostageImprov::__MAKE_VHOOK(OnReset)(void) { -// Invalidate(CountdownTimer *const this); // 833 -// SetMoveAngle(CHostageImprov *const this, -// float angle); // 840 -// Invalidate(CountdownTimer *const this); // 846 -// Invalidate(CNavPath *const this); // 856 -// Invalidate(CountdownTimer *const this); // 854 -// Start(IntervalTimer *const this); // 863 -// Start(IntervalTimer *const this); // 864 -// Invalidate(CountdownTimer *const this); // 866 -// Invalidate(CountdownTimer *const this); // 868 -// Idle(CHostageImprov *const this); // 879 -// Reset(SimpleStateMachine *const this, -// class CHostageImprov *userData); // 878 + m_moveFlags = 0; + m_moveType = Stopped; + m_moveLimit = Running; + + m_vel.x = 0; + m_vel.y = 0; + + m_actualVel = Vector(0, 0, 0); + m_checkNearbyTerroristTimer.Invalidate(); + + m_lastKnownArea = NULL; + m_hasKnownGoodPos = false; + m_hasPriorKnownGoodPos = false; + m_isTerroristNearby = false; + m_isCrouching = false; + + SetMoveAngle(m_hostage->pev->angles.y); + + m_moveGoal = m_hostage->m_vStart; + + ClearLookAt(); + ClearFaceTo(); + + m_blinkTimer.Invalidate(); + m_blinkCounter = 0; + + m_hostage->SetBoneController(2, 0); + m_hostage->SetBoneController(3, 0); + m_hostage->SetBoneController(4, 0); + + m_path.Invalidate(); + m_chatterTimer.Invalidate(); + + m_visiblePlayerCount = 0; + m_isDelayedChatterPending = 0; + + m_animateState.Reset(); + m_didFidget = 0; + + m_lastSawCT.Start(); + m_lastSawT.Start(); + + m_scaredTimer.Invalidate(); + m_jumpTimer.Invalidate(); + m_hasJumped = false; + + m_isFriendInTheWay = false; + m_aggression = RANDOM_FLOAT(0, 1); + + StandUp(); + m_behavior.Reset(this); + Idle(); } /* <474659> ../cstrike/dlls/hostage/hostage_improv.cpp:886 */ @@ -455,7 +497,7 @@ NOBODY void CHostageImprov::UpdateVision(void) } /* <476e49> ../cstrike/dlls/hostage/hostage_improv.cpp:997 */ -NOBODY void CHostageImprov::TrackPath(const Vector &pathGoal, float deltaT) +NOBODY void CHostageImprov::__MAKE_VHOOK(TrackPath)(const Vector &pathGoal, float deltaT) { // TrackPath(CHostageImprov *const this, // const Vector &pathGoal, @@ -485,12 +527,12 @@ NOBODY void CHostageImprov::ResetToKnownGoodPosition(void) } /* <47105c> ../cstrike/dlls/hostage/hostage_improv.cpp:1082 */ -NOBODY void CHostageImprov::StartLadder(const class CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos) +NOBODY void CHostageImprov::__MAKE_VHOOK(StartLadder)(const class CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos) { } /* <4710c4> ../cstrike/dlls/hostage/hostage_improv.cpp:1094 */ -NOBODY bool CHostageImprov::TraverseLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT) +NOBODY bool CHostageImprov::__MAKE_VHOOK(TraverseLadder)(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT) { // { // Vector goal; // 1098 @@ -597,7 +639,7 @@ NOBODY void CHostageImprov::UpdatePosition(float deltaT) } /* <47837a> ../cstrike/dlls/hostage/hostage_improv.cpp:1384 */ -NOBODY void CHostageImprov::OnUpkeep(float deltaT) +NOBODY void CHostageImprov::__MAKE_VHOOK(OnUpkeep)(float deltaT) { } @@ -649,7 +691,7 @@ NOBODY void CHostageImprov::UpdateGrenadeReactions(void) } /* <475ce3> ../cstrike/dlls/hostage/hostage_improv.cpp:1502 */ -NOBODY void CHostageImprov::OnUpdate(float deltaT) +NOBODY void CHostageImprov::__MAKE_VHOOK(OnUpdate)(float deltaT) { // { // float const runSpeed; // 1553 @@ -668,7 +710,7 @@ NOBODY void CHostageImprov::OnUpdate(float deltaT) } /* <47552a> ../cstrike/dlls/hostage/hostage_improv.cpp:1705 */ -NOBODY void CHostageImprov::OnGameEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +NOBODY void CHostageImprov::__MAKE_VHOOK(OnGameEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { // DelayedChatter(CHostageImprov *const this, // float delayTime, @@ -729,7 +771,7 @@ NOBODY void CHostageImprov::OnGameEvent(GameEventType event, CBaseEntity *entity } /* <471e27> ../cstrike/dlls/hostage/hostage_improv.cpp:1854 */ -NOBODY void CHostageImprov::OnTouch(CBaseEntity *other) +NOBODY void CHostageImprov::__MAKE_VHOOK(OnTouch)(CBaseEntity *other) { // { // const char *classname; // 1856 @@ -991,7 +1033,7 @@ NOBODY void CHostageImprov::Wave(void) } /* <474938> ../cstrike/dlls/hostage/hostage_improv.cpp:2375 */ -NOBODY void CHostageImprov::OnMoveToFailure(const Vector &goal, MoveToFailureType reason) +NOBODY void CHostageImprov::__MAKE_VHOOK(OnMoveToFailure)(const Vector &goal, MoveToFailureType reason) { // OnMoveToFailure(HostageStateMachine *const this, // const Vector &goal, @@ -1068,7 +1110,7 @@ NOBODY void CHostageImprov::ClearPath(void) } /* <471b3f> ../cstrike/dlls/hostage/hostage_improv.cpp:2497 */ -NOBODY void CHostageImprov::Crouch(void) +NOBODY void CHostageImprov::__MAKE_VHOOK(Crouch)(void) { // { // float const minCrouchTime; // 2503 @@ -1077,17 +1119,32 @@ NOBODY void CHostageImprov::Crouch(void) } /* <47195c> ../cstrike/dlls/hostage/hostage_improv.cpp:2516 */ -NOBODY void CHostageImprov::StandUp(void) +void CHostageImprov::__MAKE_VHOOK(StandUp)(void) { -// { -// TraceResult result; // 2525 -// int y; // 2527 -// { -// int x; // 2529 -// } -// IsElapsed(const class CountdownTimer *const this); // 2521 -// } -// StandUp(CHostageImprov *const this); // 2516 + if (!IsCrouching() || !m_minCrouchTimer.IsElapsed()) + { + return; + } + + int y; + for (y = -24; y < 36; y += 12) + { + for (int x = -24; x < 36; x += 12) + { + TraceResult result; + UTIL_TraceLine(GetFeet() + Vector(0, 0, 3), GetFeet() + Vector(x, y, 72), ignore_monsters, ignore_glass, m_hostage->edict(), &result); + + if (result.flFraction < 1.0f) + return; + } + } + + if (y == 36) + { + m_animateState.Reset(); + UTIL_SetSize(m_hostage->pev, Vector(-10, -10, 0), Vector(10, 10, 62)); + m_isCrouching = false; + } } /* <477114> ../cstrike/dlls/hostage/hostage_improv.cpp:2558 */ @@ -1095,3 +1152,183 @@ NOBODY void CHostageImprov::UpdateStationaryAnimation(void) { // UpdateStationaryAnimation(HostageStateMachine::UpdateStationaryAnimation(// class CHostageImprov *improv); // 2560 } + +#ifdef HOOK_GAMEDLL + + +void CHostageImprov::OnMoveToFailure(const Vector &goal, MoveToFailureType reason) +{ + OnMoveToFailure_(goal, reason); +} + +bool CHostageImprov::IsAlive(void) const +{ + return IsAlive_(); +} + +void CHostageImprov::MoveTo(const Vector &goal) +{ + MoveTo_(goal); +} + +void CHostageImprov::LookAt(const Vector &target) +{ + LookAt_(target); +} + +void CHostageImprov::ClearLookAt(void) +{ + ClearLookAt_(); +} + +void CHostageImprov::FaceTo(const Vector &goal) +{ + FaceTo_(goal); +} + +void CHostageImprov::ClearFaceTo(void) +{ + ClearFaceTo_(); +} + +bool CHostageImprov::IsAtMoveGoal(float error) const +{ + return IsAtMoveGoal_(error); +} + +bool CHostageImprov::IsAtFaceGoal(void) const +{ + return IsAtFaceGoal_(); +} + +bool CHostageImprov::IsFriendInTheWay(const Vector &goalPos) const +{ + return IsFriendInTheWay_(goalPos); +} + +bool CHostageImprov::IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const +{ + return IsFriendInTheWay_(myFriend, goalPos); +} + +bool CHostageImprov::Jump(void) +{ + return Jump_(); +} + +void CHostageImprov::Crouch(void) +{ + Crouch_(); +} + +void CHostageImprov::StandUp(void) +{ + StandUp_(); +} + +void CHostageImprov::TrackPath(const Vector &pathGoal, float deltaT) +{ + TrackPath_(pathGoal, deltaT); +} + +void CHostageImprov::StartLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos) +{ + StartLadder_(ladder, how, approachPos, departPos); +} + +bool CHostageImprov::TraverseLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT) +{ + return TraverseLadder_(ladder, how, approachPos, departPos, deltaT); +} + +bool CHostageImprov::GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal) +{ + return GetSimpleGroundHeightWithFloor_(pos, height, normal); +} + +void CHostageImprov::Run(void) +{ + Run_(); +} + +void CHostageImprov::Walk(void) +{ + Walk_(); +} + +void CHostageImprov::Stop(void) +{ + Stop_(); +} + +const Vector &CHostageImprov::GetFeet(void) const +{ + return GetFeet_(); +} + +const Vector &CHostageImprov::GetCentroid(void) +{ + return GetCentroid_(); +} + +const Vector &CHostageImprov::GetEyes(void) const +{ + return GetEyes_(); +} + +bool CHostageImprov::IsOnGround(void) const +{ + return IsOnGround_(); +} + +bool CHostageImprov::IsMoving(void) const +{ + return IsMoving_(); +} + +bool CHostageImprov::IsVisible(const Vector &pos, bool testFOV) const +{ + return IsVisible_(pos, testFOV); +} + +bool CHostageImprov::IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance) const +{ + return IsPlayerLookingAtMe_(other, cosTolerance); +} + +CBasePlayer *CHostageImprov::IsAnyPlayerLookingAtMe(int team, float cosTolerance) const +{ + return IsAnyPlayerLookingAtMe_(team, cosTolerance); +} + +CBasePlayer *CHostageImprov::GetClosestPlayerByTravelDistance(int team, float *range) const +{ + return GetClosestPlayerByTravelDistance_(team, range); +} + +void CHostageImprov::OnUpdate(float deltaT) +{ + OnUpdate_(deltaT); +} + +void CHostageImprov::OnUpkeep(float deltaT) +{ + OnUpkeep_(deltaT); +} + +void CHostageImprov::OnReset(void) +{ + OnReset_(); +} + +void CHostageImprov::OnGameEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +{ + OnGameEvent_(event, entity, other); +} + +void CHostageImprov::OnTouch(CBaseEntity *other) +{ + OnTouch_(other); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/hostage/hostage_improv.h b/regamedll/dlls/hostage/hostage_improv.h index 427a1b3b..c1963a84 100644 --- a/regamedll/dlls/hostage/hostage_improv.h +++ b/regamedll/dlls/hostage/hostage_improv.h @@ -51,124 +51,248 @@ public: //~CImprov(); // 49 }; - virtual void OnMoveToSuccess(const Vector &goal) + NOBODY 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) + NOBODY virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason); + NOBODY 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); - virtual void ClearLookAt(void); - virtual void FaceTo(const Vector &goal); - virtual void ClearFaceTo(void); - virtual bool IsAtMoveGoal(float error = 20.0f) const; - virtual bool HasLookAt(void) const + NOBODY virtual bool IsAlive(void) const; + NOBODY virtual void MoveTo(const Vector &goal); + NOBODY virtual void LookAt(const Vector &target); + NOBODY virtual void ClearLookAt(void); + NOBODY virtual void FaceTo(const Vector &goal); + NOBODY virtual void ClearFaceTo(void); + NOBODY virtual bool IsAtMoveGoal(float error = 20.0f) const; + NOBODY virtual bool HasLookAt(void) const { return m_isLookingAt; } - virtual bool HasFaceTo(void) const + NOBODY virtual bool HasFaceTo(void) const { return m_isFacingTo; } - virtual bool IsAtFaceGoal(void) const; - virtual bool IsFriendInTheWay(const Vector &goalPos) const; - virtual bool IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const; - virtual void MoveForward(void) + NOBODY virtual bool IsAtFaceGoal(void) const; + NOBODY virtual bool IsFriendInTheWay(const Vector &goalPos) const; + NOBODY virtual bool IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const; + NOBODY virtual void MoveForward(void) { m_moveFlags |= IN_FORWARD; } - virtual void MoveBackward(void) + NOBODY virtual void MoveBackward(void) { m_moveFlags |= IN_BACK; } - virtual void StrafeLeft(void) + NOBODY virtual void StrafeLeft(void) { m_moveFlags |= IN_MOVELEFT; } - virtual void StrafeRight(void) + NOBODY virtual void StrafeRight(void) { m_moveFlags |= IN_MOVERIGHT; } - virtual bool Jump(void); - virtual void Crouch(void); + NOBODY virtual bool Jump(void); + NOBODY virtual void Crouch(void); virtual void StandUp(void); - virtual void TrackPath(const Vector &pathGoal, float deltaT); - virtual void StartLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos); - virtual bool TraverseLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT); - virtual bool GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal = NULL); - virtual void Run(void); - virtual void Walk(void); - virtual void Stop(void); - virtual float GetMoveAngle(void) const + NOBODY virtual void TrackPath(const Vector &pathGoal, float deltaT); + NOBODY virtual void StartLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos); + NOBODY virtual bool TraverseLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT); + NOBODY virtual bool GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal = NULL); + NOBODY virtual void Run(void); + NOBODY virtual void Walk(void); + NOBODY virtual void Stop(void); + NOBODY virtual float GetMoveAngle(void) const { return m_moveAngle; } - virtual float GetFaceAngle(void) const + NOBODY virtual float GetFaceAngle(void) const { return m_moveAngle; } - virtual const Vector &GetFeet(void) const; - virtual const Vector &GetCentroid(void) const; - virtual const Vector &GetEyes(void) const; - virtual bool IsRunning(void) const + NOBODY virtual const Vector &GetFeet(void) const; + NOBODY virtual const Vector &GetCentroid(void); + NOBODY virtual const Vector &GetEyes(void) const; + NOBODY virtual bool IsRunning(void) const { return (m_moveType == Running); } - virtual bool IsWalking(void) const + NOBODY virtual bool IsWalking(void) const { return (m_moveType == Walking); } - virtual bool IsStopped(void) const + NOBODY virtual bool IsStopped(void) const { return (m_moveType == Stopped); } - virtual bool IsCrouching(void) const + NOBODY virtual bool IsCrouching(void) const { return m_isCrouching; } - virtual bool IsJumping(void) const + NOBODY virtual bool IsJumping(void) const { UNTESTED return (m_jumpTimer.IsElapsed() == false); } - virtual bool IsUsingLadder(void) const + NOBODY virtual bool IsUsingLadder(void) const { return false; } - virtual bool IsOnGround(void) const; - virtual bool IsMoving(void) const; - virtual bool CanRun(void) const + NOBODY virtual bool IsOnGround(void) const; + NOBODY virtual bool IsMoving(void) const; + NOBODY virtual bool CanRun(void) const { return true; } - virtual bool CanCrouch(void) const + NOBODY virtual bool CanCrouch(void) const { return true; } - virtual bool CanJump(void) const + NOBODY virtual bool CanJump(void) const { return true; } - virtual bool IsVisible(const Vector &pos, bool testFOV = false) const; - virtual bool IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance = 0.95f) const; - virtual CBasePlayer *IsAnyPlayerLookingAtMe(int team = 0, float cosTolerance = 0.95f) const; - virtual CBasePlayer *GetClosestPlayerByTravelDistance(int team = 0, float *range = NULL) const; - virtual CNavArea *GetLastKnownArea(void) const + NOBODY virtual bool IsVisible(const Vector &pos, bool testFOV = false) const; + NOBODY virtual bool IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance = 0.95f) const; + NOBODY virtual CBasePlayer *IsAnyPlayerLookingAtMe(int team = 0, float cosTolerance = 0.95f) const; + NOBODY virtual CBasePlayer *GetClosestPlayerByTravelDistance(int team = 0, float *range = NULL) const; + NOBODY virtual CNavArea *GetLastKnownArea(void) const { return m_lastKnownArea; } - virtual void OnUpdate(float deltaT); - virtual void OnUpkeep(float deltaT); + NOBODY virtual void OnUpdate(float deltaT); + NOBODY virtual void OnUpkeep(float deltaT); virtual void OnReset(void); - virtual void OnGameEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); - virtual void OnTouch(CBaseEntity *other); + NOBODY virtual void OnGameEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); + NOBODY virtual void OnTouch(CBaseEntity *other); + +#ifdef HOOK_GAMEDLL + + void OnMoveToSuccess_(const Vector &goal) + { + //if (m_behavior.IsState(NULL)) + // IImprovEvent::OnMoveToSuccess(goal); + } + void OnMoveToFailure_(const Vector &goal, MoveToFailureType reason); + void OnInjury_(float amount) + { + //m_behavior.Update(); + //m_lastInjuryTimer.Start(); + } + bool IsAlive_(void) const; + void MoveTo_(const Vector &goal); + void LookAt_(const Vector &target); + void ClearLookAt_(void); + void FaceTo_(const Vector &goal); + void ClearFaceTo_(void); + bool IsAtMoveGoal_(float error = 20.0f) const; + bool HasLookAt_(void) const + { + return m_isLookingAt; + } + bool HasFaceTo_(void) const + { + return m_isFacingTo; + } + bool IsAtFaceGoal_(void) const; + bool IsFriendInTheWay_(const Vector &goalPos) const; + bool IsFriendInTheWay_(CBaseEntity *myFriend, const Vector &goalPos) const; + void MoveForward_(void) + { + m_moveFlags |= IN_FORWARD; + } + void MoveBackward_(void) + { + m_moveFlags |= IN_BACK; + } + void StrafeLeft_(void) + { + m_moveFlags |= IN_MOVELEFT; + } + void StrafeRight_(void) + { + m_moveFlags |= IN_MOVERIGHT; + } + bool Jump_(void); + void Crouch_(void); + void StandUp_(void); + void TrackPath_(const Vector &pathGoal, float deltaT); + void StartLadder_(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos); + bool TraverseLadder_(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT); + bool GetSimpleGroundHeightWithFloor_(const Vector *pos, float *height, Vector *normal = NULL); + void Run_(void); + void Walk_(void); + void Stop_(void); + float GetMoveAngle_(void) const + { + return m_moveAngle; + } + float GetFaceAngle_(void) const + { + return m_moveAngle; + } + const Vector &GetFeet_(void) const; + const Vector &GetCentroid_(void); + const Vector &GetEyes_(void) const; + bool IsRunning_(void) const + { + return (m_moveType == Running); + } + bool IsWalking_(void) const + { + return (m_moveType == Walking); + } + bool IsStopped_(void) const + { + return (m_moveType == Stopped); + } + bool IsCrouching_(void) const + { + return m_isCrouching; + } + bool IsJumping_(void) const + { + UNTESTED + return (m_jumpTimer.IsElapsed() == false); + } + bool IsUsingLadder_(void) const + { + return false; + } + bool IsOnGround_(void) const; + bool IsMoving_(void) const; + bool CanRun_(void) const + { + return true; + } + bool CanCrouch_(void) const + { + return true; + } + bool CanJump_(void) const + { + return true; + } + bool IsVisible_(const Vector &pos, bool testFOV = false) const; + bool IsPlayerLookingAtMe_(CBasePlayer *other, float cosTolerance = 0.95f) const; + CBasePlayer *IsAnyPlayerLookingAtMe_(int team = 0, float cosTolerance = 0.95f) const; + CBasePlayer *GetClosestPlayerByTravelDistance_(int team = 0, float *range = NULL) const; + CNavArea *GetLastKnownArea_(void) const + { + return m_lastKnownArea; + } + void OnUpdate_(float deltaT); + void OnUpkeep_(float deltaT); + void OnReset_(void); + void OnGameEvent_(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); + void OnTouch_(CBaseEntity *other); + +#endif // HOOK_GAMEDLL + public: enum MoveType @@ -206,7 +330,10 @@ public: } CNavPath *GetPath(void); CNavPathFollower *GetPathFollower(void); - void Idle(void); + void Idle(void) + { + m_behavior.SetState(&m_idleState); + } bool IsIdle(void) { UNTESTED @@ -224,7 +351,10 @@ public: bool IsRetreating(void); bool IsAtHome(void); bool CanSeeRescueZone(void); - CBaseEntity *GetFollowLeader(void); + CBaseEntity *GetFollowLeader(void) + { + return m_followState.GetLeader(); + } CBasePlayer *GetClosestVisiblePlayer(int team); float GetTimeSinceLastSawPlayer(int team); float GetTimeSinceLastInjury(void); @@ -254,7 +384,10 @@ public: void MoveTowards(const Vector &pos, float deltaT); bool FaceTowards(const Vector &target, float deltaT); float GetSpeed(void); - void SetMoveAngle(float angle); + void SetMoveAngle(float angle) + { + m_moveAngle = angle; + } void Wiggle(void); void ClearPath(void); bool DiscontinuityJump(float ground, bool onlyJumpDown, bool mustJump); diff --git a/regamedll/dlls/hostage/hostage_localnav.cpp b/regamedll/dlls/hostage/hostage_localnav.cpp index 79b8fb59..be275941 100644 --- a/regamedll/dlls/hostage/hostage_localnav.cpp +++ b/regamedll/dlls/hostage/hostage_localnav.cpp @@ -41,7 +41,7 @@ NOBODY CLocalNav::~CLocalNav(void) } /* <485b91> ../cstrike/dlls/hostage/hostage_localnav.cpp:74 */ -NOXREF node_index_t CLocalNav::AddNode(node_index_t nindexParent, Vector &vecLoc, int offsetX, int offsetY, byte bDepth) +node_index_t CLocalNav::AddNode(node_index_t nindexParent, Vector &vecLoc, int offsetX, int offsetY, byte bDepth) { localnode_t *nodeNew; @@ -61,101 +61,211 @@ NOXREF node_index_t CLocalNav::AddNode(node_index_t nindexParent, Vector &vecLoc } /* <485570> ../cstrike/dlls/hostage/hostage_localnav.cpp:94 */ -NOXREF localnode_t *CLocalNav::GetNode(node_index_t nindex) +localnode_t *CLocalNav::GetNode(node_index_t nindex) { return &m_nodeArr[ nindex ]; } /* <485c01> ../cstrike/dlls/hostage/hostage_localnav.cpp:100 */ -NOXREF node_index_t CLocalNav::NodeExists(int offsetX, int offsetY) +node_index_t CLocalNav::NodeExists(int offsetX, int offsetY) { - node_index_t nindexCurrent; + node_index_t nindexCurrent = NODE_INVALID_EMPTY; localnode_t *nodeCurrent; - for (nindexCurrent = m_nindexAvailableNode - 1; nindexCurrent != 0; nindexCurrent--) + for (nindexCurrent = m_nindexAvailableNode - 1; nindexCurrent != NODE_INVALID_EMPTY; nindexCurrent--) { nodeCurrent = GetNode(nindexCurrent); if (nodeCurrent->offsetX == offsetX && nodeCurrent->offsetY == offsetY) - return nindexCurrent; + { + break; + } } - return -1; + + return nindexCurrent; } /* <486d46> ../cstrike/dlls/hostage/hostage_localnav.cpp:123 */ -NOBODY void CLocalNav::AddPathNodes(node_index_t nindexSource, int fNoMonsters) +void CLocalNav::AddPathNodes(node_index_t nindexSource, int fNoMonsters) { + AddPathNode(nindexSource, 1, 0, fNoMonsters); + AddPathNode(nindexSource, -1, 0, fNoMonsters); + AddPathNode(nindexSource, 0, 1, fNoMonsters); + AddPathNode(nindexSource, 0, -1, fNoMonsters); + AddPathNode(nindexSource, 1, 1, fNoMonsters); + AddPathNode(nindexSource, 1, -1, fNoMonsters); + AddPathNode(nindexSource, -1, 1, fNoMonsters); + AddPathNode(nindexSource, -1, -1, fNoMonsters); } /* <486adb> ../cstrike/dlls/hostage/hostage_localnav.cpp:138 */ -NOBODY void CLocalNav::AddPathNode(node_index_t nindexSource, int offsetX, int offsetY, int fNoMonsters) +void CLocalNav::AddPathNode(node_index_t nindexSource, int offsetX, int offsetY, int fNoMonsters) { -// { -// int bDepth; // 140 -// Vector vecSource; // 141 -// Vector vecDest; // 142 -// int offsetXAbs; // 143 -// int offsetYAbs; // 144 -// { -// localnode_t *nodeSource; // 156 -// localnode_t *nodeCurrent; // 157 -// node_index_t nindexCurrent; // 158 -// GetNode(CLocalNav *const this, -// node_index_t nindex); // 160 -// NodeExists(CLocalNav *const this, -// int offsetX, -// int offsetY); // 166 -// operator+(const Vector *const this, -// const Vector &v); // 170 -// operator*(const Vector *const this, -// float fl); // 170 -// } -// operator+(const Vector *const this, -// const Vector &v); // 149 -// operator*(const Vector *const this, -// float fl); // 149 -// AddNode(CLocalNav *const this, -// node_index_t nindexParent, -// Vector &vecLoc, -// int offsetX, -// int offsetY, -// byte bDepth); // 200 -// } + int bDepth; + Vector vecSource, vecDest; + int offsetXAbs, offsetYAbs; + + if (nindexSource == -1) + { + bDepth = 1; + + offsetXAbs = offsetX; + offsetYAbs = offsetY; + + vecSource = m_vecStartingLoc; + vecDest = vecSource + Vector(((float_precision)offsetX * HOSTAGE_STEPSIZE), ((float_precision)offsetY * HOSTAGE_STEPSIZE), 0); + } + else + { + localnode_t *nodeSource; + localnode_t *nodeCurrent; + node_index_t nindexCurrent; + + nodeCurrent = GetNode(nindexSource); + offsetXAbs = offsetX + nodeCurrent->offsetX; + offsetYAbs = offsetY + nodeCurrent->offsetY; + nodeSource = GetNode(m_nindexAvailableNode); + + // if there exists a node, then to ignore adding a the new node + if (NodeExists(offsetXAbs, offsetYAbs) != NODE_INVALID_EMPTY) + { + return; + } + + vecSource = nodeCurrent->vecLoc; + vecDest = vecSource + Vector(((float_precision)offsetX * HOSTAGE_STEPSIZE), ((float_precision)offsetY * HOSTAGE_STEPSIZE), 0); + + if (m_nindexAvailableNode) + { + nindexCurrent = m_nindexAvailableNode; + + do + { + nodeSource--; + nindexCurrent--; + + offsetX = (nodeSource->offsetX - offsetXAbs); + + if (offsetX >= 0) + { + if (offsetX > 1) + { + continue; + } + } + else + { + if (-offsetX > 1) + { + continue; + } + } + + offsetY = (nodeSource->offsetY - offsetYAbs); + + if (offsetY >= 0) + { + if (offsetY > 1) + { + continue; + } + } + else + { + if (-offsetY > 1) + { + continue; + } + } + + if (PathTraversable(nodeSource->vecLoc, vecDest, fNoMonsters) != PATH_TRAVERSABLE_EMPTY) + { + nodeCurrent = nodeSource; + nindexSource = nindexCurrent; + } + } + while (nindexCurrent); + } + + vecSource = nodeCurrent->vecLoc; + bDepth = ((int)nodeCurrent->bDepth) + 1; + } + + if (PathTraversable(vecSource, vecDest, fNoMonsters) != PATH_TRAVERSABLE_EMPTY) + { + AddNode(nindexSource, vecDest, offsetXAbs, offsetYAbs, bDepth); + } } /* <485c63> ../cstrike/dlls/hostage/hostage_localnav.cpp:205 */ -NOBODY node_index_t CLocalNav::GetBestNode(Vector &vecOrigin, Vector &vecDest) +node_index_t CLocalNav::GetBestNode(Vector &vecOrigin, Vector &vecDest) { -// { -// node_index_t nindexCurrent; // 207 -// localnode_t *nodeCurrent; // 208 -// node_index_t nindexBest; // 209 -// float flBestVal; // 210 -// { -// float flCurrentVal; // 220 -// float flDistFromStart; // 221 -// float flDistToDest; // 222 -// float flZDiff; // 223 -// operator-(const Vector *const this, -// const Vector &v); // 235 -// Length(const Vector *const this); // 235 -// } -// } + node_index_t nindexCurrent; + localnode_t *nodeCurrent; + node_index_t nindexBest; + float flBestVal; + + nindexBest = -1; + nindexCurrent = 0; + flBestVal = 1000000.0; + + while (nindexCurrent < m_nindexAvailableNode) + { + nodeCurrent = GetNode(nindexCurrent); + + if (!nodeCurrent->fSearched) + { + float_precision flCurrentVal; + float_precision flDistFromStart; + + float flDistToDest; + float_precision flZDiff = -1.0; + + flDistFromStart = LenghtSubtract + (vecDest, nodeCurrent->vecLoc); + + flDistToDest = nodeCurrent->vecLoc.z - vecDest.z; + if (flDistToDest >= 0.0) + { + flZDiff = 1.0; + } + + if ((flDistToDest * flZDiff) <= s_flStepSize) + flZDiff = 1.0; + else + flZDiff = 1.25; + + flCurrentVal = flZDiff * (((float_precision)nodeCurrent->bDepth * HOSTAGE_STEPSIZE) + flDistFromStart); + if (flCurrentVal < flBestVal) + { + flBestVal = flCurrentVal; + nindexBest = nindexCurrent; + } + } + + nindexCurrent++; + } + + return nindexBest; } /* <485d79> ../cstrike/dlls/hostage/hostage_localnav.cpp:263 */ -NOBODY int CLocalNav::SetupPathNodes(node_index_t nindex, Vector *vecNodes, int fNoMonsters) -{ -// { -// node_index_t nCurrentIndex; // 265 -// int nNodeCount; // 266 -// { -// localnode_t *nodeCurrent; // 273 -// Vector vecCurrentLoc; // 274 -// GetNode(CLocalNav *const this, -// node_index_t nindex); // 276 -// } -// } +int CLocalNav::SetupPathNodes(node_index_t nindex, Vector *vecNodes, int fNoMonsters) +{ + node_index_t nCurrentIndex = nindex; + int nNodeCount = 0; + + while (nCurrentIndex != -1) + { + localnode_t *nodeCurrent = GetNode(nCurrentIndex); + Vector vecCurrentLoc = nodeCurrent->vecLoc; + vecNodes[ nNodeCount++ ] = vecCurrentLoc; + + nCurrentIndex = nodeCurrent->nindexParent; + } + + return nNodeCount; } /* <486a56> ../cstrike/dlls/hostage/hostage_localnav.cpp:290 */ @@ -167,44 +277,31 @@ NOBODY int CLocalNav::GetFurthestTraversableNode(Vector &vecStartingLoc, Vector } /* <486d8d> ../cstrike/dlls/hostage/hostage_localnav.cpp:304 */ -NOBODY node_index_t CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters) -{ -// { -// node_index_t nIndexBest; // 306 -// { -// localnode_t *node; // 325 -// Vector vecNodeLoc; // 326 -// float flDistToDest; // 327 -// GetNode(CLocalNav *const this, -// node_index_t nindex); // 329 -// operator-(const Vector *const this, -// const Vector &v); // 332 -// Length2D(const Vector *const this); // 332 -// } -// } - - int nIndexBest; - localnode_t *node; - Vector vecNodeLoc; - float flDistToDest; - - nIndexBest = FindDirectPath(vecStart, vecDest, flTargetRadius, fNoMonsters); // TODO: Reverse me! +node_index_t CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters) +{ + node_index_t nIndexBest = FindDirectPath(vecStart, vecDest, flTargetRadius, fNoMonsters); if (nIndexBest != -1) + { return nIndexBest; + } + + localnode_t *node; + Vector vecNodeLoc; + float_precision flDistToDest; m_vecStartingLoc = vecStart; m_nindexAvailableNode = 0; - AddPathNodes(-1, fNoMonsters); - vecNodeLoc = vecStart; - nIndexBest = GetBestNode(vecNodeLoc, vecDest); // TODO: Reverse me! + AddPathNodes(-1, fNoMonsters); + nIndexBest = GetBestNode(vecStart, vecDest); while (nIndexBest != -1) { node = GetNode(nIndexBest); - vecNodeLoc = node->vecLoc; node->fSearched = TRUE; + + vecNodeLoc = node->vecLoc; flDistToDest = (vecDest - node->vecLoc).Length2D(); if (flDistToDest <= flTargetRadius) @@ -213,14 +310,15 @@ NOBODY node_index_t CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float if (flDistToDest <= HOSTAGE_STEPSIZE) break; - if ((flDistToDest - flTargetRadius) > (MAX_NODES - m_nindexAvailableNode) * HOSTAGE_STEPSIZE || m_nindexAvailableNode == MAX_NODES) + if (((flDistToDest - flTargetRadius) > ((MAX_NODES - m_nindexAvailableNode) * HOSTAGE_STEPSIZE)) + || m_nindexAvailableNode == MAX_NODES) { nIndexBest = -1; break; } - AddPathNodes(nIndexBest, fNoMonsters); // TODO: Reverse me! - nIndexBest = GetBestNode(vecNodeLoc, vecDest); // TODO: Reverse me! + AddPathNodes(nIndexBest, fNoMonsters); + nIndexBest = GetBestNode(vecNodeLoc, vecDest); } if (m_nindexAvailableNode <= 10) @@ -277,66 +375,37 @@ NOBODY node_index_t CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float } /* <4867dc> ../cstrike/dlls/hostage/hostage_localnav.cpp:413 */ -NOBODY node_index_t CLocalNav::FindDirectPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters) +node_index_t CLocalNav::FindDirectPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters) { -// { -// Vector vecActualDest; // 415 -// Vector vecPathDir; // 416 -// Vector vecNodeLoc; // 417 -// node_index_t nindexLast; // 418 -// operator-(const Vector *const this, -// const Vector &v); // 420 -// Normalize(const Vector *const this); // 420 -// operator*(const Vector *const this, -// float fl); // 422 -// operator-(const Vector *const this, -// const Vector &v); // 422 -// operator-(const Vector *const this, -// const Vector &v); // 432 -// Length2D(const Vector *const this); // 432 -// { -// node_index_t nindexCurrent; // 434 -// AddNode(CLocalNav *const this, -// node_index_t nindexParent, -// Vector &vecLoc, -// int offsetX, -// int offsetY, -// byte bDepth); // 438 -// operator*(const Vector *const this, -// float fl); // 436 -// operator+(const Vector *const this, -// const Vector &v); // 436 -// } -// } - Vector vecActualDest; Vector vecPathDir; Vector vecNodeLoc; node_index_t nindexLast; - vecPathDir = (vecDest - vecStart).Normalize(); - vecActualDest = vecDest - (vecPathDir * flTargetRadius); - - if (!PathTraversable(vecStart, vecActualDest, fNoMonsters)) // TODO: Reverse me! - return -1; - - m_nindexAvailableNode = 0; - nindexLast = -1; - vecNodeLoc = vecStart; - + vecPathDir = NormalizeSubtract(vecStart, vecDest); + vecActualDest = vecDest - (vecPathDir * flTargetRadius); + + if (PathTraversable(vecStart, vecActualDest, fNoMonsters) == PATH_TRAVERSABLE_EMPTY) + { + return -1; + } + + nindexLast = -1; + vecNodeLoc = vecStart; + m_nindexAvailableNode = 0; + while ((vecNodeLoc - vecActualDest).Length2D() >= HOSTAGE_STEPSIZE) { + node_index_t nindexCurrent = nindexLast; + vecNodeLoc = vecNodeLoc + (vecPathDir * HOSTAGE_STEPSIZE); - nindexLast = AddNode(nindexLast, vecNodeLoc, 0, 0, 0); // TODO: Reverse me! + nindexLast = AddNode(nindexCurrent, vecNodeLoc); if (nindexLast == -1) break; - } - + } + return nindexLast; - - - } /* <485e40> ../cstrike/dlls/hostage/hostage_localnav.cpp:449 */ @@ -347,7 +416,7 @@ BOOL CLocalNav::PathClear(Vector &vecOrigin, Vector &vecDest, int fNoMonsters, T if (tr.fStartSolid) return FALSE; - if (tr.flFraction == 1.0) + if (tr.flFraction == 1.0f) return TRUE; if (tr.pHit == m_pTargetEnt) @@ -365,13 +434,13 @@ int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonste Vector vecSrcTmp; Vector vecDestTmp; Vector vecDir; - double flTotal; + float_precision flTotal; int retval = PATH_TRAVERSABLE_EMPTY; vecSrcTmp = vecSource; vecDestTmp = vecDest - vecSource; - vecDir = vecDestTmp.Normalize(); + vecDir = vecDestTmp.NormalizePrecision(); vecDir.z = 0; flTotal = vecDestTmp.Length2D(); @@ -380,13 +449,14 @@ int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonste { if (flTotal >= s_flStepSize) { -#ifdef HOOK_GAMEDLL - vecDestTmp.x = vecSrcTmp.x + (vecDir.x * s_flStepSize); - vecDestTmp.y = vecSrcTmp.y + (float)(vecDir.y * s_flStepSize); - vecDestTmp.z = vecSrcTmp.z + (vecDir.z * s_flStepSize); -#else +#ifndef HOOK_GAMEDLL vecDestTmp = vecSrcTmp + (vecDir * s_flStepSize); +#else + vecDestTmp[0] = vecSrcTmp[0] + (vecDir[0] * s_flStepSize); + vecDestTmp[1] = vecSrcTmp[1] + (float)(vecDir[1] * s_flStepSize); + vecDestTmp[2] = vecSrcTmp[2] + (vecDir[2] * s_flStepSize); #endif // HOOK_GAMEDLL + } else vecDestTmp = vecDest; @@ -398,17 +468,23 @@ int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonste vecDestTmp = tr.vecEndPos; if (retval == PATH_TRAVERSABLE_EMPTY) + { retval = PATH_TRAVERSABLE_SLOPE; + } } else { if (tr.fStartSolid) + { return PATH_TRAVERSABLE_EMPTY; + } if (tr.pHit && !fNoMonsters && tr.pHit->v.classname) { if (FClassnameIs(tr.pHit, "hostage_entity")) + { return PATH_TRAVERSABLE_EMPTY; + } } vecSrcTmp = tr.vecEndPos; @@ -418,31 +494,43 @@ int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonste if (StepTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { if (retval == PATH_TRAVERSABLE_EMPTY) + { retval = PATH_TRAVERSABLE_STEP; + } } else { if (!StepJumpable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) + { return PATH_TRAVERSABLE_EMPTY; + } if (retval == PATH_TRAVERSABLE_EMPTY) + { retval = PATH_TRAVERSABLE_STEPJUMPABLE; + } } } else { if (!SlopeTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) + { return PATH_TRAVERSABLE_EMPTY; + } if (retval == PATH_TRAVERSABLE_EMPTY) + { retval = PATH_TRAVERSABLE_SLOPE; + } } } Vector vecDropDest = vecDestTmp - Vector(0, 0, 300); if (PathClear(vecDestTmp, vecDropDest, fNoMonsters, tr)) + { return PATH_TRAVERSABLE_EMPTY; + } if (!tr.fStartSolid) vecDestTmp = tr.vecEndPos; @@ -474,7 +562,7 @@ BOOL CLocalNav::SlopeTraversable(Vector &vecSource, Vector &vecDest, int fNoMons vecDown = vecDest - vecSource; vecAngles = UTIL_VecToAngles(tr.vecPlaneNormal); - vecSlopeEnd.z = vecDown.Length2D() * tan((double)((90.0 - vecAngles.x) * (M_PI / 180))) + vecSource.z; + vecSlopeEnd.z = vecDown.Length2D() * tan((float_precision)((90.0 - vecAngles.x) * (M_PI / 180))) + vecSource.z; if (!PathClear(vecSource, vecSlopeEnd, fNoMonsters, tr)) { @@ -700,36 +788,26 @@ NOBODY BOOL CLocalNav::LadderHit(Vector &vecSource, Vector &vecDest, TraceResult /* <487eeb> ../cstrike/dlls/hostage/hostage_localnav.cpp:851 */ void CLocalNav::Think(void) { -// { -// float flElapsedTime; // 853 -// class EHANDLE hCallback; // 854 -// cvar_t *sv_stepsize; // 855 -// { -// class CHostage *pHostage; // 909 -// GetClassPtr(CHostage *a); // 911 -// } -// } - - EHANDLE hostage; + EHANDLE hCallback; static cvar_t *sv_stepsize = NULL; - if (flNextCvarCheck <= gpGlobals->time) + if (gpGlobals->time >= flNextCvarCheck) { - if (sv_stepsize) - { - flNextCvarCheck = gpGlobals->time + 1; + if (sv_stepsize != NULL) s_flStepSize = sv_stepsize->value; - } else { sv_stepsize = CVAR_GET_POINTER("sv_stepsize"); - flNextCvarCheck = gpGlobals->time + 1; - s_flStepSize = s_flStepSize ? sv_stepsize->value : 18; + s_flStepSize = s_flStepSize ? sv_stepsize->value : HOSTAGE_STEPSIZE_DEFAULT; } + + flNextCvarCheck = gpGlobals->time + 1; } HostagePrethink(); - nodeval -= (gpGlobals->time - flLastThinkTime) * 250; + + float flElapsedTime = gpGlobals->time - flLastThinkTime; + nodeval -= flElapsedTime * 250; flLastThinkTime = gpGlobals->time; if (nodeval < 0) @@ -740,12 +818,9 @@ void CLocalNav::Think(void) if (tot_inqueue) { -#ifndef REGAMEDLL_FIXES - hostage = NULL; -#endif // REGAMEDLL_FIXES - hostage = _queue[ qptr ]; + hCallback = _queue[ qptr ]; - if (!hostage) + if (!hCallback) { while (tot_inqueue > 0) { @@ -755,20 +830,20 @@ void CLocalNav::Think(void) tot_inqueue--; if (!tot_inqueue) { - hostage = NULL; + hCallback = NULL; break; } - hostage = _queue[ qptr ]; + hCallback = _queue[ qptr ]; - if (hostage) + if (hCallback) break; } } - if (hostage) + if (hCallback) { - CHostage *pHostage = GetClassPtr((CHostage *)hostage->pev); + CHostage *pHostage = GetClassPtr((CHostage *)hCallback->pev); if (++qptr == MAX_HOSTAGES_NAV) qptr = 0; @@ -812,6 +887,8 @@ void CLocalNav::HostagePrethink(void) for (int iCount = 0; iCount < tot_hostages; iCount++) { if (hostages[ iCount ] != NULL) + { GetClassPtr((CHostage *)hostages[ iCount ]->pev)->PreThink(); + } } } diff --git a/regamedll/dlls/hostage/hostage_localnav.h b/regamedll/dlls/hostage/hostage_localnav.h index 8e191254..08f0edd8 100644 --- a/regamedll/dlls/hostage/hostage_localnav.h +++ b/regamedll/dlls/hostage/hostage_localnav.h @@ -32,10 +32,12 @@ #pragma once #endif -#define PATH_TRAVERSABLE_EMPTY 0 -#define PATH_TRAVERSABLE_SLOPE 1 -#define PATH_TRAVERSABLE_STEP 2 -#define PATH_TRAVERSABLE_STEPJUMPABLE 3 +#define NODE_INVALID_EMPTY -1 + +#define PATH_TRAVERSABLE_EMPTY 0 +#define PATH_TRAVERSABLE_SLOPE 1 +#define PATH_TRAVERSABLE_STEP 2 +#define PATH_TRAVERSABLE_STEPJUMPABLE 3 typedef int node_index_t; @@ -81,8 +83,8 @@ public: m_pTargetEnt = NULL; } - NOBODY node_index_t FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters); - NOBODY int SetupPathNodes(node_index_t nindex, Vector *vecNodes, int fNoMonsters); + node_index_t FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters); + int SetupPathNodes(node_index_t nindex, Vector *vecNodes, int fNoMonsters); NOBODY int GetFurthestTraversableNode(Vector &vecStartingLoc, Vector *vecNodes, int nTotalNodes, int fNoMonsters); int PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters); BOOL PathClear(Vector &vecOrigin, Vector &vecDest, int fNoMonsters, TraceResult &tr); @@ -91,23 +93,23 @@ public: TraceResult tr; return PathClear(vecSource, vecDest, fNoMonsters, tr); } - NOXREF node_index_t AddNode(node_index_t nindexParent, Vector &vecLoc, int offsetX, int offsetY, byte bDepth); - NOXREF localnode_t *GetNode(node_index_t nindex); - NOXREF node_index_t NodeExists(int offsetX, int offsetY); - NOBODY void AddPathNodes(node_index_t nindexSource, int fNoMonsters); - NOBODY void AddPathNode(node_index_t nindexSource, int offsetX, int offsetY, int fNoMonsters); - NOBODY node_index_t GetBestNode(Vector &vecOrigin, Vector &vecDest); + node_index_t AddNode(node_index_t nindexParent, Vector &vecLoc, int offsetX = 0, int offsetY = 0, byte bDepth = 0); + localnode_t *GetNode(node_index_t nindex); + node_index_t NodeExists(int offsetX, int offsetY); + void AddPathNodes(node_index_t nindexSource, int fNoMonsters); + void AddPathNode(node_index_t nindexSource, int offsetX, int offsetY, int fNoMonsters); + node_index_t GetBestNode(Vector &vecOrigin, Vector &vecDest); BOOL SlopeTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr); NOBODY BOOL LadderTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr); BOOL StepTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr); BOOL StepJumpable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr); - NOBODY node_index_t FindDirectPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters); + node_index_t FindDirectPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters); NOBODY BOOL LadderHit(Vector &vecSource, Vector &vecDest, TraceResult &tr); NOBODY static void Think(void); NOBODY static void RequestNav(CHostage *pCaller); static void Reset(void); - NOBODY static void HostagePrethink(void); + static void HostagePrethink(void); #ifndef HOOK_GAMEDLL private: diff --git a/regamedll/dlls/hostage/hostage_states.h b/regamedll/dlls/hostage/hostage_states.h index 0203971c..c34ab742 100644 --- a/regamedll/dlls/hostage/hostage_states.h +++ b/regamedll/dlls/hostage/hostage_states.h @@ -220,8 +220,14 @@ public: } virtual void UpdateStationaryAnimation(CHostageImprov *improv); public: - void SetLeader(CBaseEntity *leader); - CBaseEntity *GetLeader(void); + void SetLeader(CBaseEntity *leader) + { + m_leader = leader; + } + CBaseEntity *GetLeader(void) + { + return m_leader; + } private: EHANDLE m_leader; Vector m_lastLeaderPos; diff --git a/regamedll/dlls/hostage/states/hostage_animate.cpp b/regamedll/dlls/hostage/states/hostage_animate.cpp index 92ca6ae5..40be5f9c 100644 --- a/regamedll/dlls/hostage/states/hostage_animate.cpp +++ b/regamedll/dlls/hostage/states/hostage_animate.cpp @@ -3,6 +3,8 @@ /* <4110a1> ../cstrike/dlls/hostage/states/hostage_animate.cpp:13 */ void HostageAnimateState::Reset(void) { + m_sequenceCount = 0; + m_performance = None; } /* <4110c7> ../cstrike/dlls/hostage/states/hostage_animate.cpp:20 */ diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index d8594a4b..abe3684b 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -1,74 +1,74 @@ #include "precompiled.h" -/* ../cstrike/dlls/items.cpp:46 */ +/* ../cstrike/dlls/items.cpp:46 */ LINK_ENTITY_TO_CLASS(world_items, CWorldItem); - -/* ../cstrike/dlls/items.cpp:48 */ -void CWorldItem::KeyValue_(KeyValueData *pkvd) -{ - if (FStrEq(pkvd->szKeyName, "type")) - { - m_iType = atoi(pkvd->szValue); - pkvd->fHandled = TRUE; - } - else - CBaseEntity::KeyValue(pkvd); + +/* ../cstrike/dlls/items.cpp:48 */ +void CWorldItem::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) +{ + if (FStrEq(pkvd->szKeyName, "type")) + { + m_iType = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBaseEntity::KeyValue(pkvd); } -/* ../cstrike/dlls/items.cpp:59 */ -void CWorldItem::Spawn_(void) -{ - CBaseEntity *pEntity = NULL; - - switch (m_iType) - { - case 41: // ITEM_HEALTHKIT - break; - case 42: // ITEM_ANTIDOTE - pEntity = CBaseEntity::Create("item_antidote", pev->origin, pev->angles); - break; - case 43: // ITEM_SECURITY - pEntity = CBaseEntity::Create("item_security", pev->origin, pev->angles); - break; - case 44: // ITEM_BATTERY - pEntity = CBaseEntity::Create("item_battery", pev->origin, pev->angles); - break; - case 45: // ITEM_SUIT - pEntity = CBaseEntity::Create("item_suit", pev->origin, pev->angles); - break; - } - - if (pEntity != NULL) - { - pEntity->pev->target = pev->target; - pEntity->pev->targetname = pev->targetname; - pEntity->pev->spawnflags = pev->spawnflags; - } - - REMOVE_ENTITY(edict()); +/* ../cstrike/dlls/items.cpp:59 */ +void CWorldItem::__MAKE_VHOOK(Spawn)(void) +{ + CBaseEntity *pEntity = NULL; + + switch (m_iType) + { + case 41: // ITEM_HEALTHKIT + break; + case 42: // ITEM_ANTIDOTE + pEntity = CBaseEntity::Create("item_antidote", pev->origin, pev->angles); + break; + case 43: // ITEM_SECURITY + pEntity = CBaseEntity::Create("item_security", pev->origin, pev->angles); + break; + case 44: // ITEM_BATTERY + pEntity = CBaseEntity::Create("item_battery", pev->origin, pev->angles); + break; + case 45: // ITEM_SUIT + pEntity = CBaseEntity::Create("item_suit", pev->origin, pev->angles); + break; + } + + if (pEntity != NULL) + { + pEntity->pev->target = pev->target; + pEntity->pev->targetname = pev->targetname; + pEntity->pev->spawnflags = pev->spawnflags; + } + + REMOVE_ENTITY(edict()); } -/* ../cstrike/dlls/items.cpp:94 */ -void CItem::Spawn_(void) -{ - pev->movetype = MOVETYPE_TOSS; - pev->solid = SOLID_TRIGGER; - - UTIL_SetOrigin( pev, pev->origin ); - UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); - - SetTouch(&CItem::ItemTouch); - - if (!DROP_TO_FLOOR(ENT(pev))) - { - UTIL_Remove(this); - return; - } +/* ../cstrike/dlls/items.cpp:94 */ +void CItem::__MAKE_VHOOK(Spawn)(void) +{ + pev->movetype = MOVETYPE_TOSS; + pev->solid = SOLID_TRIGGER; + + UTIL_SetOrigin( pev, pev->origin ); + UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); + + SetTouch(&CItem::ItemTouch); + + if (!DROP_TO_FLOOR(ENT(pev))) + { + UTIL_Remove(this); + return; + } } -/* ../cstrike/dlls/items.cpp:112 */ -void CItem::ItemTouch(CBaseEntity *pOther) -{ +/* ../cstrike/dlls/items.cpp:112 */ +void CItem::ItemTouch(CBaseEntity *pOther) +{ if (!pOther->IsPlayer() || pOther->pev->deadflag != DEAD_NO) return; @@ -89,58 +89,58 @@ void CItem::ItemTouch(CBaseEntity *pOther) UTIL_Remove(this); } else if (gEvilImpulse101) - UTIL_Remove(this); + UTIL_Remove(this); } -/* ../cstrike/dlls/items.cpp:154 */ -CBaseEntity *CItem::Respawn_(void) -{ - SetTouch(NULL); - - pev->effects |= EF_NODRAW; - - // blip to whereever you should respawn. - UTIL_SetOrigin(pev, g_pGameRules->VecItemRespawnSpot(this)); - - SetThink(&CItem::Materialize); - pev->nextthink = g_pGameRules->FlItemRespawnTime(this); - - return this; +/* ../cstrike/dlls/items.cpp:154 */ +CBaseEntity *CItem::__MAKE_VHOOK(Respawn)(void) +{ + SetTouch(NULL); + + pev->effects |= EF_NODRAW; + + // blip to whereever you should respawn. + UTIL_SetOrigin(pev, g_pGameRules->VecItemRespawnSpot(this)); + + SetThink(&CItem::Materialize); + pev->nextthink = g_pGameRules->FlItemRespawnTime(this); + + return this; } -/* ../cstrike/dlls/items.cpp:166 */ -void CItem::Materialize(void) -{ - if (pev->effects & EF_NODRAW) - { - // changing from invisible state to visible. - EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); - - pev->effects &= ~EF_NODRAW; - pev->effects |= EF_MUZZLEFLASH; - } - - SetTouch(&CItem::ItemTouch); +/* ../cstrike/dlls/items.cpp:166 */ +void CItem::Materialize(void) +{ + if (pev->effects & EF_NODRAW) + { + // changing from invisible state to visible. + EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); + + pev->effects &= ~EF_NODRAW; + pev->effects |= EF_MUZZLEFLASH; + } + + SetTouch(&CItem::ItemTouch); } -/* ../cstrike/dlls/items.cpp:190 */ -void CItemSuit::Spawn_(void) -{ - Precache(); - SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); - CItem::Spawn(); +/* ../cstrike/dlls/items.cpp:190 */ +void CItemSuit::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:196 */ -void CItemSuit::Precache_(void) -{ +/* ../cstrike/dlls/items.cpp:196 */ +void CItemSuit::__MAKE_VHOOK(Precache)(void) +{ PRECACHE_MODEL("models/w_kevlar.mdl"); - PRECACHE_SOUND("items/tr_kevlar.wav"); + PRECACHE_SOUND("items/tr_kevlar.wav"); } -/* ../cstrike/dlls/items.cpp:201 */ -BOOL CItemSuit::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:201 */ +BOOL CItemSuit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ if (pPlayer->pev->weapons & (1 << WEAPON_SUIT)) return FALSE; @@ -149,130 +149,130 @@ BOOL CItemSuit::MyTouch_(CBasePlayer *pPlayer) pPlayer->pev->weapons |= (1 << WEAPON_SUIT); pPlayer->m_iHideHUD &= ~(HIDEHUD_HEALTH | HIDEHUD_MONEY); - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:216 */ +/* ../cstrike/dlls/items.cpp:216 */ LINK_ENTITY_TO_CLASS(item_suit, CItemSuit); -/* ../cstrike/dlls/items.cpp:221 */ -void CItemBattery::Spawn_(void) -{ - Precache(); - SET_MODEL(ENT(pev), "models/w_battery.mdl"); - CItem::Spawn(); +/* ../cstrike/dlls/items.cpp:221 */ +void CItemBattery::__MAKE_VHOOK(Spawn)(void) +{ + Precache(); + SET_MODEL(ENT(pev), "models/w_battery.mdl"); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:227 */ -void CItemBattery::Precache_(void) -{ - PRECACHE_MODEL("models/w_battery.mdl"); - PRECACHE_SOUND("items/gunpickup2.wav"); +/* ../cstrike/dlls/items.cpp:227 */ +void CItemBattery::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_battery.mdl"); + PRECACHE_SOUND("items/gunpickup2.wav"); } -/* ../cstrike/dlls/items.cpp:232 */ -BOOL CItemBattery::MyTouch_(CBasePlayer *pPlayer) -{ - if (pPlayer->pev->armorvalue < MAX_NORMAL_BATTERY && (pPlayer->pev->weapons & (1 << WEAPON_SUIT))) - { - int pct; - char szcharge[64]; - - pPlayer->pev->armorvalue += gSkillData.batteryCapacity; - pPlayer->pev->armorvalue = min(pPlayer->pev->armorvalue, MAX_NORMAL_BATTERY); - - EMIT_SOUND(pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM); - - MESSAGE_BEGIN(MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev); - WRITE_STRING(STRING(pev->classname)); - MESSAGE_END(); - - // Suit reports new power level - // For some reason this wasn't working in release build -- round it. - pct = (int)((float)(pPlayer->pev->armorvalue * 100.0) * (1.0 / MAX_NORMAL_BATTERY) + 0.5); - pct = (pct / 5); - - if (pct > 0) - pct--; - - Q_sprintf(szcharge,"!HEV_%1dP", pct); - pPlayer->SetSuitUpdate(szcharge, FALSE, SUIT_NEXT_IN_30SEC); - - return TRUE; - } - return FALSE; +/* ../cstrike/dlls/items.cpp:232 */ +BOOL CItemBattery::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ + if (pPlayer->pev->armorvalue < MAX_NORMAL_BATTERY && (pPlayer->pev->weapons & (1 << WEAPON_SUIT))) + { + int pct; + char szcharge[64]; + + pPlayer->pev->armorvalue += gSkillData.batteryCapacity; + pPlayer->pev->armorvalue = _min(pPlayer->pev->armorvalue, MAX_NORMAL_BATTERY); + + EMIT_SOUND(pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM); + + MESSAGE_BEGIN(MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev); + WRITE_STRING(STRING(pev->classname)); + MESSAGE_END(); + + // Suit reports new power level + // For some reason this wasn't working in release build -- round it. + pct = (int)((float)(pPlayer->pev->armorvalue * 100.0) * (1.0 / MAX_NORMAL_BATTERY) + 0.5); + pct = (pct / 5); + + if (pct > 0) + pct--; + + Q_sprintf(szcharge,"!HEV_%1dP", pct); + pPlayer->SetSuitUpdate(szcharge, FALSE, SUIT_NEXT_IN_30SEC); + + return TRUE; + } + return FALSE; } -/* ../cstrike/dlls/items.cpp:266 */ -LINK_ENTITY_TO_CLASS(item_battery, CItemBattery); +/* ../cstrike/dlls/items.cpp:266 */ +LINK_ENTITY_TO_CLASS(item_battery, CItemBattery); -/* ../cstrike/dlls/items.cpp:271 */ -void CItemAntidote::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:271 */ +void CItemAntidote::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_antidote.mdl"); - CItem::Spawn(); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:277 */ -void CItemAntidote::Precache_(void) -{ - PRECACHE_MODEL("models/w_antidote.mdl"); +/* ../cstrike/dlls/items.cpp:277 */ +void CItemAntidote::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_antidote.mdl"); } -/* ../cstrike/dlls/items.cpp:281 */ -BOOL CItemAntidote::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:281 */ +BOOL CItemAntidote::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ pPlayer->SetSuitUpdate("!HEV_DET4", FALSE, SUIT_NEXT_IN_1MIN); pPlayer->m_rgItems[ ITEM_ANTIDOTE ] += 1; - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:290 */ -LINK_ENTITY_TO_CLASS(item_antidote, CItemAntidote); +/* ../cstrike/dlls/items.cpp:290 */ +LINK_ENTITY_TO_CLASS(item_antidote, CItemAntidote); -/* ../cstrike/dlls/items.cpp:295 */ -void CItemSecurity::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:295 */ +void CItemSecurity::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_security.mdl"); - CItem::Spawn(); -} - -/* ../cstrike/dlls/items.cpp:301 */ -void CItemSecurity::Precache_(void) -{ - PRECACHE_MODEL("models/w_security.mdl"); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:305 */ -BOOL CItemSecurity::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:301 */ +void CItemSecurity::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_security.mdl"); +} + +/* ../cstrike/dlls/items.cpp:305 */ +BOOL CItemSecurity::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ pPlayer->m_rgItems[ ITEM_SECURITY ] += 1; - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:312 */ -LINK_ENTITY_TO_CLASS(item_security, CItemSecurity); +/* ../cstrike/dlls/items.cpp:312 */ +LINK_ENTITY_TO_CLASS(item_security, CItemSecurity); -/* ../cstrike/dlls/items.cpp:316 */ -void CItemLongJump::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:316 */ +void CItemLongJump::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_longjump.mdl"); - CItem::Spawn(); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:322 */ -void CItemLongJump::Precache_(void) -{ - PRECACHE_MODEL("models/w_longjump.mdl"); +/* ../cstrike/dlls/items.cpp:322 */ +void CItemLongJump::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_longjump.mdl"); } -/* ../cstrike/dlls/items.cpp:326 */ -BOOL CItemLongJump::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:326 */ +BOOL CItemLongJump::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ if (pPlayer->m_fLongJump) return FALSE; @@ -291,29 +291,29 @@ BOOL CItemLongJump::MyTouch_(CBasePlayer *pPlayer) return TRUE; } - return FALSE; + return FALSE; } -/* ../cstrike/dlls/items.cpp:350 */ -LINK_ENTITY_TO_CLASS(item_longjump, CItemLongJump); +/* ../cstrike/dlls/items.cpp:350 */ +LINK_ENTITY_TO_CLASS(item_longjump, CItemLongJump); -/* ../cstrike/dlls/items.cpp:354 */ -void CItemKevlar::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:354 */ +void CItemKevlar::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); - CItem::Spawn(); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:360 */ -void CItemKevlar::Precache_(void) -{ - PRECACHE_MODEL("models/w_kevlar.mdl"); +/* ../cstrike/dlls/items.cpp:360 */ +void CItemKevlar::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_kevlar.mdl"); } -/* ../cstrike/dlls/items.cpp:364 */ -BOOL CItemKevlar::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:364 */ +BOOL CItemKevlar::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ if (pPlayer->m_iKevlar == ARMOR_TYPE_EMPTY) pPlayer->m_iKevlar = ARMOR_TYPE_KEVLAR; @@ -331,29 +331,29 @@ BOOL CItemKevlar::MyTouch_(CBasePlayer *pPlayer) if (TheTutor) TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:390 */ -LINK_ENTITY_TO_CLASS(item_kevlar, CItemKevlar); - -/* ../cstrike/dlls/items.cpp:395 */ -void CItemAssaultSuit::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:390 */ +LINK_ENTITY_TO_CLASS(item_kevlar, CItemKevlar); + +/* ../cstrike/dlls/items.cpp:395 */ +void CItemAssaultSuit::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_assault.mdl"); - CItem::Spawn(); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:401 */ -void CItemAssaultSuit::Precache_(void) -{ - PRECACHE_MODEL("models/w_assault.mdl"); +/* ../cstrike/dlls/items.cpp:401 */ +void CItemAssaultSuit::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_assault.mdl"); } -/* ../cstrike/dlls/items.cpp:405 */ -BOOL CItemAssaultSuit::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:405 */ +BOOL CItemAssaultSuit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ pPlayer->m_iKevlar = ARMOR_TYPE_HELMET; pPlayer->pev->armorvalue = 100; @@ -370,29 +370,29 @@ BOOL CItemAssaultSuit::MyTouch_(CBasePlayer *pPlayer) if (TheTutor) TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:429 */ -LINK_ENTITY_TO_CLASS(item_assaultsuit, CItemAssaultSuit); +/* ../cstrike/dlls/items.cpp:429 */ +LINK_ENTITY_TO_CLASS(item_assaultsuit, CItemAssaultSuit); -/* ../cstrike/dlls/items.cpp:434 */ -void CItemThighPack::Spawn_(void) -{ +/* ../cstrike/dlls/items.cpp:434 */ +void CItemThighPack::__MAKE_VHOOK(Spawn)(void) +{ Precache(); SET_MODEL(ENT(pev), "models/w_thighpack.mdl"); - CItem::Spawn(); + CItem::Spawn(); } -/* ../cstrike/dlls/items.cpp:440 */ -void CItemThighPack::Precache_(void) -{ - PRECACHE_MODEL("models/w_thighpack.mdl"); +/* ../cstrike/dlls/items.cpp:440 */ +void CItemThighPack::__MAKE_VHOOK(Precache)(void) +{ + PRECACHE_MODEL("models/w_thighpack.mdl"); } -/* ../cstrike/dlls/items.cpp:444 */ -BOOL CItemThighPack::MyTouch_(CBasePlayer *pPlayer) -{ +/* ../cstrike/dlls/items.cpp:444 */ +BOOL CItemThighPack::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) +{ if (pPlayer->m_iTeam != CT || pPlayer->m_bHasDefuser) return FALSE; @@ -415,11 +415,11 @@ BOOL CItemThighPack::MyTouch_(CBasePlayer *pPlayer) if (TheTutor) TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); - return TRUE; + return TRUE; } -/* ../cstrike/dlls/items.cpp:474 */ -LINK_ENTITY_TO_CLASS(item_thighpack, CItemThighPack); +/* ../cstrike/dlls/items.cpp:474 */ +LINK_ENTITY_TO_CLASS(item_thighpack, CItemThighPack); #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/lights.cpp b/regamedll/dlls/lights.cpp index a9aa97ca..af9cf6c1 100644 --- a/regamedll/dlls/lights.cpp +++ b/regamedll/dlls/lights.cpp @@ -26,16 +26,16 @@ IMPLEMENT_SAVERESTORE(CLight, CPointEntity); // Cache user-entity-field values until spawn is called. /* ../cstrike/dlls/lights.cpp:62 */ -void CLight::KeyValue_(KeyValueData *pkvd) +void CLight::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "style")) { - m_iStyle = atoi(pkvd->szValue); + m_iStyle = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "pitch")) { - pev->angles.x = atof(pkvd->szValue); + pev->angles.x = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "pattern")) @@ -48,7 +48,7 @@ void CLight::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/lights.cpp:92 */ -void CLight::Spawn_(void) +void CLight::__MAKE_VHOOK(Spawn)(void) { // inert light if (FStringNull(pev->targetname)) @@ -72,7 +72,7 @@ void CLight::Spawn_(void) } /* ../cstrike/dlls/lights.cpp:117 */ -void CLight::Restart_(void) +void CLight::__MAKE_VHOOK(Restart)(void) { if (m_iStyle >= 32) { @@ -94,7 +94,7 @@ void CLight::Restart_(void) } /* ../cstrike/dlls/lights.cpp:139 */ -void CLight::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CLight::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { if (m_iStyle >= 32) { @@ -125,7 +125,7 @@ LINK_ENTITY_TO_CLASS(light_spot, CLight); LINK_ENTITY_TO_CLASS(light_environment, CEnvLight); /* ../cstrike/dlls/lights.cpp:177 */ -void CEnvLight::KeyValue_(KeyValueData *pkvd) +void CEnvLight::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "_light")) { @@ -162,7 +162,7 @@ void CEnvLight::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/lights.cpp:215 */ -void CEnvLight::Spawn_(void) +void CEnvLight::__MAKE_VHOOK(Spawn)(void) { #if defined(HOOK_GAMEDLL) // NOTE: fix negative the values for function sprintf from STD C++: diff --git a/regamedll/dlls/maprules.cpp b/regamedll/dlls/maprules.cpp index 6e3dcbfa..c84d8662 100644 --- a/regamedll/dlls/maprules.cpp +++ b/regamedll/dlls/maprules.cpp @@ -35,12 +35,12 @@ TYPEDESCRIPTION (*CGamePlayerZone::pm_SaveData)[4]; IMPLEMENT_SAVERESTORE(CRuleEntity, CBaseEntity); /* ../cstrike/dlls/maprules.cpp:60 */ -NOBODY void CRuleEntity::Spawn_(void) +NOBODY void CRuleEntity::__MAKE_VHOOK(Spawn)(void) { } /* ../cstrike/dlls/maprules.cpp:68 */ -NOBODY void CRuleEntity::KeyValue_(KeyValueData *pkvd) +NOBODY void CRuleEntity::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 70 @@ -58,13 +58,13 @@ NOBODY BOOL CRuleEntity::CanFireForActivator(CBaseEntity *pActivator) } /* ../cstrike/dlls/maprules.cpp:101 */ -NOBODY void CRulePointEntity::Spawn_(void) +NOBODY void CRulePointEntity::__MAKE_VHOOK(Spawn)(void) { // Spawn(CRuleEntity *const this); // 103 } /* ../cstrike/dlls/maprules.cpp:120 */ -NOBODY void CRuleBrushEntity::Spawn_(void) +NOBODY void CRuleBrushEntity::__MAKE_VHOOK(Spawn)(void) { // Spawn(CRuleEntity *const this); // 123 } @@ -73,13 +73,13 @@ NOBODY void CRuleBrushEntity::Spawn_(void) LINK_ENTITY_TO_CLASS(game_score, CGameScore); /* ../cstrike/dlls/maprules.cpp:154 */ -NOBODY void CGameScore::Spawn_(void) +NOBODY void CGameScore::__MAKE_VHOOK(Spawn)(void) { // Spawn(CRulePointEntity *const this); // 156 } /* ../cstrike/dlls/maprules.cpp:160 */ -NOBODY void CGameScore::KeyValue_(KeyValueData *pkvd) +NOBODY void CGameScore::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 162 @@ -90,7 +90,7 @@ NOBODY void CGameScore::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/maprules.cpp:173 */ -NOBODY void CGameScore::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CGameScore::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 175 @@ -111,7 +111,7 @@ LINK_ENTITY_TO_CLASS(game_end, CGameEnd); LINK_ENTITY_TO_CLASS(game_text, CGameText); /* ../cstrike/dlls/maprules.cpp:205 */ -NOBODY void CGameEnd::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CGameEnd::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 207 @@ -126,7 +126,7 @@ NOBODY void CGameEnd::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY IMPLEMENT_SAVERESTORE(CGameText, CRulePointEntity); /* ../cstrike/dlls/maprules.cpp:254 */ -NOBODY void CGameText::KeyValue_(KeyValueData *pkvd) +NOBODY void CGameText::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // { // int color; // 278 @@ -145,7 +145,7 @@ NOBODY void CGameText::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/maprules.cpp:321 */ -NOBODY void CGameText::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CGameText::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 323 @@ -161,7 +161,7 @@ NOBODY void CGameText::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T LINK_ENTITY_TO_CLASS(game_team_master, CGameTeamMaster); /* ../cstrike/dlls/maprules.cpp:373 */ -NOBODY void CGameTeamMaster::KeyValue_(KeyValueData *pkvd) +NOBODY void CGameTeamMaster::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 375 @@ -178,7 +178,7 @@ NOBODY void CGameTeamMaster::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/maprules.cpp:402 */ -void CGameTeamMaster::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGameTeamMaster::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 404 @@ -192,14 +192,14 @@ void CGameTeamMaster::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY } /* ../cstrike/dlls/maprules.cpp:429 */ -BOOL CGameTeamMaster::IsTriggered_(CBaseEntity *pActivator) +BOOL CGameTeamMaster::__MAKE_VHOOK(IsTriggered)(CBaseEntity *pActivator) { // TeamMatch(CGameTeamMaster *const this, // class CBaseEntity *pActivator); // 431 } /* ../cstrike/dlls/maprules.cpp:435 */ -const char *CGameTeamMaster::TeamID_(void) +const char *CGameTeamMaster::__MAKE_VHOOK(TeamID)(void) { // TeamID(CGameTeamMaster *const this); // 435 } @@ -216,7 +216,7 @@ BOOL CGameTeamMaster::TeamMatch(CBaseEntity *pActivator) LINK_ENTITY_TO_CLASS(game_team_set, CGameTeamSet); /* ../cstrike/dlls/maprules.cpp:477 */ -void CGameTeamSet::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGameTeamSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 479 @@ -227,19 +227,14 @@ void CGameTeamSet::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE // float value); // 477 } - - - /* ../cstrike/dlls/maprules.cpp:519 */ LINK_ENTITY_TO_CLASS(game_zone_player, CGamePlayerZone); /* ../cstrike/dlls/maprules.cpp:528 */ -IMPLEMENT_SAVERESTORE(CGamePlayerZone, CRuleBrushEntity); - - +IMPLEMENT_SAVERESTORE(CGamePlayerZone, CRuleBrushEntity); /* ../cstrike/dlls/maprules.cpp:530 */ -void CGamePlayerZone::KeyValue_(KeyValueData *pkvd) +void CGamePlayerZone::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 532 @@ -250,7 +245,7 @@ void CGamePlayerZone::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/maprules.cpp:556 */ -void CGamePlayerZone::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGamePlayerZone::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // int playersInCount; // 558 @@ -277,7 +272,7 @@ void CGamePlayerZone::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY LINK_ENTITY_TO_CLASS(game_player_hurt, CGamePlayerHurt); /* ../cstrike/dlls/maprules.cpp:631 */ -void CGamePlayerHurt::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGamePlayerHurt::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 633 @@ -292,7 +287,7 @@ void CGamePlayerHurt::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY LINK_ENTITY_TO_CLASS(game_counter, CGameCounter); /* ../cstrike/dlls/maprules.cpp:686 */ -void CGameCounter::Spawn_(void) +void CGameCounter::__MAKE_VHOOK(Spawn)(void) { // CountValue(CGameCounter *const this); // 689 // SetInitialValue(CGameCounter *const this, @@ -301,7 +296,7 @@ void CGameCounter::Spawn_(void) } /* ../cstrike/dlls/maprules.cpp:694 */ -void CGameCounter::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGameCounter::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 696 @@ -316,7 +311,7 @@ void CGameCounter::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE LINK_ENTITY_TO_CLASS(game_counter_set, CGameCounterSet); /* ../cstrike/dlls/maprules.cpp:750 */ -void CGameCounterSet::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGameCounterSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 752 @@ -331,7 +326,7 @@ void CGameCounterSet::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY LINK_ENTITY_TO_CLASS(game_player_equip, CGamePlayerEquip); /* ../cstrike/dlls/maprules.cpp:791 */ -void CGamePlayerEquip::KeyValue_(KeyValueData *pkvd) +void CGamePlayerEquip::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // { // int i; // 797 @@ -346,7 +341,7 @@ void CGamePlayerEquip::KeyValue_(KeyValueData *pkvd) } /* ../cstrike/dlls/maprules.cpp:816 */ -void CGamePlayerEquip::Touch_(CBaseEntity *pOther) +void CGamePlayerEquip::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // CanFireForActivator(CRuleEntity *const this, // class CBaseEntity *pActivator); // 818 @@ -369,7 +364,7 @@ void CGamePlayerEquip::EquipPlayer(CBaseEntity *pEntity) } /* ../cstrike/dlls/maprules.cpp:851 */ -void CGamePlayerEquip::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGamePlayerEquip::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // EquipPlayer(CGamePlayerEquip *const this, // class CBaseEntity *pEntity); // 853 @@ -389,7 +384,7 @@ const char *CGamePlayerTeam::TargetTeamName(const char *pszTargetName) } /* ../cstrike/dlls/maprules.cpp:898 */ -void CGamePlayerTeam::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CGamePlayerTeam::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // const char *pszTargetTeam; // 905 diff --git a/regamedll/dlls/mortar.cpp b/regamedll/dlls/mortar.cpp index d5639dec..689cceda 100644 --- a/regamedll/dlls/mortar.cpp +++ b/regamedll/dlls/mortar.cpp @@ -28,84 +28,194 @@ LINK_ENTITY_TO_CLASS(func_mortar_field, CFuncMortarField); IMPLEMENT_SAVERESTORE(CFuncMortarField, CBaseToggle); /* ../cstrike/dlls/mortar.cpp:71 */ -NOBODY void CFuncMortarField::KeyValue_(KeyValueData *pkvd) +void CFuncMortarField::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 73 -// FStrEq(const char *sz1, -// const char *sz2); // 78 -// KeyValue(CFuncMortarField *const this, -// KeyValueData *pkvd); // 71 + if (FStrEq(pkvd->szKeyName, "m_iszXController")) + { + m_iszXController = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_iszYController")) + { + m_iszYController = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_flSpread")) + { + m_flSpread = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_fControl")) + { + m_fControl = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_iCount")) + { + m_iCount = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } } +// Drop bombs from above + /* ../cstrike/dlls/mortar.cpp:102 */ -NOBODY void CFuncMortarField::Spawn_(void) +void CFuncMortarField::__MAKE_VHOOK(Spawn)(void) { + pev->solid = SOLID_NOT; + + // set size and link into world + SET_MODEL(ENT(pev), STRING(pev->model)); + pev->movetype = MOVETYPE_NONE; + pev->effects |= EF_NODRAW; + + SetUse(&CFuncMortarField::FieldUse); + Precache(); } /* ../cstrike/dlls/mortar.cpp:113 */ -NOBODY void CFuncMortarField::Precache_(void) +void CFuncMortarField::__MAKE_VHOOK(Precache)(void) { + PRECACHE_SOUND("weapons/mortar.wav"); + PRECACHE_SOUND("weapons/mortarhit.wav"); + PRECACHE_MODEL("sprites/lgtning.spr"); } +// If connected to a table, then use the table controllers, else hit where the trigger is. + /* ../cstrike/dlls/mortar.cpp:122 */ -NOBODY void CFuncMortarField::FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) -{ -// { -// Vector vecStart; // 124 -// int pitch; // 165 -// float t; // 169 -// { -// class CBaseEntity *pController; // 143 -// } -// { -// int i; // 170 -// { -// Vector vecSpot; // 172 -// TraceResult tr; // 176 -// edict_t *pentOwner; // 179 -// class CBaseEntity *pMortar; // 182 -// Vector(Vector *const this, -// const Vector &v); // 172 -// operator+(const Vector *const this, -// const Vector &v); // 177 -// edict(CBaseEntity *const this); // 180 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 182 -// } -// } -// } +void CFuncMortarField::FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +{ + Vector vecStart; + + vecStart.x = RANDOM_FLOAT(pev->mins.x, pev->maxs.x); + vecStart.y = RANDOM_FLOAT(pev->mins.y, pev->maxs.y); + vecStart.z = pev->maxs.z; + + switch (m_fControl) + { + // random + case 0: + break; + // Trigger Activator + case 1: + { + if (pActivator != NULL) + { + vecStart.x = pActivator->pev->origin.x; + vecStart.y = pActivator->pev->origin.y; + } + break; + } + // table + case 2: + { + CBaseEntity *pController; + + if (!FStringNull(m_iszXController)) + { + pController = UTIL_FindEntityByTargetname(NULL, STRING(m_iszXController)); + + if (pController != NULL) + { + vecStart.x = pev->mins.x + pController->pev->ideal_yaw * pev->size.x; + } + } + if (!FStringNull(m_iszYController)) + { + pController = UTIL_FindEntityByTargetname(NULL, STRING(m_iszYController)); + + if (pController != NULL) + { + vecStart.y = pev->mins.y + pController->pev->ideal_yaw * pev->size.y; + } + } + break; + } + } + + int pitch = RANDOM_LONG(95, 124); + + EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/mortar.wav", VOL_NORM, ATTN_NONE, 0, pitch); + + float t = 2.5; + for (int i = 0; i < m_iCount; i++) + { + Vector vecSpot = vecStart; + vecSpot.x += RANDOM_FLOAT(-m_flSpread, m_flSpread); + vecSpot.y += RANDOM_FLOAT(-m_flSpread, m_flSpread); + + TraceResult tr; + UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -1) * 4096, ignore_monsters, ENT(pev), &tr); + + edict_t *pentOwner = NULL; + if (pActivator) + { + pentOwner = pActivator->edict(); + } + + CBaseEntity *pMortar = Create("monster_mortar", tr.vecEndPos, Vector(0, 0, 0), pentOwner); + pMortar->pev->nextthink = gpGlobals->time + t; + t += RANDOM_FLOAT(0.2, 0.5); + + if (i == 0) + { + CSoundEnt::InsertSound(bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3); + } + } } /* ../cstrike/dlls/mortar.cpp:203 */ LINK_ENTITY_TO_CLASS(monster_mortar, CMortar); /* ../cstrike/dlls/mortar.cpp:205 */ -NOBODY void CMortar::Spawn_(void) +void CMortar::__MAKE_VHOOK(Spawn)(void) { + pev->movetype = MOVETYPE_NONE; + pev->solid = SOLID_NOT; + pev->dmg = 200; + + SetThink(&CMortar::MortarExplode); + pev->nextthink = 0; + Precache(); } /* ../cstrike/dlls/mortar.cpp:221 */ -NOBODY void CMortar::Precache_(void) +void CMortar::__MAKE_VHOOK(Precache)(void) { + m_spriteTexture = PRECACHE_MODEL("sprites/lgtning.spr"); } /* ../cstrike/dlls/mortar.cpp:226 */ -NOBODY void CMortar::MortarExplode(void) +void CMortar::MortarExplode(void) { -// { -// TraceResult tr; // 250 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 229 -// operator-(const Vector *const this, -// const Vector &v); // 251 -// operator+(const Vector *const this, -// const Vector &v); // 251 -// } + // mortar beam + MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); + WRITE_BYTE(TE_BEAMPOINTS); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z + 1024); + WRITE_SHORT(m_spriteTexture); + WRITE_BYTE(0); // framerate + WRITE_BYTE(0); // framerate + WRITE_BYTE(1); // life + WRITE_BYTE(40); // width + WRITE_BYTE(0); // noise + WRITE_BYTE(255); // r, g, b + WRITE_BYTE(160); // r, g, b + WRITE_BYTE(100); // r, g, b + WRITE_BYTE(128); // brightness + WRITE_BYTE(0); // speed + MESSAGE_END(); + + TraceResult tr; + UTIL_TraceLine(pev->origin + Vector(0, 0, 1024), pev->origin - Vector(0, 0, 1024), dont_ignore_monsters, ENT(pev), &tr); + + Explode(&tr, (DMG_BLAST | DMG_MORTAR)); + UTIL_ScreenShake(tr.vecEndPos, 25.0, 150.0, 1.0, 750); } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/mortar.h b/regamedll/dlls/mortar.h index 291e9157..0ef1e770 100644 --- a/regamedll/dlls/mortar.h +++ b/regamedll/dlls/mortar.h @@ -36,12 +36,14 @@ class CFuncMortarField: public CBaseToggle { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual void Precache(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + + // Bmodels don't go across transitions + virtual int ObjectCaps(void) { return ObjectCaps_(); } @@ -61,7 +63,7 @@ public: #endif // HOOK_GAMEDLL public: - NOBODY void EXPORT FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + void EXPORT FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[6]; @@ -80,8 +82,8 @@ public: class CMortar: public CGrenade { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void Precache(void); + virtual void Spawn(void); + virtual void Precache(void); #ifdef HOOK_GAMEDLL @@ -90,11 +92,16 @@ public: #endif // HOOK_GAMEDLL - NOBODY void EXPORT MortarExplode(void); + void EXPORT MortarExplode(void); public: int m_spriteTexture; };/* size: 504, cachelines: 8, members: 2 */ + +// linked objects +C_DLLEXPORT void func_mortar_field(entvars_t *pev); +C_DLLEXPORT void monster_mortar(entvars_t *pev); + #endif // MORTAR_H diff --git a/regamedll/dlls/mpstubb.cpp b/regamedll/dlls/mpstubb.cpp index ba078bb0..9ffe2d4e 100644 --- a/regamedll/dlls/mpstubb.cpp +++ b/regamedll/dlls/mpstubb.cpp @@ -5,31 +5,37 @@ CGraph WorldGraph; /* ../cstrike/dlls/mpstubb.cpp:32 */ void CGraph::InitGraph(void) { + ; } /* ../cstrike/dlls/mpstubb.cpp:33 */ int CGraph::FLoadGraph(char *szMapName) { + return 0; } /* ../cstrike/dlls/mpstubb.cpp:34 */ int CGraph::AllocNodes(void) { + return 0; } /* ../cstrike/dlls/mpstubb.cpp:35 */ int CGraph::CheckNODFile(char *szMapName) { + return 0; } /* ../cstrike/dlls/mpstubb.cpp:36 */ int CGraph::FSetGraphPointers(void) { + return 0; } /* ../cstrike/dlls/mpstubb.cpp:37 */ void CGraph::ShowNodeConnections(int iNode) { + ; } /* ../cstrike/dlls/mpstubb.cpp:38 */ @@ -45,7 +51,7 @@ int CGraph::FindNearestNode(const Vector &vecOrigin, CBaseEntity *pEntity) } /* ../cstrike/dlls/mpstubb.cpp:45 */ -float CBaseMonster::ChangeYaw_(int speed) +float CBaseMonster::__MAKE_VHOOK(ChangeYaw)(int speed) { return 0.0f; } @@ -70,7 +76,7 @@ NOBODY void CBaseMonster::CorpseFallThink(void) } /* ../cstrike/dlls/mpstubb.cpp:62 */ -void CBaseMonster::MonsterInitDead_(void) +void CBaseMonster::__MAKE_VHOOK(MonsterInitDead)(void) { InitBoneControllers(); @@ -93,7 +99,7 @@ void CBaseMonster::MonsterInitDead_(void) } /* ../cstrike/dlls/mpstubb.cpp:89 */ -BOOL CBaseMonster::ShouldFadeOnDeath_(void) +BOOL CBaseMonster::__MAKE_VHOOK(ShouldFadeOnDeath)(void) { return FALSE; } @@ -105,13 +111,13 @@ BOOL CBaseMonster::FCheckAITrigger(void) } /* ../cstrike/dlls/mpstubb.cpp:99 */ -void CBaseMonster::KeyValue_(KeyValueData *pkvd) +void CBaseMonster::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { CBaseToggle::KeyValue(pkvd); } /* ../cstrike/dlls/mpstubb.cpp:104 */ -NOBODY int CBaseMonster::IRelationship_(CBaseEntity *pTarget) +NOBODY int CBaseMonster::__MAKE_VHOOK(IRelationship)(CBaseEntity *pTarget) { // { // int const iEnemy; // 106 @@ -119,7 +125,7 @@ NOBODY int CBaseMonster::IRelationship_(CBaseEntity *pTarget) } /* ../cstrike/dlls/mpstubb.cpp:140 */ -NOBODY void CBaseMonster::Look_(int iDistance) +NOBODY void CBaseMonster::__MAKE_VHOOK(Look)(int iDistance) { // { // int iSighted; // 142 @@ -142,7 +148,7 @@ NOBODY void CBaseMonster::Look_(int iDistance) } /* ../cstrike/dlls/mpstubb.cpp:220 */ -NOBODY CBaseEntity *CBaseMonster::BestVisibleEnemy_(void) +NOBODY CBaseEntity *CBaseMonster::__MAKE_VHOOK(BestVisibleEnemy)(void) { // { // class CBaseEntity *pReturn; // 222 diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 9d586587..0b5351f9 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -6,7 +6,7 @@ #ifndef HOOK_GAMEDLL static char mp_com_token[ COM_TOKEN_LEN ]; -cvar_t *sv_clienttrace; +cvar_t *sv_clienttrace = NULL; #else @@ -18,107 +18,162 @@ cvar_t *sv_clienttrace; CCStrikeGameMgrHelper g_GameMgrHelper; CHalfLifeMultiplay *g_pMPGameRules; -//void info_map_parameters(entvars_t *pev) - /* <1153e2> ../cstrike/dlls/multiplay_gamerules.cpp:92 */ bool IsBotSpeaking(void) { -// { -// int i; // 94 -// { -// class CBasePlayer *pPlayer; // 96 -// { -// class CCSBot *pBot; // 99 -// } -// } -// } + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pPlayer == NULL || !pPlayer->IsBot()) + continue; + + CCSBot *pBot = reinterpret_cast(pPlayer); + + if (pBot->IsUsingVoice()) + return true; + } + + return false; } /* <1116dd> ../cstrike/dlls/multiplay_gamerules.cpp:111 */ -NOBODY void SV_Continue_f(void) +void SV_Continue_f(void) { -// { -// class CHalfLifeMultiplay *mp; // 113 -// { -// int i; // 121 -// { -// class CBasePlayer *pPlayer; // 123 -// } -// } -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp->IsCareer() && mp->m_fTeamCount > 100000.0) + { + mp->m_fTeamCount = gpGlobals->time; + + // go continue + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("GOGOGO"); + MESSAGE_END(); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (pPlayer && !pPlayer->IsBot()) + { + // at the end of the round is showed window with the proposal surrender or continue + // now of this time HUD is completely hidden + // we must to restore HUD after entered continued + pPlayer->m_iHideHUD &= ~HIDEHUD_ALL; + } + } + } } /* <112860> ../cstrike/dlls/multiplay_gamerules.cpp:133 */ -NOBODY void SV_Tutor_Toggle_f(void) +void SV_Tutor_Toggle_f(void) { + CVAR_SET_FLOAT("tutor_enable", (CVAR_GET_FLOAT("tutor_enable") <= 0.0)); } /* <11538f> ../cstrike/dlls/multiplay_gamerules.cpp:139 */ -NOBODY void SV_Career_Restart_f(void) +void SV_Career_Restart_f(void) { -// { -// class CHalfLifeMultiplay *mp; // 141 -// IsCareer(CHalfLifeMultiplay *const this); // 142 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp->IsCareer()) + { + mp->CareerRestart(); + } } /* <111695> ../cstrike/dlls/multiplay_gamerules.cpp:149 */ -NOBODY void SV_Career_EndRound_f(void) +void SV_Career_EndRound_f(void) { -// { -// class CHalfLifeMultiplay *mp; // 151 -// { -// class CBasePlayer *localPlayer; // 154 -// { -// int i; // 160 -// { -// class CBasePlayer *player; // 162 -// } -// } -// } -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + if (!mp->IsCareer() || !mp->IsInCareerRound()) + { + return; + } + + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + SERVER_COMMAND("kill\n"); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!player || FNullEnt(player->pev)) + continue; + + if (player->IsBot() && player->m_iTeam == localPlayer->m_iTeam) + { + SERVER_COMMAND(UTIL_VarArgs("bot_kill \"%s\"\n", STRING(player->pev->netname))); + } + } + } } /* <1145dd> ../cstrike/dlls/multiplay_gamerules.cpp:173 */ -NOBODY bool CHalfLifeMultiplay::IsInCareerRound(void) +bool CHalfLifeMultiplay::IsInCareerRound(void) { - if (m_fTeamCount) - return false; - - if (m_fCareerRoundMenuTime) - return false; - - if (m_fCareerMatchMenuTime) - return false; - - return true; + return IsMatchStarted() ? false : true; } /* <110ba1> ../cstrike/dlls/multiplay_gamerules.cpp:180 */ -NOBODY void SV_CareerAddTask_f(void) +void SV_CareerAddTask_f(void) { -// { -// const char *taskName; // 187 -// const char *weaponName; // 188 -// int reps; // 189 -// bool mustLive; // 190 -// bool crossRounds; // 191 -// bool isComplete; // 192 -// } + if (CMD_ARGC() != 7) + return; + + const char *taskName = CMD_ARGV(1); + const char *weaponName = CMD_ARGV(2); + + int reps = Q_atoi(CMD_ARGV(3)); + bool mustLive = Q_atoi(CMD_ARGV(4)) != 0; + bool crossRounds = Q_atoi(CMD_ARGV(5)) != 0; + bool isComplete = Q_atoi(CMD_ARGV(6)) != 0; + + TheCareerTasks->AddTask + ( + taskName, + weaponName, + reps, + mustLive, + crossRounds, + isComplete + ); } /* <111640> ../cstrike/dlls/multiplay_gamerules.cpp:213 */ -NOBODY void SV_CareerMatchLimit_f(void) +void SV_CareerMatchLimit_f(void) { -// { -// class CHalfLifeMultiplay *mp; // 219 -// } + if (CMD_ARGC() != 3) + { + return; + } + + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp->IsCareer()) + { + mp->SetCareerMatchLimit(Q_atoi(CMD_ARGV(1)), Q_atoi(CMD_ARGV(2))); + } } /* <114600> ../cstrike/dlls/multiplay_gamerules.cpp:227 */ -NOBODY void CHalfLifeMultiplay::SetCareerMatchLimit(int minWins, int winDifference) +void CHalfLifeMultiplay::SetCareerMatchLimit(int minWins, int winDifference) { -// IsCareer(CHalfLifeMultiplay *const this); // 229 + if (!IsCareer()) + { + return; + } + + if (!m_iCareerMatchWins) + { + m_iCareerMatchWins = minWins; + m_iRoundWinDifference = winDifference; + } } /* <114650> ../cstrike/dlls/multiplay_gamerules.cpp:238 */ @@ -127,41 +182,96 @@ BOOL CHalfLifeMultiplay::IsCareer(void) return IS_CAREER_MATCH(); } -/* <113e08> ../cstrike/dlls/multiplay_gamerules.cpp:263 */ -NOBODY void CMapInfo::KeyValue_(KeyValueData *pkvd) +/* <113ca2> ../cstrike/dlls/multiplay_gamerules.cpp:241 */ +void CHalfLifeMultiplay::__MAKE_VHOOK(ServerDeactivate)(void) { -// FStrEq(const char *sz1, -// const char *sz2); // 265 -// FStrEq(const char *sz1, -// const char *sz2); // 270 -// atoi(const char *__nptr); // 272 -// KeyValue(CMapInfo *const this, -// KeyValueData *pkvd); // 263 + if (!IsCareer()) + { + return; + } + + CVAR_SET_FLOAT("pausable", 0); + CVAR_SET_FLOAT("mp_windifference", 1); + UTIL_LogPrintf("Career End\n"); +} + +/* <113e08> ../cstrike/dlls/multiplay_gamerules.cpp:263 */ +void CMapInfo::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) +{ + if (FStrEq(pkvd->szKeyName, "buying")) + { + m_iBuyingStatus = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "bombradius")) + { + m_flBombRadius = Q_atoi(pkvd->szValue); + + if (m_flBombRadius > MAX_BOMB_RADIUS) + m_flBombRadius = MAX_BOMB_RADIUS; + + pkvd->fHandled = TRUE; + } } /* <112879> ../cstrike/dlls/multiplay_gamerules.cpp:280 */ -NOBODY void CMapInfo::Spawn_(void) +void CMapInfo::__MAKE_VHOOK(Spawn)(void) { + pev->movetype = MOVETYPE_NONE; + pev->solid = SOLID_NOT; + pev->effects |= EF_NODRAW; } /* <114673> ../cstrike/dlls/multiplay_gamerules.cpp:288 */ LINK_ENTITY_TO_CLASS(info_map_parameters, CMapInfo); +/* <11124e> ../cstrike/dlls/multiplay_gamerules.cpp:293 */ +bool CCStrikeGameMgrHelper::__MAKE_VHOOK(CanPlayerHearPlayer)(CBasePlayer *pListener, CBasePlayer *pSender) +{ + if (!pSender->IsPlayer() || pListener->m_iTeam != pSender->m_iTeam) + { + return false; + } + + BOOL bListenerAlive = pListener->IsAlive(); + BOOL bSenderAlive = pSender->IsAlive(); + + if (pListener->IsObserver()) + { + return true; + } + + if (bListenerAlive) + { + if (!bSenderAlive) + return false; + } + else + { + if (bSenderAlive) + return true; + } + + return (bListenerAlive == bSenderAlive); +} + /* <11474f> ../cstrike/dlls/multiplay_gamerules.cpp:331 */ void Broadcast(const char *sentence) { 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); + WRITE_BYTE(0); + WRITE_STRING(text); + WRITE_SHORT(100); MESSAGE_END(); } @@ -179,34 +289,140 @@ char *GetTeam(int teamNo) default: break; } + return ""; } /* <114805> ../cstrike/dlls/multiplay_gamerules.cpp:364 */ -NOBODY void EndRoundMessage(const char *sentence, int event) +void EndRoundMessage(const char *sentence, int event) { -// { -// class CHalfLifeMultiplay *mp; // 366 -// char *team; // 368 -// const char *message; // 369 -// int teamTriggered; // 370 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + char *team = NULL; + const char *message = &sentence[1]; + int teamTriggered = 1; + + UTIL_ClientPrintAll(HUD_PRINTCENTER, sentence); + + switch (event) + { + case ROUND_TARGET_BOMB: + case ROUND_VIP_ASSASSINATED: + case ROUND_TERRORISTS_ESCAPED: + case ROUND_TERRORISTS_WIN: + case ROUND_HOSTAGE_NOT_RESCUED: + case ROUND_VIP_NOT_ESCAPED: + team = GetTeam(TERRORIST); + TheBots->OnEvent(EVENT_TERRORISTS_WIN); + break; + case ROUND_VIP_ESCAPED: + case ROUND_CTS_PREVENT_ESCAPE: + case ROUND_ESCAPING_TERRORISTS_NEUTRALIZED: + case ROUND_BOMB_DEFUSED: + case ROUND_CTS_WIN: + case ROUND_ALL_HOSTAGES_RESCUED: + case ROUND_TARGET_SAVED: + case ROUND_TERRORISTS_NOT_ESCAPED: + team = GetTeam(CT); + TheBots->OnEvent(EVENT_CTS_WIN); + break; + default: + teamTriggered = false; + TheBots->OnEvent(EVENT_ROUND_DRAW); + break; + } + + if (mp != NULL) + { + if (teamTriggered) + { + UTIL_LogPrintf + ( + "Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n", + team, + message, + mp->m_iNumCTWins, + mp->m_iNumTerroristWins + ); + } + else + { + UTIL_LogPrintf + ( + "World triggered \"%s\" (CT \"%i\") (T \"%i\")\n", + message, + mp->m_iNumCTWins, + mp->m_iNumTerroristWins + ); + } + } + + UTIL_LogPrintf("World triggered \"Round_End\"\n"); } /* <1128a1> ../cstrike/dlls/multiplay_gamerules.cpp:419 */ -NOBODY void ReadMultiplayCvars(CHalfLifeMultiplay *mp) +void ReadMultiplayCvars(CHalfLifeMultiplay *mp) { + mp->m_iRoundTime = (int)(CVAR_GET_FLOAT("mp_roundtime") * 60); + mp->m_iC4Timer = (int)CVAR_GET_FLOAT("mp_c4timer"); + mp->m_iIntroRoundTime = (int)CVAR_GET_FLOAT("mp_freezetime"); + mp->m_iLimitTeams = (int)CVAR_GET_FLOAT("mp_limitteams"); + + if (mp->m_iRoundTime > 540) + { + CVAR_SET_FLOAT("mp_roundtime", 9); + mp->m_iRoundTime = 540; + } + else if (mp->m_iRoundTime < 60) + { + CVAR_SET_FLOAT("mp_roundtime", 1); + mp->m_iRoundTime = 60; + } + + if (mp->m_iIntroRoundTime > 60) + { + CVAR_SET_FLOAT("mp_freezetime", 60); + mp->m_iIntroRoundTime = 60; + } + else if (mp->m_iIntroRoundTime < 0) + { + CVAR_SET_FLOAT("mp_freezetime", 0); + mp->m_iIntroRoundTime = 0; + } + + if (mp->m_iC4Timer > 90) + { + CVAR_SET_FLOAT("mp_c4timer", 90); + mp->m_iC4Timer = 90; + } + else if (mp->m_iC4Timer < 10) + { + CVAR_SET_FLOAT("mp_c4timer", 10); + mp->m_iC4Timer = 10; + } + + if (mp->m_iLimitTeams > 20) + { + CVAR_SET_FLOAT("mp_limitteams", 20); + mp->m_iLimitTeams = 20; + } + else if (mp->m_iLimitTeams < 0) + { + CVAR_SET_FLOAT("mp_limitteams", 0); + mp->m_iLimitTeams = 0; + } } /* <11492c> ../cstrike/dlls/multiplay_gamerules.cpp:479 */ -NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) +CHalfLifeMultiplay::CHalfLifeMultiplay(void) { + UNTESTED m_VoiceGameMgr.Init(&g_GameMgrHelper, gpGlobals->maxClients); RefreshSkillData(); m_flIntermissionEndTime = 0; m_flIntermissionStartTime = 0; m_fTeamCount = 0; + m_iAccountCT = 0; m_iAccountTerrorist = 0; m_iHostagesRescued = 0; @@ -218,10 +434,10 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) m_iNumTerrorist = 0; m_iNumSpawnableCT = 0; m_iNumSpawnableTerrorist = 0; - m_bMapHasCameras = 2; + m_bMapHasCameras = MAP_HAS_CAMERAS_INIT; g_fGameOver = FALSE; - m_iLoserBonus = 1400; + m_iLoserBonus = REWARD_LOSER_BONUS_DEFAULT; m_iNumConsecutiveCTLoses = 0; m_iNumConsecutiveTerroristLoses = 0; m_iC4Guy = 0; @@ -246,8 +462,8 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) m_bRoundTerminating = false; g_iHostageNumber = 0; - m_bBombDropped = FALSE; + m_iMaxRounds = (int)CVAR_GET_FLOAT("mp_maxrounds"); if (m_iMaxRounds < 0) @@ -265,7 +481,7 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) CVAR_SET_FLOAT("mp_winlimit", 0); } - memset(m_iMapVotes, 0, sizeof(m_iMapVotes)); + Q_memset(m_iMapVotes, 0, sizeof(m_iMapVotes)); m_iLastPick = 1; m_bMapHasEscapeZone = false; @@ -275,7 +491,9 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) m_iStoredSpectValue = (int)allow_spectators.value; for (int j = 0; j < MAX_VIP_QUEUES; j++) - VIPQueue[ j ] = NULL; + { + VIPQueue[j] = NULL; + } CVAR_SET_FLOAT("cl_himodels", 0); ReadMultiplayCvars(this); @@ -284,8 +502,11 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) m_fMaxIdlePeriod = m_iRoundTime * 2; float flAutoKickIdle = CVAR_GET_FLOAT("mp_autokick_timeout"); + if (flAutoKickIdle > 0.0) + { m_fMaxIdlePeriod = flAutoKickIdle; + } m_bInCareerGame = false; m_iRoundTimeSecs = m_iIntroRoundTime; @@ -294,32 +515,30 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) { CVAR_SET_FLOAT("pausable", 0); } + else if (IsCareer()) + { + CVAR_SET_FLOAT("pausable", 1); + CVAR_SET_FLOAT("sv_aim", 0); + CVAR_SET_FLOAT("sv_maxspeed", 322); + CVAR_SET_FLOAT("sv_cheats", 0); + CVAR_SET_FLOAT("mp_windifference", 2); + + m_bInCareerGame = true; + UTIL_LogPrintf("Career Start\n"); + } else { - if (IsCareer()) + CVAR_SET_FLOAT("pausable", 0); + + const char *lservercfgfile = CVAR_GET_STRING("lservercfgfile"); + + if (lservercfgfile && *lservercfgfile != '\0') { - CVAR_SET_FLOAT("pausable", 1); - CVAR_SET_FLOAT("sv_aim", 0); - CVAR_SET_FLOAT("sv_maxspeed", 322); - CVAR_SET_FLOAT("sv_cheats", 0); - CVAR_SET_FLOAT("mp_windifference", 2); + ALERT(at_console, "Executing listen server config file\n"); - m_bInCareerGame = true; - UTIL_LogPrintf("Career Start\n"); - } - else - { - CVAR_SET_FLOAT("pausable", 0); - - const char *lservercfgfile = CVAR_GET_STRING("lservercfgfile"); - - if (lservercfgfile && *lservercfgfile) - { - char szCommand[256]; - ALERT(at_console, "Executing listen server config file\n"); - Q_sprintf(szCommand, "exec %s\n", lservercfgfile); - SERVER_COMMAND(szCommand); - } + char szCommand[256]; + Q_sprintf(szCommand, "exec %s\n", lservercfgfile); + SERVER_COMMAND(szCommand); } } @@ -379,13 +598,13 @@ NOBODY CHalfLifeMultiplay::CHalfLifeMultiplay(void) } sv_clienttrace = CVAR_GET_POINTER("sv_clienttrace"); - InstallTutor(CVAR_GET_POINTER("tutor_enable") != NULL); + InstallTutor(CVAR_GET_FLOAT("tutor_enable") != 0.0f); g_pMPGameRules = this; } /* <113b92> ../cstrike/dlls/multiplay_gamerules.cpp:678 */ -void CHalfLifeMultiplay::RefreshSkillData_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(RefreshSkillData)(void) { CGameRules::RefreshSkillData(); @@ -400,7 +619,7 @@ void CHalfLifeMultiplay::RefreshSkillData_(void) } /* <113b51> ../cstrike/dlls/multiplay_gamerules.cpp:713 */ -void CHalfLifeMultiplay::RemoveGuns_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(RemoveGuns)(void) { CBaseEntity *toremove = NULL; @@ -412,250 +631,1259 @@ void CHalfLifeMultiplay::RemoveGuns_(void) while ((toremove = UTIL_FindEntityByClassname(toremove, "weapon_shield")) != NULL) { toremove->SetThink(&CBaseEntity::SUB_Remove); - //toremove->SetTouch(NULL); // TODO: this not exists in IDA toremove->pev->nextthink = gpGlobals->time + 0.1; } } /* <1149e8> ../cstrike/dlls/multiplay_gamerules.cpp:733 */ -NOBODY void CHalfLifeMultiplay::UpdateTeamScores(void) +void CHalfLifeMultiplay::UpdateTeamScores(void) { -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 735 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 740 + MESSAGE_BEGIN(MSG_ALL, gmsgTeamScore); + WRITE_STRING("CT"); + WRITE_SHORT(m_iNumCTWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgTeamScore); + WRITE_STRING("TERRORIST"); + WRITE_SHORT(m_iNumTerroristWins); + MESSAGE_END(); } /* <113aee> ../cstrike/dlls/multiplay_gamerules.cpp:747 */ -NOBODY void CHalfLifeMultiplay::CleanUpMap_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(CleanUpMap)(void) { -// { -// class CBaseEntity *torestart; // 749 -// class CBaseEntity *toremove; // 750 -// int icount; // 837 -// } + CBaseEntity *torestart; + CBaseEntity *toremove; + int icount; + + for (torestart = UTIL_FindEntityByClassname(NULL, "cycler_sprite"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "cycler_sprite")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "light"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "light")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_breakable"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_breakable")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_door"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_door")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_water"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_water")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_door_rotating"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_door_rotating")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_tracktrain"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_tracktrain")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_vehicle"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_vehicle")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "func_train"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "func_train")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "armoury_entity"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "armoury_entity")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "ambient_generic"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "ambient_generic")) + { + torestart->Restart(); + } + + for (torestart = UTIL_FindEntityByClassname(NULL, "env_sprite"); + torestart != NULL; torestart = UTIL_FindEntityByClassname(torestart, "env_sprite")) + { + torestart->Restart(); + } + + for (toremove = UTIL_FindEntityByClassname(NULL, "grenade"), icount = 0; + toremove != NULL && icount < 20; toremove = UTIL_FindEntityByClassname(toremove, "grenade"), icount++) + { + UTIL_Remove(toremove); + } + + for (toremove = UTIL_FindEntityByClassname(NULL, "item_thighpack"); + toremove != NULL; toremove = UTIL_FindEntityByClassname(toremove, "item_thighpack")) + { + UTIL_Remove(toremove); + } + + RemoveGuns(); + PLAYBACK_EVENT((FEV_GLOBAL | FEV_RELIABLE), 0, m_usResetDecals); } /* <118585> ../cstrike/dlls/multiplay_gamerules.cpp:862 */ -NOBODY void CHalfLifeMultiplay::GiveC4_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(GiveC4)(void) { -// { -// int iTeamCount; // 864 -// int iTemp; // 865 -// class CBaseEntity *pPlayer; // 866 -// class CBasePlayer *player; // 867 -// int humansPresent; // 873 -// bool giveToHumans; // 874 -// { -// int i; // 878 -// edict(CBaseEntity *const this); // 882 -// FNullEnt(const edict_t *pent); // 882 -// } -// edict(CBaseEntity *const this); // 906 -// FNullEnt(const edict_t *pent); // 906 -// IsThereABomber(CHalfLifeMultiplay *const this); // 941 -// edict(CBaseEntity *const this); // 949 -// FNullEnt(const edict_t *pent); // 949 -// edict(CBaseEntity *const this); // 930 -// edict(CBaseEntity *const this); // 930 -// edict(CBaseEntity *const this); // 968 -// edict(CBaseEntity *const this); // 968 -// } + int iTeamCount = m_iNumTerrorist; + int iTemp = 0; + int humansPresent = 0; + + ++m_iC4Guy; + bool giveToHumans = (cv_bot_defer_to_human.value > 0.0); + + if (giveToHumans) + { + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (!player || FNullEnt(player->edict())) + continue; + + if (player->pev->deadflag != DEAD_NO || player->m_iTeam != TERRORIST) + continue; + + if (!player->IsBot()) + humansPresent++; + } + + if (humansPresent) + iTeamCount = humansPresent; + else + giveToHumans = false; + } + + if (m_iC4Guy > iTeamCount) + { + m_iC4Guy = 1; + } + + CBaseEntity *pPlayer = NULL; + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + if (!pPlayer->IsPlayer()) + continue; + + if (pPlayer->pev->flags == FL_DORMANT) + continue; + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + + if (player->pev->deadflag != DEAD_NO || player->m_iTeam != TERRORIST || (giveToHumans && player->IsBot())) + continue; + + if (++iTemp == m_iC4Guy) + { + player->m_bHasC4 = true; + player->GiveNamedItem("weapon_c4"); + player->SetBombIcon(FALSE); + player->pev->body = 1; + + player->m_flDisplayHistory |= DHF_BOMB_RETRIEVED; + player->HintMessage("#Hint_you_have_the_bomb", FALSE, TRUE); + + UTIL_LogPrintf + ( + "\"%s<%i><%s>\" triggered \"Spawned_With_The_Bomb\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict()) + ); + + g_pGameRules->m_bBombDropped = FALSE; + } + } + + // if there are no players with a bomb + if (!IsThereABomber()) + { + m_iC4Guy = 0; + pPlayer = NULL; + + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + break; + + if (!pPlayer->IsPlayer()) + continue; + + if (pPlayer->pev->flags == FL_DORMANT) + continue; + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + + if (player->pev->deadflag != DEAD_NO || player->m_iTeam != TERRORIST) + continue; + + player->m_bHasC4 = true; + player->GiveNamedItem("weapon_c4"); + player->SetBombIcon(FALSE); + player->pev->body = 1; + + player->m_flDisplayHistory |= DHF_BOMB_RETRIEVED; + player->HintMessage("#Hint_you_have_the_bomb", FALSE, TRUE); + + UTIL_LogPrintf + ( + "\"%s<%i><%s>\" triggered \"Spawned_With_The_Bomb\"\n", + STRING(player->pev->netname), + GETPLAYERUSERID(player->edict()), + GETPLAYERAUTHID(player->edict()) + ); + + g_pGameRules->m_bBombDropped = FALSE; + return; + } + } } /* <11541f> ../cstrike/dlls/multiplay_gamerules.cpp:981 */ -inline void TerminateRound(float tmDelay, int iWinStatus) +void TerminateRound(float tmDelay, int iWinStatus) { -// { -// class CHalfLifeMultiplay *mp; // 983 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + mp->m_iRoundWinStatus = iWinStatus; + mp->m_bRoundTerminating = true; + mp->m_fTeamCount = gpGlobals->time + tmDelay; } /* <114a6a> ../cstrike/dlls/multiplay_gamerules.cpp:995 */ -NOBODY void CHalfLifeMultiplay::QueueCareerRoundEndMenu(float tmDelay, int iWinStatus) +void CHalfLifeMultiplay::QueueCareerRoundEndMenu(float tmDelay, int iWinStatus) { -// { -// bool humansAreCTs; // 1000 -// { -// class CBaseEntity *hostage; // 1005 -// int numHostagesInMap; // 1006 -// int numHostagesFollowingHumans; // 1007 -// int numHostagesAlive; // 1008 -// { -// class CHostage *pHostage; // 1014 -// { -// class CBasePlayer *pLeader; // 1017 -// GetLeader(CHostage *const this); // 1017 -// IsFollowingSomeone(CHostage *const this); // 1018 -// } -// } -// } -// { -// bool canCTsWin; // 1060 -// bool canTsWin; // 1062 -// } -// } + if (m_fCareerMatchMenuTime != 0.0f) + return; + + m_fCareerRoundMenuTime = tmDelay + gpGlobals->time; + bool humansAreCTs = (Q_strcmp(humans_join_team.string, "CT") == 0); + + if (humansAreCTs) + { + CBaseEntity *hostage = NULL; + + int numHostagesInMap = 0; + int numHostagesFollowingHumans = 0; + int numHostagesAlive = 0; + + while ((hostage = UTIL_FindEntityByClassname(hostage, "hostage_entity")) != NULL) + { + numHostagesInMap++; + + CHostage *pHostage = reinterpret_cast(hostage); + + if (pHostage->pev->takedamage != DAMAGE_YES) + { + continue; + } + + CBasePlayer *pLeader = NULL; + + if (pHostage->m_improv != NULL) + { + if (pHostage->IsFollowingSomeone()) + { + pLeader = reinterpret_cast(pHostage->GetLeader()); + } + } + else if (pHostage->m_hTargetEnt != NULL && pHostage->m_State == CHostage::FOLLOW) + { + pLeader = (CBasePlayer *)((CBaseEntity *)pHostage->m_hTargetEnt); + } + + if (pLeader == NULL) + { + numHostagesAlive++; + } + else + { + if (!pLeader->IsBot()) + { + ++numHostagesFollowingHumans; + TheCareerTasks->HandleEvent(EVENT_HOSTAGE_RESCUED, pLeader, 0); + } + } + } + + if (!numHostagesAlive) + { + if ((numHostagesInMap * 0.5) <= (numHostagesFollowingHumans + m_iHostagesRescued)) + { + TheCareerTasks->HandleEvent(EVENT_ALL_HOSTAGES_RESCUED); + } + } + } + + switch (iWinStatus) + { + case WINSTATUS_CTS: + TheCareerTasks->HandleEvent(humansAreCTs ? EVENT_ROUND_WIN : EVENT_ROUND_LOSS); + break; + case WINSTATUS_TERRORISTS: + TheCareerTasks->HandleEvent(humansAreCTs ? EVENT_ROUND_LOSS : EVENT_ROUND_WIN); + break; + default: + TheCareerTasks->HandleEvent(EVENT_ROUND_DRAW); + break; + } + + if (m_fCareerMatchMenuTime == 0.0f && m_iCareerMatchWins) + { + bool canTsWin = true; + bool canCTsWin = true; + + if (m_iNumCTWins < m_iCareerMatchWins || (m_iNumCTWins - m_iNumTerroristWins < m_iRoundWinDifference)) + canCTsWin = false; + + if (m_iNumTerroristWins < m_iCareerMatchWins || (m_iNumTerroristWins - m_iNumCTWins < m_iRoundWinDifference)) + canTsWin = false; + + if (!TheCareerTasks->AreAllTasksComplete() && !humansAreCTs) + canTsWin = false; + + if (canCTsWin || canTsWin) + { + m_fCareerRoundMenuTime = 0; + m_fCareerMatchMenuTime = gpGlobals->time + 3.0f; + } + } } /* <117750> ../cstrike/dlls/multiplay_gamerules.cpp:1084 */ -NOBODY void CHalfLifeMultiplay::CheckWinConditions_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(CheckWinConditions)(void) { -// { -// class CBaseEntity *pPlayer; // 1086 -// class CBasePlayer *player; // 1087 -// int NumDeadCT; // 1088 -// int NumDeadTerrorist; // 1088 -// int NumAliveTerrorist; // 1088 -// int NumAliveCT; // 1088 -// int NumSpawnableHumans; // 1089 -// int NumHumans; // 1090 -// BOOL bNeededPlayers; // 1091 -// class CBaseEntity *hostage; // 1454 -// int iHostages; // 1455 -// bool bHostageAlive; // 1456 -// edict(CBaseEntity *const this); // 1106 -// FNullEnt(const edict_t *pent); // 1106 -// IsCareer(CHalfLifeMultiplay *const this); // 1175 -// { -// class CBasePlayer *player; // 1177 -// } -// IsCareer(CHalfLifeMultiplay *const this); // 1192 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1194 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1199 -// { -// float flEscapeRatio; // 1266 -// Broadcast(const char *sentence); // 1303 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1310 -// Broadcast(const char *sentence); // 1272 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1279 -// Broadcast(const char *sentence); // 1287 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1294 -// } -// Broadcast(const char *sentence); // 1343 -// { -// class CGrenade *C4; // 1368 -// class CBaseEntity *temp; // 1369 -// BOOL nowin; // 1370 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1410 -// Broadcast(const char *sentence); // 1395 -// } -// Broadcast(const char *sentence); // 1425 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1436 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1440 -// Broadcast(const char *sentence); // 1447 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1448 -// Broadcast(const char *sentence); // 1473 -// IsCareer(CHalfLifeMultiplay *const this); // 1488 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1493 -// Broadcast(const char *sentence); // 1325 -// TerminateRound(float tmDelay, -// int iWinStatus); // 1337 -// Broadcast(const char *sentence); // 1242 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1249 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1333 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1354 -// Broadcast(const char *sentence); // 1214 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1221 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1224 -// edict(CBaseEntity *const this); // 1227 -// ENTINDEX(edict_t *pEdict); // 1227 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1481 -// } + if (m_bFirstConnected && m_iRoundWinStatus) + { + return; + } + + CBaseEntity *pPlayer = NULL; + + int NumDeadCT, NumDeadTerrorist, NumAliveTerrorist, + NumAliveCT, NumSpawnableHumans, NumHumans; + + NumDeadCT = 0; + NumDeadTerrorist = 0; + NumAliveTerrorist = 0; + NumAliveCT = 0; + NumSpawnableHumans = 0; + NumHumans = 0; + + m_iNumSpawnableCT = 0; + m_iNumSpawnableTerrorist = 0; + m_iNumCT = 0; + m_iNumTerrorist = 0; + m_iHaveEscaped = 0; + + // initialize count dead/alive players + while ((pPlayer = UTIL_FindEntityByClassname(pPlayer, "player")) != NULL) + { + if (FNullEnt(pPlayer->edict())) + { + break; + } + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + + if (pPlayer->pev->flags == FL_DORMANT) + { + continue; + } + + // TODO: check it out, for what here used player->IsBot() ? + // maybe body this conditions is located under the wrapper #ifdef 0 + // if (player->IsBot()) + // { + // #ifdef 0 + // .... + // #endif + // } + + switch (player->m_iTeam) + { + case CT: + { + ++m_iNumCT; + + if (player->m_iMenu != Menu_ChooseAppearance) + { + m_iNumSpawnableCT++; + //player->IsBot(); + } + + //player->IsBot(); + if (player->pev->deadflag != DEAD_NO) + NumDeadCT++; + else + NumAliveCT++; + + break; + } + case TERRORIST: + { + ++m_iNumTerrorist; + + if (player->m_iMenu != Menu_ChooseAppearance) + { + m_iNumSpawnableTerrorist++; + //player->IsBot(); + } + //player->IsBot(); + + if (player->pev->deadflag != DEAD_NO) + NumDeadTerrorist++; + else + NumAliveTerrorist++; + + if (player->m_bEscaped) + m_iHaveEscaped++; + + break; + } + default: + break; + } + } + + BOOL bNeededPlayers = FALSE; + + NumSpawnableHumans = (m_iNumSpawnableTerrorist > 0 && m_iNumSpawnableCT > 0); + NumHumans = (m_iNumCT > 0 && m_iNumTerrorist > 0); + + // start the game, after the players entered in game + if (!NumSpawnableHumans) + { + UTIL_ClientPrintAll(HUD_PRINTCONSOLE, "#Game_scoring"); + + bNeededPlayers = TRUE; + m_bFirstConnected = false; + } + + if (!m_bFirstConnected && NumSpawnableHumans) + { + if (IsCareer()) + { + CBasePlayer *player = (CBasePlayer *)UTIL_PlayerByIndex(gpGlobals->maxClients); + + if (!player || !player->IsBot()) + { + return; + } + } + + UTIL_LogPrintf("World triggered \"Game_Commencing\"\n"); + + m_bFreezePeriod = FALSE; + m_bCompleteReset = true; + + EndRoundMessage("#Game_Commencing", ROUND_END_DRAW); + TerminateRound(IsCareer() ? 0 : 3, WINSTATUS_DRAW); + + m_bFirstConnected = true; + TheBots->OnEvent(EVENT_GAME_COMMENCE); + + return; + } + + // checks to scenario Escaped VIP on map with vip safety zones + if (m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES && m_pVIP != NULL) + { + if (m_pVIP->m_bEscaped) + { + Broadcast("ctwin"); + m_iAccountCT += REWARD_VIP_ESCAPED; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); + WRITE_BYTE(DRC_CMD_EVENT); + WRITE_SHORT(ENTINDEX(m_pVIP->edict())); + WRITE_SHORT(0); + WRITE_LONG(DRC_FLAG_PRIO_MASK | DRC_FLAG_FINAL); + MESSAGE_END(); + + EndRoundMessage("#VIP_Escaped", ROUND_VIP_ESCAPED); + TheBots->OnEvent(EVENT_VIP_ESCAPED); + + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } + + if (m_pVIP->pev->deadflag != DEAD_NO) + { + Broadcast("terwin"); + m_iAccountTerrorist += REWARD_VIP_ASSASSINATED; + + if (!bNeededPlayers) + { + m_iNumTerroristWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#VIP_Assassinated", ROUND_VIP_ASSASSINATED); + TheBots->OnEvent(EVENT_VIP_ASSASSINATED); + + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + return; + } + } + + // checks to scenario Escaped Terrorist's + if (m_bMapHasEscapeZone) + { + float_precision flEscapeRatio = (float_precision)m_iHaveEscaped / (float_precision)m_iNumEscapers; + + if (flEscapeRatio >= m_flRequiredEscapeRatio) + { + Broadcast("terwin"); + m_iAccountTerrorist += REWARD_TERRORISTS_ESCAPED; + + if (!bNeededPlayers) + { + m_iNumTerroristWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#Terrorists_Escaped", ROUND_TERRORISTS_ESCAPED); + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + return; + } + + if (!NumAliveTerrorist) + { + if (m_flRequiredEscapeRatio > flEscapeRatio) + { + Broadcast("ctwin"); + m_iAccountCT += (1 - flEscapeRatio) * REWARD_CTS_PREVENT_ESCAPE; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#CTs_PreventEscape", ROUND_CTS_PREVENT_ESCAPE); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } + else if (NumDeadTerrorist && m_iNumSpawnableCT > 0) + { + Broadcast("ctwin"); + m_iAccountCT += (1 - flEscapeRatio) * REWARD_ESCAPING_TERRORISTS_NEUTRALIZED; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#Escaping_Terrorists_Neutralized", ROUND_ESCAPING_TERRORISTS_NEUTRALIZED); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } + } + } + + // checks to scenario bomb target saved or exploded + if (m_bMapHasBombTarget) + { + if (m_bTargetBombed) + { + Broadcast("terwin"); + m_iAccountTerrorist += REWARD_TARGET_BOMB; + + if (!bNeededPlayers) + { + m_iNumTerroristWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#Target_Bombed", ROUND_TARGET_BOMB); + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + return; + } + else if (m_bBombDefused) + { + Broadcast("ctwin"); + m_iAccountCT += REWARD_BOMB_DEFUSED; + m_iAccountTerrorist += REWARD_BOMB_PLANTED; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#Bomb_Defused", ROUND_BOMB_DEFUSED); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } + } + + // check the round ended on expiration time + if (NumHumans && NumSpawnableHumans) + { + if (!NumAliveTerrorist && NumDeadTerrorist && NumAliveCT > 0) + { + CGrenade *C4 = NULL; + CBaseEntity *temp = NULL; + BOOL nowin = FALSE; + + while ((temp = UTIL_FindEntityByClassname(temp, "grenade")) != NULL) + { + C4 = reinterpret_cast(temp); + + if (C4->m_bIsC4 && !C4->m_bJustBlew) + { + nowin = TRUE; +#ifdef REGAMEDLL_FIXES + break; +#endif // REGAMEDLL_FIXES + } + } + + if (!nowin) + { + Broadcast("ctwin"); + m_iAccountCT += m_bMapHasBombTarget ? REWARD_BOMB_DEFUSED : REWARD_CTS_WIN; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#CTs_Win", ROUND_CTS_WIN); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } + } + else if (!NumAliveCT && NumDeadCT) + { + Broadcast("terwin"); + m_iAccountTerrorist += m_bMapHasBombTarget ? REWARD_BOMB_EXPLODED : REWARD_TERRORISTS_WIN; + + if (!bNeededPlayers) + { + m_iNumTerroristWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#Terrorists_Win", ROUND_TERRORISTS_WIN); + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + return; + } + } + else if (!NumAliveCT && !NumAliveTerrorist) + { + EndRoundMessage("#Round_Draw", ROUND_END_DRAW); + Broadcast("rounddraw"); + TerminateRound(5, WINSTATUS_DRAW); + + return; + } + + // check that the hostages is rescued + + CBaseEntity *hostage = NULL; + int iHostages = 0; + bool bHostageAlive = false; + + while ((hostage = UTIL_FindEntityByClassname(hostage, "hostage_entity")) != NULL) + { + ++iHostages; + + if (hostage->pev->takedamage == DAMAGE_YES) + { + bHostageAlive = true; + } + } + + if (!bHostageAlive && iHostages > 0 && m_iHostagesRescued >= (iHostages * 0.5)) + { + Broadcast("ctwin"); + m_iAccountCT += REWARD_ALL_HOSTAGES_RESCUED; + + if (!bNeededPlayers) + { + m_iNumCTWins++; + UpdateTeamScores(); + } + + EndRoundMessage("#All_Hostages_Rescued", ROUND_ALL_HOSTAGES_RESCUED); + TheBots->OnEvent(EVENT_ALL_HOSTAGES_RESCUED); + + if (IsCareer()) + { + TheCareerTasks->HandleEvent(EVENT_ALL_HOSTAGES_RESCUED); + } + + TerminateRound(5, WINSTATUS_CTS); + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + return; + } } /* <117336> ../cstrike/dlls/multiplay_gamerules.cpp:1499 */ -NOBODY void CHalfLifeMultiplay::SwapAllPlayers(void) +NOXREF void CHalfLifeMultiplay::SwapAllPlayers(void) { -// { -// class CBasePlayer *player; // 1501 -// class CBaseEntity *pPlayer; // 1502 -// int iTemp; // 1516 -// edict(CBaseEntity *const this); // 1505 -// FNullEnt(const edict_t *pent); // 1505 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1522 -// } + 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); + player->SwitchTeam(); + } + + int iTemp = m_iNumTerroristWins; + m_iNumTerroristWins = m_iNumCTWins; + m_iNumCTWins = iTemp; + + UpdateTeamScores(); } /* <1171eb> ../cstrike/dlls/multiplay_gamerules.cpp:1525 */ -NOBODY void CHalfLifeMultiplay::BalanceTeams(void) +void CHalfLifeMultiplay::BalanceTeams(void) { -// { -// int iTeamToSwap; // 1527 -// int iNumToSwap; // 1528 -// class CBasePlayer *player; // 1573 -// class CBasePlayer *toSwap; // 1574 -// class CBaseEntity *pPlayer; // 1575 -// int iHighestUserID; // 1578 -// { -// int iDesiredNumCT; // 1532 -// int iDesiredNumTerrorist; // 1532 -// } -// { -// int i; // 1580 -// edict(CBaseEntity *const this); // 1586 -// FNullEnt(const edict_t *pent); // 1586 -// edict(CBaseEntity *const this); // 1591 -// edict(CBaseEntity *const this); // 1593 -// } -// } + int iTeamToSwap = UNASSIGNED; + int iNumToSwap; + + if (m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + int iDesiredNumCT; + if ((m_iNumTerrorist + m_iNumCT) % 2) + iDesiredNumCT = (int)((m_iNumCT + m_iNumTerrorist) * 0.55f) + 1; + else + iDesiredNumCT = (int)((m_iNumCT + m_iNumTerrorist) / 2); + + int iDesiredNumTerrorist = (m_iNumTerrorist + m_iNumCT) - iDesiredNumCT; + + if (m_iNumCT < iDesiredNumCT) + { + iTeamToSwap = TERRORIST; + iNumToSwap = iDesiredNumCT - m_iNumCT; + } + else if (m_iNumTerrorist < iDesiredNumTerrorist) + { + iTeamToSwap = CT; + iNumToSwap = iDesiredNumTerrorist - m_iNumTerrorist; + } + else + { + return; + } + } + else + { + if (m_iNumTerrorist < m_iNumCT) + { + iTeamToSwap = CT; + iNumToSwap = (m_iNumCT - m_iNumTerrorist) / 2; + } + else if (m_iNumTerrorist > m_iNumCT) + { + iTeamToSwap = TERRORIST; + iNumToSwap = (m_iNumTerrorist - m_iNumCT) / 2; + } + else + { + return; + } + } + + if (iNumToSwap > 4) + iNumToSwap = 4; + + int iHighestUserID; + CBasePlayer *toSwap = NULL; + CBaseEntity *pPlayer = NULL; + + for (int i = 1; i <= iNumToSwap; i++) + { + iHighestUserID = 0; + toSwap = 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); + + if (player->m_iTeam != iTeamToSwap || GETPLAYERUSERID(player->edict()) <= iHighestUserID || m_pVIP == player) + { + continue; + } + + iHighestUserID = GETPLAYERUSERID(player->edict()); + toSwap = player; + } + + if (toSwap != NULL) + { + toSwap->SwitchTeam(); + } + } } /* <113158> ../cstrike/dlls/multiplay_gamerules.cpp:1608 */ -NOBODY void CHalfLifeMultiplay::CheckMapConditions_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(CheckMapConditions)(void) { + if (UTIL_FindEntityByClassname(NULL, "func_bomb_target")) + { + m_bMapHasBombTarget = true; + m_bMapHasBombZone = true; + } + else if (UTIL_FindEntityByClassname(NULL, "info_bomb_target")) + { + m_bMapHasBombTarget = true; + m_bMapHasBombZone = false; + } + else + { + m_bMapHasBombTarget = false; + m_bMapHasBombZone = false; + } + + m_bMapHasRescueZone = (UTIL_FindEntityByClassname(NULL, "func_hostage_rescue") != NULL); + m_bMapHasBuyZone = (UTIL_FindEntityByClassname(NULL, "func_buyzone") != NULL); + m_bMapHasEscapeZone = (UTIL_FindEntityByClassname(NULL, "func_escapezone") != NULL); + + if ((UTIL_FindEntityByClassname(NULL, "func_vip_safetyzone")) != NULL) + m_iMapHasVIPSafetyZone = MAP_HAVE_VIP_SAFETYZONE_YES; + else + m_iMapHasVIPSafetyZone = MAP_HAVE_VIP_SAFETYZONE_NO; } /* <11745e> ../cstrike/dlls/multiplay_gamerules.cpp:1676 */ -NOBODY void CHalfLifeMultiplay::RestartRound_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(RestartRound)(void) { -// { -// float flAutoKickIdle; // 1804 -// class CMapInfo *mi; // 1815 -// class CBaseEntity *hostage; // 1896 -// class CHostage *temp; // 1897 -// int acct_tmp; // 1903 -// class CBaseEntity *pPlayer; // 1965 -// class CBasePlayer *player; // 1966 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1711 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1717 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 1782 -// { -// int i; // 1786 -// { -// class CBasePlayer *plr; // 1788 -// FNullEnt(entvars_t *pev); // 1790 -// } -// } -// edict(CBaseEntity *const this); // 1985 -// FNullEnt(const edict_t *pent); // 1985 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1701 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 1704 -// } + TheBots->RestartRound(); + + if (g_pHostages) + { + g_pHostages->RestartRound(); + } + + ++m_iTotalRoundsPlayed; + ClearBodyQue(); + + CVAR_SET_FLOAT("sv_accelerate", 5); + CVAR_SET_FLOAT("sv_friction", 4); + CVAR_SET_FLOAT("sv_stopspeed", 75); + + m_iNumCT = CountTeamPlayers(CT); + m_iNumTerrorist = CountTeamPlayers(TERRORIST); + + if (m_bMapHasBombTarget) + { + MESSAGE_BEGIN(MSG_ALL, gmsgBombPickup); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgShowTimer); + MESSAGE_END(); + } + + g_pGameRules->m_bBombDropped = FALSE; + + MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); + WRITE_BYTE(0); + WRITE_BYTE(100 | DRC_FLAG_FACEPLAYER); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); + WRITE_BYTE(0); + WRITE_BYTE(0); + MESSAGE_END(); + + if (CVAR_GET_FLOAT("mp_autoteambalance") != 0.0f && m_iUnBalancedRounds >= 1) + BalanceTeams(); + + if ((m_iNumCT - m_iNumTerrorist) >= 2 || (m_iNumTerrorist - m_iNumCT) >= 2) + ++m_iUnBalancedRounds; + else + m_iUnBalancedRounds = 0; + + if (CVAR_GET_FLOAT("mp_autoteambalance") != 0.0f && m_iUnBalancedRounds == 1) + { + UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Auto_Team_Balance_Next_Round"); + } + + if (m_bCompleteReset) + { + if (timelimit.value < 0) + CVAR_SET_FLOAT("mp_timelimit", 0); + + g_flResetTime = gpGlobals->time; + + if (timelimit.value) + g_flTimeLimit = gpGlobals->time + timelimit.value * 60; + + m_iTotalRoundsPlayed = 0; + m_iMaxRounds = (int)CVAR_GET_FLOAT("mp_maxrounds"); + + if (m_iMaxRounds < 0) + { + m_iMaxRounds = 0; + CVAR_SET_FLOAT("mp_maxrounds", 0); + } + + m_iMaxRoundsWon = (int)CVAR_GET_FLOAT("mp_winlimit"); + + if (m_iMaxRoundsWon < 0) + { + m_iMaxRoundsWon = 0; + CVAR_SET_FLOAT("mp_winlimit", 0); + } + + m_iNumTerroristWins = 0; + m_iNumCTWins = 0; + m_iNumConsecutiveTerroristLoses = 0; + m_iNumConsecutiveCTLoses = 0; + UpdateTeamScores(); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *plr = (CBasePlayer *)UTIL_PlayerByIndex(i); + + if (plr && !FNullEnt(plr->pev)) + plr->Reset(); + } + + TheBots->OnEvent(EVENT_NEW_MATCH); + } + + m_bFreezePeriod = TRUE; + m_bRoundTerminating = false; + + ReadMultiplayCvars(this); + + float flAutoKickIdle = CVAR_GET_FLOAT("mp_autokick_timeout"); + + if (flAutoKickIdle > 0) + m_fMaxIdlePeriod = flAutoKickIdle; + else + m_fMaxIdlePeriod = (m_iRoundTime * 2); + + m_iRoundTimeSecs = m_iIntroRoundTime; + + CMapInfo *mi = (CMapInfo *)UTIL_FindEntityByClassname(NULL, "info_map_parameters"); + + if (mi != NULL) + { + switch (mi->m_iBuyingStatus) + { + case BUYING_EVERYONE: + m_bCTCantBuy = false; + m_bTCantBuy = false; + + ALERT(at_console, "EVERYONE CAN BUY!\n"); + break; + case BUYING_ONLY_CTS: + m_bCTCantBuy = false; + m_bTCantBuy = true; + + ALERT(at_console, "Only CT's can buy!!\n"); + break; + case BUYING_ONLY_TERRORISTS: + m_bCTCantBuy = true; + m_bTCantBuy = false; + + ALERT(at_console, "Only T's can buy!!\n"); + break; + case BUYING_NO_ONE: + m_bCTCantBuy = true; + m_bTCantBuy = true; + + ALERT(at_console, "No one can buy!!\n"); + break; + default: + m_bCTCantBuy = false; + m_bTCantBuy = false; + break; + } + + m_flBombRadius = mi->m_flBombRadius; + } + + CheckMapConditions(); + + if (m_bMapHasEscapeZone) + { + m_iHaveEscaped = 0; + m_iNumEscapers = 0; + + if (m_iNumEscapeRounds > 2) + { + SwapAllPlayers(); + m_iNumEscapeRounds = 0; + } + + ++m_iNumEscapeRounds; + } + + if (m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + PickNextVIP(); + ++m_iConsecutiveVIP; + } + + int acct_tmp = 0; + CBaseEntity *hostage = NULL; + + while ((hostage = UTIL_FindEntityByClassname(hostage, "hostage_entity")) != NULL) + { + if (acct_tmp >= 2000) + break; + + CHostage *temp = reinterpret_cast(hostage); + + if (hostage->pev->solid != SOLID_NOT) + { + acct_tmp += 150; + + if (hostage->pev->deadflag == DEAD_DEAD) + { + hostage->pev->deadflag = DEAD_RESPAWNABLE; + } + } + + temp->RePosition(); + } + + if (m_iRoundWinStatus == WINSTATUS_TERRORISTS) + { + if (m_iNumConsecutiveTerroristLoses > 1) + { + m_iLoserBonus = REWARD_LOSER_BONUS_MIN; + } + + m_iNumConsecutiveCTLoses++; + m_iNumConsecutiveTerroristLoses = 0; + } + else if (m_iRoundWinStatus == WINSTATUS_CTS) + { + if (m_iNumConsecutiveCTLoses > 1) + { + m_iLoserBonus = REWARD_LOSER_BONUS_MIN; + } + + m_iNumConsecutiveCTLoses = 0; + m_iNumConsecutiveTerroristLoses++; + } + + if (m_iLoserBonus < REWARD_LOSER_BONUS_MAX && (m_iNumConsecutiveTerroristLoses > 1 || m_iNumConsecutiveCTLoses > 1)) + { + m_iLoserBonus += REWARD_LOSER_BONUS_ADD; + } + + if (m_iRoundWinStatus == WINSTATUS_TERRORISTS) + { + m_iAccountTerrorist += acct_tmp; + m_iAccountCT += m_iLoserBonus; + } + else if (m_iRoundWinStatus == WINSTATUS_CTS) + { + m_iAccountCT += acct_tmp; + + if (!m_bMapHasEscapeZone) + { + m_iAccountTerrorist += m_iLoserBonus; + } + } + + m_iAccountCT += m_iHostagesRescued * REWARD_RESCUED_HOSTAGE; + + m_fRoundCount = gpGlobals->time; + m_fIntroRoundCount = gpGlobals->time; + + if (m_bCompleteReset) + { + m_iAccountCT = 0; + m_iAccountTerrorist = 0; + + m_iNumTerroristWins = 0; + m_iNumCTWins = 0; + + m_iNumConsecutiveTerroristLoses = 0; + m_iNumConsecutiveCTLoses = 0; + + m_iLoserBonus = REWARD_LOSER_BONUS_DEFAULT; + } + + 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); + + player->m_iNumSpawns = 0; + player->m_bTeamChanged = false; + + if (!player->IsPlayer()) + { + player->SyncRoundTimer(); + } + + if (player->m_iTeam == CT) + { + if (!player->m_bReceivesNoMoneyNextRound) + { + player->AddAccount(m_iAccountCT); + } + } + else if (player->m_iTeam == TERRORIST) + { + ++m_iNumEscapers; + + if (!player->m_bReceivesNoMoneyNextRound) + { + player->AddAccount(m_iAccountTerrorist); + } + + if (m_bMapHasEscapeZone) + { + player->m_bNotKilled = false; + } + } + + if (player->m_iTeam != UNASSIGNED && player->m_iTeam != SPECTATOR) + { + if (player->m_bHasC4) + { + player->DropPlayerItem("weapon_c4"); + } + + player->RoundRespawn(); + } + } + + CleanUpMap(); + + if (m_bMapHasBombTarget) + { + GiveC4(); + } + + TheBots->OnEvent(EVENT_BUY_TIME_START); + + m_flIntermissionEndTime = 0; + m_flIntermissionStartTime = 0; + m_fTeamCount = 0; + + m_iAccountCT = 0; + m_iAccountTerrorist = 0; + + m_iHostagesRescued = 0; + m_iHostagesTouched = 0; + + m_iRoundWinStatus = 0; + m_bBombDefused = false; + m_bTargetBombed = false; + m_bLevelInitialized = false; + m_bCompleteReset = false; } /* <114ca3> ../cstrike/dlls/multiplay_gamerules.cpp:2073 */ @@ -673,7 +1901,6 @@ BOOL CHalfLifeMultiplay::IsThereABomber(void) } return FALSE; - } /* <114d20> ../cstrike/dlls/multiplay_gamerules.cpp:2097 */ @@ -698,7 +1925,9 @@ BOOL CHalfLifeMultiplay::IsThereABomb(void) } if (bFoundBomb || (UTIL_FindEntityByClassname(NULL, "weapon_c4")) != NULL) + { return TRUE; + } return FALSE; @@ -749,224 +1978,833 @@ BOOL CHalfLifeMultiplay::TeamStacked(int newTeam_id, int curTeam_id) } /* <114e2b> ../cstrike/dlls/multiplay_gamerules.cpp:2214 */ -NOBODY void CHalfLifeMultiplay::StackVIPQueue(void) +void CHalfLifeMultiplay::StackVIPQueue(void) { -// { -// int i; // 2216 -// } + for (int i = 0; i < MAX_VIP_QUEUES - 2; i++) + { + if (VIPQueue[i - 1]) + { + if (!VIPQueue[i]) + { + VIPQueue[i] = VIPQueue[i + 1]; + VIPQueue[i + 1] = NULL; + } + } + else + { + VIPQueue[i - 1] = VIPQueue[i]; + VIPQueue[i] = VIPQueue[i + 1]; + VIPQueue[i + 1] = NULL; + } + } + } /* <114e63> ../cstrike/dlls/multiplay_gamerules.cpp:2232 */ -NOBODY bool CHalfLifeMultiplay::IsVIPQueueEmpty(void) +bool CHalfLifeMultiplay::IsVIPQueueEmpty(void) { -// { -// class CBasePlayer *toCheck; // 2234 -// { -// int i; // 2238 -// } -// StackVIPQueue(CHalfLifeMultiplay *const this); // 2249 -// } + for (int i = 0; i < MAX_VIP_QUEUES; i++) + { + CBasePlayer *toCheck = VIPQueue[i]; + + if (toCheck && toCheck->m_iTeam != CT) + { + VIPQueue[i] = NULL; + } + } + + StackVIPQueue(); + return (VIPQueue[0] == NULL && VIPQueue[1] == NULL && VIPQueue[2] == NULL && VIPQueue[3] == NULL && VIPQueue[4] == NULL); } /* <114eea> ../cstrike/dlls/multiplay_gamerules.cpp:2257 */ -NOBODY bool CHalfLifeMultiplay::AddToVIPQueue(CBasePlayer *toAdd) +bool CHalfLifeMultiplay::AddToVIPQueue(CBasePlayer *toAdd) { -// { -// int i; // 2265 -// } -// { -// int j; // 2274 -// StackVIPQueue(CHalfLifeMultiplay *const this); // 2279 -// } + for (int i = 0; i < MAX_VIP_QUEUES; i++) + { + CBasePlayer *toCheck = VIPQueue[i]; + + if (toCheck && toCheck->m_iTeam != CT) + { + VIPQueue[i] = NULL; + } + } + + StackVIPQueue(); + + if (toAdd->m_iTeam == CT) + { + int j; + for (j = 0; j < MAX_VIP_QUEUES; j++) + { + if (VIPQueue[j] == toAdd) + { + ClientPrint(toAdd->pev, HUD_PRINTCENTER, "#Game_in_position", UTIL_dtos1(j + 1)); + + return FALSE; + } + } + + for (j = 0; j < MAX_VIP_QUEUES; j++) + { + if (!VIPQueue[j]) + { + VIPQueue[j] = toAdd; + + StackVIPQueue(); + ClientPrint(toAdd->pev, HUD_PRINTCENTER, "#Game_added_position", UTIL_dtos1(j + 1)); + + return TRUE; + } + } + + ClientPrint(toAdd->pev, HUD_PRINTCENTER, "#All_VIP_Slots_Full"); + } + + return FALSE; } /* <114f80> ../cstrike/dlls/multiplay_gamerules.cpp:2290 */ -NOBODY void CHalfLifeMultiplay::ResetCurrentVIP(void) +void CHalfLifeMultiplay::ResetCurrentVIP(void) { -// { -// char *infobuffer; // 2292 -// int numSkins; // 2294 -// edict(CBaseEntity *const this); // 2292 -// entindex(CBaseEntity *const this); // 2327 -// entindex(CBaseEntity *const this); // 2316 -// entindex(CBaseEntity *const this); // 2308 -// entindex(CBaseEntity *const this); // 2312 -// entindex(CBaseEntity *const this); // 2322 -// } + char *infobuffer = GET_INFO_BUFFER(m_pVIP->edict()); + int numSkins = UTIL_IsGame("czero") ? CZ_NUM_SKIN : CS_NUM_SKIN; + + switch (RANDOM_LONG(0, numSkins)) + { + case 1: + m_pVIP->m_iModelName = MODEL_GSG9; + SET_CLIENT_KEY_VALUE(m_pVIP->entindex(), infobuffer, "model", "gsg9"); + break; + case 2: + m_pVIP->m_iModelName = MODEL_SAS; + SET_CLIENT_KEY_VALUE(m_pVIP->entindex(), infobuffer, "model", "sas"); + break; + case 3: + m_pVIP->m_iModelName = MODEL_GIGN; + SET_CLIENT_KEY_VALUE(m_pVIP->entindex(), infobuffer, "model", "gign"); + break; + case 4: + if (UTIL_IsGame("czero")) + { + m_pVIP->m_iModelName = MODEL_SPETSNAZ; + SET_CLIENT_KEY_VALUE(m_pVIP->entindex(), infobuffer, "model", "spetsnaz"); + break; + } + default: + m_pVIP->m_iModelName = MODEL_URBAN; + SET_CLIENT_KEY_VALUE(m_pVIP->entindex(), infobuffer, "model", "urban"); + break; + } + + m_pVIP->m_bIsVIP = false; + m_pVIP->m_bNotKilled = false; } /* <11706f> ../cstrike/dlls/multiplay_gamerules.cpp:2335 */ -NOBODY void CHalfLifeMultiplay::PickNextVIP(void) +void CHalfLifeMultiplay::PickNextVIP(void) { -// { -// int i; // 2343 -// StackVIPQueue(CHalfLifeMultiplay *const this); // 2351 -// } -// { -// int iCount; // 2365 -// class CBaseEntity *pPlayer; // 2367 -// class CBasePlayer *player; // 2368 -// class CBasePlayer *pLastPlayer; // 2369 -// edict(CBaseEntity *const this); // 2372 -// FNullEnt(const edict_t *pent); // 2372 -// } -// { -// class CBaseEntity *pPlayer; // 2404 -// class CBasePlayer *player; // 2405 -// edict(CBaseEntity *const this); // 2408 -// FNullEnt(const edict_t *pent); // 2408 -// } + if (!IsVIPQueueEmpty()) + { + if (m_pVIP != NULL) + { + ResetCurrentVIP(); + } + + for (int i = 0; i < MAX_VIP_QUEUES; i++) + { + if (VIPQueue[i] != NULL) + { + m_pVIP = VIPQueue[i]; + m_pVIP->MakeVIP(); + + VIPQueue[i] = NULL; + + StackVIPQueue(); + m_iConsecutiveVIP = 0; + + break; + } + } + } + else if (m_iConsecutiveVIP > 2) + { + if (++m_iLastPick > m_iNumCT) + { + m_iLastPick = 1; + } + + int iCount = 1; + CBasePlayer *pLastPlayer = NULL; + 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); + + if (player->m_iTeam == CT) + { + if (iCount == m_iLastPick) + { + if (player == m_pVIP && pLastPlayer != NULL) + { + player = pLastPlayer; + } + + if (m_pVIP != NULL) + { + ResetCurrentVIP(); + } + + player->MakeVIP(); + m_iConsecutiveVIP = 0; + break; + } + + iCount++; + } + + if (player->m_iTeam != SPECTATOR) + { + pLastPlayer = player; + } + } + } + else if (!m_pVIP) + { + 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); + + if (player->m_iTeam == CT) + { + player->MakeVIP(); + m_iConsecutiveVIP = 0; + break; + } + } + } } /* <115458> ../cstrike/dlls/multiplay_gamerules.cpp:2435 */ -NOBODY void CHalfLifeMultiplay::Think_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(Think)(void) { -// { -// int time_remaining; // 2437 -// float fTimeLimit; // 2495 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2456 -// { -// int time; // 2472 -// IsCareer(CHalfLifeMultiplay *const this); // 2481 -// } -// IsCareer(CHalfLifeMultiplay *const this); // 2504 -// IsBotSpeaking(void); // 2511 -// TimeRemaining(CHalfLifeMultiplay *const this); // 2594 -// { -// char CT_sentence; // 2602 -// char T_sentence; // 2603 -// bool bCTPlayed; // 2649 -// bool bTPlayed; // 2650 -// { -// int i; // 2652 -// { -// class CBasePlayer *plr; // 2654 -// } -// } -// } -// { -// class CGrenade *C4; // 2691 -// float flEndRoundTime; // 2692 -// Broadcast(const char *sentence); // 2710 -// TerminateRound(float tmDelay, -// int iWinStatus); // 2715 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 2716 -// Broadcast(const char *sentence); // 2721 -// TerminateRound(float tmDelay, -// int iWinStatus); // 2726 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 2727 -// TerminateRound(float tmDelay, -// int iWinStatus); // 2747 -// Broadcast(const char *sentence); // 2732 -// TerminateRound(float tmDelay, -// int iWinStatus); // 2736 -// UpdateTeamScores(CHalfLifeMultiplay *const this); // 2737 -// } -// IsCareer(CHalfLifeMultiplay *const this); // 2758 -// { -// bool isBotSpeaking; // 2760 -// { -// bool canCTsWin; // 2771 -// bool canTsWin; // 2773 -// } -// { -// int i; // 2801 -// { -// class CBasePlayer *pPlayer; // 2803 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 2807 -// } -// } -// IsBotSpeaking(void); // 2763 -// } -// { -// class CBaseEntity *ent; // 2840 -// } -// { -// int iRestartDelay; // 2860 -// { -// class CHalfLifeMultiplay *mp; // 2872 -// } -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2587 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2520 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 2527 -// } + MonitorTutorStatus(); + + m_VoiceGameMgr.Update(gpGlobals->frametime); + + if (sv_clienttrace->value != 1.0f) + { + CVAR_SET_FLOAT("sv_clienttrace", 1); + } + + if (!m_fRoundCount) + { + m_fRoundCount = gpGlobals->time; + m_fIntroRoundCount = gpGlobals->time; + } + + if (m_flForceCameraValue != forcecamera.value + || m_flForceChaseCamValue != forcechasecam.value + || m_flFadeToBlackValue != fadetoblack.value) + { + MESSAGE_BEGIN(MSG_ALL, gmsgForceCam); + WRITE_BYTE(forcecamera.value != 0); + WRITE_BYTE(forcechasecam.value != 0); + WRITE_BYTE(fadetoblack.value != 0); + MESSAGE_END(); + + m_flForceCameraValue = forcecamera.value; + m_flForceChaseCamValue = forcechasecam.value; + m_flFadeToBlackValue = fadetoblack.value; + } + + if (g_fGameOver) + { + int time = (int)CVAR_GET_FLOAT("mp_chattime"); + + if (time < 1) + CVAR_SET_STRING("mp_chattime", "1"); + + else if (time > MAX_INTERMISSION_TIME) + CVAR_SET_STRING("mp_chattime", UTIL_dtos1(MAX_INTERMISSION_TIME)); + + m_flIntermissionEndTime = m_flIntermissionStartTime + mp_chattime.value; + + if (gpGlobals->time > m_flIntermissionEndTime && !IsCareer() + && (!UTIL_HumansInGame(false) || m_iEndIntermissionButtonHit || (gpGlobals->time > m_flIntermissionStartTime + MAX_INTERMISSION_TIME))) + { + ChangeLevel(); + } + + return; + } + + float fTimeLimit = timelimit.value; + + if (fTimeLimit < 0) + { + CVAR_SET_FLOAT("mp_timelimit", 0); + fTimeLimit = 0; + } + + if (!IsCareer()) + { + if (fTimeLimit != 0.0f) + { + g_flTimeLimit = g_flResetTime + fTimeLimit * 60.0f; + } + + if (fTimeLimit && g_flTimeLimit <= gpGlobals->time) + { + ALERT(at_console, "Changing maps because time limit has been met\n"); + + GoToIntermission(); + return; + } + + if (m_iMaxRounds && m_iTotalRoundsPlayed >= m_iMaxRounds) + { + ALERT(at_console, "Changing maps due to maximum rounds have been met\n"); + + GoToIntermission(); + return; + } + + if (m_iMaxRoundsWon && (m_iNumCTWins >= m_iMaxRoundsWon || m_iNumTerroristWins >= m_iMaxRoundsWon)) + { + if ((m_iNumCTWins - m_iNumTerroristWins >= m_iRoundWinDifference) + || (m_iNumTerroristWins - m_iNumCTWins >= m_iRoundWinDifference)) + { + ALERT(at_console, "Changing maps...one team has won the specified number of rounds\n"); + + GoToIntermission(); + return; + } + } + } + + if (!IsCareer() || (m_fCareerMatchMenuTime <= 0.0 || m_fCareerMatchMenuTime >= gpGlobals->time)) + { + if (m_iStoredSpectValue != allow_spectators.value) + { + m_iStoredSpectValue = allow_spectators.value; + + MESSAGE_BEGIN(MSG_ALL, gmsgAllowSpec); + WRITE_BYTE((int)allow_spectators.value); + MESSAGE_END(); + } + + if (IsFreezePeriod()) + { + if (TimeRemaining() <= 0.0) + { + char CT_sentence[40], T_sentence[40]; + + UTIL_LogPrintf("World triggered \"Round_Start\"\n"); + m_bFreezePeriod = FALSE; + + switch (RANDOM_LONG(0, 3)) + { + case 0: + Q_strncpy(CT_sentence, "%!MRAD_MOVEOUT", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_MOVEOUT", sizeof(T_sentence)); + break; + case 1: + Q_strncpy(CT_sentence, "%!MRAD_LETSGO", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_LETSGO", sizeof(T_sentence)); + break; + case 2: + Q_strncpy(CT_sentence, "%!MRAD_LOCKNLOAD", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_LOCKNLOAD", sizeof(T_sentence)); + break; + case 3: + Q_strncpy(CT_sentence, "%!MRAD_GO", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_GO", sizeof(T_sentence)); + break; + } + + if (m_bMapHasEscapeZone) + { + Q_strncpy(CT_sentence, "%!MRAD_ELIM", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_GETOUT", sizeof(T_sentence)); + } + else if (m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + Q_strncpy(CT_sentence, "%!MRAD_VIP", sizeof(CT_sentence)); + Q_strncpy(T_sentence, "%!MRAD_LOCKNLOAD", sizeof(T_sentence)); + } + + bool bCTPlayed, bTPlayed; + + m_iRoundTimeSecs = m_iRoundTime; + m_fRoundCount = gpGlobals->time; + + bCTPlayed = false; + bTPlayed = false; + + TheCareerTasks->HandleEvent(EVENT_ROUND_START); + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *plr = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (!plr || plr->pev->flags == FL_DORMANT) + { + continue; + } + + if (plr->m_iJoiningState == JOINED) + { + if (plr->m_iTeam == CT && !bCTPlayed) + { + plr->Radio(CT_sentence, NULL); + bCTPlayed = true; + } + else if (plr->m_iTeam == TERRORIST && !bTPlayed) + { + plr->Radio(T_sentence, NULL); + bTPlayed = true; + } + + if (plr->m_iTeam != SPECTATOR) + { + plr->ResetMaxSpeed(); + plr->m_bCanShoot = true; + } + } + + plr->SyncRoundTimer(); + } + + TheBots->OnEvent(EVENT_ROUND_START); + TheCareerTasks->HandleEvent(EVENT_ROUND_START); + } + } + else if (HasRoundTimeExpired()) + { + //CGrenade *C4 = (CGrenade *)UTIL_FindEntityByClassname(NULL, "grenade"); + + if (m_bMapHasBombTarget) + { + Broadcast("ctwin"); + + m_iAccountCT += REWARD_TARGET_BOMB_SAVED; + m_iNumCTWins++; + + EndRoundMessage("#Target_Saved", ROUND_TARGET_SAVED); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + UpdateTeamScores(); + MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(TERRORIST); + } + else if (UTIL_FindEntityByClassname(NULL, "hostage_entity")) + { + Broadcast("terwin"); + m_iAccountTerrorist += REWARD_HOSTAGE_NOT_RESCUED; + m_iNumTerroristWins++; + + EndRoundMessage("#Hostages_Not_Rescued", ROUND_HOSTAGE_NOT_RESCUED); + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + UpdateTeamScores(); + MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(CT); + } + else if (m_bMapHasEscapeZone) + { + Broadcast("ctwin"); + m_iNumCTWins++; + + EndRoundMessage("#Terrorists_Not_Escaped", ROUND_TERRORISTS_NOT_ESCAPED); + TerminateRound(5, WINSTATUS_CTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_CTS); + } + + UpdateTeamScores(); + } + else if (m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES) + { + Broadcast("terwin"); + m_iAccountTerrorist += REWARD_VIP_NOT_ESCAPED; + m_iNumTerroristWins++; + + EndRoundMessage("#VIP_Not_Escaped", ROUND_VIP_NOT_ESCAPED); + TerminateRound(5, WINSTATUS_TERRORISTS); + + if (IsCareer()) + { + QueueCareerRoundEndMenu(5, WINSTATUS_TERRORISTS); + } + + UpdateTeamScores(); + } + + m_fRoundCount = gpGlobals->time + 60.0f; + } + +//LABEL_147: + if (m_fTeamCount != 0.0f && m_fTeamCount <= gpGlobals->time) + { + if (!IsCareer() || !m_fCareerRoundMenuTime) + { + RestartRound(); + } + else + { + bool isBotSpeaking = false; + + if (m_fTeamCount + 10.0 > gpGlobals->time) + { + isBotSpeaking = IsBotSpeaking(); + } + + if (!isBotSpeaking) + { + if (m_fCareerMatchMenuTime == 0.0f && m_iCareerMatchWins) + { + bool canCTsWin = true; + bool canTsWin = true; + + if (m_iNumCTWins < m_iCareerMatchWins || (m_iNumCTWins - m_iNumTerroristWins < m_iRoundWinDifference)) + canCTsWin = false; + + if (m_iNumTerroristWins < m_iCareerMatchWins || (m_iNumTerroristWins - m_iNumCTWins < m_iRoundWinDifference)) + canTsWin = false; + + if (!Q_strcmp(humans_join_team.string, "CT")) + { + if (!TheCareerTasks->AreAllTasksComplete()) + { + canCTsWin = false; + } + } + else if (!TheCareerTasks->AreAllTasksComplete()) + { + canTsWin = false; + } + + if (canCTsWin || canTsWin) + { + m_fCareerRoundMenuTime = 0; + m_fCareerMatchMenuTime = gpGlobals->time + 3.0f; + + return; + } + } + + m_bFreezePeriod = TRUE; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (pPlayer != NULL && !pPlayer->IsBot()) + { + MESSAGE_BEGIN(MSG_ONE, gmsgCZCareerHUD, NULL, pPlayer->pev); + WRITE_STRING("ROUND"); + WRITE_LONG(m_iNumCTWins); + WRITE_LONG(m_iNumTerroristWins); + WRITE_BYTE(m_iCareerMatchWins); + WRITE_BYTE(m_iRoundWinDifference); + WRITE_BYTE(m_iRoundWinStatus); + MESSAGE_END(); + + pPlayer->m_iHideHUD |= HIDEHUD_ALL; + m_fTeamCount = gpGlobals->time + 100000.0; + + UTIL_LogPrintf + ( + "Career Round %d %d %d %d\n", + m_iRoundWinStatus, + m_iNumCTWins, + m_iNumTerroristWins, + TheCareerTasks->AreAllTasksComplete() + ); + + break; + } + } + + m_fCareerRoundMenuTime = 0; + } + } +//LABEL_181: + if (TheTutor) + { + TheTutor->PurgeMessages(); + } + } + + if (!m_bLevelInitialized) + { + m_iSpawnPointCount_Terrorist = 0; + m_iSpawnPointCount_CT = 0; + + CBaseEntity *ent = NULL; + + while ((ent = UTIL_FindEntityByClassname(ent, "info_player_deathmatch")) != NULL) + m_iSpawnPointCount_Terrorist++; + + //ent = NULL; + while ((ent = UTIL_FindEntityByClassname(ent, "info_player_start")) != NULL) + m_iSpawnPointCount_CT++; + + m_bLevelInitialized = true; + } + + if (gpGlobals->time > m_tmNextPeriodicThink) + { + int iRestartDelay = (int)restartround.value; + + if (!iRestartDelay) + { + iRestartDelay = sv_restart.value; + } + + if (iRestartDelay > 0) + { + if (iRestartDelay > 60) + iRestartDelay = 60; + + CHalfLifeMultiplay *mp = g_pGameRules; + UTIL_LogPrintf("World triggered \"Restart_Round_(%i_%s)\"\n", iRestartDelay, (iRestartDelay == 1) ? "second" : "seconds"); + + if (mp != NULL) + { + UTIL_LogPrintf + ( + "Team \"CT\" scored \"%i\" with \"%i\" players\n", + mp->m_iNumCTWins, + mp->m_iNumCT + ); + + UTIL_LogPrintf + ( + "Team \"TERRORIST\" scored \"%i\" with \"%i\" players\n", + mp->m_iNumTerroristWins, + mp->m_iNumTerrorist + ); + } + + UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Game_will_restart_in", UTIL_dtos1(iRestartDelay), (iRestartDelay == 1) ? "SECOND" : "SECONDS"); + UTIL_ClientPrintAll(HUD_PRINTCONSOLE, "#Game_will_restart_in_console", UTIL_dtos1(iRestartDelay), (iRestartDelay == 1) ? "SECOND" : "SECONDS"); + + m_bCompleteReset = true; + m_fTeamCount = gpGlobals->time + iRestartDelay; + + CVAR_SET_FLOAT("sv_restartround", 0); + CVAR_SET_FLOAT("sv_restart", 0); + + CareerRestart(); + } + + m_tmNextPeriodicThink = gpGlobals->time + 1.0f; + + if (g_psv_accelerate->value != 5.0f) + { + CVAR_SET_FLOAT("sv_accelerate", 5); + } + + if (g_psv_friction->value != 4.0f) + { + CVAR_SET_FLOAT("sv_friction", 4); + } + + if (g_psv_stopspeed->value != 75.0f) + { + CVAR_SET_FLOAT("sv_stopspeed", 75); + } + + m_iMaxRounds = (int)maxrounds.value; + + if (m_iMaxRounds < 0) + { + m_iMaxRounds = 0; + CVAR_SET_FLOAT("mp_maxrounds", 0); + } + + m_iMaxRoundsWon = (int)winlimit.value; + + if (m_iMaxRoundsWon < 0) + { + m_iMaxRoundsWon = 0; + CVAR_SET_FLOAT("mp_winlimit", 0); + } + } + } + else + { + if (m_fCareerMatchMenuTime + 10 > gpGlobals->time && !IsBotSpeaking()) + { + return; + } + + UTIL_CareerDPrintf("Ending career match...one team has won the specified number of rounds\n"); + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("MATCH"); + WRITE_LONG(m_iNumCTWins); + WRITE_LONG(m_iNumTerroristWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareerHUD); + WRITE_STRING("MATCH"); + WRITE_LONG(m_iNumCTWins); + WRITE_LONG(m_iNumTerroristWins); + WRITE_BYTE(m_iCareerMatchWins); + WRITE_BYTE(m_iRoundWinDifference); + WRITE_BYTE(m_iRoundWinStatus); + MESSAGE_END(); + + UTIL_LogPrintf + ( + "Career Match %d %d %d %d\n", + m_iRoundWinStatus, + m_iNumCTWins, + m_iNumTerroristWins, + TheCareerTasks->AreAllTasksComplete() + ); + + SERVER_COMMAND("setpause\n"); + } } /* <115189> ../cstrike/dlls/multiplay_gamerules.cpp:2922 */ -NOBODY bool CHalfLifeMultiplay::HasRoundTimeExpired(void) +bool CHalfLifeMultiplay::HasRoundTimeExpired(void) { -// TimeRemaining(CHalfLifeMultiplay *const this); // 2925 -// IsBombPlanted(CHalfLifeMultiplay *const this); // 2929 + if (TimeRemaining() > 0 || m_iRoundWinStatus) + { + return false; + } + + if (!IsBombPlanted()) + { + if (cv_bot_nav_edit.value == 0.0f || IS_DEDICATED_SERVER() || UTIL_HumansInGame(false) != 1) + { + return true; + } + } + + return false; } /* <1151f4> ../cstrike/dlls/multiplay_gamerules.cpp:2945 */ -NOBODY bool CHalfLifeMultiplay::IsBombPlanted(void) +bool CHalfLifeMultiplay::IsBombPlanted(void) { -// { -// class CGrenade *bomb; // 2950 -// } + if (m_bMapHasBombTarget) + { + CGrenade *bomb = NULL; + + if ((bomb = (CGrenade *)UTIL_FindEntityByClassname(bomb, "grenade")) != NULL) + { + if (bomb->m_bIsC4) + { + return true; + } + } + } + + return false; } /* <115229> ../cstrike/dlls/multiplay_gamerules.cpp:2971 */ -NOBODY void CHalfLifeMultiplay::MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(int iTeam) +void CHalfLifeMultiplay::MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(int iTeam) { -// { -// int i; // 2973 -// { -// class CBasePlayer *player; // 2975 -// FNullEnt(entvars_t *pev); // 2977 -// } -// } + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (!player || FNullEnt(player->pev)) + continue; + + if (player->m_iTeam == iTeam) + { + if (player->pev->health > 0 && player->pev->deadflag == DEAD_NO) + { + player->m_bReceivesNoMoneyNextRound = true; + } + } + } } /* <1152e2> ../cstrike/dlls/multiplay_gamerules.cpp:2987 */ -NOBODY void CHalfLifeMultiplay::CareerRestart(void) +void CHalfLifeMultiplay::CareerRestart(void) { -// { -// int i; // 3004 -// { -// class CBasePlayer *player; // 3006 -// FNullEnt(entvars_t *pev); // 3008 -// } -// } + g_fGameOver = FALSE; + + if (m_fTeamCount == 0.0f) + { + m_fTeamCount = gpGlobals->time + 1.0f; + } + + // for reset everything + m_bCompleteReset = true; + m_fCareerRoundMenuTime = 0; + m_fCareerMatchMenuTime = 0; + TheCareerTasks->Reset(false); + m_bSkipSpawn = false; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (!player || FNullEnt(player->pev)) + continue; + + if (!player->IsBot()) + { + player->ForceClientDllUpdate(); + } + } } /* <1128cb> ../cstrike/dlls/multiplay_gamerules.cpp:3017 */ -BOOL CHalfLifeMultiplay::IsMultiplayer_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(IsMultiplayer)(void) { return TRUE; } /* <1128f3> ../cstrike/dlls/multiplay_gamerules.cpp:3024 */ -BOOL CHalfLifeMultiplay::IsDeathmatch_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(IsDeathmatch)(void) { return TRUE; } /* <11291b> ../cstrike/dlls/multiplay_gamerules.cpp:3031 */ -BOOL CHalfLifeMultiplay::IsCoOp_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(IsCoOp)(void) { return gpGlobals->coop; } /* <113fcf> ../cstrike/dlls/multiplay_gamerules.cpp:3038 */ -BOOL CHalfLifeMultiplay::FShouldSwitchWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(FShouldSwitchWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { if (!pWeapon->CanDeploy()) return FALSE; @@ -987,7 +2825,7 @@ BOOL CHalfLifeMultiplay::FShouldSwitchWeapon_(CBasePlayer *pPlayer, CBasePlayerI } /* <113eec> ../cstrike/dlls/multiplay_gamerules.cpp:3071 */ -BOOL CHalfLifeMultiplay::GetNextBestWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(GetNextBestWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) { if (!pCurrentWeapon->CanHolster()) return FALSE; @@ -998,478 +2836,962 @@ BOOL CHalfLifeMultiplay::GetNextBestWeapon_(CBasePlayer *pPlayer, CBasePlayerIte for (int i = 0; i < MAX_ITEM_TYPES; i++) { CBasePlayerItem *pCheck = pPlayer->m_rgpPlayerItems[i]; - while (pCheck) + + while (pCheck != NULL) { if (pCheck->iWeight() > iBestWeight && pCheck != pCurrentWeapon && pCheck->CanDeploy()) { iBestWeight = pCheck->iWeight(); pBest = pCheck; } + pCheck = pCheck->m_pNext; } } - if (pBest) + + if (pBest != NULL) { pPlayer->SwitchWeapon(pBest); return TRUE; } - return FALSE; -} -NOBODY BOOL CHalfLifeMultiplay::ClientCommand_(CBasePlayer *pPlayer, const char *pcmd) -{ return FALSE; } /* <113aa5> ../cstrike/dlls/multiplay_gamerules.cpp:3132 */ -NOBODY BOOL CHalfLifeMultiplay::ClientCommand_DeadOrAlive_(CBasePlayer *pPlayer, const char *pcmd) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(ClientCommand_DeadOrAlive)(CBasePlayer *pPlayer, const char *pcmd) { + return m_VoiceGameMgr.ClientCommand(pPlayer, pcmd); +} + +/* <113afe> ../cstrike/dlls/multiplay_gamerules.cpp:3138 */ +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(ClientCommand)(CBasePlayer *pPlayer, const char *pcmd) +{ + return FALSE; } /* <113a3c> ../cstrike/dlls/multiplay_gamerules.cpp:3145 */ -NOBODY BOOL CHalfLifeMultiplay::ClientConnected_(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(ClientConnected)(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) { + m_VoiceGameMgr.ClientConnected(pEntity); + return TRUE; } /* <11298b> ../cstrike/dlls/multiplay_gamerules.cpp:3156 */ -NOBODY void CHalfLifeMultiplay::UpdateGameMode_(CBasePlayer *pPlayer) +void CHalfLifeMultiplay::__MAKE_VHOOK(UpdateGameMode)(CBasePlayer *pPlayer) { -// edict(CBaseEntity *const this); // 3158 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3158 + MESSAGE_BEGIN(MSG_ONE, gmsgGameMode, NULL, pPlayer->edict()); + WRITE_BYTE(1); + MESSAGE_END(); } /* <11642b> ../cstrike/dlls/multiplay_gamerules.cpp:3163 */ -NOBODY void CHalfLifeMultiplay::InitHUD_(CBasePlayer *pl) +void CHalfLifeMultiplay::__MAKE_VHOOK(InitHUD)(CBasePlayer *pl) { -// { -// int i; // 3207 -// edict(CBaseEntity *const this); // 3168 -// edict(CBaseEntity *const this); // 3168 -// edict(CBaseEntity *const this); // 3181 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3181 -// edict(CBaseEntity *const this); // 3182 -// ENTINDEX(edict_t *pEdict); // 3182 -// edict(CBaseEntity *const this); // 3189 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3189 -// IsCareer(CHalfLifeMultiplay *const this); // 3193 -// edict(CBaseEntity *const this); // 3196 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3196 -// { -// class CBasePlayer *plr; // 3211 -// edict(CBaseEntity *const this); // 3215 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3215 -// } -// edict(CBaseEntity *const this); // 3226 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3226 -// edict(CBaseEntity *const this); // 3231 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3231 -// edict(CBaseEntity *const this); // 3236 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3236 -// edict(CBaseEntity *const this); // 3240 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3240 -// { -// class CBasePlayer *plr; // 3255 -// entindex(CBaseEntity *const this); // 3283 -// edict(CBaseEntity *const this); // 3259 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3259 -// entindex(CBaseEntity *const this); // 3260 -// edict(CBaseEntity *const this); // 3287 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3287 -// entindex(CBaseEntity *const this); // 3288 -// } -// { -// class CBaseEntity *pWeaponC4; // 3301 -// edict(CBaseEntity *const this); // 3306 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3306 -// } -// edict(CBaseEntity *const this); // 3175 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3175 -// edict(CBaseEntity *const this); // 3248 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3248 -// } + int i; + + // notify other clients of player joining the game + UTIL_LogPrintf + ( + "\"%s<%i><%s><>\" entered the game\n", + STRING(pl->pev->netname), + GETPLAYERUSERID(pl->edict()), + GETPLAYERAUTHID(pl->edict()) + ); + + UpdateGameMode(pl); + + if (!g_flWeaponCheat) + { + MESSAGE_BEGIN(MSG_ONE, gmsgViewMode, NULL, pl->edict()); + MESSAGE_END(); + } + + // sending just one score makes the hud scoreboard active; otherwise + // it is just disabled for single play + MESSAGE_BEGIN(MSG_ONE, gmsgScoreInfo, NULL, pl->edict()); + WRITE_BYTE(ENTINDEX(pl->edict())); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(pl->m_iTeam); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgShadowIdx, NULL, pl->edict()); + WRITE_LONG(g_iShadowSprite); + MESSAGE_END(); + + if (IsCareer()) + { + MESSAGE_BEGIN(MSG_ONE, gmsgCZCareer, NULL, pl->edict()); + WRITE_STRING("START"); + WRITE_SHORT(m_iRoundTime); + MESSAGE_END(); + } + else + SendMOTDToClient(pl->edict()); + + // loop through all active players and send their score info to the new client + for (i = 1; i <= gpGlobals->maxClients; i++) + { + // FIXME: Probably don't need to cast this just to read m_iDeaths + CBasePlayer *plr = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (plr != NULL) + { + MESSAGE_BEGIN(MSG_ONE, gmsgScoreInfo, NULL, pl->edict()); + WRITE_BYTE(i); // client number + WRITE_SHORT((int)plr->pev->frags); + WRITE_SHORT(plr->m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(plr->m_iTeam); + MESSAGE_END(); + } + } + + MESSAGE_BEGIN(MSG_ONE, gmsgTeamScore, NULL, pl->edict()); + WRITE_STRING("TERRORIST"); + WRITE_SHORT(m_iNumTerroristWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgTeamScore, NULL, pl->edict()); + WRITE_STRING("CT"); + WRITE_SHORT(m_iNumCTWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgAllowSpec, NULL, pl->edict()); + WRITE_BYTE((int)allow_spectators.value); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgForceCam, NULL, pl->edict()); + WRITE_BYTE(forcecamera.value != 0); + WRITE_BYTE(forcechasecam.value != 0); + WRITE_BYTE(fadetoblack.value != 0); + MESSAGE_END(); + + if (g_fGameOver) + { + MESSAGE_BEGIN(MSG_ONE, SVC_INTERMISSION, NULL, pl->edict()); + MESSAGE_END(); + } + + for (i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *plr = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (plr != NULL) + { + MESSAGE_BEGIN(MSG_ONE, gmsgTeamInfo, NULL, pl->edict()); + WRITE_BYTE(plr->entindex()); + switch (plr->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(); + + plr->SetScoreboardAttributes(pl); + + if (i != pl->entindex()) + { + if (plr->pev->flags == FL_DORMANT) + continue; + + if (plr->pev->deadflag == DEAD_NO) + { + MESSAGE_BEGIN(MSG_ONE, gmsgRadar, NULL, pl->edict()); + WRITE_BYTE(plr->entindex()); + WRITE_COORD(plr->pev->origin.x); + WRITE_COORD(plr->pev->origin.y); + WRITE_COORD(plr->pev->origin.z); + MESSAGE_END(); + } + } + } + } + + if (g_pGameRules->m_bBombDropped) + { + CBaseEntity *pWeaponC4 = UTIL_FindEntityByClassname(NULL, "weapon_c4"); + + if (pWeaponC4 != NULL) + { + MESSAGE_BEGIN(MSG_ONE, gmsgBombDrop, NULL, pl->edict()); + WRITE_COORD(pWeaponC4->pev->origin.x); + WRITE_COORD(pWeaponC4->pev->origin.y); + WRITE_COORD(pWeaponC4->pev->origin.z); + WRITE_BYTE(0); + MESSAGE_END(); + } + } } /* <1137c1> ../cstrike/dlls/multiplay_gamerules.cpp:3318 */ -NOBODY void CHalfLifeMultiplay::ClientDisconnected_(edict_t *pClient) +void CHalfLifeMultiplay::__MAKE_VHOOK(ClientDisconnected)(edict_t *pClient) { -// { -// class CBasePlayer *pPlayer; // 3322 -// Instance(edict_t *pent); // 3322 -// { -// char *team; // 3389 -// class CBasePlayer *client; // 3403 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3365 -// ENTINDEX(edict_t *pEdict); // 3366 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3373 -// ENTINDEX(edict_t *pEdict); // 3374 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3378 -// ENTINDEX(edict_t *pEdict); // 3379 -// GetTeam(int teamNo); // 3389 -// edict(CBaseEntity *const this); // 3395 -// edict(CBaseEntity *const this); // 3395 -// edict(CBaseEntity *const this); // 3404 -// FNullEnt(const edict_t *pent); // 3404 -// { -// int iMode; // 3415 -// } -// } -// } + if (pClient != NULL) + { + CBasePlayer *pPlayer = reinterpret_cast(CBaseEntity::Instance(pClient)); + + if (pPlayer != NULL) + { + pPlayer->has_disconnected = true; + pPlayer->pev->deadflag = DEAD_DEAD; + pPlayer->SetScoreboardAttributes(); + + if (pPlayer->m_bHasC4) + { + pPlayer->DropPlayerItem("weapon_c4"); + } + + if (pPlayer->m_bHasDefuser) + { + pPlayer->DropPlayerItem("item_thighpack"); + } + + if (pPlayer->m_bIsVIP) + { + m_pVIP = NULL; + } + + pPlayer->m_iCurrentKickVote = 0; + + if (pPlayer->m_iMapVote) + { + m_iMapVotes[ pPlayer->m_iMapVote ]--; + + if (m_iMapVotes[ pPlayer->m_iMapVote ] < 0) + { + m_iMapVotes[ pPlayer->m_iMapVote ] = 0; + } + } + + MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(pClient)); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(0); + WRITE_SHORT(0); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo); + WRITE_BYTE(ENTINDEX(pClient)); + WRITE_STRING("UNASSIGNED"); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgLocation); + WRITE_BYTE(ENTINDEX(pClient)); + WRITE_STRING(""); + MESSAGE_END(); + + char *team = GetTeam(pPlayer->m_iTeam); + + FireTargets("game_playerleave", pPlayer, pPlayer, USE_TOGGLE, 0); + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" disconnected\n", + STRING(pPlayer->pev->netname), + GETPLAYERUSERID(pPlayer->edict()), + GETPLAYERAUTHID(pPlayer->edict()), + team + ); + + // destroy all of the players weapons and items + pPlayer->RemoveAllItems(TRUE); + + if (pPlayer->m_pObserver != NULL) + { + pPlayer->m_pObserver->SUB_Remove(); + } + + CBasePlayer *client = NULL; + + while ((client = (CBasePlayer *)UTIL_FindEntityByClassname(client, "player")) != NULL) + { + if (FNullEnt(client->edict())) + break; + + if (!client->pev || client == pPlayer) + continue; + + if (client->m_hObserverTarget == pPlayer) + { + int iMode = client->pev->iuser1; + + client->pev->iuser1 = OBS_NONE; + client->Observer_SetMode(iMode); + } + } + } + } + + CheckWinConditions(); } /* <112a05> ../cstrike/dlls/multiplay_gamerules.cpp:3428 */ -float CHalfLifeMultiplay::FlPlayerFallDamage_(CBasePlayer *pPlayer) +float CHalfLifeMultiplay::__MAKE_VHOOK(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 */ -NOBODY BOOL CHalfLifeMultiplay::FPlayerCanTakeDamage_(CBasePlayer *pPlayer, CBaseEntity *pAttacker) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(FPlayerCanTakeDamage)(CBasePlayer *pPlayer, CBaseEntity *pAttacker) { + if (!pAttacker || PlayerRelationship(pPlayer, pAttacker) != GR_TEAMMATE) + { + return TRUE; + } + + if (CVAR_GET_FLOAT("mp_friendlyfire") != 0 || pAttacker == pPlayer) + { + return TRUE; + } + + return FALSE; } /* <11370c> ../cstrike/dlls/multiplay_gamerules.cpp:3454 */ -NOBODY void CHalfLifeMultiplay::PlayerThink_(CBasePlayer *pPlayer) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer) { -// { -// class CBasePlayerWeapon *pWeapon; // 3476 -// } -// { -// int team; // 3484 -// IsCareer(CHalfLifeMultiplay *const this); // 3513 -// } -// IsCareer(CHalfLifeMultiplay *const this); // 3459 + if (g_fGameOver) + { + // check for button presses + if (!IsCareer() && (pPlayer->m_afButtonPressed & (IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP))) + { + m_iEndIntermissionButtonHit = TRUE; + } + + // clear attack/use commands from player + pPlayer->m_afButtonPressed = 0; + pPlayer->pev->button = 0; + pPlayer->m_afButtonReleased = 0; + } + + if (!pPlayer->m_bCanShoot && !IsFreezePeriod()) + { + pPlayer->m_bCanShoot = true; + } + + if (pPlayer->m_pActiveItem && pPlayer->m_pActiveItem->IsWeapon()) + { + CBasePlayerWeapon *pWeapon = reinterpret_cast(pPlayer->m_pActiveItem->GetWeaponPtr()); + + if (pWeapon->m_iWeaponState & WPNSTATE_SHIELD_DRAWN) + { + pPlayer->m_bCanShoot = false; + } + } + + if (pPlayer->m_iMenu != Menu_ChooseTeam && pPlayer->m_iJoiningState == SHOWTEAMSELECT) + { + int team = MENU_SLOT_TEAM_UNDEFINED; + + if (!Q_stricmp(humans_join_team.string, "T")) + { + team = MENU_SLOT_TEAM_TERRORIST; + } + else if (!Q_stricmp(humans_join_team.string, "CT")) + { + team = MENU_SLOT_TEAM_CT; + } + else + { + if (allow_spectators.value == 0.0f) + ShowVGUIMenu(pPlayer, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5), "#Team_Select"); + else + ShowVGUIMenu(pPlayer, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6), "#Team_Select_Spect"); + } + + pPlayer->m_iMenu = Menu_ChooseTeam; + pPlayer->m_iJoiningState = PICKINGTEAM; + + if (team != MENU_SLOT_TEAM_UNDEFINED && !pPlayer->IsBot()) + { + HandleMenu_ChooseTeam(pPlayer, team); + + if (team != MENU_SLOT_TEAM_SPECT && IsCareer()) + { + // slot 6 - chooses randomize the appearance to model player + HandleMenu_ChooseAppearance(pPlayer, 6); + } + } + } } /* <113bcf> ../cstrike/dlls/multiplay_gamerules.cpp:3523 */ -NOBODY void CHalfLifeMultiplay::PlayerSpawn_(CBasePlayer *pPlayer) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerSpawn)(CBasePlayer *pPlayer) { -// { -// BOOL addDefault; // 3525 -// class CBaseEntity *pWeaponEntity; // 3526 -// } + BOOL addDefault; + CBaseEntity *pWeaponEntity = NULL; + + if (pPlayer->m_bJustConnected) + { + return; + } + + pPlayer->pev->weapons |= (1 << WEAPON_SUIT); + + addDefault = TRUE; + + while ((pWeaponEntity = UTIL_FindEntityByClassname(pWeaponEntity, "game_player_equip")) != NULL) + { + pWeaponEntity->Touch(pPlayer); + addDefault = FALSE; + } + + if ((!pPlayer->m_bNotKilled && addDefault) || pPlayer->m_bIsVIP) + { + pPlayer->GiveDefaultItems(); + } + + pPlayer->SetPlayerModel(false); } /* <113d74> ../cstrike/dlls/multiplay_gamerules.cpp:3553 */ -NOBODY BOOL CHalfLifeMultiplay::FPlayerCanRespawn_(CBasePlayer *pPlayer) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(FPlayerCanRespawn)(CBasePlayer *pPlayer) { -// FPlayerCanRespawn(CHalfLifeMultiplay *const this, -// class CBasePlayer *pPlayer); // 3553 + if (pPlayer->m_iNumSpawns > 0) + { + return FALSE; + } + + m_iNumCT = CountTeamPlayers(CT); + m_iNumTerrorist = CountTeamPlayers(TERRORIST); + + if (m_iNumTerrorist > 0 && m_iNumCT > 0 && (gpGlobals->time > m_fRoundCount + 20.0f)) + { + if (fadetoblack.value != 0.0f) + { + UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); + } + + return FALSE; + } + + if (pPlayer->m_iMenu == Menu_ChooseAppearance) + { + return FALSE; + } + + return TRUE; } /* <112a86> ../cstrike/dlls/multiplay_gamerules.cpp:3591 */ -NOBODY float CHalfLifeMultiplay::FlPlayerSpawnTime_(CBasePlayer *pPlayer) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlPlayerSpawnTime)(CBasePlayer *pPlayer) { - return -1.0f; + return gpGlobals->time;//now! } /* <112abe> ../cstrike/dlls/multiplay_gamerules.cpp:3596 */ -NOBODY BOOL CHalfLifeMultiplay::AllowAutoTargetCrosshair_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(AllowAutoTargetCrosshair)(void) { return FALSE; } +// IPointsForKill - how many points awarded to anyone +// that kills this player? + /* <112ae6> ../cstrike/dlls/multiplay_gamerules.cpp:3619 */ -NOBODY int CHalfLifeMultiplay::IPointsForKill_(CBasePlayer *pAttacker, CBasePlayer *pKilled) +int CHalfLifeMultiplay::__MAKE_VHOOK(IPointsForKill)(CBasePlayer *pAttacker, CBasePlayer *pKilled) { + return 1; } /* <116cbd> ../cstrike/dlls/multiplay_gamerules.cpp:3627 */ -NOBODY void CHalfLifeMultiplay::PlayerKilled_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerKilled)(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) { -// { -// class CBasePlayer *peKiller; // 3644 -// class CBaseEntity *ktmp; // 3645 -// class CBaseEntity *ep; // 3751 -// edict(CBaseEntity *const this); // 3642 -// Instance(entvars_t *pev); // 3645 -// { -// class CBasePlayer *pDriver; // 3650 -// } -// { -// class CBasePlayer *killer; // 3667 -// { -// int iUserID; // 3685 -// edict(CBaseEntity *const this); // 3685 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3708 -// edict(CBaseEntity *const this); // 3711 -// ENTINDEX(edict_t *pEdict); // 3711 -// ENTINDEX(edict_t *pEdict); // 3712 -// edict(CBaseEntity *const this); // 3720 -// edict(CBaseEntity *const this); // 3720 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3742 -// edict(CBaseEntity *const this); // 3743 -// ENTINDEX(edict_t *pEdict); // 3743 -// Instance(entvars_t *pev); // 3751 -// { -// class CBasePlayer *PK; // 3754 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3756 -// edict(CBaseEntity *const this); // 3757 -// ENTINDEX(edict_t *pEdict); // 3757 -// } -// } + DeathNotice(pVictim, pKiller, pInflictor); + + pVictim->m_afPhysicsFlags &= ~PFLAG_ONTRAIN; + pVictim->m_iDeaths++; + pVictim->m_bNotKilled = false; + pVictim->m_bEscaped = false; + pVictim->m_iTrain = (TRAIN_NEW | TRAIN_OFF); + SET_VIEW(ENT(pVictim->pev), ENT(pVictim->pev)); + + CBasePlayer *peKiller = NULL; + CBaseEntity *ktmp = CBaseEntity::Instance(pKiller); + + if (ktmp && ktmp->Classify() == CLASS_PLAYER) + { + peKiller = reinterpret_cast(ktmp); + } + else if (ktmp && ktmp->Classify() == CLASS_VEHICLE) + { + CBasePlayer *pDriver = reinterpret_cast(((CFuncVehicle *)ktmp)->m_pDriver); + + if (pDriver != NULL) + { + pKiller = pDriver->pev; + peKiller = reinterpret_cast(pDriver); + } + } + + FireTargets("game_playerdie", pVictim, pVictim, USE_TOGGLE, 0); + + if (pVictim->pev == pKiller) + { + // killed self + pKiller->frags -= 1; + } + else if (peKiller && peKiller->IsPlayer()) + { + CBasePlayer *killer = GetClassPtr((CBasePlayer *)pKiller); + + if (killer->m_iTeam == pVictim->m_iTeam) + { + // if a player dies by from teammate + pKiller->frags -= IPointsForKill(peKiller, pVictim); + + killer->AddAccount(PAYBACK_FOR_KILLED_TEAMMATES); + killer->m_iTeamKills++; + killer->m_bJustKilledTeammate = true; + + ClientPrint(killer->pev, HUD_PRINTCENTER, "#Killed_Teammate"); + ClientPrint(killer->pev, HUD_PRINTCONSOLE, "#Game_teammate_kills", UTIL_dtos1(killer->m_iTeamKills)); + + if (killer->m_iTeamKills == 3 && CVAR_GET_FLOAT("mp_autokick") != 0.0f) + { + ClientPrint(killer->pev, HUD_PRINTCONSOLE, "#Banned_For_Killing_Teamates"); + + int iUserID = GETPLAYERUSERID(killer->edict()); + + if (iUserID != -1) + { + SERVER_COMMAND(UTIL_VarArgs("kick # %d\n", iUserID)); + } + } + + if (!(killer->m_flDisplayHistory & DHF_FRIEND_KILLED)) + { + killer->m_flDisplayHistory |= DHF_FRIEND_KILLED; + killer->HintMessage("#Hint_careful_around_teammates"); + } + } + else + { + // if a player dies in a deathmatch game and the killer is a client, award the killer some points + pKiller->frags += IPointsForKill(peKiller, pVictim); + + if (pVictim->m_bIsVIP) + { + killer->HintMessage("#Hint_reward_for_killing_vip", TRUE); + killer->AddAccount(REWARD_KILLED_VIP); + + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); + WRITE_BYTE(DRC_CMD_EVENT); + WRITE_SHORT(ENTINDEX(pVictim->edict())); + WRITE_SHORT(ENTINDEX(ENT(pInflictor))); + WRITE_LONG(DRC_FLAG_PRIO_MASK | DRC_FLAG_DRAMATIC | DRC_FLAG_FINAL); + MESSAGE_END(); + + UTIL_LogPrintf + ( + "\"%s<%i><%s>\" triggered \"Assassinated_The_VIP\"\n", + STRING(killer->pev->netname), + GETPLAYERUSERID(killer->edict()), + GETPLAYERAUTHID(killer->edict()) + ); + } + else + killer->AddAccount(REWARD_KILLED_ENEMY); + + if (!(killer->m_flDisplayHistory & DHF_ENEMY_KILLED)) + { + killer->m_flDisplayHistory |= DHF_ENEMY_KILLED; + killer->HintMessage("#Hint_win_round_by_killing_enemy"); + } + } + + FireTargets("game_playerkill", peKiller, peKiller, USE_TOGGLE, 0); + } + else + { + // killed by the world + pKiller->frags -= 1; + } + + // update the scores + // killed scores + MESSAGE_BEGIN(MSG_BROADCAST, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(pVictim->edict())); + WRITE_SHORT((int)pVictim->pev->frags); + WRITE_SHORT(pVictim->m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(pVictim->m_iTeam); + MESSAGE_END(); + + // killers score, if it's a player + CBaseEntity *ep = CBaseEntity::Instance(pKiller); + + if (ep && ep->Classify() == CLASS_PLAYER) + { + CBasePlayer *PK = reinterpret_cast(ep); + + MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); + WRITE_BYTE(ENTINDEX(PK->edict())); + WRITE_SHORT((int)PK->pev->frags); + WRITE_SHORT(PK->m_iDeaths); + WRITE_SHORT(0); + WRITE_SHORT(PK->m_iTeam); + MESSAGE_END(); + + // let the killer paint another decal as soon as he'd like. + PK->m_flNextDecalTime = gpGlobals->time; + } } /* <113273> ../cstrike/dlls/multiplay_gamerules.cpp:3772 */ -NOBODY void CHalfLifeMultiplay::DeathNotice_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor) +void CHalfLifeMultiplay::__MAKE_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor) { -// { -// class CBaseEntity *Killer; // 3775 -// const char *killer_weapon_name; // 3777 -// int killer_index; // 3778 -// char *tau; // 3781 -// char *gluon; // 3782 -// int iGotHeadshot; // 3819 -// Instance(entvars_t *pev); // 3775 -// ENTINDEX(edict_t *pEdict); // 3786 -// { -// class CBasePlayer *pPlayer; // 3793 -// Instance(entvars_t *pev); // 3793 -// pszName(CBasePlayerItem *const this); // 3797 -// } -// { -// class CBasePlayer *pPlayer; // 3856 -// char *VictimTeam; // 3858 -// char *KillerTeam; // 3859 -// Instance(entvars_t *pev); // 3856 -// GetTeam(int teamNo); // 3858 -// edict(CBaseEntity *const this); // 3872 -// } -// { -// char *team; // 3877 -// GetTeam(int teamNo); // 3877 -// edict(CBaseEntity *const this); // 3884 -// } -// { -// char *team; // 3845 -// GetTeam(int teamNo); // 3845 -// edict(CBaseEntity *const this); // 3852 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3890 -// edict(CBaseEntity *const this); // 3893 -// ENTINDEX(edict_t *pEdict); // 3893 -// ENTINDEX(edict_t *pEdict); // 3895 -// ENTINDEX(edict_t *pEdict); // 3897 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 3829 -// edict(CBaseEntity *const this); // 3831 -// ENTINDEX(edict_t *pEdict); // 3831 -// } + // Work out what killed the player, and send a message to all clients about it + // CBaseEntity *Killer = CBaseEntity::Instance(pKiller); + + // by default, the player is killed by the world + const char *killer_weapon_name = "world"; + int killer_index = 0; + + // Hack to fix name change + char *tau = "tau_cannon"; + char *gluon = "gluon gun"; + + if (pKiller->flags & FL_CLIENT) + { + killer_index = ENTINDEX(ENT(pKiller)); + + if (pevInflictor) + { + if (pevInflictor == pKiller) + { + // If the inflictor is the killer, then it must be their current weapon doing the damage + CBasePlayer *pPlayer = reinterpret_cast(CBaseEntity::Instance(pKiller)); + + if (pPlayer && pPlayer->m_pActiveItem) + { + killer_weapon_name = pPlayer->m_pActiveItem->pszName(); + } + } + else + { + killer_weapon_name = STRING(pevInflictor->classname); // it's just that easy + } + } + } + else + killer_weapon_name = STRING(pevInflictor->classname); + + // strip the monster_* or weapon_* from the inflictor's classname + if (!Q_strncmp(killer_weapon_name, "weapon_", 7)) + killer_weapon_name += 7; + + else if (!Q_strncmp(killer_weapon_name, "monster_", 8)) + killer_weapon_name += 8; + + else if (!Q_strncmp(killer_weapon_name, "func_", 5)) + killer_weapon_name += 5; + + int iGotHeadshot = 0; + + if (pVictim->m_bHeadshotKilled) + iGotHeadshot = 1; + + if (TheTutor == NULL) + { + MESSAGE_BEGIN(MSG_ALL, gmsgDeathMsg); + WRITE_BYTE(killer_index); // the killer + WRITE_BYTE(ENTINDEX(pVictim->edict())); // the victim + WRITE_BYTE(iGotHeadshot); // is killed headshot + WRITE_STRING(killer_weapon_name); // what they were killed by (should this be a string?) + MESSAGE_END(); + } + + // replace the code names with the 'real' names + if (!Q_strcmp(killer_weapon_name, "egon")) + killer_weapon_name = gluon; + + else if (!Q_strcmp(killer_weapon_name, "gauss")) + killer_weapon_name = tau; + + if (pVictim->pev == pKiller) + { + // killed self + char *team = GetTeam(pVictim->m_iTeam); + + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" committed suicide with \"%s\"\n", + STRING(pVictim->pev->netname), + GETPLAYERUSERID(pVictim->edict()), + GETPLAYERAUTHID(pVictim->edict()), + team, + killer_weapon_name + ); + } + else if (pKiller->flags & FL_CLIENT) + { + CBasePlayer *pPlayer = reinterpret_cast(CBaseEntity::Instance(pKiller)); + + char *VictimTeam = GetTeam(pVictim->m_iTeam); + char *KillerTeam = GetTeam(pPlayer->m_iTeam); + + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"\n", + STRING(pKiller->netname), + GETPLAYERUSERID(ENT(pKiller)), + GETPLAYERAUTHID(ENT(pKiller)), + KillerTeam, + STRING(pVictim->pev->netname), + GETPLAYERUSERID(pVictim->edict()), + GETPLAYERAUTHID(pVictim->edict()), + VictimTeam, + killer_weapon_name + ); + } + else + { + // killed by the world + char *team = GetTeam(pVictim->m_iTeam); + + UTIL_LogPrintf + ( + "\"%s<%i><%s><%s>\" committed suicide with \"%s\" (world)\n", + STRING(pVictim->pev->netname), + GETPLAYERUSERID(pVictim->edict()), + GETPLAYERAUTHID(pVictim->edict()), + team, + killer_weapon_name + ); + } + + CheckWinConditions(); + + MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); + WRITE_BYTE(9); // command length in bytes + WRITE_BYTE(DRC_CMD_EVENT); // player killed + WRITE_SHORT(ENTINDEX(pVictim->edict())); // index number of primary entity + + if (pevInflictor) + WRITE_SHORT(ENTINDEX(ENT(pevInflictor))); // index number of secondary entity + else + WRITE_SHORT(ENTINDEX(ENT(pKiller))); // index number of secondary entity + + if (iGotHeadshot) + WRITE_LONG(9 | DRC_FLAG_DRAMATIC | DRC_FLAG_SLOWMOTION); + else + WRITE_LONG(7 | DRC_FLAG_DRAMATIC); // eventflags (priority and flags) + + MESSAGE_END(); } +// PlayerGotWeapon - player has grabbed a weapon that was +// sitting in the world + /* <112b2e> ../cstrike/dlls/multiplay_gamerules.cpp:3916 */ -void CHalfLifeMultiplay::PlayerGotWeapon_(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerGotWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { ; } +// FlWeaponRespawnTime - what is the time in the future +// at which this weapon may spawn? + /* <112b76> ../cstrike/dlls/multiplay_gamerules.cpp:3924 */ -NOBODY float CHalfLifeMultiplay::FlWeaponRespawnTime_(CBasePlayerItem *pWeapon) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlWeaponRespawnTime)(CBasePlayerItem *pWeapon) { + return gpGlobals->time + WEAPON_RESPAWN_TIME; } +// FlWeaponRespawnTime - Returns 0 if the weapon can respawn +// now, otherwise it returns the time at which it can try +// to spawn again. + /* <114058> ../cstrike/dlls/multiplay_gamerules.cpp:3938 */ -NOBODY float CHalfLifeMultiplay::FlWeaponTryRespawn_(CBasePlayerItem *pWeapon) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlWeaponTryRespawn)(CBasePlayerItem *pWeapon) { -// iFlags(CBasePlayerItem *const this); // 3940 -// FlWeaponTryRespawn(CHalfLifeMultiplay *const this, -// class CBasePlayerItem *pWeapon); // 3938 + if (pWeapon && pWeapon->m_iId && (pWeapon->iFlags() & ITEM_FLAG_LIMITINWORLD)) + { + if (NUMBER_OF_ENTITIES() < (gpGlobals->maxEntities - ENTITY_INTOLERANCE)) + return 0; + + // we're past the entity tolerance level, so delay the respawn + return FlWeaponRespawnTime(pWeapon); + } + + return 0; } /* <112bae> ../cstrike/dlls/multiplay_gamerules.cpp:3956 */ -NOBODY Vector CHalfLifeMultiplay::VecWeaponRespawnSpot_(CBasePlayerItem *pWeapon) +Vector CHalfLifeMultiplay::__MAKE_VHOOK(VecWeaponRespawnSpot)(CBasePlayerItem *pWeapon) { -// Vector(Vector *const this, -// const Vector &v); // 3958 + return pWeapon->pev->origin; } /* <112c11> ../cstrike/dlls/multiplay_gamerules.cpp:3965 */ -int CHalfLifeMultiplay::WeaponShouldRespawn_(CBasePlayerItem *pWeapon) +int CHalfLifeMultiplay::__MAKE_VHOOK(WeaponShouldRespawn)(CBasePlayerItem *pWeapon) { if (pWeapon->pev->spawnflags & SF_NORESPAWN) + { return GR_WEAPON_RESPAWN_NO; + } return GR_WEAPON_RESPAWN_YES; } /* <11322b> ../cstrike/dlls/multiplay_gamerules.cpp:3979 */ -NOBODY BOOL CHalfLifeMultiplay::CanHavePlayerItem_(CBasePlayer *pPlayer, CBasePlayerItem *pItem) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(CanHavePlayerItem)(CBasePlayer *pPlayer, CBasePlayerItem *pItem) { return CGameRules::CanHavePlayerItem(pPlayer, pItem); } /* <112c49> ../cstrike/dlls/multiplay_gamerules.cpp:3986 */ -BOOL CHalfLifeMultiplay::CanHaveItem_(CBasePlayer *pPlayer, CItem *pItem) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(CanHaveItem)(CBasePlayer *pPlayer, CItem *pItem) { return TRUE; } /* <112c91> ../cstrike/dlls/multiplay_gamerules.cpp:3993 */ -void CHalfLifeMultiplay::PlayerGotItem_(CBasePlayer *pPlayer, CItem *pItem) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerGotItem)(CBasePlayer *pPlayer, CItem *pItem) { ; } /* <112cd9> ../cstrike/dlls/multiplay_gamerules.cpp:3999 */ -int CHalfLifeMultiplay::ItemShouldRespawn_(CItem *pItem) +int CHalfLifeMultiplay::__MAKE_VHOOK(ItemShouldRespawn)(CItem *pItem) { if (pItem->pev->spawnflags & SF_NORESPAWN) + { return GR_ITEM_RESPAWN_NO; + } return GR_ITEM_RESPAWN_YES; } /* <112d11> ../cstrike/dlls/multiplay_gamerules.cpp:4013 */ -float CHalfLifeMultiplay::FlItemRespawnTime_(CItem *pItem) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlItemRespawnTime)(CItem *pItem) { return gpGlobals->time + ITEM_RESPAWN_TIME; } /* <112d49> ../cstrike/dlls/multiplay_gamerules.cpp:4022 */ -Vector CHalfLifeMultiplay::VecItemRespawnSpot_(CItem *pItem) +Vector CHalfLifeMultiplay::__MAKE_VHOOK(VecItemRespawnSpot)(CItem *pItem) { return pItem->pev->origin; } /* <112dac> ../cstrike/dlls/multiplay_gamerules.cpp:4029 */ -NOBODY void CHalfLifeMultiplay::PlayerGotAmmo_(CBasePlayer *pPlayer, char *szName, int iCount) +void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerGotAmmo)(CBasePlayer *pPlayer, char *szName, int iCount) { + ; } /* <112e04> ../cstrike/dlls/multiplay_gamerules.cpp:4035 */ -NOBODY BOOL CHalfLifeMultiplay::IsAllowedToSpawn_(CBaseEntity *pEntity) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(IsAllowedToSpawn)(CBaseEntity *pEntity) { + return TRUE; } /* <112e3c> ../cstrike/dlls/multiplay_gamerules.cpp:4045 */ -int CHalfLifeMultiplay::AmmoShouldRespawn_(CBasePlayerAmmo *pAmmo) +int CHalfLifeMultiplay::__MAKE_VHOOK(AmmoShouldRespawn)(CBasePlayerAmmo *pAmmo) { if (pAmmo->pev->spawnflags & SF_NORESPAWN) + { return GR_AMMO_RESPAWN_NO; + } return GR_AMMO_RESPAWN_YES; } /* <112e74> ../cstrike/dlls/multiplay_gamerules.cpp:4057 */ -float CHalfLifeMultiplay::FlAmmoRespawnTime_(CBasePlayerAmmo *pAmmo) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlAmmoRespawnTime)(CBasePlayerAmmo *pAmmo) { return gpGlobals->time + 20.0f; } /* <112eac> ../cstrike/dlls/multiplay_gamerules.cpp:4064 */ -Vector CHalfLifeMultiplay::VecAmmoRespawnSpot_(CBasePlayerAmmo *pAmmo) +Vector CHalfLifeMultiplay::__MAKE_VHOOK(VecAmmoRespawnSpot)(CBasePlayerAmmo *pAmmo) { return pAmmo->pev->origin; } /* <112f0f> ../cstrike/dlls/multiplay_gamerules.cpp:4071 */ -NOBODY float CHalfLifeMultiplay::FlHealthChargerRechargeTime_(void) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlHealthChargerRechargeTime)(void) { + return 60; } /* <112f37> ../cstrike/dlls/multiplay_gamerules.cpp:4077 */ -NOBODY float CHalfLifeMultiplay::FlHEVChargerRechargeTime_(void) +float CHalfLifeMultiplay::__MAKE_VHOOK(FlHEVChargerRechargeTime)(void) { + return 30; } /* <112f5f> ../cstrike/dlls/multiplay_gamerules.cpp:4084 */ -int CHalfLifeMultiplay::DeadPlayerWeapons_(CBasePlayer *pPlayer) +int CHalfLifeMultiplay::__MAKE_VHOOK(DeadPlayerWeapons)(CBasePlayer *pPlayer) { return GR_PLR_DROP_GUN_ACTIVE; } /* <112f97> ../cstrike/dlls/multiplay_gamerules.cpp:4091 */ -int CHalfLifeMultiplay::DeadPlayerAmmo_(CBasePlayer *pPlayer) +int CHalfLifeMultiplay::__MAKE_VHOOK(DeadPlayerAmmo)(CBasePlayer *pPlayer) { return GR_PLR_DROP_AMMO_ACTIVE; } /* <1131d6> ../cstrike/dlls/multiplay_gamerules.cpp:4096 */ -NOBODY edict_t *CHalfLifeMultiplay::GetPlayerSpawnSpot_(CBasePlayer *pPlayer) +edict_t *CHalfLifeMultiplay::__MAKE_VHOOK(GetPlayerSpawnSpot)(CBasePlayer *pPlayer) { -// { -// edict_t *pentSpawnSpot; // 4098 -// } + edict_t *pentSpawnSpot = CGameRules::GetPlayerSpawnSpot(pPlayer); + + if (IsMultiplayer()) + { + if (pentSpawnSpot->v.target) + { + FireTargets(STRING(pentSpawnSpot->v.target), pPlayer, pPlayer, USE_TOGGLE, 0); + } + } + + return pentSpawnSpot; } /* <116c24> ../cstrike/dlls/multiplay_gamerules.cpp:4110 */ -NOBODY int CHalfLifeMultiplay::PlayerRelationship_(CBasePlayer *pPlayer, CBaseEntity *pTarget) +int CHalfLifeMultiplay::__MAKE_VHOOK(PlayerRelationship)(CBasePlayer *pPlayer, CBaseEntity *pTarget) { -// { -// class CBasePlayer *player; // 4118 -// class CBasePlayer *target; // 4119 -// } + if (!pPlayer || !pTarget) + { + return GR_NOTTEAMMATE; + } + + if (!pTarget->IsPlayer()) + { + return GR_NOTTEAMMATE; + } + + CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev); + CBasePlayer *target = GetClassPtr((CBasePlayer *)pTarget->pev); + + if (player->m_iTeam != target->m_iTeam) + { + return GR_NOTTEAMMATE; + } + + return GR_TEAMMATE; } /* <112fcf> ../cstrike/dlls/multiplay_gamerules.cpp:4128 */ -BOOL CHalfLifeMultiplay::FAllowFlashlight_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(FAllowFlashlight)(void) { static cvar_t *mp_flashlight = NULL; @@ -1483,38 +3805,102 @@ BOOL CHalfLifeMultiplay::FAllowFlashlight_(void) } /* <113012> ../cstrike/dlls/multiplay_gamerules.cpp:4145 */ -NOBODY BOOL CHalfLifeMultiplay::FAllowMonsters_(void) +BOOL CHalfLifeMultiplay::__MAKE_VHOOK(FAllowMonsters)(void) { + return CVAR_GET_FLOAT("mp_allowmonsters") != 0; } /* <114155> ../cstrike/dlls/multiplay_gamerules.cpp:4156 */ -NOBODY void CHalfLifeMultiplay::GoToIntermission_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(GoToIntermission)(void) { -// { -// class CHalfLifeMultiplay *mp; // 4161 -// int time; // 4200 -// } -// GoToIntermission(CHalfLifeMultiplay *const this); // 4156 -} + if (g_fGameOver) + return; + + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp != NULL) + { + UTIL_LogPrintf("Team \"CT\" scored \"%i\" with \"%i\" players\n", mp->m_iNumCTWins, mp->m_iNumCT); + UTIL_LogPrintf("Team \"TERRORIST\" scored \"%i\" with \"%i\" players\n", mp->m_iNumTerroristWins, mp->m_iNumTerrorist); + } -NOBODY void CHalfLifeMultiplay::ServerDeactivate_(void) -{ if (IsCareer()) { - CVAR_SET_FLOAT("pausable", 0); - CVAR_SET_FLOAT("mp_windifference", 1.0); - UTIL_LogPrintf("Career End\n"); + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer); + WRITE_STRING("MATCH"); + WRITE_LONG(m_iNumCTWins); + WRITE_LONG(m_iNumTerroristWins); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ALL, gmsgCZCareerHUD); + WRITE_STRING("MATCH"); + WRITE_LONG(m_iNumCTWins); + WRITE_LONG(m_iNumTerroristWins); + WRITE_BYTE(m_iCareerMatchWins); + WRITE_BYTE(m_iRoundWinDifference); + WRITE_BYTE(m_iRoundWinStatus); + MESSAGE_END(); + + UTIL_LogPrintf + ( + "Career Match %d %d %d %d\n", + m_iRoundWinStatus, + m_iNumCTWins, + m_iNumTerroristWins, + TheCareerTasks->AreAllTasksComplete() + ); } + + MESSAGE_BEGIN(MSG_ALL, SVC_INTERMISSION); + MESSAGE_END(); + + if (IsCareer()) + { + SERVER_COMMAND("setpause\n"); + } + + int time = (int)CVAR_GET_FLOAT("mp_chattime"); + + if (time < 1) + CVAR_SET_STRING("mp_chattime", "1"); + + else if (time > MAX_INTERMISSION_TIME) + CVAR_SET_STRING("mp_chattime", UTIL_dtos1(MAX_INTERMISSION_TIME)); + + m_flIntermissionEndTime = gpGlobals->time + (int)mp_chattime.value; + m_flIntermissionStartTime = gpGlobals->time; + + g_fGameOver = TRUE; + m_iEndIntermissionButtonHit = FALSE; + m_iSpawnPointCount_Terrorist = 0; + m_iSpawnPointCount_CT = 0; + m_bLevelInitialized = false; } +// Clean up memory used by mapcycle when switching it + /* <115c98> ../cstrike/dlls/multiplay_gamerules.cpp:4241 */ -NOBODY void DestroyMapCycle(mapcycle_t *cycle) +void DestroyMapCycle(mapcycle_t *cycle) { -// { -// mapcycle_item_t *p; // 4243 -// mapcycle_item_t *n; // 4243 -// mapcycle_item_t *start; // 4243 -// } + mapcycle_item_t *p, *n, *start; + p = cycle->items; + + if (p != NULL) + { + start = p; + p = p->next; + while (p != start) + { + n = p->next; + delete p; + p = n; + } + + delete cycle->items; + } + + cycle->items = NULL; + cycle->next_item = NULL; } /* <115d30> ../cstrike/dlls/multiplay_gamerules.cpp:4271 */ @@ -1570,7 +3956,7 @@ skipwhite: if (c == '\"' || !c) { - mp_com_token[len] = '\0'; + mp_com_token[ len ] = '\0'; return data; } @@ -1599,12 +3985,12 @@ skipwhite: } while (c > 32); - mp_com_token[len] = '\0'; + mp_com_token[ len ] = '\0'; return data; } /* <115db1> ../cstrike/dlls/multiplay_gamerules.cpp:4360 */ -NOXREF int MP_COM_TokenWaiting(char *buffer) +int MP_COM_TokenWaiting(char *buffer) { char *p; @@ -1621,154 +4007,545 @@ NOXREF int MP_COM_TokenWaiting(char *buffer) } /* <115e11> ../cstrike/dlls/multiplay_gamerules.cpp:4384 */ -NOBODY int ReloadMapCycleFile(char *filename, mapcycle_t *cycle) +int ReloadMapCycleFile(char *filename, mapcycle_t *cycle) { -// { -// char szBuffer; // 4386 -// char szMap; // 4387 -// int length; // 4388 -// char *pFileList; // 4389 -// char *aFileList; // 4390 -// int hasbuffer; // 4391 -// class mapcycle_item_s *item; // 4392 -// class mapcycle_item_s *newlist; // 4392 -// class mapcycle_item_s *next; // 4392 -// MP_COM_TokenWaiting(char *buffer); // 4410 -// { -// char *s; // 4424 -// atoi(const char *__nptr); // 4440 -// atoi(const char *__nptr); // 4447 -// } -// } + char szBuffer[ MAX_RULE_BUFFER ]; + char szMap[ 32 ]; + int length; + char *pFileList; + char *aFileList = pFileList = (char *)LOAD_FILE_FOR_ME(filename, &length); + int hasbuffer; + mapcycle_item_s *item, *newlist = NULL, *next; + + if (pFileList && length) + { + // the first map name in the file becomes the default + while (true) + { + hasbuffer = 0; + Q_memset(szBuffer, 0, sizeof(szBuffer)); + + pFileList = MP_COM_Parse(pFileList); + + if (Q_strlen(mp_com_token) <= 0) + break; + + Q_strcpy(szMap, mp_com_token); + + // Any more tokens on this line? + if (MP_COM_TokenWaiting(pFileList)) + { + pFileList = MP_COM_Parse(pFileList); + if (Q_strlen(mp_com_token) > 0) + { + hasbuffer = 1; + Q_strcpy(szBuffer, mp_com_token); + } + } + + // Check map + if (IS_MAP_VALID(szMap)) + { + // Create entry + char *s; + + item = new mapcycle_item_s; + + Q_strcpy(item->mapname, szMap); + + item->minplayers = 0; + item->maxplayers = 0; + + Q_memset(item->rulebuffer, 0, sizeof(item->rulebuffer)); + + if (hasbuffer) + { + s = GET_KEY_VALUE(szBuffer, "minplayers"); + + if (s && s[0] != '\0') + { + item->minplayers = Q_atoi(s); + item->minplayers = _max(item->minplayers, 0); + item->minplayers = _min(item->minplayers, gpGlobals->maxClients); + } + + s = GET_KEY_VALUE(szBuffer, "maxplayers"); + if (s && s[0] != '\0') + { + item->maxplayers = Q_atoi(s); + item->maxplayers = _max(item->maxplayers, 0); + item->maxplayers = _min(item->maxplayers, gpGlobals->maxClients); + } + + // Remove keys + REMOVE_KEY_VALUE(szBuffer, "minplayers"); + REMOVE_KEY_VALUE(szBuffer, "maxplayers"); + + Q_strcpy(item->rulebuffer, szBuffer); + } + + item->next = cycle->items; + cycle->items = item; + } + else + ALERT(at_console, "Skipping %s from mapcycle, not a valid map\n", szMap); + } + + FREE_FILE(aFileList); + } + + // Fixup circular list pointer + item = cycle->items; + + // Reverse it to get original order + while (item) + { + next = item->next; + item->next = newlist; + newlist = item; + item = next; + } + + cycle->items = newlist; + item = cycle->items; + + // Didn't parse anything + if (!item) + { + return 0; + } + + while (item->next != NULL) + { + item = item->next; + } + + item->next = cycle->items; + cycle->next_item = item->next; + + return 1; } +// Determine the current # of active players on the server for map cycling logic + /* <115f76> ../cstrike/dlls/multiplay_gamerules.cpp:4510 */ -NOBODY int CountPlayers(void) +int CountPlayers(void) { -// { -// int num; // 4512 -// { -// int i; // 4514 -// { -// class CBaseEntity *pEnt; // 4516 -// } -// } -// } + int num = 0; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBaseEntity *pEnt = UTIL_PlayerByIndex(i); + + if (pEnt) + { + num = num + 1; + } + } + + return num; } +// Parse commands/key value pairs to issue right after map xxx command is issued on server level transition + /* <116002> ../cstrike/dlls/multiplay_gamerules.cpp:4535 */ -NOBODY void ExtractCommandString(char *s, char *szCommand) +void ExtractCommandString(char *s, char *szCommand) { -// { -// char pkey; // 4538 -// char value; // 4539 -// char *o; // 4541 -// } + // Now make rules happen + char pkey[512]; + char value[512]; // use two buffers so compares + + // work without stomping on each other + char *o; + + if (*s == '\\') + s++; + + while (true) + { + o = pkey; + while (*s != '\\') + { + if (!*s) + { + return; + } + + *o++ = *s++; + } + + *o = '\0'; + s++; + + o = value; + + while (*s != '\\' && *s) + { + if (!*s) + { + return; + } + + *o++ = *s++; + } + + *o = '\0'; + + Q_strcat(szCommand, pkey); + if (Q_strlen(value) > 0) + { + Q_strcat(szCommand, " "); + Q_strcat(szCommand, value); + } + Q_strcat(szCommand, "\n"); + + if (!*s) + { + return; + } + + s++; + } } /* <116b52> ../cstrike/dlls/multiplay_gamerules.cpp:4582 */ -NOBODY void CHalfLifeMultiplay::ResetAllMapVotes(void) +void CHalfLifeMultiplay::ResetAllMapVotes(void) { -// { -// int j; // 4584 -// class CBaseEntity *pTempEntity; // 4585 -// class CBasePlayer *pTempPlayer; // 4586 -// } + CBaseEntity *pTempEntity = NULL; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (pTempPlayer->m_iTeam != UNASSIGNED) + { + pTempPlayer->m_iMapVote = 0; + } + } + + for (int j = 0; j < MAX_VOTE_MAPS; j++) + m_iMapVotes[j] = 0; } /* <11624e> ../cstrike/dlls/multiplay_gamerules.cpp:4608 */ -NOBODY int GetMapCount(void) +int GetMapCount(void) { -// { -// mapcycle_t mapcycle2; // 4610 -// char *mapcfile; // 4611 -// class mapcycle_item_s *item; // 4612 -// int iCount; // 4613 -// int iDone; // 4613 -// DestroyMapCycle(mapcycle_t *cycle); // 4615 -// } + static mapcycle_t mapcycle2; + char *mapcfile = (char *)CVAR_GET_STRING("mapcyclefile"); + + DestroyMapCycle(&mapcycle2); + ReloadMapCycleFile(mapcfile, &mapcycle2); + + int iCount = 0, iDone = 0; + for (mapcycle_item_s *item = mapcycle2.next_item; item != NULL && iDone != 1; item = item->next) + { + if (item == mapcycle2.next_item) + iDone = 1; + + ++iCount; + } + + return iCount; } /* <1187d2> ../cstrike/dlls/multiplay_gamerules.cpp:4629 */ -NOBODY void CHalfLifeMultiplay::DisplayMaps(CBasePlayer *player, int iVote) +void CHalfLifeMultiplay::DisplayMaps(CBasePlayer *player, int iVote) { -// { -// mapcycle_t mapcycle2; // 4631 -// char *mapcfile; // 4632 -// class mapcycle_item_s *item; // 4633 -// int iCount; // 4634 -// char *pszNewMap; // 4635 -// int done; // 4640 -// DestroyMapCycle(mapcycle_t *cycle); // 4637 -// ResetAllMapVotes(CHalfLifeMultiplay *const this); // 4691 -// } + static mapcycle_t mapcycle2; + char *mapcfile = (char *)CVAR_GET_STRING("mapcyclefile"); + char *pszNewMap = NULL; + + int iCount = 0, done = 0; + + DestroyMapCycle(&mapcycle2); + ReloadMapCycleFile(mapcfile, &mapcycle2); + + mapcycle_item_s *item = mapcycle2.next_item; + while (!done && item != NULL) + { + if (item->next == mapcycle2.next_item) + done = 1; + + ++iCount; + + if (player != NULL) + { + if (m_iMapVotes[iCount] == 1) + { + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Vote", UTIL_dtos1(iCount), item->mapname, UTIL_dtos2(1)); + } + else + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Votes", UTIL_dtos1(iCount), item->mapname, UTIL_dtos2(m_iMapVotes[iCount])); + } + + if (iCount == iVote) + { + pszNewMap = item->mapname; + } + + item = item->next; + } + + if (!pszNewMap || !iVote) + { + return; + } + + if (Q_strcmp(pszNewMap, STRING(gpGlobals->mapname))) + { + CHANGE_LEVEL(pszNewMap, NULL); + return; + } + + if (timelimit.value) + { + timelimit.value += 30; + UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Map_Vote_Extend"); + } + + ResetAllMapVotes(); } /* <11895b> ../cstrike/dlls/multiplay_gamerules.cpp:4702 */ -NOBODY void CHalfLifeMultiplay::ProcessMapVote(CBasePlayer *player, int iVote) +void CHalfLifeMultiplay::ProcessMapVote(CBasePlayer *player, int iVote) { -// { -// class CBaseEntity *pTempEntity; // 4704 -// class CBasePlayer *pTempPlayer; // 4705 -// int iValidVotes; // 4706 -// int iRequiredVotes; // 4707 -// int iNumPlayers; // 4708 -// float ratio; // 4730 -// edict(CBaseEntity *const this); // 4712 -// FNullEnt(const edict_t *pent); // 4712 -// } + CBaseEntity *pTempEntity = NULL; + + int iValidVotes = 0, iNumPlayers = 0; + + while ((pTempEntity = UTIL_FindEntityByClassname(pTempEntity, "player")) != NULL) + { + if (FNullEnt(pTempEntity->edict())) + break; + + CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pTempEntity->pev); + + if (pTempPlayer->m_iTeam != UNASSIGNED) + { + iNumPlayers++; + + if (pTempPlayer->m_iMapVote = iVote) + iValidVotes++; + } + } + + m_iMapVotes[iVote] = iValidVotes; + + float ratio = mapvoteratio.value; + if (mapvoteratio.value > 1) + { + ratio = 1; + CVAR_SET_STRING("mp_mapvoteratio", "1.0"); + } + else if (mapvoteratio.value < 0.35) + { + ratio = 0.35; + CVAR_SET_STRING("mp_mapvoteratio", "0.35"); + } + + int iRequiredVotes = 2; + if (iNumPlayers > 2) + { + iRequiredVotes = (int)(iNumPlayers * ratio + 0.5); + } + + if (iValidVotes < iRequiredVotes) + { + DisplayMaps(player, 0); + ClientPrint(player->pev, HUD_PRINTCONSOLE, "#Game_required_votes", UTIL_dtos1(iRequiredVotes)); + } + else + DisplayMaps(NULL, iVote); } +// Server is changing to a new level, check mapcycle.txt for map name and setup info + /* <116089> ../cstrike/dlls/multiplay_gamerules.cpp:4773 */ -NOBODY void CHalfLifeMultiplay::ChangeLevel_(void) +void CHalfLifeMultiplay::__MAKE_VHOOK(ChangeLevel)(void) { -// { -// char szPreviousMapCycleFile; // 4775 -// mapcycle_t mapcycle; // 4776 -// char szNextMap; // 4778 -// char szFirstMapInList; // 4779 -// char szCommands; // 4780 -// char szRules; // 4781 -// int minplayers; // 4782 -// int maxplayers; // 4782 -// int curplayers; // 4785 -// BOOL do_cycle; // 4786 -// char *mapcfile; // 4789 -// CountPlayers(void); // 4795 -// { -// BOOL keeplooking; // 4813 -// BOOL found; // 4814 -// class mapcycle_item_s *item; // 4815 -// } -// DestroyMapCycle(mapcycle_t *cycle); // 4802 -// } + static char szPreviousMapCycleFile[256]; + static mapcycle_t mapcycle; + + char szNextMap[32]; + char szFirstMapInList[32]; + char szCommands[1500]; + char szRules[1500]; + int minplayers = 0, maxplayers = 0; + + // the absolute default level is hldm1 + Q_strcpy(szFirstMapInList, "hldm1"); + + int curplayers; + BOOL do_cycle = TRUE; + + // find the map to change to + char *mapcfile = (char *)CVAR_GET_STRING("mapcyclefile"); + assert(mapcfile != NULL); + + szCommands[0] = '\0'; + szRules[0] = '\0'; + + curplayers = CountPlayers(); + + // Has the map cycle filename changed? + if (Q_stricmp(mapcfile, szPreviousMapCycleFile)) + { + Q_strcpy(szPreviousMapCycleFile, mapcfile); + + DestroyMapCycle(&mapcycle); + + if (!ReloadMapCycleFile(mapcfile, &mapcycle) || !mapcycle.items) + { + ALERT(at_console, "Unable to load map cycle file %s\n", mapcfile); + do_cycle = FALSE; + } + } + + if (do_cycle && mapcycle.items) + { + BOOL keeplooking = FALSE; + BOOL found = FALSE; + mapcycle_item_s *item; + + // Assume current map + Q_strcpy(szNextMap, STRING(gpGlobals->mapname)); + Q_strcpy(szFirstMapInList, STRING(gpGlobals->mapname)); + + // Traverse list + for (item = mapcycle.next_item; item->next != mapcycle.next_item; item = item->next) + { + keeplooking = FALSE; + + assert(item != NULL); + + if (item->minplayers != 0) + { + if (curplayers >= item->minplayers) + { + found = TRUE; + minplayers = item->minplayers; + } + else + { + keeplooking = TRUE; + } + } + + if (item->maxplayers != 0) + { + if (curplayers <= item->maxplayers) + { + found = TRUE; + maxplayers = item->maxplayers; + } + else + { + keeplooking = TRUE; + } + } + + if (keeplooking) + { + continue; + } + + found = TRUE; + break; + } + + if (!found) + { + item = mapcycle.next_item; + } + + // Increment next item pointer + mapcycle.next_item = item->next; + + // Perform logic on current item + Q_strcpy(szNextMap, item->mapname); + ExtractCommandString(item->rulebuffer, szCommands); + Q_strcpy(szRules, item->rulebuffer); + } + + if (!IS_MAP_VALID(szNextMap)) + { + Q_strcpy(szNextMap, szFirstMapInList); + } + + g_fGameOver = TRUE; + + ALERT(at_console, "CHANGE LEVEL: %s\n", szNextMap); + if (minplayers || maxplayers) + { + ALERT(at_console, "PLAYER COUNT: min %i max %i current %i\n", minplayers, maxplayers, curplayers); + } + + if (Q_strlen(szRules) > 0) + { + ALERT(at_console, "RULES: %s\n", szRules); + } + + CHANGE_LEVEL(szNextMap, NULL); + if (Q_strlen(szCommands) > 0) + { + SERVER_COMMAND(szCommands); + } } /* <116317> ../cstrike/dlls/multiplay_gamerules.cpp:4903 */ -NOBODY void CHalfLifeMultiplay::SendMOTDToClient(edict_t *client) +void CHalfLifeMultiplay::SendMOTDToClient(edict_t *client) { -// { -// int length; // 4906 -// int char_count; // 4906 -// char *pFileList; // 4907 -// char *aFileList; // 4908 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 4911 -// { -// char chunk; // 4920 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 4938 -// } -// } + // read from the MOTD.txt file + int length, char_count = 0; + char *pFileList; + char *aFileList = pFileList = (char *)LOAD_FILE_FOR_ME((char *)CVAR_GET_STRING("motdfile"), &length); + + // send the server name + MESSAGE_BEGIN(MSG_ONE, gmsgServerName, NULL, client); + WRITE_STRING(CVAR_GET_STRING("hostname")); + MESSAGE_END(); + + // Send the message of the day + // read it chunk-by-chunk, and send it in parts + while (pFileList && *pFileList && char_count < MAX_MOTD_LENGTH) + { + char chunk[MAX_MOTD_CHUNK + 1]; + + if (Q_strlen(pFileList) < sizeof(chunk)) + { + Q_strcpy(chunk, pFileList); + } + else + { + Q_strncpy(chunk, pFileList, sizeof(chunk) - 1); + // Q_strncpy doesn't always append the null terminator + chunk[sizeof(chunk) - 1] = '\0'; + } + + char_count += Q_strlen(chunk); + + if (char_count < MAX_MOTD_LENGTH) + pFileList = aFileList + char_count; + else + *pFileList = '\0'; + + MESSAGE_BEGIN(MSG_ONE, gmsgMOTD, NULL, client); + WRITE_BYTE((*pFileList != '\0') ? FALSE : TRUE); // FALSE means there is still more message to come + WRITE_STRING(chunk); + MESSAGE_END(); + } + + FREE_FILE(aFileList); } -NOBODY void CHalfLifeMultiplay::ClientUserInfoChanged_(CBasePlayer *pPlayer, char *infobuffer) +/* <1181ac> ../cstrike/dlls/multiplay_gamerules.cpp:4961 */ +void CHalfLifeMultiplay::__MAKE_VHOOK(ClientUserInfoChanged)(CBasePlayer *pPlayer, char *infobuffer) { - + pPlayer->SetPlayerModel(pPlayer->m_bHasC4); + pPlayer->SetPrefsFromUserinfo(infobuffer); } #ifdef HOOK_GAMEDLL @@ -1783,6 +4560,11 @@ void CMapInfo::KeyValue(KeyValueData *pkvd) KeyValue_(pkvd); } +bool CCStrikeGameMgrHelper::CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender) +{ + return CanPlayerHearPlayer_(pListener, pSender); +} + void CHalfLifeMultiplay::RefreshSkillData(void) { RefreshSkillData_(); diff --git a/regamedll/dlls/nodes.h b/regamedll/dlls/nodes.h index f2003b76..03a52ede 100644 --- a/regamedll/dlls/nodes.h +++ b/regamedll/dlls/nodes.h @@ -49,14 +49,14 @@ public: class CGraph { public: - NOBODY void InitGraph(void); - NOBODY int AllocNodes(void); - NOBODY int CheckNODFile(char *szMapName); - NOBODY int FLoadGraph(char *szMapName); - NOBODY int FSetGraphPointers(void); + void InitGraph(void); + int AllocNodes(void); + int CheckNODFile(char *szMapName); + int FLoadGraph(char *szMapName); + int FSetGraphPointers(void); void ShowNodeConnections(int iNode); - NOBODY int FindNearestNode(const Vector &vecOrigin, CBaseEntity *pEntity); - NOBODY int FindNearestNode(const Vector &vecOrigin, int afNodeTypes); + int FindNearestNode(const Vector &vecOrigin, CBaseEntity *pEntity); + int FindNearestNode(const Vector &vecOrigin, int afNodeTypes); public: BOOL m_fGraphPresent; BOOL m_fGraphPointersSet; diff --git a/regamedll/dlls/pathcorner.cpp b/regamedll/dlls/pathcorner.cpp index d7cc2c31..2510eec9 100644 --- a/regamedll/dlls/pathcorner.cpp +++ b/regamedll/dlls/pathcorner.cpp @@ -33,7 +33,7 @@ LINK_ENTITY_TO_CLASS(path_corner, CPathCorner); IMPLEMENT_SAVERESTORE(CPathCorner, CPointEntity); /* <122697> ../cstrike/dlls/pathcorner.cpp:54 */ -NOBODY void CPathCorner::KeyValue_(KeyValueData *pkvd) +NOBODY void CPathCorner::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 56 @@ -44,7 +44,7 @@ NOBODY void CPathCorner::KeyValue_(KeyValueData *pkvd) } /* <122325> ../cstrike/dlls/pathcorner.cpp:66 */ -NOBODY void CPathCorner::Spawn_(void) +NOBODY void CPathCorner::__MAKE_VHOOK(Spawn)(void) { } @@ -55,7 +55,7 @@ IMPLEMENT_SAVERESTORE(CPathTrack, CBaseEntity); LINK_ENTITY_TO_CLASS(path_track, CPathTrack); /* <122602> ../cstrike/dlls/pathcorner.cpp:86 */ -NOBODY void CPathTrack::KeyValue_(KeyValueData *pkvd) +NOBODY void CPathTrack::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 88 @@ -66,7 +66,7 @@ NOBODY void CPathTrack::KeyValue_(KeyValueData *pkvd) } /* <122433> ../cstrike/dlls/pathcorner.cpp:97 */ -NOBODY void CPathTrack::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CPathTrack::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // int on; // 99 @@ -99,7 +99,7 @@ NOBODY void CPathTrack::Link(void) } /* <12239a> ../cstrike/dlls/pathcorner.cpp:165 */ -NOBODY void CPathTrack::Spawn_(void) +NOBODY void CPathTrack::__MAKE_VHOOK(Spawn)(void) { // Vector(Vector::Spawn(// float X, // float Y, @@ -111,7 +111,7 @@ NOBODY void CPathTrack::Spawn_(void) } /* <122c76> ../cstrike/dlls/pathcorner.cpp:180 */ -NOBODY void CPathTrack::Activate_(void) +NOBODY void CPathTrack::__MAKE_VHOOK(Activate)(void) { } diff --git a/regamedll/dlls/plane.cpp b/regamedll/dlls/plane.cpp index 85c77c18..0cdff259 100644 --- a/regamedll/dlls/plane.cpp +++ b/regamedll/dlls/plane.cpp @@ -1,29 +1,33 @@ #include "precompiled.h" /* <1262b3> ../cstrike/dlls/plane.cpp:24 */ -NOBODY CPlane::CPlane(void) +CPlane::CPlane(void) { m_fInitialized = FALSE; } /* <1262d4> ../cstrike/dlls/plane.cpp:33 */ -NOBODY void CPlane::InitializePlane(const Vector &vecNormal, const Vector &vecPoint) +NOXREF void CPlane::InitializePlane(const Vector &vecNormal, const Vector &vecPoint) { m_vecNormal = vecNormal; - m_flDist = DotProduct(m_vecNormal, vecPoint); m_fInitialized = TRUE; + m_flDist = DotProduct(m_vecNormal, vecPoint); } /* <126343> ../cstrike/dlls/plane.cpp:45 */ -NOBODY BOOL CPlane::PointInFront(const Vector &vecPoint) +NOXREF BOOL CPlane::PointInFront(const Vector &vecPoint) { if (!m_fInitialized) + { return FALSE; + } float flFace = DotProduct(m_vecNormal, vecPoint) - m_flDist; if (flFace >= 0.0f) + { return TRUE; + } return FALSE; } diff --git a/regamedll/dlls/plane.h b/regamedll/dlls/plane.h index 595a4663..1050e1e7 100644 --- a/regamedll/dlls/plane.h +++ b/regamedll/dlls/plane.h @@ -36,11 +36,12 @@ class CPlane { public: - NOBODY CPlane(void); + CPlane(void); - NOBODY void InitializePlane(const Vector &vecNormal, const Vector &vecPoint); - NOBODY BOOL PointInFront(const Vector &vecPoint); + NOXREF void InitializePlane(const Vector &vecNormal, const Vector &vecPoint); + NOXREF BOOL PointInFront(const Vector &vecPoint); +private: Vector m_vecNormal; float m_flDist; BOOL m_fInitialized; diff --git a/regamedll/dlls/plats.cpp b/regamedll/dlls/plats.cpp index 2ba4aa8b..10385972 100644 --- a/regamedll/dlls/plats.cpp +++ b/regamedll/dlls/plats.cpp @@ -74,7 +74,7 @@ TYPEDESCRIPTION (*CGunTarget::pm_SaveData)[1]; IMPLEMENT_SAVERESTORE(CBasePlatTrain, CBaseToggle); /* <12ea9b> ../cstrike/dlls/plats.cpp:61 */ -NOBODY void CBasePlatTrain::KeyValue_(KeyValueData *pkvd) +NOBODY void CBasePlatTrain::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 73 @@ -97,7 +97,7 @@ NOBODY void CBasePlatTrain::KeyValue_(KeyValueData *pkvd) #define noiseArrived noise1 /* <12d675> ../cstrike/dlls/plats.cpp:105 */ -NOBODY void CBasePlatTrain::Precache_(void) +NOBODY void CBasePlatTrain::__MAKE_VHOOK(Precache)(void) { } @@ -131,13 +131,13 @@ NOBODY void CFuncPlat::Setup(void) } /* <13088e> ../cstrike/dlls/plats.cpp:309 */ -NOBODY void CFuncPlat::Precache_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(Precache)(void) { // PlatSpawnInsideTrigger(entvars_t *pevPlatform); // 315 } /* <130757> ../cstrike/dlls/plats.cpp:319 */ -NOBODY void CFuncPlat::Spawn_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(Spawn)(void) { // Spawn(CFuncPlat *const this); // 319 } @@ -161,7 +161,7 @@ NOBODY void CPlatTrigger::SpawnInsideTrigger(CFuncPlat *pPlatform) } /* <12e7e7> ../cstrike/dlls/plats.cpp:380 */ -NOBODY void CPlatTrigger::Touch_(CBaseEntity *pOther) +NOBODY void CPlatTrigger::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // entvars_t *pevToucher; // 383 @@ -186,7 +186,7 @@ NOBODY void CFuncPlat::PlatUse(CBaseEntity *pActivator, CBaseEntity *pCaller, US } /* <12e49b> ../cstrike/dlls/plats.cpp:431 */ -NOBODY void CFuncPlat::GoDown_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(GoDown)(void) { // EMIT_SOUND(edict_t *entity, // int channel, @@ -198,7 +198,7 @@ NOBODY void CFuncPlat::GoDown_(void) } /* <12f381> ../cstrike/dlls/plats.cpp:446 */ -NOBODY void CFuncPlat::HitBottom_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(HitBottom)(void) { // EMIT_SOUND(edict_t *entity, // int channel, @@ -211,7 +211,7 @@ NOBODY void CFuncPlat::HitBottom_(void) } /* <12e52d> ../cstrike/dlls/plats.cpp:462 */ -NOBODY void CFuncPlat::GoUp_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(GoUp)(void) { // EMIT_SOUND(edict_t *entity, // int channel, @@ -223,7 +223,7 @@ NOBODY void CFuncPlat::GoUp_(void) } /* <12f452> ../cstrike/dlls/plats.cpp:477 */ -NOBODY void CFuncPlat::HitTop_(void) +NOBODY void CFuncPlat::__MAKE_VHOOK(HitTop)(void) { // STOP_SOUND(edict_t *entity, // int channel, @@ -236,7 +236,7 @@ NOBODY void CFuncPlat::HitTop_(void) } /* <12f524> ../cstrike/dlls/plats.cpp:497 */ -NOBODY void CFuncPlat::Blocked_(CBaseEntity *pOther) +NOBODY void CFuncPlat::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { // STOP_SOUND(edict_t *entity, // int channel, @@ -258,32 +258,32 @@ NOBODY void CFuncPlatRot::SetupRotation(void) } /* <130bc4> ../cstrike/dlls/plats.cpp:563 */ -NOBODY void CFuncPlatRot::Spawn_(void) +NOBODY void CFuncPlatRot::__MAKE_VHOOK(Spawn)(void) { // Spawn(CFuncPlat *const this); // 565 } /* <12fe63> ../cstrike/dlls/plats.cpp:569 */ -NOBODY void CFuncPlatRot::GoDown_(void) +NOBODY void CFuncPlatRot::__MAKE_VHOOK(GoDown)(void) { // RotMove(CFuncPlatRot::GoDown(// Vector &destAngle, // float time); // 572 } /* <12f430> ../cstrike/dlls/plats.cpp:579 */ -NOBODY void CFuncPlatRot::HitBottom_(void) +NOBODY void CFuncPlatRot::__MAKE_VHOOK(HitBottom)(void) { } /* <12fdad> ../cstrike/dlls/plats.cpp:590 */ -NOBODY void CFuncPlatRot::GoUp_(void) +NOBODY void CFuncPlatRot::__MAKE_VHOOK(GoUp)(void) { // RotMove(CFuncPlatRot::GoUp(// Vector &destAngle, // float time); // 593 } /* <12f502> ../cstrike/dlls/plats.cpp:600 */ -NOBODY void CFuncPlatRot::HitTop_(void) +NOBODY void CFuncPlatRot::__MAKE_VHOOK(HitTop)(void) { } @@ -306,7 +306,7 @@ LINK_ENTITY_TO_CLASS(func_train, CFuncTrain); IMPLEMENT_SAVERESTORE(CFuncTrain, CBasePlatTrain); /* <130390> ../cstrike/dlls/plats.cpp:668 */ -NOBODY void CFuncTrain::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTrain::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 670 @@ -317,7 +317,7 @@ NOBODY void CFuncTrain::KeyValue_(KeyValueData *pkvd) } /* <12de63> ../cstrike/dlls/plats.cpp:679 */ -NOBODY void CFuncTrain::Blocked_(CBaseEntity *pOther) +NOBODY void CFuncTrain::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { // Blocked(CFuncTrain *const this, // class CBaseEntity *pOther); // 679 @@ -325,7 +325,7 @@ NOBODY void CFuncTrain::Blocked_(CBaseEntity *pOther) /* <12fa23> ../cstrike/dlls/plats.cpp:691 */ -NOBODY void CFuncTrain::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTrain::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // EMIT_SOUND(edict_t *entity, // int channel, @@ -393,7 +393,7 @@ NOBODY void CFuncTrain::Next(void) } /* <12e1fd> ../cstrike/dlls/plats.cpp:818 */ -NOBODY void CFuncTrain::Activate_(void) +NOBODY void CFuncTrain::__MAKE_VHOOK(Activate)(void) { // { // entvars_t *pevTarg; // 824 @@ -402,22 +402,22 @@ NOBODY void CFuncTrain::Activate_(void) } /* <12dcad> ../cstrike/dlls/plats.cpp:852 */ -NOBODY void CFuncTrain::Spawn_(void) +NOBODY void CFuncTrain::__MAKE_VHOOK(Spawn)(void) { } /* <12dab7> ../cstrike/dlls/plats.cpp:886 */ -NOBODY void CFuncTrain::Restart_(void) +NOBODY void CFuncTrain::__MAKE_VHOOK(Restart)(void) { } /* <12d734> ../cstrike/dlls/plats.cpp:907 */ -NOBODY void CFuncTrain::Precache_(void) +NOBODY void CFuncTrain::__MAKE_VHOOK(Precache)(void) { } /* <12e166> ../cstrike/dlls/plats.cpp:913 */ -NOBODY void CFuncTrain::OverrideReset_(void) +NOBODY void CFuncTrain::__MAKE_VHOOK(OverrideReset)(void) { // { // class CBaseEntity *pTarg; // 915 @@ -434,7 +434,7 @@ IMPLEMENT_SAVERESTORE(CFuncTrackTrain, CBaseEntity); LINK_ENTITY_TO_CLASS(func_tracktrain, CFuncTrackTrain); /* <12e88e> ../cstrike/dlls/plats.cpp:964 */ -NOBODY void CFuncTrackTrain::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 966 @@ -452,7 +452,7 @@ NOBODY void CFuncTrackTrain::NextThink(float thinkTime, BOOL alwaysThink) } /* <12ee6d> ../cstrike/dlls/plats.cpp:1013 */ -NOBODY void CFuncTrackTrain::Blocked_(CBaseEntity *pOther) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { // { // entvars_t *pevOther; // 1015 @@ -470,7 +470,7 @@ NOBODY void CFuncTrackTrain::Blocked_(CBaseEntity *pOther) } /* <1312c7> ../cstrike/dlls/plats.cpp:1038 */ -NOBODY void CFuncTrackTrain::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // float delta; // 1062 @@ -588,7 +588,7 @@ NOBODY void CFuncTrackTrain::SetControls(entvars_t *pevControls) } /* <12dd23> ../cstrike/dlls/plats.cpp:1363 */ -NOBODY BOOL CFuncTrackTrain::OnControls_(entvars_t *pevTest) +NOBODY BOOL CFuncTrackTrain::__MAKE_VHOOK(OnControls)(entvars_t *pevTest) { // { // Vector offset; // 1365 @@ -654,7 +654,7 @@ NOBODY void CFuncTrackTrain::NearestPath(void) } /* <12d75a> ../cstrike/dlls/plats.cpp:1470 */ -NOBODY void CFuncTrackTrain::OverrideReset_(void) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(OverrideReset)(void) { // NextThink(CFuncTrackTrain::OverrideReset(// float thinkTime, // BOOL alwaysThink); // 1472 @@ -669,21 +669,21 @@ NOBODY CFuncTrackTrain *CFuncTrackTrain::Instance(edict_t *pent) } /* <12dcd4> ../cstrike/dlls/plats.cpp:1495 */ -NOBODY void CFuncTrackTrain::Spawn_(void) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(Spawn)(void) { // NextThink(CFuncTrackTrain::Spawn(// float thinkTime, // BOOL alwaysThink); // 1533 } /* <12dbdf> ../cstrike/dlls/plats.cpp:1539 */ -NOBODY void CFuncTrackTrain::Restart_(void) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(Restart)(void) { // NextThink(CFuncTrackTrain::Restart(// float thinkTime, // BOOL alwaysThink); // 1557 } /* <12d7a5> ../cstrike/dlls/plats.cpp:1562 */ -NOBODY void CFuncTrackTrain::Precache_(void) +NOBODY void CFuncTrackTrain::__MAKE_VHOOK(Precache)(void) { } @@ -709,12 +709,12 @@ NOBODY void CFuncTrainControls::Find(void) } /* <12dc86> ../cstrike/dlls/plats.cpp:1619 */ -NOBODY void CFuncTrainControls::Spawn_(void) +NOBODY void CFuncTrainControls::__MAKE_VHOOK(Spawn)(void) { } /* <12d7f2> ../cstrike/dlls/plats.cpp:1673 */ -NOBODY BOOL CFuncTrackChange::IsTogglePlat_(void) +NOBODY BOOL CFuncTrackChange::__MAKE_VHOOK(IsTogglePlat)(void) { return TRUE; } @@ -726,24 +726,24 @@ LINK_ENTITY_TO_CLASS(func_trackchange, CFuncTrackChange); IMPLEMENT_SAVERESTORE(CFuncTrackChange, CFuncPlatRot); /* <130c1d> ../cstrike/dlls/plats.cpp:1715 */ -NOBODY void CFuncTrackChange::Spawn_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(Spawn)(void) { // EnableUse(CFuncTrackChange *const this); // 1738 } /* <130a3b> ../cstrike/dlls/plats.cpp:1744 */ -NOBODY void CFuncTrackChange::Precache_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(Precache)(void) { // Precache(CFuncPlat *const this); // 1749 } /* <12d818> ../cstrike/dlls/plats.cpp:1753 */ -NOBODY void CFuncTrackChange::Touch_(CBaseEntity *pOther) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { } /* <1304ca> ../cstrike/dlls/plats.cpp:1758 */ -NOBODY void CFuncTrackChange::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 1760 @@ -754,7 +754,7 @@ NOBODY void CFuncTrackChange::KeyValue_(KeyValueData *pkvd) } /* <12d84d> ../cstrike/dlls/plats.cpp:1782 */ -NOBODY void CFuncTrackChange::OverrideReset_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(OverrideReset)(void) { } @@ -833,26 +833,26 @@ NOBODY void CFuncTrackChange::UpdateTrain(Vector &dest) } /* <131ade> ../cstrike/dlls/plats.cpp:1883 */ -NOBODY void CFuncTrackChange::GoDown_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(GoDown)(void) { // GoDown(CFuncTrackChange *const this); // 1883 } /* <1319f9> ../cstrike/dlls/plats.cpp:1919 */ -NOBODY void CFuncTrackChange::GoUp_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(GoUp)(void) { // GoUp(CFuncTrackChange *const this); // 1919 } /* <12deb0> ../cstrike/dlls/plats.cpp:1954 */ -NOBODY void CFuncTrackChange::UpdateAutoTargets_(int toggleState) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(UpdateAutoTargets)(int toggleState) { // UpdateAutoTargets(CFuncTrackChange *const this, // int toggleState); // 1954 } /* <131725> ../cstrike/dlls/plats.cpp:1971 */ -NOBODY void CFuncTrackChange::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CFuncTrackChange *const this, // class CBaseEntity *pActivator, @@ -867,7 +867,7 @@ NOBODY void CFuncTrackChange::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller } /* <12f618> ../cstrike/dlls/plats.cpp:2005 */ -NOBODY void CFuncTrackChange::HitBottom_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(HitBottom)(void) { // HitBottom(CFuncPlatRot *const this); // 2007 // EnableUse(CFuncTrackChange *const this); // 2018 @@ -876,7 +876,7 @@ NOBODY void CFuncTrackChange::HitBottom_(void) } /* <12f588> ../cstrike/dlls/plats.cpp:2025 */ -NOBODY void CFuncTrackChange::HitTop_(void) +NOBODY void CFuncTrackChange::__MAKE_VHOOK(HitTop)(void) { // HitTop(CFuncPlatRot *const this); // 2027 // EnableUse(CFuncTrackChange *const this); // 2038 @@ -888,7 +888,7 @@ NOBODY void CFuncTrackChange::HitTop_(void) LINK_ENTITY_TO_CLASS(func_trackautochange, CFuncTrackAuto); /* <12dc2a> ../cstrike/dlls/plats.cpp:2053 */ -NOBODY void CFuncTrackAuto::UpdateAutoTargets_(int toggleState) +NOBODY void CFuncTrackAuto::__MAKE_VHOOK(UpdateAutoTargets)(int toggleState) { // { // class CPathTrack *pTarget; // 2055 @@ -897,7 +897,7 @@ NOBODY void CFuncTrackAuto::UpdateAutoTargets_(int toggleState) } /* <1301f9> ../cstrike/dlls/plats.cpp:2083 */ -NOBODY void CFuncTrackAuto::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncTrackAuto::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // class CPathTrack *pTarget; // 2085 @@ -916,12 +916,12 @@ LINK_ENTITY_TO_CLASS(func_guntarget, CGunTarget); IMPLEMENT_SAVERESTORE(CGunTarget, CBaseMonster); /* <12dbb8> ../cstrike/dlls/plats.cpp:2173 */ -NOBODY void CGunTarget::Spawn_(void) +NOBODY void CGunTarget::__MAKE_VHOOK(Spawn)(void) { } /* <12dade> ../cstrike/dlls/plats.cpp:2199 */ -NOBODY void CGunTarget::Activate_(void) +NOBODY void CGunTarget::__MAKE_VHOOK(Activate)(void) { // { // class CBaseEntity *pTarg; // 2201 @@ -969,7 +969,7 @@ NOBODY void CGunTarget::Stop(void) } /* <12e371> ../cstrike/dlls/plats.cpp:2277 */ -NOBODY int CGunTarget::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +NOBODY int CGunTarget::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { // Stop(CGunTarget *const this); // 2285 // TakeDamage(CGunTarget *const this, @@ -980,7 +980,7 @@ NOBODY int CGunTarget::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttack } /* <12e408> ../cstrike/dlls/plats.cpp:2294 */ -NOBODY void CGunTarget::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CGunTarget::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Stop(CGunTarget *const this); // 2301 // Use(CGunTarget *const this, diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 6bc9a6f1..ccc95383 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -442,99 +442,40 @@ const char *GetCSModelName(int item_id) const char *modelName = NULL; switch (item_id) { - case WEAPON_P228: - modelName = "models/w_p228.mdl"; - break; - case WEAPON_SCOUT: - modelName = "models/w_scout.mdl"; - break; - case WEAPON_HEGRENADE: - modelName = "models/w_hegrenade.mdl"; - break; - case WEAPON_XM1014: - modelName = "models/w_xm1014.mdl"; - break; - case WEAPON_C4: - modelName = "models/w_backpack.mdl"; - break; - case WEAPON_MAC10: - modelName = "models/w_mac10.mdl"; - break; - case WEAPON_AUG: - modelName = "models/w_aug.mdl"; - break; - case WEAPON_SMOKEGRENADE: - modelName = "models/w_smokegrenade.mdl"; - break; - case WEAPON_ELITE: - modelName = "models/w_elite.mdl"; - break; - case WEAPON_FIVESEVEN: - modelName = "models/w_fiveseven.mdl"; - break; - case WEAPON_UMP45: - modelName = "models/w_ump45.mdl"; - break; - case WEAPON_SG550: - modelName = "models/w_sg550.mdl"; - break; - case WEAPON_GALIL: - modelName = "models/w_galil.mdl"; - break; - case WEAPON_FAMAS: - modelName = "models/w_famas.mdl"; - break; - case WEAPON_USP: - modelName = "models/w_usp.mdl"; - break; - case WEAPON_GLOCK18: - modelName = "models/w_glock18.mdl"; - break; - case WEAPON_AWP: - modelName = "models/w_awp.mdl"; - break; - case WEAPON_MP5N: - modelName = "models/w_mp5.mdl"; - break; - case WEAPON_M249: - modelName = "models/w_m249.mdl"; - break; - case WEAPON_M3: - modelName = "models/w_m3.mdl"; - break; - case WEAPON_M4A1: - modelName = "models/w_m4a1.mdl"; - break; - case WEAPON_TMP: - modelName = "models/w_tmp.mdl"; - break; - case WEAPON_G3SG1: - modelName = "models/w_g3sg1.mdl"; - break; - case WEAPON_FLASHBANG: - modelName = "models/w_flashbang.mdl"; - break; - case WEAPON_DEAGLE: - modelName = "models/w_deagle.mdl"; - break; - case WEAPON_SG552: - modelName = "models/w_sg552.mdl"; - break; - case WEAPON_AK47: - modelName = "models/w_ak47.mdl"; - break; - case WEAPON_KNIFE: - modelName = "models/w_knife.mdl"; - break; - case WEAPON_P90: - modelName = "models/w_p90.mdl"; - break; - case WEAPON_SHIELDGUN: - modelName = "models/w_shield.mdl"; - break; - default: - ALERT(at_console, "CBasePlayer::PackDeadPlayerItems(): Unhandled item- not creating weaponbox\n"); + case WEAPON_P228: modelName = "models/w_p228.mdl"; break; + case WEAPON_SCOUT: modelName = "models/w_scout.mdl"; break; + case WEAPON_HEGRENADE: modelName = "models/w_hegrenade.mdl"; break; + case WEAPON_XM1014: modelName = "models/w_xm1014.mdl"; break; + case WEAPON_C4: modelName = "models/w_backpack.mdl"; break; + case WEAPON_MAC10: modelName = "models/w_mac10.mdl"; break; + case WEAPON_AUG: modelName = "models/w_aug.mdl"; break; + case WEAPON_SMOKEGRENADE: modelName = "models/w_smokegrenade.mdl"; break; + case WEAPON_ELITE: modelName = "models/w_elite.mdl"; break; + case WEAPON_FIVESEVEN: modelName = "models/w_fiveseven.mdl"; break; + case WEAPON_UMP45: modelName = "models/w_ump45.mdl"; break; + case WEAPON_SG550: modelName = "models/w_sg550.mdl"; break; + case WEAPON_GALIL: modelName = "models/w_galil.mdl"; break; + case WEAPON_FAMAS: modelName = "models/w_famas.mdl"; break; + case WEAPON_USP: modelName = "models/w_usp.mdl"; break; + case WEAPON_GLOCK18: modelName = "models/w_glock18.mdl"; break; + case WEAPON_AWP: modelName = "models/w_awp.mdl"; break; + case WEAPON_MP5N: modelName = "models/w_mp5.mdl"; break; + case WEAPON_M249: modelName = "models/w_m249.mdl"; break; + case WEAPON_M3: modelName = "models/w_m3.mdl"; break; + case WEAPON_M4A1: modelName = "models/w_m4a1.mdl"; break; + case WEAPON_TMP: modelName = "models/w_tmp.mdl"; break; + case WEAPON_G3SG1: modelName = "models/w_g3sg1.mdl"; break; + case WEAPON_FLASHBANG: modelName = "models/w_flashbang.mdl"; break; + case WEAPON_DEAGLE: modelName = "models/w_deagle.mdl"; break; + case WEAPON_SG552: modelName = "models/w_sg552.mdl"; break; + case WEAPON_AK47: modelName = "models/w_ak47.mdl"; break; + case WEAPON_KNIFE: modelName = "models/w_knife.mdl"; break; + case WEAPON_P90: modelName = "models/w_p90.mdl"; break; + case WEAPON_SHIELDGUN: modelName = "models/w_shield.mdl"; break; + default: + ALERT(at_console, "CBasePlayer::PackDeadPlayerItems(): Unhandled item- not creating weaponbox\n"); } + return modelName; } @@ -548,77 +489,77 @@ void CBasePlayer::SetPlayerModel(BOOL HasC4) { switch (m_iModelName) { - case MODEL_URBAN: - model = "urban"; - break; - case MODEL_GSG9: - model = "gsg9"; - break; - case MODEL_GIGN: - model = "gign"; - break; - case MODEL_SAS: - model = "sas"; - break; - case MODEL_VIP: - model = "vip"; - break; - case MODEL_SPETSNAZ: - if (UTIL_IsGame("czero")) - { - model = "spetsnaz"; - break; - } - default: + case MODEL_URBAN: + model = "urban"; + break; + case MODEL_GSG9: + model = "gsg9"; + break; + case MODEL_GIGN: + model = "gign"; + break; + case MODEL_SAS: + model = "sas"; + break; + case MODEL_VIP: + model = "vip"; + break; + case MODEL_SPETSNAZ: + if (UTIL_IsGame("czero")) { - if (IsBot()) - { - model = (char *)TheBotProfiles->GetCustomSkinModelname(m_iModelName); - if (!model) - model = "urban"; - } - else - model = "urban"; - + model = "spetsnaz"; break; } + default: + { + if (IsBot()) + { + model = (char *)TheBotProfiles->GetCustomSkinModelname(m_iModelName); + if (!model) + model = "urban"; + } + else + model = "urban"; + + break; + } } } else if (m_iTeam == TERRORIST) { switch (m_iModelName) { - case MODEL_TERROR: - model = "terror"; - break; - case MODEL_LEET: - model = "leet"; - break; - case MODEL_ARCTIC: - model = "arctic"; - break; - case MODEL_GUERILLA: - model = "guerilla"; - break; - case MODEL_MILITIA: - if (UTIL_IsGame("czero")) - { - model = "militia"; - break; - } - default: + case MODEL_TERROR: + model = "terror"; + break; + case MODEL_LEET: + model = "leet"; + break; + case MODEL_ARCTIC: + model = "arctic"; + break; + case MODEL_GUERILLA: + model = "guerilla"; + break; + case MODEL_MILITIA: + if (UTIL_IsGame("czero")) { - if (IsBot()) - { - model = (char *)TheBotProfiles->GetCustomSkinModelname(m_iModelName); - if (!model) - model = "terror"; - } - else - model = "terror"; - + model = "militia"; break; } + default: + { + if (IsBot()) + { + model = (char *)TheBotProfiles->GetCustomSkinModelname(m_iModelName); + if (!model) + model = "terror"; + } + else + model = "terror"; + + break; + } } } else @@ -660,15 +601,20 @@ NOXREF CBasePlayer *CBasePlayer::GetNextRadioRecipient(CBasePlayer *pStartPlayer if (!FNullEnt(m_hObserverTarget)) continue; - CBasePlayer *pTarget = (CBasePlayer *)CBaseEntity::Instance( pPlayer->m_hObserverTarget->pev ); + CBasePlayer *pTarget = (CBasePlayer *)CBaseEntity::Instance(pPlayer->m_hObserverTarget->pev); if (pTarget && pTarget->m_iTeam == m_iTeam) + { bSend = TRUE; + } } if (bSend) + { return pPlayer; + } } + return NULL; } @@ -779,15 +725,9 @@ void CBasePlayer::Pain(int m_LastHitGroup, bool HasArmour) switch (temp) { - case 0: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot1.wav", VOL_NORM, ATTN_NORM); - break; - case 1: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot2.wav", VOL_NORM, ATTN_NORM); - break; - default: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot3.wav", VOL_NORM, ATTN_NORM); - break; + case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot1.wav", VOL_NORM, ATTN_NORM); break; + case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot2.wav", VOL_NORM, ATTN_NORM); break; + default: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/headshot3.wav", VOL_NORM, ATTN_NORM); break; } } else @@ -803,15 +743,9 @@ void CBasePlayer::Pain(int m_LastHitGroup, bool HasArmour) switch (temp) { - case 0: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-1.wav", VOL_NORM, ATTN_NORM); - break; - case 1: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-2.wav", VOL_NORM, ATTN_NORM); - break; - default: - EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-3.wav", VOL_NORM, ATTN_NORM); - break; + case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-1.wav", VOL_NORM, ATTN_NORM); break; + case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-2.wav", VOL_NORM, ATTN_NORM); break; + default: EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/bhit_flesh-3.wav", VOL_NORM, ATTN_NORM); break; } } } @@ -860,25 +794,21 @@ 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; } } /* <151213> ../cstrike/dlls/player.cpp:937 */ -int CBasePlayer::TakeHealth_(float flHealth, int bitsDamageType) +int CBasePlayer::__MAKE_VHOOK(TakeHealth)(float flHealth, int bitsDamageType) { return CBaseMonster::TakeHealth(flHealth, bitsDamageType); } /* <150f1c> ../cstrike/dlls/player.cpp:943 */ -Vector CBasePlayer::GetGunPosition_(void) +Vector CBasePlayer::__MAKE_VHOOK(GetGunPosition)(void) { return pev->origin + pev->view_ofs; } @@ -899,7 +829,7 @@ bool CBasePlayer::IsHittingShield(Vector &vecDirection, TraceResult *ptr) } /* <152b58> ../cstrike/dlls/player.cpp:989 */ -void CBasePlayer::TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +void CBasePlayer::__MAKE_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { bool bShouldBleed = true; bool bShouldSpark = false; @@ -1123,7 +1053,7 @@ void LogAttack(CBasePlayer *pAttacker, CBasePlayer *pVictim, int teamAttack, int // etc are implemented with subsequent calls to TakeDamage using DMG_GENERIC. /* <15dff9> ../cstrike/dlls/player.cpp:1241 */ -int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) +int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { int fTookDamage; float flRatio = ARMOR_RATIO; @@ -1169,7 +1099,7 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl if (pGrenade->m_iTeam == m_iTeam) teamAttack = TRUE; - pAttack = reinterpret_cast(CBasePlayer::Instance( pevAttacker )); + pAttack = reinterpret_cast(CBasePlayer::Instance(pevAttacker)); } else if (pGrenade->m_iTeam == m_iTeam && (&edict()->v != pevAttacker)) { @@ -1279,7 +1209,7 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); WRITE_BYTE(ENTINDEX(edict())); - WRITE_BYTE((int)max(pev->health, 0) | (1<<7)); + WRITE_BYTE((int)_max(pev->health, 0) | DRC_FLAG_FACEPLAYER); MESSAGE_END(); for (int i = 1; i <= gpGlobals->maxClients; i++) @@ -1290,7 +1220,7 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl continue; MESSAGE_BEGIN(MSG_ONE, gmsgSpecHealth, NULL, pPlayer->edict()); - WRITE_BYTE((int)max(pev->health, 0)); + WRITE_BYTE((int)_max(pev->health, 0)); MESSAGE_END(); } @@ -1342,7 +1272,9 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl 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; @@ -1360,52 +1292,24 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl 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_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_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_KNIFE: flRatio *= 1.7; break; case WEAPON_FAMAS: - case WEAPON_SG552: - flRatio *= 1.4; - break; + case WEAPON_SG552: flRatio *= 1.4; break; case WEAPON_GALIL: - case WEAPON_AK47: - flRatio *= 1.55; - break; + case WEAPON_AK47: flRatio *= 1.55; break; } } @@ -1527,7 +1431,7 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl MESSAGE_BEGIN(MSG_SPEC, gmsgHLTV); WRITE_BYTE(ENTINDEX(edict())); - WRITE_BYTE((int)max(pev->health, 0) | (1<<7)); + WRITE_BYTE((int)_max(pev->health, 0) | DRC_FLAG_FACEPLAYER); MESSAGE_END(); for (int i = 1; i <= gpGlobals->maxClients; i++) @@ -1540,7 +1444,7 @@ int CBasePlayer::TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, fl if (pPlayer->m_hObserverTarget == this) { MESSAGE_BEGIN(MSG_ONE, gmsgSpecHealth, NULL, pPlayer->edict()); - WRITE_BYTE((int)max(pev->health, 0)); + WRITE_BYTE((int)_max(pev->health, 0)); MESSAGE_END(); } } @@ -1574,8 +1478,9 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) pWeaponBox->PackWeapon(pItem); if (packAmmo) - pWeaponBox->PackAmmo(MAKE_STRING( IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray)[ pItem->m_iId ].pszAmmo1 ), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]); - + { + pWeaponBox->PackAmmo(MAKE_STRING(IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray)[ pItem->m_iId ].pszAmmo1), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]); + } SET_MODEL(ENT(pWeaponBox->pev), modelName); } } @@ -1636,24 +1541,18 @@ void CBasePlayer::GiveDefaultItems(void) switch (m_iTeam) { - case CT: - { - GiveNamedItem("weapon_knife"); - GiveNamedItem("weapon_usp"); + case CT: + GiveNamedItem("weapon_knife"); + GiveNamedItem("weapon_usp"); + GiveAmmo(m_bIsVIP ? 12 : 24, "45acp", MAX_AMMO_45ACP); - GiveAmmo(m_bIsVIP ? 12 : 24, "45acp", MAX_AMMO_45ACP); + break; + case TERRORIST: + GiveNamedItem("weapon_knife"); + GiveNamedItem("weapon_glock18"); + GiveAmmo(40, "9mm", MAX_AMMO_9MM); - break; - } - case TERRORIST: - { - GiveNamedItem("weapon_knife"); - GiveNamedItem("weapon_glock18"); - - GiveAmmo(40, "9mm", MAX_AMMO_9MM); - - break; - } + break; } } @@ -1885,7 +1784,7 @@ void BombTargetFlash_Set(CBasePlayer *player) if (player->m_bHasC4 && !(player->m_flDisplayHistory & DHF_IN_TARGET_ZONE)) { player->m_flDisplayHistory |= DHF_IN_TARGET_ZONE; - player->HintMessage("#Hint_you_are_in_targetzone"); + player->HintMessage("#Hint_you_are_in_targetzone", TRUE); // TODO: send also for dead the players? } player->SetBombIcon(TRUE); } @@ -1910,7 +1809,7 @@ void RescueZoneIcon_Set(CBasePlayer *player) if (player->m_iTeam == CT && !(player->m_flDisplayHistory & DHF_IN_RESCUE_ZONE)) { player->m_flDisplayHistory |= DHF_IN_RESCUE_ZONE; - player->HintMessage("#Hint_hostage_rescue_zone"); + player->HintMessage("#Hint_hostage_rescue_zone", TRUE); // TODO: send also for dead the players? } } @@ -1952,7 +1851,7 @@ void EscapeZoneIcon_Set(CBasePlayer *player) if (!(player->m_flDisplayHistory & DHF_IN_ESCAPE_ZONE)) { player->m_flDisplayHistory |= DHF_IN_ESCAPE_ZONE; - player->HintMessage("#Hint_terrorist_escape_zone", TRUE); + player->HintMessage("#Hint_terrorist_escape_zone"); } } } @@ -1989,18 +1888,18 @@ void VIP_SafetyZoneIcon_Set(CBasePlayer *player) WRITE_BYTE(160); WRITE_BYTE(0); MESSAGE_END(); - + if (!(player->m_flDisplayHistory & DHF_IN_VIPSAFETY_ZONE)) { if (player->m_iTeam == CT) { player->m_flDisplayHistory |= DHF_IN_VIPSAFETY_ZONE; - player->HintMessage("#Hint_ct_vip_zone"); + player->HintMessage("#Hint_ct_vip_zone", TRUE); } else if (player->m_iTeam == TERRORIST) { player->m_flDisplayHistory |= DHF_IN_VIPSAFETY_ZONE; - player->HintMessage("#Hint_terrorist_vip_zone"); + player->HintMessage("#Hint_terrorist_vip_zone", TRUE); } } } @@ -2040,7 +1939,7 @@ void CBasePlayer::SendFOV(int fov) } /* <160a1a> ../cstrike/dlls/player.cpp:2300 */ -void CBasePlayer::Killed_(entvars_t *pevAttacker, int iGib) +void CBasePlayer::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) { m_canSwitchObserverModes = false; @@ -2139,32 +2038,34 @@ void CBasePlayer::Killed_(entvars_t *pevAttacker, int iGib) { 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; - } + 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; + } + default: + break; } } @@ -2480,18 +2381,10 @@ void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim) switch (m_Activity) { - case ACT_RANGE_ATTACK1: - Q_strcpy(szAnim, "ref_shoot_"); - break; - case ACT_RANGE_ATTACK2: - Q_strcpy(szAnim, "ref_shoot2_"); - break; - case ACT_RELOAD: - Q_strcpy(szAnim, "ref_reload_"); - break; - default: - Q_strcpy(szAnim, "ref_aim_"); - break; + case ACT_RANGE_ATTACK1: Q_strcpy(szAnim, "ref_shoot_"); break; + case ACT_RANGE_ATTACK2: Q_strcpy(szAnim, "ref_shoot2_"); break; + case ACT_RELOAD: Q_strcpy(szAnim, "ref_reload_"); break; + default: Q_strcpy(szAnim, "ref_aim_"); break; } Q_strcat(szAnim, m_szAnimExtention); @@ -2709,39 +2602,39 @@ void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim) { switch (RANDOM_LONG(0, 8)) { - case 0: - animDesired = LookupActivity(ACT_DIE_HEADSHOT); - m_iThrowDirection = THROW_BACKWARD; - break; - case 1: - animDesired = LookupActivity(ACT_DIE_GUTSHOT); - break; - case 2: - animDesired = LookupActivity(ACT_DIE_BACKSHOT); - m_iThrowDirection = THROW_HITVEL; - break; - case 3: - animDesired = LookupActivity(ACT_DIESIMPLE); - break; - case 4: - animDesired = LookupActivity(ACT_DIEBACKWARD); - m_iThrowDirection = THROW_HITVEL; - break; - case 5: - animDesired = LookupActivity(ACT_DIEFORWARD); - m_iThrowDirection = THROW_FORWARD; - break; - case 6: - animDesired = LookupActivity(ACT_DIE_CHESTSHOT); - break; - case 7: - animDesired = LookupActivity(ACT_DIE_GUTSHOT); - break; - case 8: - animDesired = LookupActivity(ACT_DIE_HEADSHOT); - break; - default: - break; + case 0: + animDesired = LookupActivity(ACT_DIE_HEADSHOT); + m_iThrowDirection = THROW_BACKWARD; + break; + case 1: + animDesired = LookupActivity(ACT_DIE_GUTSHOT); + break; + case 2: + animDesired = LookupActivity(ACT_DIE_BACKSHOT); + m_iThrowDirection = THROW_HITVEL; + break; + case 3: + animDesired = LookupActivity(ACT_DIESIMPLE); + break; + case 4: + animDesired = LookupActivity(ACT_DIEBACKWARD); + m_iThrowDirection = THROW_HITVEL; + break; + case 5: + animDesired = LookupActivity(ACT_DIEFORWARD); + m_iThrowDirection = THROW_FORWARD; + break; + case 6: + animDesired = LookupActivity(ACT_DIE_CHESTSHOT); + break; + case 7: + animDesired = LookupActivity(ACT_DIE_GUTSHOT); + break; + case 8: + animDesired = LookupActivity(ACT_DIE_HEADSHOT); + break; + default: + break; } break; } @@ -2755,21 +2648,21 @@ void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim) switch (random) { - case 1: - case 2: - m_iThrowDirection = THROW_BACKWARD; - break; - case 3: - case 4: - m_iThrowDirection = THROW_FORWARD; - break; - case 5: - case 6: - m_iThrowDirection = THROW_HITVEL; - break; - default: - m_iThrowDirection = THROW_NONE; - break; + case 1: + case 2: + m_iThrowDirection = THROW_BACKWARD; + break; + case 3: + case 4: + m_iThrowDirection = THROW_FORWARD; + break; + case 5: + case 6: + m_iThrowDirection = THROW_HITVEL; + break; + default: + m_iThrowDirection = THROW_NONE; + break; } animDesired = LookupActivity(ACT_DIE_HEADSHOT); @@ -3002,18 +2895,10 @@ void CBasePlayer::WaterMove(void) { 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; + 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; } } @@ -3064,7 +2949,7 @@ NOXREF void CBasePlayer::ThrowWeapon(char *pszItemName) LINK_ENTITY_TO_CLASS(weapon_shield, CWShield); /* <151962> ../cstrike/dlls/player.cpp:3426 */ -void CWShield::Spawn_(void) +void CWShield::__MAKE_VHOOK(Spawn)(void) { pev->movetype = MOVETYPE_TOSS; pev->solid = SOLID_TRIGGER; @@ -3074,7 +2959,7 @@ void CWShield::Spawn_(void) } /* <152e95> ../cstrike/dlls/player.cpp:3436 */ -void CWShield::Touch_(CBaseEntity *pOther) +void CWShield::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { if (!pOther->IsPlayer()) return; @@ -3288,27 +3173,29 @@ void CBasePlayer::SyncRoundTimer(void) tmRemaining = 0; MESSAGE_BEGIN(MSG_ONE, gmsgRoundTime, NULL, pev); - WRITE_SHORT(tmRemaining); + WRITE_SHORT((int)tmRemaining); MESSAGE_END(); if (!mp->IsMultiplayer()) return; - if (mp->IsFreezePeriod() && TheTutor && !IsObserver()) + if (mp->IsFreezePeriod() && TheTutor != NULL && !IsObserver()) { MESSAGE_BEGIN(MSG_ONE, gmsgBlinkAcct, NULL, pev); - WRITE_BYTE( MONEY_BLINK_AMOUNT ); + WRITE_BYTE(MONEY_BLINK_AMOUNT); MESSAGE_END(); } if (mp->IsCareer()) { - int remaining; + int remaining = 0; bool shouldCountDown = false; int fadeOutDelay = 0; - if (tmRemaining) - remaining = (int)((float_precision)TheCareerTasks->GetTaskTime() - (gpGlobals->time - mp->m_fRoundCount)); + if (tmRemaining != 0.0f) + { + remaining = TheCareerTasks->GetTaskTime() - (gpGlobals->time - mp->m_fRoundCount); + } if (remaining < 0) remaining = 0; @@ -3320,20 +3207,23 @@ void CBasePlayer::SyncRoundTimer(void) remaining = -TheCareerTasks->GetFinishedTaskTime(); if (!mp->IsFreezePeriod() && !TheCareerTasks->GetFinishedTaskTime()) + { shouldCountDown = true; - + } if (!mp->IsFreezePeriod()) { - if (TheCareerTasks->GetFinishedTaskTime() || ((float_precision)TheCareerTasks->GetTaskTime() <= TheCareerTasks->GetRoundElapsedTime())) + if (TheCareerTasks->GetFinishedTaskTime() || (TheCareerTasks->GetTaskTime() <= TheCareerTasks->GetRoundElapsedTime())) + { fadeOutDelay = 3; + } } if (!TheCareerTasks->GetFinishedTaskTime() || TheCareerTasks->GetFinishedTaskRound() == mp->m_iTotalRoundsPlayed) { MESSAGE_BEGIN(MSG_ONE, gmsgTaskTime, NULL, pev); - WRITE_SHORT(remaining); - WRITE_BYTE(shouldCountDown); - WRITE_BYTE(fadeOutDelay); + WRITE_SHORT(remaining); // remaining of time, -1 the timer is disappears + WRITE_BYTE(shouldCountDown); // timer counts down + WRITE_BYTE(fadeOutDelay); // fade in time, hide HUD timer after the expiration time MESSAGE_END(); } } @@ -3466,7 +3356,6 @@ void CBasePlayer::JoiningThink(void) if (mp->FPlayerCanRespawn(this)) { - // TODO: Reverse me Spawn(); mp->CheckWinConditions(); @@ -3526,7 +3415,7 @@ void CBasePlayer::JoiningThink(void) MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); WRITE_BYTE(ENTINDEX(edict())); - WRITE_SHORT((short)pev->frags); + WRITE_SHORT((int)pev->frags); WRITE_SHORT(m_iDeaths); WRITE_SHORT(0); WRITE_SHORT(m_iTeam); @@ -3538,6 +3427,7 @@ void CBasePlayer::JoiningThink(void) m_flDisplayHistory |= DHF_SPEC_DUCK; } } + return; } } @@ -3587,7 +3477,9 @@ void CBasePlayer::Disappear(void) CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict())); if (pSound) + { pSound->Reset(); + } m_fSequenceFinished = TRUE; pev->modelindex = m_modelIndexPlayer; @@ -3617,6 +3509,7 @@ void CBasePlayer::Disappear(void) if (m_bHasC4) { DropPlayerItem("weapon_c4"); + SetProgressBarTime(0); } else if (m_bHasDefuser) { @@ -3630,13 +3523,13 @@ void CBasePlayer::Disappear(void) MESSAGE_END(); SendItemStatus(this); + SetProgressBarTime(0); } - SetProgressBarTime(0); BuyZoneIcon_Clear(this); SetThink(&CBasePlayer::PlayerDeathThink); - pev->nextthink = gpGlobals->time + 0.1; + pev->nextthink = gpGlobals->time + 0.1f; pev->angles.x = 0; pev->angles.z = 0; @@ -3726,14 +3619,22 @@ void CBasePlayer::PlayerDeathThink(void) } /* <153042> ../cstrike/dlls/player.cpp:4134 */ -void CBasePlayer::RoundRespawn_(void) +void CBasePlayer::__MAKE_VHOOK(RoundRespawn)(void) { m_canSwitchObserverModes = true; if (m_bJustKilledTeammate && CVAR_GET_FLOAT("mp_tkpunish")) { m_bJustKilledTeammate = false; +#ifndef REGAMEDLL_FIXES + // TODO: wtf? CLIENT_COMMAND(edict(), "kill\n"); +#else + if (pev->health > 0.0f) + { + ClientKill(ENT(pev)); + } +#endif // REGAMEDLL_FIXES m_bPunishedForTK = true; } if (m_iMenu != Menu_ChooseAppearance) @@ -3747,10 +3648,12 @@ void CBasePlayer::RoundRespawn_(void) if (m_pActiveItem) { if (m_pActiveItem->iItemSlot() == GRENADE_SLOT) + { SwitchWeapon(m_pActiveItem); + } } - m_lastLocation[0] = 0; + m_lastLocation[0] = '\0'; } /* <155577> ../cstrike/dlls/player.cpp:4172 */ @@ -4062,7 +3965,7 @@ void CBasePlayer::HostageUsed(void) } /* <153f69> ../cstrike/dlls/player.cpp:4507 */ -void CBasePlayer::Jump_(void) +void CBasePlayer::__MAKE_VHOOK(Jump)(void) { if (pev->flags & FL_WATERJUMP) return; @@ -4135,20 +4038,20 @@ NOXREF void FixPlayerCrouchStuck(edict_t *pPlayer) } /* <153ef5> ../cstrike/dlls/player.cpp:4580 */ -void CBasePlayer::Duck_(void) +void CBasePlayer::__MAKE_VHOOK(Duck)(void) { if (pev->button & IN_DUCK) SetAnimation(PLAYER_WALK); } /* <150f8f> ../cstrike/dlls/player.cpp:4591 */ -int CBasePlayer::Classify_(void) +int CBasePlayer::__MAKE_VHOOK(Classify)(void) { return CLASS_PLAYER; } /* <150fb7> ../cstrike/dlls/player.cpp:4597 */ -void CBasePlayer::AddPoints_(int score, BOOL bAllowNegativeScore) +void CBasePlayer::__MAKE_VHOOK(AddPoints)(int score, BOOL bAllowNegativeScore) { if (score < 0 && !bAllowNegativeScore) { @@ -4163,7 +4066,7 @@ void CBasePlayer::AddPoints_(int score, BOOL bAllowNegativeScore) MESSAGE_BEGIN(MSG_BROADCAST, gmsgScoreInfo); WRITE_BYTE(ENTINDEX(edict())); - WRITE_SHORT((short)pev->frags); + WRITE_SHORT((int)pev->frags); WRITE_SHORT(m_iDeaths); WRITE_SHORT(0); WRITE_SHORT(m_iTeam); @@ -4171,7 +4074,7 @@ void CBasePlayer::AddPoints_(int score, BOOL bAllowNegativeScore) } /* <15125b> ../cstrike/dlls/player.cpp:4626 */ -void CBasePlayer::AddPointsToTeam_(int score, BOOL bAllowNegativeScore) +void CBasePlayer::__MAKE_VHOOK(AddPointsToTeam)(int score, BOOL bAllowNegativeScore) { int index = entindex(); @@ -4247,7 +4150,7 @@ bool CBasePlayer::CanPlayerBuy(bool display) } /* <15f9ac> ../cstrike/dlls/player.cpp:4717 */ -void CBasePlayer::PreThink_(void) +void CBasePlayer::__MAKE_VHOOK(PreThink)(void) { int buttonsChanged = (pev->button ^ m_afButtonLast); @@ -4513,46 +4416,46 @@ void CBasePlayer::CheckTimeBasedDamage(void) { 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: + 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) { - TakeDamage(pev, pev, POISON_DAMAGE, DMG_GENERIC); - bDuration = POISON_DURATION; - break; + int idif = _min(m_idrowndmg - m_idrownrestored, 10); + TakeHealth(idif, DMG_GENERIC); + m_idrownrestored += idif; } - 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; + 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]) @@ -4792,7 +4695,7 @@ void CBasePlayer::UpdatePlayerSound(void) } /* <15a182> ../cstrike/dlls/player.cpp:5667 */ -void CBasePlayer::PostThink_(void) +void CBasePlayer::__MAKE_VHOOK(PostThink)(void) { // intermission or finale if (g_fGameOver) @@ -4898,12 +4801,12 @@ pt_end: 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); + 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); + gun->m_flTimeWeaponIdle = _max(gun->m_flTimeWeaponIdle - gpGlobals->frametime, -0.001); } } @@ -5146,7 +5049,7 @@ void SetScoreAttrib(CBasePlayer *dest, CBasePlayer *src) } /* <15fdba> ../cstrike/dlls/player.cpp:6264 */ -void CBasePlayer::Spawn_(void) +void CBasePlayer::__MAKE_VHOOK(Spawn)(void) { int i; @@ -5277,7 +5180,7 @@ void CBasePlayer::Spawn_(void) } MESSAGE_BEGIN(MSG_ONE, SVC_ROOMTYPE, NULL, pev); - WRITE_SHORT((short)CVAR_GET_FLOAT("room_type")); + WRITE_SHORT((int)CVAR_GET_FLOAT("room_type")); MESSAGE_END(); if (g_pGameRules->IsFreezePeriod()) @@ -5456,7 +5359,7 @@ void CBasePlayer::Spawn_(void) MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); WRITE_BYTE(ENTINDEX(edict())); - WRITE_SHORT((short)pev->frags); + WRITE_SHORT((int)pev->frags); WRITE_SHORT(m_iDeaths); WRITE_SHORT(0); WRITE_SHORT(m_iTeam); @@ -5492,7 +5395,7 @@ void CBasePlayer::Spawn_(void) } /* <153555> ../cstrike/dlls/player.cpp:6620 */ -void CBasePlayer::Precache_(void) +void CBasePlayer::__MAKE_VHOOK(Precache)(void) { // in the event that the player JUST spawned, and the level node graph // was loaded, fix all of the node graph pointers before the game starts. @@ -5534,7 +5437,7 @@ void CBasePlayer::Precache_(void) } /* <151a77> ../cstrike/dlls/player.cpp:6671 */ -int CBasePlayer::Save_(CSave &save) +int CBasePlayer::__MAKE_VHOOK(Save)(CSave &save) { if (!CBaseMonster::Save(save)) return 0; @@ -5567,7 +5470,7 @@ NOXREF void CBasePlayer::RenewItems(void) } /* <156b9b> ../cstrike/dlls/player.cpp:6718 */ -int CBasePlayer::Restore_(CRestore &restore) +int CBasePlayer::__MAKE_VHOOK(Restore)(CRestore &restore) { if (!CBaseMonster::Restore(restore)) return 0; @@ -5636,14 +5539,18 @@ NOXREF void CBasePlayer::SelectNextItem(int iItem) CBasePlayerItem *pItem = m_rgpPlayerItems[ iItem ]; if (!pItem) + { return; + } if (pItem == m_pActiveItem) { pItem = m_pActiveItem->m_pNext; if (!pItem) + { return; + } CBasePlayerItem *pLast = pItem; @@ -5658,7 +5565,9 @@ NOXREF void CBasePlayer::SelectNextItem(int iItem) ResetAutoaim(); if (m_pActiveItem) + { m_pActiveItem->Holster(); + } if (HasShield()) { @@ -5685,7 +5594,9 @@ NOXREF void CBasePlayer::SelectNextItem(int iItem) void CBasePlayer::SelectItem(const char *pstr) { if (!pstr) + { return; + } CBasePlayerItem *pItem = NULL; @@ -5704,21 +5615,24 @@ void CBasePlayer::SelectItem(const char *pstr) } if (pItem) + { break; + } } } - if (!pItem) - return; - - if (pItem == m_pActiveItem) + if (!pItem || pItem == m_pActiveItem) + { return; + } ResetAutoaim(); // FIX, this needs to queue them up and delay if (m_pActiveItem) + { m_pActiveItem->Holster(); + } m_pLastItem = m_pActiveItem; m_pActiveItem = pItem; @@ -5808,7 +5722,7 @@ NOXREF void CBasePlayer::SelectPrevItem(int iItem) } /* <15106c> ../cstrike/dlls/player.cpp:6987 */ -const char *CBasePlayer::TeamID_(void) +const char *CBasePlayer::__MAKE_VHOOK(TeamID)(void) { // Not fully connected yet if (pev == NULL) @@ -5831,7 +5745,7 @@ void CSprayCan::Spawn(entvars_t *pevOwner) } /* <151815> ../cstrike/dlls/player.cpp:7021 */ -void CSprayCan::Think_(void) +void CSprayCan::__MAKE_VHOOK(Think)(void) { TraceResult tr; int playernum; @@ -5869,7 +5783,7 @@ void CSprayCan::Think_(void) } /* <157481> ../cstrike/dlls/player.cpp:7064 */ -NOXREF void CBloodSplat::Spawn(entvars_t *pevOwner) +void CBloodSplat::Spawn(entvars_t *pevOwner) { pev->origin = pevOwner->origin + Vector(0, 0, 32); pev->angles = pevOwner->v_angle; @@ -5880,7 +5794,7 @@ NOXREF void CBloodSplat::Spawn(entvars_t *pevOwner) } /* <151758> ../cstrike/dlls/player.cpp:7074 */ -NOXREF void CBloodSplat::Spray(void) +void CBloodSplat::Spray(void) { TraceResult tr; if (g_Language != LANGUAGE_GERMAN) @@ -5914,7 +5828,7 @@ void CBasePlayer::GiveNamedItem(const char *pszName) } /* <157568> ../cstrike/dlls/player.cpp:7114 */ -NOXREF CBaseEntity *FindEntityForward(CBaseEntity *pMe) +CBaseEntity *FindEntityForward(CBaseEntity *pMe) { TraceResult tr; @@ -5984,7 +5898,7 @@ void CBasePlayer::ForceClientDllUpdate(void) } /* <157f8d> ../cstrike/dlls/player.cpp:7202 */ -void CBasePlayer::ImpulseCommands_(void) +void CBasePlayer::__MAKE_VHOOK(ImpulseCommands)(void) { TraceResult tr; @@ -6198,8 +6112,9 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse) pEntity = FindEntityForward(this); if (pEntity && pEntity->pev->takedamage != DAMAGE_NO) + { pEntity->SetThink(&CBaseEntity::SUB_Remove); - + } break; } case 204: @@ -6274,7 +6189,7 @@ void OLD_CheckRescueZone(CBasePlayer *player) CBaseEntity *pSpot = NULL; while ((pSpot = UTIL_FindEntityByClassname(pSpot, "info_hostage_rescue")) != NULL) { - if ((pSpot->pev->origin - player->pev->origin).Length() <= 256) + if ((pSpot->pev->origin - player->pev->origin).Length() <= 256.0f) player->m_signals.Signal(SIGNAL_RESCUE); } } @@ -6341,7 +6256,7 @@ void CBasePlayer::HandleSignals(void) // Add a weapon to the player (Item == Weapon == Selectable Object) /* <15325f> ../cstrike/dlls/player.cpp:7625 */ -BOOL CBasePlayer::AddPlayerItem_(CBasePlayerItem *pItem) +BOOL CBasePlayer::__MAKE_VHOOK(AddPlayerItem)(CBasePlayerItem *pItem) { CBasePlayerItem *pInsert = m_rgpPlayerItems[ pItem->iItemSlot() ]; while (pInsert != NULL) @@ -6387,18 +6302,23 @@ BOOL CBasePlayer::AddPlayerItem_(CBasePlayerItem *pItem) if (g_pGameRules->FShouldSwitchWeapon(this, pItem)) { if (!m_bShieldDrawn) + { SwitchWeapon(pItem); + } } + return TRUE; } else if (gEvilImpulse101) + { pItem->Kill(); + } return FALSE; } /* <1534bd> ../cstrike/dlls/player.cpp:7692 */ -BOOL CBasePlayer::RemovePlayerItem_(CBasePlayerItem *pItem) +BOOL CBasePlayer::__MAKE_VHOOK(RemovePlayerItem)(CBasePlayerItem *pItem) { if (m_pActiveItem == pItem) { @@ -6435,7 +6355,7 @@ BOOL CBasePlayer::RemovePlayerItem_(CBasePlayerItem *pItem) // Returns the unique ID for the ammo, or -1 if error /* <15997b> ../cstrike/dlls/player.cpp:7731 */ -int CBasePlayer::GiveAmmo_(int iCount, char *szName, int iMax) +int CBasePlayer::__MAKE_VHOOK(GiveAmmo)(int iCount, char *szName, int iMax) { if (pev->flags & FL_SPECTATOR) return -1; @@ -6457,7 +6377,7 @@ int CBasePlayer::GiveAmmo_(int iCount, char *szName, int iMax) if (i < 0 || i >= MAX_AMMO_SLOTS) return -1; - int iAdd = min(iCount, iMax - m_rgAmmo[i]); + int iAdd = _min(iCount, iMax - m_rgAmmo[i]); if (iAdd < 1) return i; @@ -6567,7 +6487,7 @@ void CBasePlayer::SendAmmoUpdate(void) // send "Ammo" update message MESSAGE_BEGIN(MSG_ONE, gmsgAmmoX, NULL, pev); WRITE_BYTE(i); - WRITE_BYTE( max( min( m_rgAmmo[i], 254 ), 0 ) ); // clamp the value to one byte + WRITE_BYTE( _max( _min( m_rgAmmo[i], 254 ), 0 ) ); // clamp the value to one byte MESSAGE_END(); } } @@ -6576,13 +6496,13 @@ void CBasePlayer::SendAmmoUpdate(void) /* <158d4b> ../cstrike/dlls/player.cpp:7885 */ void CBasePlayer::SendHostagePos(void) { - CHostage *pHostage = NULL; + CBaseEntity *pHostage = NULL; - while ((pHostage = (CHostage *)UTIL_FindEntityByClassname(pHostage, "hostage_entity")) != NULL) + while ((pHostage = UTIL_FindEntityByClassname(pHostage, "hostage_entity")) != NULL) { MESSAGE_BEGIN(MSG_ONE, gmsgHostagePos, NULL, pev); WRITE_BYTE(1); - WRITE_BYTE(pHostage->m_iHostageIndex); + WRITE_BYTE(((CHostage *)pHostage)->m_iHostageIndex); WRITE_COORD(pHostage->pev->origin.x); WRITE_COORD(pHostage->pev->origin.y); WRITE_COORD(pHostage->pev->origin.z); @@ -6662,7 +6582,7 @@ void CBasePlayer::SendWeatherInfo(void) // reflecting all of the HUD state info. /* <159d3c> ../cstrike/dlls/player.cpp:7963 */ -void CBasePlayer::UpdateClientData_(void) +void CBasePlayer::__MAKE_VHOOK(UpdateClientData)(void) { if (m_fInitHUD) { @@ -7006,7 +6926,7 @@ void CBasePlayer::UpdateClientData_(void) } /* <1510bc> ../cstrike/dlls/player.cpp:8330 */ -BOOL CBasePlayer::FBecomeProne_(void) +BOOL CBasePlayer::__MAKE_VHOOK(FBecomeProne)(void) { m_afPhysicsFlags |= PFLAG_ONBARNACLE; return TRUE; @@ -7027,7 +6947,7 @@ NOXREF void CBasePlayer::BarnacleVictimReleased(void) // return player light level plus virtual muzzle flash /* <1510e4> ../cstrike/dlls/player.cpp:8360 */ -int CBasePlayer::Illumination_(void) +int CBasePlayer::__MAKE_VHOOK(Illumination)(void) { int iIllum = CBaseEntity::Illumination(); @@ -7049,7 +6969,7 @@ void CBasePlayer::EnableControl(BOOL fControl) } /* <151142> ../cstrike/dlls/player.cpp:8387 */ -void CBasePlayer::ResetMaxSpeed_(void) +void CBasePlayer::__MAKE_VHOOK(ResetMaxSpeed)(void) { float speed = 240.0f; @@ -7081,7 +7001,7 @@ bool CBasePlayer::HintMessage(const char *pMessage, BOOL bDisplayIfPlayerDead, B } /* <1513f7> ../cstrike/dlls/player.cpp:8473 */ -Vector CBasePlayer::GetAutoaimVector_(float flDelta) +Vector CBasePlayer::__MAKE_VHOOK(GetAutoaimVector)(float flDelta) { Vector vecSrc; BOOL m_fOldTargeting; @@ -7184,7 +7104,7 @@ int CBasePlayer::GetCustomDecalFrames(void) } /* <151183> ../cstrike/dlls/player.cpp:8731 */ -void CBasePlayer::Blind_(float duration, float holdTime, float fadeTime, int alpha) +void CBasePlayer::__MAKE_VHOOK(Blind)(float duration, float holdTime, float fadeTime, int alpha) { m_blindUntilTime = gpGlobals->time + duration; m_blindStartTime = gpGlobals->time; @@ -7709,12 +7629,16 @@ void CBasePlayer::UpdateShieldCrosshair(bool draw) BOOL CBasePlayer::SwitchWeapon(CBasePlayerItem *pWeapon) { if (!pWeapon->CanDeploy()) + { return FALSE; + } ResetAutoaim(); if (m_pActiveItem) + { m_pActiveItem->Holster(); + } CBasePlayerItem *pTemp = m_pActiveItem; m_pActiveItem = pWeapon; @@ -7722,10 +7646,14 @@ BOOL CBasePlayer::SwitchWeapon(CBasePlayerItem *pWeapon) pWeapon->Deploy(); if (pWeapon->m_pPlayer) + { pWeapon->m_pPlayer->ResetMaxSpeed(); + } if (HasShield()) + { UpdateShieldCrosshair(true); + } return TRUE; } @@ -7746,17 +7674,17 @@ void CBasePlayer::TabulateAmmo(void) } /* <1511eb> ../cstrike/dlls/player.cpp:9365 */ -int CDeadHEV::Classify_(void) +int CDeadHEV::__MAKE_VHOOK(Classify)(void) { return CLASS_HUMAN_MILITARY; } /* <152451> ../cstrike/dlls/player.cpp:9375 */ -void CDeadHEV::KeyValue_(KeyValueData *pkvd) +void CDeadHEV::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "pose")) { - m_iPose = atoi(pkvd->szValue); + m_iPose = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else @@ -7767,7 +7695,7 @@ void CDeadHEV::KeyValue_(KeyValueData *pkvd) LINK_ENTITY_TO_CLASS(monster_hevsuit_dead, CDeadHEV); /* <1513ce> ../cstrike/dlls/player.cpp:9391 */ -void CDeadHEV::Spawn_(void) +void CDeadHEV::__MAKE_VHOOK(Spawn)(void) { PRECACHE_MODEL("models/player.mdl"); SET_MODEL(ENT(pev), "models/player.mdl"); @@ -7796,18 +7724,23 @@ void CDeadHEV::Spawn_(void) LINK_ENTITY_TO_CLASS(player_weaponstrip, CStripWeapons); /* <15f62f> ../cstrike/dlls/player.cpp:9428 */ -void CStripWeapons::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CStripWeapons::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { CBasePlayer *pPlayer = NULL; if (pActivator && pActivator->IsPlayer()) + { pPlayer = (CBasePlayer *)pActivator; - + } else if (!g_pGameRules->IsDeathmatch()) + { pPlayer = (CBasePlayer *)Instance(INDEXENT(1)); + } if (pPlayer) + { pPlayer->RemoveAllItems(FALSE); + } } /* <159c40> ../cstrike/dlls/player.cpp:9473 */ @@ -7817,26 +7750,26 @@ LINK_ENTITY_TO_CLASS(player_loadsaved, CRevertSaved); IMPLEMENT_SAVERESTORE(CRevertSaved, CPointEntity); /* <152540> ../cstrike/dlls/player.cpp:9483 */ -void CRevertSaved::KeyValue_(KeyValueData *pkvd) +void CRevertSaved::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "duration")) { - SetDuration( atof(pkvd->szValue) ); + SetDuration(Q_atof(pkvd->szValue)); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "holdtime")) { - SetHoldTime( atof(pkvd->szValue) ); + SetHoldTime(Q_atof(pkvd->szValue)); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "messagetime")) { - SetMessageTime( atof(pkvd->szValue) ); + SetMessageTime(Q_atof(pkvd->szValue)); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "loadtime")) { - SetLoadTime( atof(pkvd->szValue) ); + SetLoadTime(Q_atof(pkvd->szValue)); pkvd->fHandled = TRUE; } else @@ -7844,7 +7777,7 @@ void CRevertSaved::KeyValue_(KeyValueData *pkvd) } /* <151365> ../cstrike/dlls/player.cpp:9509 */ -void CRevertSaved::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CRevertSaved::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { UTIL_ScreenFadeAll(pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, FFADE_OUT); pev->nextthink = gpGlobals->time + MessageTime(); @@ -7874,7 +7807,7 @@ void CRevertSaved::LoadThink(void) } /* <15133c> ../cstrike/dlls/player.cpp:9549 */ -void CInfoIntermission::Spawn_(void) +void CInfoIntermission::__MAKE_VHOOK(Spawn)(void) { UTIL_SetOrigin(pev, pev->origin); @@ -7885,7 +7818,7 @@ void CInfoIntermission::Spawn_(void) } /* <1530e6> ../cstrike/dlls/player.cpp:9560 */ -void CInfoIntermission::Think_(void) +void CInfoIntermission::__MAKE_VHOOK(Think)(void) { edict_t *pTarget = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(pev->target)); @@ -8123,7 +8056,7 @@ void CBasePlayer::ResetStamina(void) float GetPlayerPitch(const edict_t *pEdict) { entvars_t *pev = VARS((edict_t *)pEdict); - CBasePlayer *pPlayer = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pPlayer = reinterpret_cast(CBasePlayer::Instance(pev)); if (!pPlayer) return 0.0f; @@ -8135,7 +8068,7 @@ float GetPlayerPitch(const edict_t *pEdict) float GetPlayerYaw(const edict_t *pEdict) { entvars_t *pev = VARS((edict_t *)pEdict); - CBasePlayer *pPlayer = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pPlayer = reinterpret_cast(CBasePlayer::Instance(pev)); if (!pPlayer) return 0.0f; @@ -8147,7 +8080,7 @@ float GetPlayerYaw(const edict_t *pEdict) int GetPlayerGaitsequence(const edict_t *pEdict) { entvars_t *pev = VARS((edict_t *)pEdict); - CBasePlayer *pPlayer = reinterpret_cast< CBasePlayer * >(CBasePlayer::Instance( pev )); + CBasePlayer *pPlayer = reinterpret_cast(CBasePlayer::Instance(pev)); if (!pPlayer) return 1; @@ -8178,8 +8111,10 @@ void CBasePlayer::SpawnClientSideCorpse(void) m_canSwitchObserverModes = true; - if (TheTutor) + if (TheTutor != NULL) + { TheTutor->OnEvent(EVENT_CLIENT_CORPSE_SPAWNED, this); + } } /* <15a7a2> ../cstrike/dlls/player.cpp:9909 */ @@ -8246,21 +8181,21 @@ void CBasePlayer::SetPrefsFromUserinfo(char *infobuffer) pszKeyVal = GET_KEY_VALUE(infobuffer, "_cl_autowepswitch"); if (Q_strcmp(pszKeyVal, "")) - m_iAutoWepSwitch = atoi(pszKeyVal); + m_iAutoWepSwitch = Q_atoi(pszKeyVal); else m_iAutoWepSwitch = 1; pszKeyVal = GET_KEY_VALUE(infobuffer, "_vgui_menus"); if (Q_strcmp(pszKeyVal, "")) - m_bVGUIMenus = atoi(pszKeyVal) != 0; + m_bVGUIMenus = Q_atoi(pszKeyVal) != 0; else m_bVGUIMenus = true; pszKeyVal = GET_KEY_VALUE(infobuffer, "_ah"); if (Q_strcmp(pszKeyVal, "")) - m_bShowHints = atoi(pszKeyVal) != 0; + m_bShowHints = Q_atoi(pszKeyVal) != 0; else m_bShowHints = true; } @@ -8441,7 +8376,7 @@ void CBasePlayer::ClientCommand(const char *cmd, const char *arg1, const char *a } /* <15aea9> ../cstrike/dlls/player.cpp:10401 */ -NOXREF const char *GetBuyStringForWeaponClass(int weaponClass) +const char *GetBuyStringForWeaponClass(int weaponClass) { switch (weaponClass) { @@ -8561,13 +8496,13 @@ void CBasePlayer::AutoBuy(void) } /* <14ea4e> ../cstrike/dlls/player.cpp:10556 */ -NOXREF bool IsPrimaryWeaponClass(int classId) +bool IsPrimaryWeaponClass(int classId) { return (classId >= WEAPONCLASS_SUBMACHINEGUN && classId <= WEAPONCLASS_SNIPERRIFLE); } /* <15afbe> ../cstrike/dlls/player.cpp:10571 */ -NOXREF bool IsPrimaryWeaponId(int id) +bool IsPrimaryWeaponId(int id) { int classId = WEAPONCLASS_NONE; const char *alias = WeaponIDToAlias( id ); @@ -8581,13 +8516,13 @@ NOXREF bool IsPrimaryWeaponId(int id) } /* <14ea6f> ../cstrike/dlls/player.cpp:10583 */ -NOXREF bool IsSecondaryWeaponClass(int classId) +bool IsSecondaryWeaponClass(int classId) { return (classId == WEAPONCLASS_PISTOL); } /* <15b059> ../cstrike/dlls/player.cpp:10588 */ -NOXREF bool IsSecondaryWeaponId(int id) +bool IsSecondaryWeaponId(int id) { int classId = WEAPONCLASS_NONE; const char *alias = WeaponIDToAlias( id ); @@ -8601,26 +8536,28 @@ NOXREF bool IsSecondaryWeaponId(int id) } /* <15b0f1> ../cstrike/dlls/player.cpp:10600 */ -NOXREF const char *GetWeaponAliasFromName(const char *weaponName) +const char *GetWeaponAliasFromName(const char *weaponName) { if (!Q_strncmp(weaponName, "weapon_", 7)) + { weaponName += 7; + } return weaponName; } /* <15b133> ../cstrike/dlls/player.cpp:10607 */ -NOXREF bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int classId) +bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int classId) { if (pWeapon == NULL) return false; - const char *weaponName = GetWeaponAliasFromName( pWeapon->pszName() ); + const char *weaponName = GetWeaponAliasFromName(pWeapon->pszName()); - if (id && AliasToWeaponID( weaponName ) == id) + if (id && AliasToWeaponID(weaponName) == id) return true; - if (classId && AliasToWeaponClass( weaponName ) == classId) + if (classId && AliasToWeaponClass(weaponName) == classId) return true; return false; @@ -8722,7 +8659,7 @@ NOBODY const char __declspec(naked) *CBasePlayer::PickSecondaryCareerTaskWeapon( } /* <15b9ea> ../cstrike/dlls/player.cpp:10759 */ -NOXREF const char *CBasePlayer::PickFlashKillWeaponString(void) +const char *CBasePlayer::PickFlashKillWeaponString(void) { bool foundOne = false; @@ -8744,7 +8681,7 @@ NOXREF const char *CBasePlayer::PickFlashKillWeaponString(void) } /* <15baa1> ../cstrike/dlls/player.cpp:10787 */ -NOXREF const char *CBasePlayer::PickGrenadeKillWeaponString(void) +const char *CBasePlayer::PickGrenadeKillWeaponString(void) { bool foundOne = false; @@ -8882,7 +8819,7 @@ void CBasePlayer::ParseAutoBuyString(const char *string, bool &boughtPrimary, bo } /* <15bb6b> ../cstrike/dlls/player.cpp:10957 */ -NOXREF bool CBasePlayer::ShouldExecuteAutoBuyCommand(AutoBuyInfoStruct *commandInfo, bool boughtPrimary, bool boughtSecondary) +bool CBasePlayer::ShouldExecuteAutoBuyCommand(AutoBuyInfoStruct *commandInfo, bool boughtPrimary, bool boughtSecondary) { if (!commandInfo) return false; @@ -8897,7 +8834,7 @@ NOXREF bool CBasePlayer::ShouldExecuteAutoBuyCommand(AutoBuyInfoStruct *commandI } /* <15bbfa> ../cstrike/dlls/player.cpp:10978 */ -NOXREF AutoBuyInfoStruct *CBasePlayer::GetAutoBuyCommandInfo(const char *command) +AutoBuyInfoStruct *CBasePlayer::GetAutoBuyCommandInfo(const char *command) { int i = 0; AutoBuyInfoStruct *ret = NULL; diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index 8e699d1e..70b3e3ce 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -112,8 +112,8 @@ #define TEAM_NAME_LENGTH 16 -#define MAX_ID_RANGE 2048 -#define MAX_SPECTATOR_ID_RANGE 8192 +#define MAX_ID_RANGE 2048.0f +#define MAX_SPECTATOR_ID_RANGE 8192.0f #define SBAR_STRING_SIZE 128 #define SBAR_TARGETTYPE_TEAMMATE 1 @@ -765,22 +765,22 @@ public: void PrioritizeAutoBuyString(char *autobuyString, const char *priorityString); NOBODY const char *PickPrimaryCareerTaskWeapon(void); NOBODY const char *PickSecondaryCareerTaskWeapon(void); - NOXREF const char *PickFlashKillWeaponString(void); - NOXREF const char *PickGrenadeKillWeaponString(void); - NOXREF bool ShouldExecuteAutoBuyCommand(AutoBuyInfoStruct *commandInfo, bool boughtPrimary, bool boughtSecondary); + const char *PickFlashKillWeaponString(void); + const char *PickGrenadeKillWeaponString(void); + bool ShouldExecuteAutoBuyCommand(AutoBuyInfoStruct *commandInfo, bool boughtPrimary, bool boughtSecondary); void PostAutoBuyCommandProcessing(AutoBuyInfoStruct *commandInfo, bool &boughtPrimary, bool &boughtSecondary); void ParseAutoBuyString(const char *string, bool &boughtPrimary, bool &boughtSecondary); - NOXREF AutoBuyInfoStruct *GetAutoBuyCommandInfo(const char *command); + AutoBuyInfoStruct *GetAutoBuyCommandInfo(const char *command); void InitRebuyData(const char *str); void BuildRebuyStruct(void); void Rebuy(void); - NOXREF void RebuyPrimaryWeapon(void); - NOXREF void RebuyPrimaryAmmo(void); - NOXREF void RebuySecondaryWeapon(void); - NOXREF void RebuySecondaryAmmo(void); - NOXREF void RebuyHEGrenade(void); - NOXREF void RebuyFlashbang(void); - NOXREF void RebuySmokeGrenade(void); + void RebuyPrimaryWeapon(void); + void RebuyPrimaryAmmo(void); + void RebuySecondaryWeapon(void); + void RebuySecondaryAmmo(void); + void RebuyHEGrenade(void); + void RebuyFlashbang(void); + void RebuySmokeGrenade(void); void RebuyDefuser(void); void RebuyNightVision(void); void RebuyArmor(void); @@ -1168,17 +1168,17 @@ NOXREF void InitZombieSpawns(void); NOXREF CBaseEntity *FindZombieSpawn(CBaseEntity *player, bool forceSpawn); edict_t *EntSelectSpawnPoint(CBaseEntity *pPlayer); void SetScoreAttrib(CBasePlayer *dest, CBasePlayer *src); -NOXREF CBaseEntity *FindEntityForward(CBaseEntity *pMe); +CBaseEntity *FindEntityForward(CBaseEntity *pMe); float GetPlayerPitch(const edict_t *pEdict); float GetPlayerYaw(const edict_t *pEdict); int GetPlayerGaitsequence(const edict_t *pEdict); -NOXREF const char *GetBuyStringForWeaponClass(int weaponClass); -NOXREF bool IsPrimaryWeaponClass(int classId); -NOXREF bool IsPrimaryWeaponId(int id); -NOXREF bool IsSecondaryWeaponClass(int classId); -NOXREF bool IsSecondaryWeaponId(int id); -NOXREF const char *GetWeaponAliasFromName(const char *weaponName); -NOXREF bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int classId); +const char *GetBuyStringForWeaponClass(int weaponClass); +bool IsPrimaryWeaponClass(int classId); +bool IsPrimaryWeaponId(int id); +bool IsSecondaryWeaponClass(int classId); +bool IsSecondaryWeaponId(int id); +const char *GetWeaponAliasFromName(const char *weaponName); +bool CurrentWeaponSatisfies(CBasePlayerWeapon *pWeapon, int id, int classId); // refs extern void (*pCBasePlayer__PickPrimaryCareerTaskWeapon)(void); diff --git a/regamedll/dlls/saverestore.h b/regamedll/dlls/saverestore.h index 670856bb..7eb45f08 100644 --- a/regamedll/dlls/saverestore.h +++ b/regamedll/dlls/saverestore.h @@ -32,7 +32,7 @@ #pragma once #endif -#define MAX_ENTITYARRAY 64 +#define MAX_ENTITY_ARRAY 64 #ifndef HOOK_GAMEDLL @@ -71,6 +71,7 @@ typedef enum GLOBAL_OFF, GLOBAL_ON, GLOBAL_DEAD + } GLOBALESTATE; typedef struct globalentity_s @@ -79,14 +80,18 @@ typedef struct globalentity_s char levelName[32]; GLOBALESTATE state; struct globalentity_s *pNext; + } globalentity_t; +/* size: 104, cachelines: 2, members: 4 */ typedef struct { unsigned short size; unsigned short token; char *pData; + } HEADER; +/* size: 8, cachelines: 1, members: 3 */ class CBaseEntity; @@ -204,22 +209,23 @@ private: class CGlobalState { public: - NOBODY CGlobalState(); - NOBODY void Reset(void); - NOBODY void ClearStates(void); - NOBODY void EntityAdd(string_t globalname, string_t mapName, GLOBALESTATE state); + CGlobalState(void); + + void Reset(void); + void ClearStates(void); + void EntityAdd(string_t globalname, string_t mapName, GLOBALESTATE state); void EntitySetState(string_t globalname, GLOBALESTATE state); - NOBODY void EntityUpdate(string_t globalname, string_t mapname); - NOBODY const globalentity_t *EntityFromTable(string_t globalname); - NOBODY GLOBALESTATE EntityGetState(string_t globalname); + void EntityUpdate(string_t globalname, string_t mapname); + const globalentity_t *EntityFromTable(string_t globalname); + GLOBALESTATE EntityGetState(string_t globalname); int EntityInTable(string_t globalname) { if (Find(globalname) != NULL) return 1; return 0; } - NOBODY int Save(CSave &save); - NOBODY int Restore(CRestore &restore); + int Save(CSave &save); + int Restore(CRestore &restore); void DumpGlobals(void); static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[1]; diff --git a/regamedll/dlls/scriptevent.h b/regamedll/dlls/scriptevent.h new file mode 100644 index 00000000..7e937e4b --- /dev/null +++ b/regamedll/dlls/scriptevent.h @@ -0,0 +1,47 @@ +/* +* +* 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 SCRIPTEVENT_H +#define SCRIPTEVENT_H +#ifdef _WIN32 +#pragma once +#endif + +#define SCRIPT_EVENT_DEAD 1000 // character is now dead +#define SCRIPT_EVENT_NOINTERRUPT 1001 // does not allow interrupt +#define SCRIPT_EVENT_CANINTERRUPT 1002 // will allow interrupt +#define SCRIPT_EVENT_FIREEVENT 1003 // event now fires +#define SCRIPT_EVENT_SOUND 1004 // Play named wave file (on CHAN_BODY) +#define SCRIPT_EVENT_SENTENCE 1005 // Play named sentence +#define SCRIPT_EVENT_INAIR 1006 // Leave the character in air at the end of the sequence (don't find the floor) +#define SCRIPT_EVENT_ENDANIMATION 1007 // Set the animation by name after the sequence completes +#define SCRIPT_EVENT_SOUND_VOICE 1008 // Play named wave file (on CHAN_VOICE) +#define SCRIPT_EVENT_SENTENCE_RND1 1009 // Play sentence group 25% of the time +#define SCRIPT_EVENT_NOT_DEAD 1010 // Bring back to life (for life/death sequences) + +#endif // SCRIPTEVENT_H diff --git a/regamedll/dlls/singleplay_gamerules.cpp b/regamedll/dlls/singleplay_gamerules.cpp index 5d3ab095..14266ce0 100644 --- a/regamedll/dlls/singleplay_gamerules.cpp +++ b/regamedll/dlls/singleplay_gamerules.cpp @@ -3,81 +3,86 @@ /* <1676c5> ../cstrike/dlls/singleplay_gamerules.cpp:32 */ CHalfLifeRules::CHalfLifeRules(void) { + m_bFreezePeriod = FALSE; RefreshSkillData(); } /* <166d5d> ../cstrike/dlls/singleplay_gamerules.cpp:40 */ -void CHalfLifeRules::Think(void) +void CHalfLifeRules::__MAKE_VHOOK(Think)(void) { ; } /* <166d83> ../cstrike/dlls/singleplay_gamerules.cpp:46 */ -BOOL CHalfLifeRules::IsMultiplayer(void) +BOOL CHalfLifeRules::__MAKE_VHOOK(IsMultiplayer)(void) { return FALSE; } /* <166da9> ../cstrike/dlls/singleplay_gamerules.cpp:53 */ -BOOL CHalfLifeRules::IsDeathmatch(void) +BOOL CHalfLifeRules::__MAKE_VHOOK(IsDeathmatch)(void) { return FALSE; } /* <166dcf> ../cstrike/dlls/singleplay_gamerules.cpp:60 */ -BOOL CHalfLifeRules::IsCoOp(void) +BOOL CHalfLifeRules::__MAKE_VHOOK(IsCoOp)(void) { return FALSE; } /* <166df5> ../cstrike/dlls/singleplay_gamerules.cpp:68 */ -BOOL CHalfLifeRules::FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +BOOL CHalfLifeRules::__MAKE_VHOOK(FShouldSwitchWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { if (!pPlayer->m_pActiveItem) { // player doesn't have an active item! return TRUE; } + if (!pPlayer->m_pActiveItem->CanHolster()) { return FALSE; } + return TRUE; } /* <166e38> ../cstrike/dlls/singleplay_gamerules.cpp:86 */ -BOOL CHalfLifeRules::GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) +BOOL CHalfLifeRules::__MAKE_VHOOK(GetNextBestWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) { return FALSE; } /* <166e7a> ../cstrike/dlls/singleplay_gamerules.cpp:93 */ -BOOL CHalfLifeRules::ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) +BOOL CHalfLifeRules::__MAKE_VHOOK(ClientConnected)(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) { return TRUE; } /* <166ed8> ../cstrike/dlls/singleplay_gamerules.cpp:98 */ -void CHalfLifeRules::InitHUD(CBasePlayer *pl) +void CHalfLifeRules::__MAKE_VHOOK(InitHUD)(CBasePlayer *pl) { ; } /* <166f0b> ../cstrike/dlls/singleplay_gamerules.cpp:104 */ -void CHalfLifeRules::ClientDisconnected(edict_t *pClient) +void CHalfLifeRules::__MAKE_VHOOK(ClientDisconnected)(edict_t *pClient) { ; } /* <166f3f> ../cstrike/dlls/singleplay_gamerules.cpp:110 */ -float CHalfLifeRules::FlPlayerFallDamage(CBasePlayer *pPlayer) +float CHalfLifeRules::__MAKE_VHOOK(FlPlayerFallDamage)(CBasePlayer *pPlayer) { + // subtract off the speed at which a player is allowed to fall without being hurt, + // so damage will be based on speed beyond that, not the entire fall pPlayer->m_flFallVelocity -= PLAYER_MAX_SAFE_FALL_SPEED; return pPlayer->m_flFallVelocity * DAMAGE_FOR_FALL_SPEED; } /* <167677> ../cstrike/dlls/singleplay_gamerules.cpp:120 */ -void CHalfLifeRules::PlayerSpawn_(CBasePlayer *pPlayer) +void CHalfLifeRules::__MAKE_VHOOK(PlayerSpawn)(CBasePlayer *pPlayer) { pPlayer->pev->weapons |= (1 << WEAPON_SUIT); @@ -91,73 +96,73 @@ void CHalfLifeRules::PlayerSpawn_(CBasePlayer *pPlayer) } /* <166f73> ../cstrike/dlls/singleplay_gamerules.cpp:135 */ -BOOL CHalfLifeRules::AllowAutoTargetCrosshair(void) +BOOL CHalfLifeRules::__MAKE_VHOOK(AllowAutoTargetCrosshair)(void) { return (g_iSkillLevel == SKILL_EASY); } /* <166f99> ../cstrike/dlls/singleplay_gamerules.cpp:142 */ -void CHalfLifeRules::PlayerThink(CBasePlayer *pPlayer) +void CHalfLifeRules::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer) { ; } /* <166fcd> ../cstrike/dlls/singleplay_gamerules.cpp:149 */ -BOOL CHalfLifeRules::FPlayerCanRespawn(CBasePlayer *pPlayer) +BOOL CHalfLifeRules::__MAKE_VHOOK(FPlayerCanRespawn)(CBasePlayer *pPlayer) { return TRUE; } /* <167001> ../cstrike/dlls/singleplay_gamerules.cpp:156 */ -float CHalfLifeRules::FlPlayerSpawnTime(CBasePlayer *pPlayer) +float CHalfLifeRules::__MAKE_VHOOK(FlPlayerSpawnTime)(CBasePlayer *pPlayer) { return gpGlobals->time; } /* <167035> ../cstrike/dlls/singleplay_gamerules.cpp:165 */ -int CHalfLifeRules::IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) +int CHalfLifeRules::__MAKE_VHOOK(IPointsForKill)(CBasePlayer *pAttacker, CBasePlayer *pKilled) { return 1; } /* <167077> ../cstrike/dlls/singleplay_gamerules.cpp:173 */ -void CHalfLifeRules::PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +void CHalfLifeRules::__MAKE_VHOOK(PlayerKilled)(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) { ; } /* <1670c7> ../cstrike/dlls/singleplay_gamerules.cpp:180 */ -void CHalfLifeRules::DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +void CHalfLifeRules::__MAKE_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) { ; } /* <167117> ../cstrike/dlls/singleplay_gamerules.cpp:188 */ -void CHalfLifeRules::PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +void CHalfLifeRules::__MAKE_VHOOK(PlayerGotWeapon)(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { ; } /* <167159> ../cstrike/dlls/singleplay_gamerules.cpp:196 */ -float CHalfLifeRules::FlWeaponRespawnTime(CBasePlayerItem *pWeapon) +float CHalfLifeRules::__MAKE_VHOOK(FlWeaponRespawnTime)(CBasePlayerItem *pWeapon) { return -1; } /* <16718d> ../cstrike/dlls/singleplay_gamerules.cpp:206 */ -float CHalfLifeRules::FlWeaponTryRespawn(CBasePlayerItem *pWeapon) +float CHalfLifeRules::__MAKE_VHOOK(FlWeaponTryRespawn)(CBasePlayerItem *pWeapon) { return 0; } /* <1671c1> ../cstrike/dlls/singleplay_gamerules.cpp:215 */ -Vector CHalfLifeRules::VecWeaponRespawnSpot(CBasePlayerItem *pWeapon) +Vector CHalfLifeRules::__MAKE_VHOOK(VecWeaponRespawnSpot)(CBasePlayerItem *pWeapon) { return pWeapon->pev->origin; } /* <1675e6> ../cstrike/dlls/singleplay_gamerules.cpp:220 */ -edict_t *CHalfLifeRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer) +edict_t *CHalfLifeRules::__MAKE_VHOOK(GetPlayerSpawnSpot)(CBasePlayer *pPlayer) { CBaseEntity *pSpot = UTIL_FindEntityByClassname(NULL, "info_player_start"); @@ -178,107 +183,297 @@ edict_t *CHalfLifeRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer) } /* <16721c> ../cstrike/dlls/singleplay_gamerules.cpp:243 */ -int CHalfLifeRules::WeaponShouldRespawn(CBasePlayerItem *pWeapon) +int CHalfLifeRules::__MAKE_VHOOK(WeaponShouldRespawn)(CBasePlayerItem *pWeapon) { return GR_WEAPON_RESPAWN_NO; } /* <167250> ../cstrike/dlls/singleplay_gamerules.cpp:250 */ -BOOL CHalfLifeRules::CanHaveItem(CBasePlayer *pPlayer, CItem *pItem) +BOOL CHalfLifeRules::__MAKE_VHOOK(CanHaveItem)(CBasePlayer *pPlayer, CItem *pItem) { return TRUE; } /* <167292> ../cstrike/dlls/singleplay_gamerules.cpp:257 */ -void CHalfLifeRules::PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem) +void CHalfLifeRules::__MAKE_VHOOK(PlayerGotItem)(CBasePlayer *pPlayer, CItem *pItem) { ; } /* <1672d6> ../cstrike/dlls/singleplay_gamerules.cpp:263 */ -int CHalfLifeRules::ItemShouldRespawn(CItem *pItem) +int CHalfLifeRules::__MAKE_VHOOK(ItemShouldRespawn)(CItem *pItem) { return GR_ITEM_RESPAWN_NO; } /* <16730b> ../cstrike/dlls/singleplay_gamerules.cpp:272 */ -float CHalfLifeRules::FlItemRespawnTime(CItem *pItem) +float CHalfLifeRules::__MAKE_VHOOK(FlItemRespawnTime)(CItem *pItem) { return -1; } /* <167340> ../cstrike/dlls/singleplay_gamerules.cpp:281 */ -Vector CHalfLifeRules::VecItemRespawnSpot(CItem *pItem) +Vector CHalfLifeRules::__MAKE_VHOOK(VecItemRespawnSpot)(CItem *pItem) { return pItem->pev->origin; } /* <16739d> ../cstrike/dlls/singleplay_gamerules.cpp:288 */ -BOOL CHalfLifeRules::IsAllowedToSpawn(CBaseEntity *pEntity) +BOOL CHalfLifeRules::__MAKE_VHOOK(IsAllowedToSpawn)(CBaseEntity *pEntity) { return TRUE; } /* <1673d2> ../cstrike/dlls/singleplay_gamerules.cpp:295 */ -void CHalfLifeRules::PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount) +void CHalfLifeRules::__MAKE_VHOOK(PlayerGotAmmo)(CBasePlayer *pPlayer, char *szName, int iCount) { ; } /* <167425> ../cstrike/dlls/singleplay_gamerules.cpp:301 */ -int CHalfLifeRules::AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) +int CHalfLifeRules::__MAKE_VHOOK(AmmoShouldRespawn)(CBasePlayerAmmo *pAmmo) { return GR_AMMO_RESPAWN_NO; } /* <16745a> ../cstrike/dlls/singleplay_gamerules.cpp:308 */ -float CHalfLifeRules::FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) +float CHalfLifeRules::__MAKE_VHOOK(FlAmmoRespawnTime)(CBasePlayerAmmo *pAmmo) { return -1; } /* <16748f> ../cstrike/dlls/singleplay_gamerules.cpp:315 */ -Vector CHalfLifeRules::VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) +Vector CHalfLifeRules::__MAKE_VHOOK(VecAmmoRespawnSpot)(CBasePlayerAmmo *pAmmo) { return pAmmo->pev->origin; } /* <1674ec> ../cstrike/dlls/singleplay_gamerules.cpp:322 */ -float CHalfLifeRules::FlHealthChargerRechargeTime(void) +float CHalfLifeRules::__MAKE_VHOOK(FlHealthChargerRechargeTime)(void) { return 0; } /* <167512> ../cstrike/dlls/singleplay_gamerules.cpp:329 */ -int CHalfLifeRules::DeadPlayerWeapons(CBasePlayer *pPlayer) +int CHalfLifeRules::__MAKE_VHOOK(DeadPlayerWeapons)(CBasePlayer *pPlayer) { return GR_PLR_DROP_GUN_NO; } /* <167547> ../cstrike/dlls/singleplay_gamerules.cpp:336 */ -int CHalfLifeRules::DeadPlayerAmmo(CBasePlayer *pPlayer) +int CHalfLifeRules::__MAKE_VHOOK(DeadPlayerAmmo)(CBasePlayer *pPlayer) { return GR_PLR_DROP_AMMO_NO; } /* <16757c> ../cstrike/dlls/singleplay_gamerules.cpp:343 */ -int CHalfLifeRules::PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) +int CHalfLifeRules::__MAKE_VHOOK(PlayerRelationship)(CBasePlayer *pPlayer, CBaseEntity *pTarget) { // why would a single player in half life need this? return GR_NOTTEAMMATE; } /* <1675c0> ../cstrike/dlls/singleplay_gamerules.cpp:351 */ -BOOL CHalfLifeRules::FAllowMonsters(void) +BOOL CHalfLifeRules::__MAKE_VHOOK(FAllowMonsters)(void) { return TRUE; } #ifdef HOOK_GAMEDLL -void CHalfLifeRules::PlayerSpawn(CBasePlayer *pPlayer) -{ - PlayerSpawn_(pPlayer); +void CHalfLifeRules::Think(void) +{ + Think_(); +} + +BOOL CHalfLifeRules::IsAllowedToSpawn(CBaseEntity *pEntity) +{ + return IsAllowedToSpawn_(pEntity); +} + +BOOL CHalfLifeRules::FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +{ + return FShouldSwitchWeapon_(pPlayer, pWeapon); +} + +BOOL CHalfLifeRules::GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) +{ + return GetNextBestWeapon_(pPlayer, pCurrentWeapon); +} + +BOOL CHalfLifeRules::IsMultiplayer(void) +{ + return IsMultiplayer_(); +} + +BOOL CHalfLifeRules::IsDeathmatch(void) +{ + return IsDeathmatch_(); +} + +BOOL CHalfLifeRules::IsCoOp(void) +{ + return IsCoOp_(); +} + +BOOL CHalfLifeRules::ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]) +{ + return ClientConnected_(pEntity, pszName, pszAddress, szRejectReason); +} + +void CHalfLifeRules::InitHUD(CBasePlayer *pl) +{ + InitHUD_(pl); +} + +void CHalfLifeRules::ClientDisconnected(edict_t *pClient) +{ + ClientDisconnected_(pClient); +} + +float CHalfLifeRules::FlPlayerFallDamage(CBasePlayer *pPlayer) +{ + return FlPlayerFallDamage_(pPlayer); +} + +void CHalfLifeRules::PlayerSpawn(CBasePlayer *pPlayer) +{ + PlayerSpawn_(pPlayer); +} + +void CHalfLifeRules::PlayerThink(CBasePlayer *pPlayer) +{ + PlayerThink_(pPlayer); +} + +BOOL CHalfLifeRules::FPlayerCanRespawn(CBasePlayer *pPlayer) +{ + return FPlayerCanRespawn_(pPlayer); +} + +float CHalfLifeRules::FlPlayerSpawnTime(CBasePlayer *pPlayer) +{ + return FlPlayerSpawnTime_(pPlayer); +} + +edict_t *CHalfLifeRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer) +{ + return GetPlayerSpawnSpot_(pPlayer); +} + +BOOL CHalfLifeRules::AllowAutoTargetCrosshair(void) +{ + return AllowAutoTargetCrosshair_(); +} + +int CHalfLifeRules::IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) +{ + return IPointsForKill_(pAttacker, pKilled); +} + +void CHalfLifeRules::PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +{ + PlayerKilled_(pVictim, pKiller, pInflictor); +} + +void CHalfLifeRules::DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +{ + DeathNotice_(pVictim, pKiller, pInflictor); +} + +void CHalfLifeRules::PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) +{ + PlayerGotWeapon_(pPlayer, pWeapon); +} + +int CHalfLifeRules::WeaponShouldRespawn(CBasePlayerItem *pWeapon) +{ + return WeaponShouldRespawn_(pWeapon); +} + +float CHalfLifeRules::FlWeaponRespawnTime(CBasePlayerItem *pWeapon) +{ + return FlWeaponRespawnTime_(pWeapon); +} + +float CHalfLifeRules::FlWeaponTryRespawn(CBasePlayerItem *pWeapon) +{ + return FlWeaponTryRespawn_(pWeapon); +} + +Vector CHalfLifeRules::VecWeaponRespawnSpot(CBasePlayerItem *pWeapon) +{ + return VecWeaponRespawnSpot_(pWeapon); +} + +BOOL CHalfLifeRules::CanHaveItem(CBasePlayer *pPlayer, CItem *pItem) +{ + return CanHaveItem_(pPlayer, pItem); +} + +void CHalfLifeRules::PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem) +{ + PlayerGotItem_(pPlayer, pItem); +} + +int CHalfLifeRules::ItemShouldRespawn(CItem *pItem) +{ + return ItemShouldRespawn_(pItem); +} + +float CHalfLifeRules::FlItemRespawnTime(CItem *pItem) +{ + return FlItemRespawnTime_(pItem); +} + +Vector CHalfLifeRules::VecItemRespawnSpot(CItem *pItem) +{ + return VecItemRespawnSpot_(pItem); +} + +void CHalfLifeRules::PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount) +{ + PlayerGotAmmo_(pPlayer, szName, iCount); +} + +int CHalfLifeRules::AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) +{ + return AmmoShouldRespawn_(pAmmo); +} + +float CHalfLifeRules::FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) +{ + return FlAmmoRespawnTime_(pAmmo); +} + +Vector CHalfLifeRules::VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) +{ + return VecAmmoRespawnSpot_(pAmmo); +} + +float CHalfLifeRules::FlHealthChargerRechargeTime(void) +{ + return FlHealthChargerRechargeTime_(); +} + +int CHalfLifeRules::DeadPlayerWeapons(CBasePlayer *pPlayer) +{ + return DeadPlayerWeapons_(pPlayer); +} + +int CHalfLifeRules::DeadPlayerAmmo(CBasePlayer *pPlayer) +{ + return DeadPlayerAmmo_(pPlayer); +} + +int CHalfLifeRules::PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) +{ + return PlayerRelationship_(pPlayer, pTarget); +} + +BOOL CHalfLifeRules::FAllowMonsters(void) +{ + return FAllowMonsters_(); } #endif // HOOK_GAMEDLL \ No newline at end of file diff --git a/regamedll/dlls/skill.cpp b/regamedll/dlls/skill.cpp index 9b278c50..b96cc3e0 100644 --- a/regamedll/dlls/skill.cpp +++ b/regamedll/dlls/skill.cpp @@ -2,19 +2,23 @@ skilldata_t gSkillData; +// take the name of a cvar, tack a digit for the skill level +// on, and return the value.of that Cvar + /* <16a558> ../cstrike/dlls/skill.cpp:30 */ NOXREF float GetSkillCvar(char *pName) { - //int iCount; //unused - + int iCount; float flValue; char szBuffer[64]; - Q_sprintf(szBuffer, "%s%d", pName, gSkillData.iSkillLevel); + iCount = Q_sprintf(szBuffer, "%s%d", pName, gSkillData.iSkillLevel); flValue = CVAR_GET_FLOAT(szBuffer); if (flValue <= 0.0f) + { ALERT(at_console, "\n\n** GetSkillCVar Got a zero for %s **\n\n",szBuffer); + } return flValue; } diff --git a/regamedll/dlls/sound.cpp b/regamedll/dlls/sound.cpp index 82a90643..b1d53d26 100644 --- a/regamedll/dlls/sound.cpp +++ b/regamedll/dlls/sound.cpp @@ -257,7 +257,7 @@ NOBODY void CEnvSound::Spawn(void) // randomize list of sentence name indices /* <17093f> ../cstrike/dlls/sound.cpp:1084 */ -NOXREF void USENTENCEG_InitLRU(unsigned char *plru, int count) +void USENTENCEG_InitLRU(unsigned char *plru, int count) { int i, j, k; unsigned char temp; @@ -343,7 +343,7 @@ int USENTENCEG_Pick(int isentenceg, char *szfound) unsigned char i; unsigned char count; char sznum[8]; - unsigned char ipick; + unsigned char ipick = 0xFF; BOOL ffound = FALSE; if (!fSentencesInit) @@ -351,7 +351,7 @@ int USENTENCEG_Pick(int isentenceg, char *szfound) if (isentenceg < 0) return -1; - + szgroupname = rgsentenceg[isentenceg].szgroupname; count = rgsentenceg[isentenceg].count; plru = rgsentenceg[isentenceg].rgblru; @@ -359,6 +359,7 @@ int USENTENCEG_Pick(int isentenceg, char *szfound) while (!ffound) { for (i = 0; i < count; i++) + { if (plru[i] != 0xFF) { ipick = plru[i]; @@ -366,18 +367,21 @@ int USENTENCEG_Pick(int isentenceg, char *szfound) ffound = TRUE; break; } + } - if (!ffound) - USENTENCEG_InitLRU(plru, count); - else + if (ffound) { Q_strcpy(szfound, "!"); Q_strcat(szfound, szgroupname); Q_sprintf(sznum, "%d", ipick); Q_strcat(szfound, sznum); + return ipick; } + else + USENTENCEG_InitLRU(plru, count); } + return -1; } @@ -565,8 +569,10 @@ void SENTENCEG_Init(void) buffer[j] = 0; const char *pString = buffer + i; - if (Q_strlen( pString ) >= CBSENTENCENAME_MAX) - ALERT( at_warning, "Sentence %s longer than %d letters\n", pString, CBSENTENCENAME_MAX - 1); + if (Q_strlen(pString) >= CBSENTENCENAME_MAX) + { + ALERT(at_warning, "Sentence %s longer than %d letters\n", pString, CBSENTENCENAME_MAX - 1); + } Q_strcpy(gszallsentencenames[gcallsentences++], pString); @@ -825,7 +831,7 @@ void TEXTURETYPE_Init(void) continue; // null-terminate name and save in sentences array - j = min(j, CBTEXTURENAMEMAX - 1 + i); + j = _min(j, CBTEXTURENAMEMAX - 1 + i); buffer[j] = 0; Q_strcpy(&(grgszTextureName[gcTextures++][0]), &(buffer[i])); } @@ -1034,7 +1040,6 @@ float TEXTURETYPE_PlaySound(TraceResult *ptr, Vector vecSrc, Vector vecEnd, int else if (chTextureType == CHAR_TEX_COMPUTER) { // play random spark if computer - if (ptr->flFraction != 1.0 && RANDOM_LONG(0, 1)) { UTIL_Sparks(ptr->vecEndPos); @@ -1044,12 +1049,12 @@ float TEXTURETYPE_PlaySound(TraceResult *ptr, Vector vecSrc, Vector vecEnd, int switch (RANDOM_LONG(0, 1)) { - case 0: - UTIL_EmitAmbientSound(ENT(0), ptr->vecEndPos, "buttons/spark5.wav", flVolume, ATTN_NORM, 0, 100); - break; - case 1: - UTIL_EmitAmbientSound(ENT(0), ptr->vecEndPos, "buttons/spark6.wav", flVolume, ATTN_NORM, 0, 100); - break; + case 0: + UTIL_EmitAmbientSound(ENT(0), ptr->vecEndPos, "buttons/spark5.wav", flVolume, ATTN_NORM, 0, 100); + break; + case 1: + UTIL_EmitAmbientSound(ENT(0), ptr->vecEndPos, "buttons/spark6.wav", flVolume, ATTN_NORM, 0, 100); + break; } } } diff --git a/regamedll/dlls/sound.h b/regamedll/dlls/sound.h index c8f01876..5cd6587b 100644 --- a/regamedll/dlls/sound.h +++ b/regamedll/dlls/sound.h @@ -45,7 +45,7 @@ typedef struct /* size: 52, cachelines: 1, members: 3 */ NOBODY BOOL FEnvSoundInRange(entvars_t *pev, entvars_t *pevTarget, float *pflRange); -NOXREF void USENTENCEG_InitLRU(unsigned char *plru, int count); +void USENTENCEG_InitLRU(unsigned char *plru, int count); int USENTENCEG_PickSequential(int isentenceg, char *szfound, int ipick, int freset); int USENTENCEG_Pick(int isentenceg, char *szfound); NOXREF int SENTENCEG_GetIndex(const char *szgroupname); diff --git a/regamedll/dlls/soundent.cpp b/regamedll/dlls/soundent.cpp index 807f0b22..5fe98735 100644 --- a/regamedll/dlls/soundent.cpp +++ b/regamedll/dlls/soundent.cpp @@ -33,12 +33,12 @@ NOBODY BOOL CSound::FIsScent(void) } /* <17900a> ../cstrike/dlls/soundent.cpp:80 */ -NOBODY void CSoundEnt::Spawn_(void) +NOBODY void CSoundEnt::__MAKE_VHOOK(Spawn)(void) { } /* <178b0c> ../cstrike/dlls/soundent.cpp:93 */ -NOBODY void CSoundEnt::Think_(void) +NOBODY void CSoundEnt::__MAKE_VHOOK(Think)(void) { // { // int iSound; // 95 @@ -53,7 +53,7 @@ NOBODY void CSoundEnt::Think_(void) } /* <178a76> ../cstrike/dlls/soundent.cpp:132 */ -NOBODY void CSoundEnt::Precache_(void) +NOBODY void CSoundEnt::__MAKE_VHOOK(Precache)(void) { } diff --git a/regamedll/dlls/spectator.cpp b/regamedll/dlls/spectator.cpp index 77c4f631..fc2c2df7 100644 --- a/regamedll/dlls/spectator.cpp +++ b/regamedll/dlls/spectator.cpp @@ -1,6 +1,6 @@ #include "precompiled.h" -NOXREF void CBaseSpectator::SpectatorConnect(void) +void CBaseSpectator::SpectatorConnect(void) { pev->flags = FL_SPECTATOR; pev->solid = SOLID_NOT; @@ -74,20 +74,24 @@ void CBaseSpectator::SpectatorImpulseCommand(void) pev->impulse = 0; } -NOXREF void CBaseSpectator::SpectatorThink(void) +void CBaseSpectator::SpectatorThink(void) { if (!(pev->flags & FL_SPECTATOR)) + { pev->flags = FL_SPECTATOR; + } pev->solid = SOLID_NOT; pev->movetype = MOVETYPE_NOCLIP; if (pev->impulse) + { SpectatorImpulseCommand(); + } } /* <17d297> ../cstrike/dlls/spectator.cpp:142 */ -NOXREF void CBaseSpectator::Spawn_(void) +void CBaseSpectator::__MAKE_VHOOK(Spawn)(void) { pev->flags = FL_SPECTATOR; pev->solid = SOLID_NOT; diff --git a/regamedll/dlls/subs.cpp b/regamedll/dlls/subs.cpp index efdeee5a..129459c8 100644 --- a/regamedll/dlls/subs.cpp +++ b/regamedll/dlls/subs.cpp @@ -42,12 +42,12 @@ TYPEDESCRIPTION (*CBaseToggle::pm_SaveData)[19]; #endif // HOOK_GAMEDLL /* <1832bc> ../cstrike/dlls/subs.cpp:38 */ -NOBODY void CPointEntity::Spawn_(void) +NOBODY void CPointEntity::__MAKE_VHOOK(Spawn)(void) { } /* <183417> ../cstrike/dlls/subs.cpp:53 */ -NOBODY void CNullEntity::Spawn_(void) +NOBODY void CNullEntity::__MAKE_VHOOK(Spawn)(void) { } @@ -73,7 +73,7 @@ LINK_ENTITY_TO_CLASS(info_hostage_rescue, CPointEntity); LINK_ENTITY_TO_CLASS(info_bomb_target, CPointEntity); /* <183647> ../cstrike/dlls/subs.cpp:79 */ -NOBODY void CBaseDMStart::KeyValue_(KeyValueData *pkvd) +NOBODY void CBaseDMStart::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 81 @@ -84,7 +84,7 @@ NOBODY void CBaseDMStart::KeyValue_(KeyValueData *pkvd) } /* <18331c> ../cstrike/dlls/subs.cpp:90 */ -NOBODY BOOL CBaseDMStart::IsTriggered_(CBaseEntity *pEntity) +NOBODY BOOL CBaseDMStart::__MAKE_VHOOK(IsTriggered)(CBaseEntity *pEntity) { // { // BOOL master; // 92 @@ -94,7 +94,7 @@ NOBODY BOOL CBaseDMStart::IsTriggered_(CBaseEntity *pEntity) /* <183f03> ../cstrike/dlls/subs.cpp:98 */ void CBaseEntity::UpdateOnRemove(void) { - if (pev->flags & FL_GRAPHED) // NOXREF + if (pev->flags & FL_GRAPHED) { for (int i = 0; i < WorldGraph.m_cLinks; i++) { @@ -102,8 +102,11 @@ void CBaseEntity::UpdateOnRemove(void) WorldGraph.m_pLinkPool[i].m_pLinkEnt = NULL; } } + if (pev->globalname) + { gGlobalState.EntitySetState(pev->globalname, GLOBAL_DEAD); + } } /* <183f38> ../cstrike/dlls/subs.cpp:120 */ @@ -115,6 +118,7 @@ void CBaseEntity::SUB_Remove(void) pev->health = 0; ALERT(at_aiconsole, "SUB_Remove called on entity with health > 0\n"); } + REMOVE_ENTITY(ENT(pev)); } @@ -128,11 +132,11 @@ void CBaseEntity::SUB_DoNothing(void) IMPLEMENT_SAVERESTORE(CBaseDelay, CBaseEntity); /* <18356f> ../cstrike/dlls/subs.cpp:149 */ -void CBaseDelay::KeyValue_(KeyValueData *pkvd) +void CBaseDelay::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "delay")) { - m_flDelay = atof(pkvd->szValue); + m_flDelay = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "killtarget")) @@ -254,16 +258,16 @@ void CBaseDelay::DelayThink(void) IMPLEMENT_SAVERESTORE(CBaseToggle, CBaseAnimating); /* <1836dc> ../cstrike/dlls/subs.cpp:397 */ -void CBaseToggle::KeyValue_(KeyValueData *pkvd) +void CBaseToggle::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "lip")) { - m_flLip = atof(pkvd->szValue); + m_flLip = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "wait")) { - m_flWait = atof(pkvd->szValue); + m_flWait = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "master")) @@ -273,7 +277,7 @@ void CBaseToggle::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "distance")) { - m_flMoveDistance = atof(pkvd->szValue); + m_flMoveDistance = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else diff --git a/regamedll/dlls/training_gamerules.cpp b/regamedll/dlls/training_gamerules.cpp index 9a64ad70..db72893f 100644 --- a/regamedll/dlls/training_gamerules.cpp +++ b/regamedll/dlls/training_gamerules.cpp @@ -26,25 +26,25 @@ TYPEDESCRIPTION CBaseGrenCatch::m_SaveData[] = #else -TYPEDESCRIPTION (*CFuncWeaponCheck::pm_SaveData)[6]; -TYPEDESCRIPTION (*CBaseGrenCatch::pm_SaveData)[5]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CFuncWeaponCheck, m_SaveData)[6]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CBaseGrenCatch, m_SaveData)[5]; #endif // HOOK_GAMEDLL /* <18bcc4> ../cstrike/dlls/training_gamerules.cpp:23 */ -NOBODY CHalfLifeTraining::CHalfLifeTraining(void) +CHalfLifeTraining::CHalfLifeTraining(void) { PRECACHE_MODEL("models/w_weaponbox.mdl"); } /* <18ae1b> ../cstrike/dlls/training_gamerules.cpp:27 */ -BOOL CHalfLifeTraining::IsDeathmatch_(void) +BOOL CHalfLifeTraining::__MAKE_VHOOK(IsDeathmatch)(void) { return FALSE; } /* <18ae41> ../cstrike/dlls/training_gamerules.cpp:28 */ -void CHalfLifeTraining::InitHUD_(CBasePlayer *pl) +void CHalfLifeTraining::__MAKE_VHOOK(InitHUD)(CBasePlayer *pl) { ; } @@ -55,11 +55,13 @@ void CHalfLifeTraining::HostageDied(void) CBasePlayer *pPlayer = (CBasePlayer *)UTIL_PlayerByIndex(1); if (pPlayer) + { pPlayer->pev->radsuit_finished = gpGlobals->time + 3; + } } /* <18b005> ../cstrike/dlls/training_gamerules.cpp:34 */ -edict_t *CHalfLifeTraining::GetPlayerSpawnSpot_(CBasePlayer *pPlayer) +edict_t *CHalfLifeTraining::__MAKE_VHOOK(GetPlayerSpawnSpot)(CBasePlayer *pPlayer) { CBaseEntity *pSpot = UTIL_FindEntityByClassname(NULL, "info_player_start"); @@ -80,32 +82,134 @@ edict_t *CHalfLifeTraining::GetPlayerSpawnSpot_(CBasePlayer *pPlayer) } /* <18b4aa> ../cstrike/dlls/training_gamerules.cpp:52 */ -NOBODY void CHalfLifeTraining::PlayerThink_(CBasePlayer *pPlayer) +void CHalfLifeTraining::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer) { -// { -// class CGrenade *pBomb; // 94 -// FClassnameIs(entvars_t *pev, -// const char *szClassname); // 81 -// { -// class CBasePlayerWeapon *pWeapon; // 82 -// } -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 124 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 127 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 105 -// } + if (pPlayer->pev->radsuit_finished && gpGlobals->time > pPlayer->pev->radsuit_finished) + { + SERVER_COMMAND("reload\n"); + } + + if (!pPlayer->m_iAccount) + { + if (pPlayer->pev->scale) + { + pPlayer->m_iAccount = (int)pPlayer->pev->scale; + } + } + + if (pPlayer->m_iTeam == UNASSIGNED) + { + pPlayer->SetProgressBarTime(0); + pPlayer->m_bHasDefuser = pPlayer->pev->ideal_yaw != 0; + } + + m_iHostagesRescued = 0; + m_iRoundTimeSecs = (int)(gpGlobals->time + 1.0f); + m_bFreezePeriod = FALSE; + g_fGameOver = FALSE; + + pPlayer->m_iTeam = CT; + pPlayer->m_bCanShoot = true; + pPlayer->m_fLastMovement = gpGlobals->time; + + if (pPlayer->m_pActiveItem) + pPlayer->m_iHideHUD &= ~HIDEHUD_WEAPONS; + else + pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; + + if (pPlayer->HasNamedPlayerItem("weapon_c4")) + { + if (pPlayer->m_rgAmmo[ pPlayer->GetAmmoIndex("C4") ] <= 0) + { + pPlayer->m_bHasC4 = false; + + CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)pPlayer->m_pActiveItem; + + if (FClassnameIs(pWeapon->pev, "weapon_c4")) + { + pPlayer->pev->weapons &= ~(1 << pWeapon->m_iId); + pPlayer->RemovePlayerItem(pWeapon); + pWeapon->Drop(); + } + } + else + pPlayer->m_bHasC4 = true; + } + + if (!pPlayer->m_bVGUIMenus) + { + if (fVGUIMenus) + { + pPlayer->m_bVGUIMenus = fVGUIMenus; + } + } + + CGrenade *pBomb = NULL; + while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL) + { + if (pBomb->m_pentCurBombTarget != NULL) + pBomb->m_bStartDefuse = true; + } + + if (pPlayer->m_signals.GetState() & SIGNAL_BUY) + { + if (!fInBuyArea) + { + FillAccountTime = 1; + + if (!fVisitedBuyArea) + { + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pPlayer->pev); + WRITE_BYTE(STATUSICON_FLASH); + WRITE_STRING("buyzone"); + WRITE_BYTE(0); + WRITE_BYTE(160); + WRITE_BYTE(0); + MESSAGE_END(); + } + } + + fInBuyArea = TRUE; + + if (pPlayer->m_iAccount < 16000 && FillAccountTime == 0.0f) + FillAccountTime = gpGlobals->time + 5; + + if (FillAccountTime != 0.0f && gpGlobals->time > FillAccountTime) + { + if (!fVisitedBuyArea) + { + MESSAGE_BEGIN(MSG_ONE, gmsgBlinkAcct, NULL, pPlayer->pev); + WRITE_BYTE(3); + MESSAGE_END(); + + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, NULL, pPlayer->pev); + WRITE_BYTE(STATUSICON_SHOW); + WRITE_STRING("buyzone"); + WRITE_BYTE(0); + WRITE_BYTE(160); + WRITE_BYTE(0); + MESSAGE_END(); + + fVisitedBuyArea = TRUE; + } + + pPlayer->AddAccount(16000 - pPlayer->m_iAccount); + FillAccountTime = 0; + } + } + else if (fInBuyArea && fVisitedBuyArea) + { + fInBuyArea = FALSE; + } + + pPlayer->pev->scale = pPlayer->m_iAccount; + pPlayer->pev->ideal_yaw = pPlayer->m_bHasDefuser; + + TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, pPlayer); } /* <18b79c> ../cstrike/dlls/training_gamerules.cpp:151 */ -void CHalfLifeTraining::PlayerSpawn_(CBasePlayer *pPlayer) +void CHalfLifeTraining::__MAKE_VHOOK(PlayerSpawn)(CBasePlayer *pPlayer) { if (pPlayer->m_bNotKilled) return; @@ -126,7 +230,9 @@ void CHalfLifeTraining::PlayerSpawn_(CBasePlayer *pPlayer) CBaseEntity *pWeaponEntity = NULL; while ((pWeaponEntity = UTIL_FindEntityByClassname(pWeaponEntity, "game_player_equip")) != NULL) + { pWeaponEntity->Touch(pPlayer); + } pPlayer->SetPlayerModel(false); pPlayer->Spawn(); @@ -134,61 +240,106 @@ void CHalfLifeTraining::PlayerSpawn_(CBasePlayer *pPlayer) } /* <18ae74> ../cstrike/dlls/training_gamerules.cpp:182 */ -NOBODY int CHalfLifeTraining::ItemShouldRespawn_(CItem *pItem) +int CHalfLifeTraining::__MAKE_VHOOK(ItemShouldRespawn)(CItem *pItem) { + return GR_ITEM_RESPAWN_NO; } /* <18aea8> ../cstrike/dlls/training_gamerules.cpp:186 */ -NOBODY BOOL CHalfLifeTraining::FPlayerCanRespawn_(CBasePlayer *pPlayer) +BOOL CHalfLifeTraining::__MAKE_VHOOK(FPlayerCanRespawn)(CBasePlayer *pPlayer) { + return TRUE; } /* <18bd40> ../cstrike/dlls/training_gamerules.cpp:190 */ bool CHalfLifeTraining::PlayerCanBuy(CBasePlayer *pPlayer) { - return pPlayer->m_signals.GetState() & SIGNAL_BUY; + return (pPlayer->m_signals.GetState() & SIGNAL_BUY) != 0; } /* <18afa5> ../cstrike/dlls/training_gamerules.cpp:195 */ -NOBODY void CHalfLifeTraining::PlayerKilled_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) +void CHalfLifeTraining::__MAKE_VHOOK(PlayerKilled)(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) { -// edict(CBaseEntity *const this); // 198 + SET_VIEW(pVictim->edict(), pVictim->edict()); + FireTargets("game_playerdie", pVictim, pVictim, USE_TOGGLE, 0); } /* <18b0fb> ../cstrike/dlls/training_gamerules.cpp:202 */ -NOBODY void CHalfLifeTraining::CheckWinConditions_(void) +void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)(void) { -// { -// class CBaseEntity *pHostage; // 229 -// { -// class CGrenade *pBomb; // 217 -// Instance(edict_t *pent); // 225 -// Instance(edict_t *pent); // 225 -// } -// { -// class CGrenade *pBomb; // 205 -// Instance(edict_t *pent); // 213 -// Instance(edict_t *pent); // 213 -// } -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 229 -// Instance(edict_t *pent); // 229 -// { -// class CBaseEntity *pRescueArea; // 236 -// class CBaseEntity *pFirstRescueArea; // 237 -// FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, -// const char *pszName); // 236 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 235 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 235 -// Instance(edict_t *pent); // 236 -// } -// } + CBaseEntity *pHostage = NULL; + + if (m_bBombDefused) + { + CGrenade *pBomb = NULL; + + while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL) + { + if (!pBomb->m_bIsC4 || !pBomb->m_bJustBlew) + continue; + + pBomb->m_bJustBlew = false; + m_bBombDefused = false; + FireTargets(STRING(pBomb->pev->target), CBaseEntity::Instance(pBomb->pev->owner), CBaseEntity::Instance(pBomb->pev->owner), USE_TOGGLE, 0); + break; + } + } + else if (m_bTargetBombed) + { + CGrenade *pBomb = NULL; + + while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL) + { + if (!pBomb->m_bIsC4 || !pBomb->m_bJustBlew) + continue; + + if (FStringNull(pBomb->pev->noise1)) + continue; + + pBomb->m_bJustBlew = false; + m_bTargetBombed = false; + FireTargets(STRING(pBomb->pev->noise1), CBaseEntity::Instance(pBomb->pev->owner), CBaseEntity::Instance(pBomb->pev->owner), USE_TOGGLE, 0); + break; + } + } + + pHostage = CBaseEntity::Instance(FIND_ENTITY_BY_CLASSNAME(NULL, "hostage_entity")); + + while (pHostage != NULL) + { + if (pHostage->pev->deadflag != DEAD_RESPAWNABLE || !FStringNull(pHostage->pev->noise1)) + continue; + + UTIL_SetSize(pHostage->pev, Vector(-16, -16, 0), Vector(16, 16, 72)); + + CBaseEntity *pRescueArea; + CBaseEntity *pFirstRescueArea; + + pFirstRescueArea = CBaseEntity::Instance(FIND_ENTITY_BY_CLASSNAME(NULL, "func_hostage_rescue")); + pRescueArea = pFirstRescueArea; + + if (pFirstRescueArea != NULL) + { + while (pRescueArea != pFirstRescueArea) + { + if (!pRescueArea->Intersects(pHostage)) + break; + + pRescueArea = UTIL_FindEntityByClassname(pRescueArea, "func_hostage_rescue"); + + if (!pRescueArea) + break; + } + + if (pRescueArea != NULL) + { + pHostage->pev->noise1 = 1; + FireTargets(STRING(pRescueArea->pev->target), NULL, NULL, USE_TOGGLE, 0); + } + } + + pHostage = UTIL_FindEntityByClassname(pHostage, "hostage_entity"); + } } /* <18b74f> ../cstrike/dlls/training_gamerules.cpp:280 */ @@ -197,67 +348,135 @@ IMPLEMENT_SAVERESTORE(CBaseGrenCatch, CBaseEntity); /* <18bd74> ../cstrike/dlls/training_gamerules.cpp:282 */ LINK_ENTITY_TO_CLASS(func_grencatch, CBaseGrenCatch); -/* <18af50> ../cstrike/dlls/training_gamerules.cpp:293 */ -NOBODY void CBaseGrenCatch::Touch_(CBaseEntity *pOther) +/* <18af02> ../cstrike/dlls/training_gamerules.cpp:284 */ +void CBaseGrenCatch::__MAKE_VHOOK(Spawn)(void) { -// strstr(const char *__haystack, -// const char *__needle); // 297 + pev->solid = SOLID_TRIGGER; + pev->flags |= FL_WORLDBRUSH; + pev->effects |= EF_NODRAW; + + SET_MODEL(ENT(pev), STRING(pev->model)); + pev->nextthink = gpGlobals->time + 0.1f; } -/* <18af02> ../cstrike/dlls/training_gamerules.cpp:284 */ -NOBODY void CBaseGrenCatch::Spawn_(void) +/* <18af50> ../cstrike/dlls/training_gamerules.cpp:293 */ +void CBaseGrenCatch::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { + if (!pOther) + { + return; + } + + if (Q_strstr(STRING(pev->model), "flash") != NULL) + { + m_fFlashTouched = true; + } } /* <18b835> ../cstrike/dlls/training_gamerules.cpp:300 */ -NOBODY void CBaseGrenCatch::Think_(void) +void CBaseGrenCatch::__MAKE_VHOOK(Think)(void) { -// { -// class CGrenade *pGrenade; // 302 -// BOOL m_fSmokeTouchingLastFrame; // 304 -// class CBaseEntity *pTrigger; // 320 -// { -// class Vector vMax; // 311 -// class Vector vMin; // 311 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 312 -// Vector(Vector *const this, -// float X, -// float Y, -// float Z); // 312 -// Vector(Vector *const this, -// const class Vector &const v); // 311 -// Vector(Vector *const this, -// const class Vector &const v); // 311 -// strstr(const char *__haystack, -// const char *__needle); // 314 -// Length(const class Vector *const this); // 315 -// } -// } + CGrenade *pGrenade; + bool m_fSmokeTouchingLastFrame; + CBaseEntity *pTrigger; + Vector vMax, vMin; + + m_fSmokeTouchingLastFrame = m_fSmokeTouching; + m_fSmokeTouching = false; + pGrenade = NULL; + + while (pGrenade = (CGrenade *)UTIL_FindEntityByClassname(pGrenade, "grenade")) + { + vMin = pGrenade->pev->mins; + vMax = pGrenade->pev->maxs; + + UTIL_SetSize(pGrenade->pev, Vector(-8, -8, 0), Vector(8, 8, 0)); + + if (pGrenade->Intersects(this) && Q_strstr(STRING(pGrenade->pev->model), "smoke") != NULL) + { + if (pGrenade->pev->velocity.Length() == 0) + m_fSmokeTouching = true; + } + + pGrenade->pev->mins = vMin; + pGrenade->pev->maxs = vMax; + } + + if ((m_NeedGrenadeType == GRENADETYPE_SMOKE && m_fSmokeTouching && !m_fSmokeTouchingLastFrame) + || (m_NeedGrenadeType == GRENADETYPE_FLASH && m_fFlashTouched)) + { + FireTargets(STRING(sTriggerOnGrenade), this, this, USE_TOGGLE, 0); + + if (m_NeedGrenadeType == GRENADETYPE_SMOKE) + { + pTrigger = NULL; + + while ((pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade))) != NULL) + { + // save solid + pTrigger->pev->team = pTrigger->pev->solid; + pTrigger->pev->solid = SOLID_NOT; + } + } + else if (m_NeedGrenadeType == GRENADETYPE_FLASH) + pev->flags |= FL_KILLME; + } + + if (m_fSmokeTouchingLastFrame && !m_fSmokeTouching) + { + pTrigger = NULL; + + while (pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade))) + { + // restore solid + pTrigger->pev->solid = pTrigger->pev->team; + pTrigger->pev->team = 0; + UTIL_SetOrigin(pTrigger->pev, pTrigger->pev->origin); + } + } + + pev->nextthink = gpGlobals->time + 0.1f; } /* <18ba09> ../cstrike/dlls/training_gamerules.cpp:358 */ -NOBODY void CBaseGrenCatch::KeyValue_(KeyValueData *pkvd) +void CBaseGrenCatch::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 360 -// FStrEq(const char *sz1, -// const char *sz2); // 365 -// FStrEq(const char *sz1, -// const char *sz2); // 370 -// FStrEq(const char *sz1, -// const char *sz2); // 372 -// KeyValue(CBaseEntity *const this, -// KeyValueData *pkvd); // 376 -// FStrEq(const char *sz1, -// const char *sz2); // 373 + if (FStrEq(pkvd->szKeyName, "triggerongrenade")) + { + sTriggerOnGrenade = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "disableongrenade")) + { + sDisableOnGrenade = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "grenadetype")) + { + if (FStrEq(pkvd->szValue, "smoke")) + { + m_NeedGrenadeType = GRENADETYPE_SMOKE; + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szValue, "flash")) + { + m_NeedGrenadeType = GRENADETYPE_FLASH; + pkvd->fHandled = TRUE; + } + } + else + CBaseEntity::KeyValue(pkvd); } /* <18af29> ../cstrike/dlls/training_gamerules.cpp:400 */ -NOBODY void CFuncWeaponCheck::Spawn_(void) +void CFuncWeaponCheck::__MAKE_VHOOK(Spawn)(void) { + pev->dmgtime = 0; + pev->solid = SOLID_TRIGGER; + pev->flags |= FL_WORLDBRUSH; + pev->solid |= EF_NODRAW; + + SET_MODEL(ENT(pev), STRING(pev->model)); } /* <18b702> ../cstrike/dlls/training_gamerules.cpp:420 */ @@ -267,24 +486,91 @@ IMPLEMENT_SAVERESTORE(CFuncWeaponCheck, CBaseEntity); LINK_ENTITY_TO_CLASS(func_weaponcheck, CFuncWeaponCheck); /* <18b5f6> ../cstrike/dlls/training_gamerules.cpp:424 */ -NOBODY void CFuncWeaponCheck::Touch_(CBaseEntity *pOther) +void CFuncWeaponCheck::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { -// { -// class CBasePlayer *pPlayer; // 430 -// } -// Touch(CFuncWeaponCheck *const this, -// class CBaseEntity *pOther); // 424 + if (!UTIL_IsMasterTriggered(sMaster, pOther)) + return; + + if (!pOther) + return; + + if (!pOther->IsPlayer()) + return; + + CBasePlayer *pPlayer = (CBasePlayer *)pOther; + for (int i = 1; i <= iItemCount; i++) + { + if (iAnyWeapon) + { + if (pPlayer->HasNamedPlayerItem(STRING(sItemName[i]))) + { + break; + } + } + else + { + if (!pPlayer->HasNamedPlayerItem(STRING(sItemName[i]))) + { + if (pev->dmgtime < gpGlobals->time) + { + if (pev->speed > -1.0f) + { + FireTargets(STRING(sTriggerNoItems), pOther, pOther, USE_TOGGLE, 0); + pev->dmgtime = pev->speed + gpGlobals->time; + + if (!pev->speed) + pev->speed = -1; + } + } + + return; + } + } + } + + FireTargets(STRING(sTriggerWithItems), pOther, pOther, USE_TOGGLE, 0); + SUB_Remove(); } /* <18bb28> ../cstrike/dlls/training_gamerules.cpp:462 */ -NOBODY void CFuncWeaponCheck::KeyValue_(KeyValueData *pkvd) +void CFuncWeaponCheck::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 464 -// FStrEq(const char *sz1, -// const char *sz2); // 469 -// KeyValue(CFuncWeaponCheck *const this, -// KeyValueData *pkvd); // 462 + if (FStrEq(pkvd->szKeyName, "trigger_items")) + { + sTriggerWithItems = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "trigger_noitems")) + { + sTriggerNoItems = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "trigger_noitems_delay")) + { + pev->speed = Q_atof(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (Q_strstr(pkvd->szKeyName, "item") != NULL) + { + if (iItemCount < MAX_ITEM_COUNTS) + { + sItemName[ iItemCount++ ] = ALLOC_STRING(pkvd->szValue); + } + + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "master")) + { + sMaster = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "any_weapon")) + { + iAnyWeapon = Q_atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + CBaseEntity::KeyValue(pkvd); } #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/training_gamerules.h b/regamedll/dlls/training_gamerules.h index 476a6bf1..0f49fe67 100644 --- a/regamedll/dlls/training_gamerules.h +++ b/regamedll/dlls/training_gamerules.h @@ -40,22 +40,25 @@ public: public: virtual BOOL IsMultiplayer(void) { - return FALSE; + return IsMultiplayer_(); } - NOBODY virtual BOOL IsDeathmatch(void); + virtual BOOL IsDeathmatch(void); virtual void InitHUD(CBasePlayer *pl); virtual void PlayerSpawn(CBasePlayer *pPlayer); - NOBODY virtual void PlayerThink(CBasePlayer *pPlayer); - NOBODY virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer); + virtual void PlayerThink(CBasePlayer *pPlayer); + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer); virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer); - NOBODY virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); - NOBODY virtual int ItemShouldRespawn(CItem *pItem); - NOBODY virtual void CheckMapConditions(void) {} - NOBODY virtual void CheckWinConditions(void); + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); + virtual int ItemShouldRespawn(CItem *pItem); + virtual void CheckMapConditions(void) { } + virtual void CheckWinConditions(void); #ifdef HOOK_GAMEDLL - //BOOL IsMultiplayer_(void); + BOOL IsMultiplayer_(void) + { + return FALSE; + } BOOL IsDeathmatch_(void); void InitHUD_(CBasePlayer *pl); void PlayerSpawn_(CBasePlayer *pPlayer); @@ -64,7 +67,6 @@ public: edict_t *GetPlayerSpawnSpot_(CBasePlayer *pPlayer); void PlayerKilled_(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor); int ItemShouldRespawn_(CItem *pItem); - //void CheckMapConditions_(void) {} void CheckWinConditions_(void); #endif // HOOK_GAMEDLL @@ -72,7 +74,8 @@ public: public: static void HostageDied(void); static bool PlayerCanBuy(CBasePlayer *pPlayer); -private: + +//private: float FillAccountTime; float ServerRestartTime; BOOL fInBuyArea; @@ -85,16 +88,16 @@ private: class CBaseGrenCatch: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual int ObjectCaps(void) + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual int ObjectCaps(void) { return ObjectCaps_(); } - NOBODY virtual void Think(void); - NOBODY virtual void Touch(CBaseEntity *pOther); + virtual void Think(void); + virtual void Touch(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL @@ -126,11 +129,11 @@ public: class CFuncWeaponCheck: public CBaseEntity { public: - NOBODY virtual void Spawn(void); - NOBODY virtual void KeyValue(KeyValueData *pkvd); - NOBODY virtual int Save(CSave &save); - NOBODY virtual int Restore(CRestore &restore); - NOBODY virtual void Touch(CBaseEntity *pOther); + virtual void Spawn(void); + virtual void KeyValue(KeyValueData *pkvd); + virtual int Save(CSave &save); + virtual int Restore(CRestore &restore); + virtual void Touch(CBaseEntity *pOther); #ifdef HOOK_GAMEDLL @@ -155,4 +158,8 @@ private: };/* size: 300, cachelines: 5, members: 8 */ +// linked objects +C_DLLEXPORT void func_grencatch(entvars_t *pev); +C_DLLEXPORT void func_weaponcheck(entvars_t *pev); + #endif // TRAINING_GAMERULES_H diff --git a/regamedll/dlls/triggers.cpp b/regamedll/dlls/triggers.cpp index 21195cfb..a65c44b6 100644 --- a/regamedll/dlls/triggers.cpp +++ b/regamedll/dlls/triggers.cpp @@ -78,7 +78,7 @@ LINK_ENTITY_TO_CLASS(func_friction, CFrictionModifier); IMPLEMENT_SAVERESTORE(CFrictionModifier, CBaseEntity); /* <19fa7d> ../cstrike/dlls/triggers.cpp:72 */ -NOBODY void CFrictionModifier::Spawn_(void) +NOBODY void CFrictionModifier::__MAKE_VHOOK(Spawn)(void) { } @@ -88,7 +88,7 @@ NOBODY void CFrictionModifier::ChangeFriction(CBaseEntity *pOther) } /* <1a1c39> ../cstrike/dlls/triggers.cpp:91 */ -NOBODY void CFrictionModifier::KeyValue_(KeyValueData *pkvd) +NOBODY void CFrictionModifier::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { } @@ -99,7 +99,7 @@ LINK_ENTITY_TO_CLASS(trigger_auto, CAutoTrigger); IMPLEMENT_SAVERESTORE(CAutoTrigger, CBaseDelay); /* <1a1b64> ../cstrike/dlls/triggers.cpp:136 */ -NOBODY void CAutoTrigger::KeyValue_(KeyValueData *pkvd) +NOBODY void CAutoTrigger::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 138 @@ -114,17 +114,17 @@ NOBODY void CAutoTrigger::KeyValue_(KeyValueData *pkvd) } /* <19fb05> ../cstrike/dlls/triggers.cpp:165 */ -NOBODY void CAutoTrigger::Spawn_(void) +NOBODY void CAutoTrigger::__MAKE_VHOOK(Spawn)(void) { } /* <19fb2d> ../cstrike/dlls/triggers.cpp:171 */ -NOBODY void CAutoTrigger::Precache_(void) +NOBODY void CAutoTrigger::__MAKE_VHOOK(Precache)(void) { } /* <19d48c> ../cstrike/dlls/triggers.cpp:177 */ -NOBODY void CAutoTrigger::Think_(void) +NOBODY void CAutoTrigger::__MAKE_VHOOK(Think)(void) { } @@ -135,7 +135,7 @@ LINK_ENTITY_TO_CLASS(trigger_relay, CTriggerRelay); IMPLEMENT_SAVERESTORE(CTriggerRelay, CBaseDelay); /* <1a1abc> ../cstrike/dlls/triggers.cpp:216 */ -NOBODY void CTriggerRelay::KeyValue_(KeyValueData *pkvd) +NOBODY void CTriggerRelay::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 218 @@ -144,12 +144,12 @@ NOBODY void CTriggerRelay::KeyValue_(KeyValueData *pkvd) } /* <19fb7e> ../cstrike/dlls/triggers.cpp:240 */ -NOBODY void CTriggerRelay::Spawn_(void) +NOBODY void CTriggerRelay::__MAKE_VHOOK(Spawn)(void) { } /* <1a01d7> ../cstrike/dlls/triggers.cpp:247 */ -NOBODY void CTriggerRelay::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTriggerRelay::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { } @@ -160,7 +160,7 @@ LINK_ENTITY_TO_CLASS(multi_manager, CMultiManager); IMPLEMENT_SAVERESTORE(CMultiManager, CBaseToggle); /* <1a19ed> ../cstrike/dlls/triggers.cpp:318 */ -NOBODY void CMultiManager::KeyValue_(KeyValueData *pkvd) +NOBODY void CMultiManager::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 325 @@ -173,7 +173,7 @@ NOBODY void CMultiManager::KeyValue_(KeyValueData *pkvd) } /* <19fbce> ../cstrike/dlls/triggers.cpp:347 */ -NOBODY void CMultiManager::Spawn_(void) +NOBODY void CMultiManager::__MAKE_VHOOK(Spawn)(void) { // { // int swapped; // 355 @@ -188,7 +188,7 @@ NOBODY void CMultiManager::Spawn_(void) } /* <1a03e5> ../cstrike/dlls/triggers.cpp:377 */ -NOBODY void CMultiManager::Restart_(void) +NOBODY void CMultiManager::__MAKE_VHOOK(Restart)(void) { // { // int i; // 379 @@ -206,7 +206,7 @@ NOBODY void CMultiManager::Restart_(void) } /* <1a1402> ../cstrike/dlls/triggers.cpp:420 */ -NOBODY BOOL CMultiManager::HasTarget_(string_t targetname) +NOBODY BOOL CMultiManager::__MAKE_VHOOK(HasTarget)(string_t targetname) { // { // int i; // 422 @@ -230,12 +230,12 @@ NOBODY CMultiManager *CMultiManager::Clone(void) CMultiManager *pMulti = GetClassPtr((CMultiManager *)NULL); edict_t *pEdict = pMulti->pev->pContainingEntity; - memcpy(pMulti->pev, pev, sizeof(*pev)); + Q_memcpy(pMulti->pev, pev, sizeof(*pev)); pMulti->pev->pContainingEntity = pEdict; pMulti->pev->spawnflags |= SF_MULTIMAN_CLONE; pMulti->m_cTargets = m_cTargets; - memcpy(pMulti->m_iTargetName, m_iTargetName, sizeof(m_iTargetName)); - memcpy(pMulti->m_flTargetDelay, m_flTargetDelay, sizeof(m_flTargetDelay)); + Q_memcpy(pMulti->m_iTargetName, m_iTargetName, sizeof(m_iTargetName)); + Q_memcpy(pMulti->m_flTargetDelay, m_flTargetDelay, sizeof(m_flTargetDelay)); return pMulti; } @@ -252,12 +252,12 @@ NOBODY void CMultiManager::ManagerUse(CBaseEntity *pActivator, CBaseEntity *pCal LINK_ENTITY_TO_CLASS(env_render, CRenderFxManager); /* <19fc52> ../cstrike/dlls/triggers.cpp:535 */ -NOBODY void CRenderFxManager::Spawn_(void) +NOBODY void CRenderFxManager::__MAKE_VHOOK(Spawn)(void) { } /* <1a0c95> ../cstrike/dlls/triggers.cpp:540 */ -NOBODY void CRenderFxManager::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CRenderFxManager::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(class CRenderFxManager *const this, // class CBaseEntity *pActivator, @@ -277,7 +277,7 @@ NOBODY void CBaseTrigger::InitTrigger(void) } /* <1a17cf> ../cstrike/dlls/triggers.cpp:608 */ -NOBODY void CBaseTrigger::KeyValue_(KeyValueData *pkvd) +NOBODY void CBaseTrigger::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 610 @@ -296,18 +296,18 @@ LINK_ENTITY_TO_CLASS(trigger_hurt, CTriggerHurt); LINK_ENTITY_TO_CLASS(trigger_monsterjump, CTriggerMonsterJump); /* <1a2fdc> ../cstrike/dlls/triggers.cpp:652 */ -NOBODY void CTriggerMonsterJump::Spawn_(void) +NOBODY void CTriggerMonsterJump::__MAKE_VHOOK(Spawn)(void) { // Spawn(class CTriggerMonsterJump *const this); // 652 } /* <1a00e4> ../cstrike/dlls/triggers.cpp:671 */ -NOBODY void CTriggerMonsterJump::Think_(void) +NOBODY void CTriggerMonsterJump::__MAKE_VHOOK(Think)(void) { } /* <19fca2> ../cstrike/dlls/triggers.cpp:678 */ -NOBODY void CTriggerMonsterJump::Touch_(CBaseEntity *pOther) +NOBODY void CTriggerMonsterJump::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // entvars_t *pevOther; // 680 @@ -320,18 +320,18 @@ NOBODY void CTriggerMonsterJump::Touch_(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(trigger_cdaudio, CTriggerCDAudio); /* <1a2382> ../cstrike/dlls/triggers.cpp:721 */ -NOBODY void CTriggerCDAudio::Touch_(CBaseEntity *pOther) +NOBODY void CTriggerCDAudio::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // PlayTrack(class CTriggerCDAudio *const this); // 728 } /* <1a2fb4> ../cstrike/dlls/triggers.cpp:731 */ -NOBODY void CTriggerCDAudio::Spawn_(void) +NOBODY void CTriggerCDAudio::__MAKE_VHOOK(Spawn)(void) { } /* <1a2288> ../cstrike/dlls/triggers.cpp:736 */ -NOBODY void CTriggerCDAudio::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTriggerCDAudio::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // PlayTrack(class CTriggerCDAudio *const this); // 738 } @@ -357,7 +357,7 @@ NOBODY void CTriggerCDAudio::PlayTrack(void) LINK_ENTITY_TO_CLASS(target_cdaudio, CTargetCDAudio); /* <1a170f> ../cstrike/dlls/triggers.cpp:796 */ -NOBODY void CTargetCDAudio::KeyValue_(KeyValueData *pkvd) +NOBODY void CTargetCDAudio::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 798 @@ -368,19 +368,19 @@ NOBODY void CTargetCDAudio::KeyValue_(KeyValueData *pkvd) } /* <1a066a> ../cstrike/dlls/triggers.cpp:807 */ -NOBODY void CTargetCDAudio::Spawn_(void) +NOBODY void CTargetCDAudio::__MAKE_VHOOK(Spawn)(void) { // Spawn(class CTargetCDAudio *const this); // 807 } /* <1a2175> ../cstrike/dlls/triggers.cpp:816 */ -NOBODY void CTargetCDAudio::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTargetCDAudio::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Play(class CTargetCDAudio *const this); // 818 } /* <1a2465> ../cstrike/dlls/triggers.cpp:822 */ -NOBODY void CTargetCDAudio::Think_(void) +NOBODY void CTargetCDAudio::__MAKE_VHOOK(Think)(void) { // { // edict_t *pClient; // 824 @@ -398,7 +398,7 @@ NOBODY void CTargetCDAudio::Play(void) } /* <1a2f8b> ../cstrike/dlls/triggers.cpp:853 */ -NOBODY void CTriggerHurt::Spawn_(void) +NOBODY void CTriggerHurt::__MAKE_VHOOK(Spawn)(void) { } @@ -427,7 +427,7 @@ NOBODY void CBaseTrigger::HurtTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(trigger_multiple, CTriggerMultiple); /* <1a2f67> ../cstrike/dlls/triggers.cpp:1089 */ -NOBODY void CTriggerMultiple::Spawn_(void) +NOBODY void CTriggerMultiple::__MAKE_VHOOK(Spawn)(void) { } @@ -435,7 +435,7 @@ NOBODY void CTriggerMultiple::Spawn_(void) LINK_ENTITY_TO_CLASS(trigger_once, CTriggerOnce); /* <1a301c> ../cstrike/dlls/triggers.cpp:1136 */ -NOBODY void CTriggerOnce::Spawn_(void) +NOBODY void CTriggerOnce::__MAKE_VHOOK(Spawn)(void) { // Spawn(class CTriggerMultiple *const this); // 1140 } @@ -479,7 +479,7 @@ NOBODY void CBaseTrigger::CounterUse(CBaseEntity *pActivator, CBaseEntity *pCall LINK_ENTITY_TO_CLASS(trigger_counter, CTriggerCounter); /* <19fd42> ../cstrike/dlls/triggers.cpp:1280 */ -NOBODY void CTriggerCounter::Spawn_(void) +NOBODY void CTriggerCounter::__MAKE_VHOOK(Spawn)(void) { } @@ -487,7 +487,7 @@ NOBODY void CTriggerCounter::Spawn_(void) LINK_ENTITY_TO_CLASS(trigger_transition, CTriggerVolume); /* <19fd6a> ../cstrike/dlls/triggers.cpp:1302 */ -NOBODY void CTriggerVolume::Spawn_(void) +NOBODY void CTriggerVolume::__MAKE_VHOOK(Spawn)(void) { } @@ -495,19 +495,19 @@ NOBODY void CTriggerVolume::Spawn_(void) LINK_ENTITY_TO_CLASS(fireanddie, CFireAndDie); /* <1a0618> ../cstrike/dlls/triggers.cpp:1323 */ -NOBODY void CFireAndDie::Spawn_(void) +NOBODY void CFireAndDie::__MAKE_VHOOK(Spawn)(void) { // MAKE_STRING_CLASS(const char *str, // entvars_t *pev); // 1325 } /* <19fdbb> ../cstrike/dlls/triggers.cpp:1330 */ -NOBODY void CFireAndDie::Precache_(void) +NOBODY void CFireAndDie::__MAKE_VHOOK(Precache)(void) { } /* <1a01ae> ../cstrike/dlls/triggers.cpp:1337 */ -NOBODY void CFireAndDie::Think_(void) +NOBODY void CFireAndDie::__MAKE_VHOOK(Think)(void) { } @@ -518,7 +518,7 @@ LINK_ENTITY_TO_CLASS(trigger_changelevel, CChangeLevel); IMPLEMENT_SAVERESTORE(CChangeLevel, CBaseTrigger); /* <1a1d4a> ../cstrike/dlls/triggers.cpp:1388 */ -NOBODY void CChangeLevel::KeyValue_(KeyValueData *pkvd) +NOBODY void CChangeLevel::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 1390 @@ -527,7 +527,7 @@ NOBODY void CChangeLevel::KeyValue_(KeyValueData *pkvd) } /* <1a2f25> ../cstrike/dlls/triggers.cpp:1423 */ -NOBODY void CChangeLevel::Spawn_(void) +NOBODY void CChangeLevel::__MAKE_VHOOK(Spawn)(void) { } @@ -545,7 +545,7 @@ NOBODY void CChangeLevel::ExecuteChangeLevel(void) } /* <1a3b43> ../cstrike/dlls/triggers.cpp:1456 */ -NOXREF edict_t *CChangeLevel::FindLandmark(const char *pLandmarkName) +edict_t *CChangeLevel::FindLandmark(const char *pLandmarkName) { edict_t *pentLandmark = FIND_ENTITY_BY_STRING(NULL, "targetname", pLandmarkName); while (!FNullEnt(pentLandmark)) @@ -556,6 +556,7 @@ NOXREF edict_t *CChangeLevel::FindLandmark(const char *pLandmarkName) else pentLandmark = FIND_ENTITY_BY_STRING(pentLandmark, "targetname", pLandmarkName); } + ALERT(at_error, "Can't find landmark %s\n", pLandmarkName); return NULL; } @@ -595,12 +596,34 @@ NOBODY void CChangeLevel::TouchChangeLevel(CBaseEntity *pOther) // class CBaseEntity *pActivator); // 1550 } +// Add a transition to the list, but ignore duplicates +// (a designer may have placed multiple trigger_changelevels with the same landmark) + /* <1a3ff8> ../cstrike/dlls/triggers.cpp:1556 */ -NOBODY int CChangeLevel::AddTransitionToList(LEVELLIST *pLevelList, int listCount, const char *pMapName, const char *pLandmarkName, edict_t *pentLandmark) +int CChangeLevel::AddTransitionToList(LEVELLIST *pLevelList, int listCount, const char *pMapName, const char *pLandmarkName, edict_t *pentLandmark) { -// { -// int i; // 1558 -// } + int i; + + if (!pLevelList || !pMapName || !pLandmarkName || !pentLandmark) + { + return 0; + } + + for (i = 0; i < listCount; i++) + { + if (pLevelList[i].pentLandmark == pentLandmark && Q_strcmp(pLevelList[i].mapName, pMapName) == 0) + { + return 0; + } + } + + Q_strcpy(pLevelList[ listCount ].mapName, pMapName); + Q_strcpy(pLevelList[ listCount ].landmarkName, pLandmarkName); + + pLevelList[ listCount ].pentLandmark = pentLandmark; + pLevelList[ listCount ].vecLandmarkOrigin = VARS(pentLandmark)->origin; + + return 1; } /* <1a44ba> ../cstrike/dlls/triggers.cpp:1576 */ @@ -610,16 +633,57 @@ NOBODY int BuildChangeList(LEVELLIST *pLevelList, int maxList) } /* <1a4075> ../cstrike/dlls/triggers.cpp:1582 */ -NOBODY int CChangeLevel::InTransitionVolume(CBaseEntity *pEntity, char *pVolumeName) +int CChangeLevel::InTransitionVolume(CBaseEntity *pEntity, char *pVolumeName) { -// { -// edict_t *pentVolume; // 1584 -// int inVolume; // 1597 -// } + edict_t *pentVolume; + + if (pEntity->ObjectCaps() & FCAP_FORCE_TRANSITION) + { + return 1; + } + + // If you're following another entity, follow it through the transition (weapons follow the player) + if (pEntity->pev->movetype == MOVETYPE_FOLLOW) + { + if (pEntity->pev->aiment != NULL) + { + pEntity = CBaseEntity::Instance(pEntity->pev->aiment); + } + } + + // Unless we find a trigger_transition, everything is in the volume + int inVolume = 1; + + pentVolume = FIND_ENTITY_BY_TARGETNAME(NULL, pVolumeName); + while (!FNullEnt(pentVolume)) + { + CBaseEntity *pVolume = CBaseEntity::Instance(pentVolume); + + if (pVolume && FClassnameIs(pVolume->pev, "trigger_transition")) + { + // It touches one, it's in the volume + if (pVolume->Intersects(pEntity)) + return 1; + else + { + // Found a trigger_transition, but I don't intersect it -- if I don't find another, don't go! + inVolume = 0; + } + } + + pentVolume = FIND_ENTITY_BY_TARGETNAME(pentVolume, pVolumeName); + } + + return inVolume; } +// This has grown into a complicated beast +// Can we make this more elegant? +// This builds the list of all transitions on this level and which entities are in their PVS's and can / should +// be moved across. + /* <1a40b1> ../cstrike/dlls/triggers.cpp:1625 */ -NOBODY int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList) +int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList) { edict_t *pentChangelevel, *pentLandmark; int i, count = 0; @@ -634,7 +698,7 @@ NOBODY int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList) { CChangeLevel *pTrigger = GetClassPtr((CChangeLevel *)VARS(pentChangelevel)); - if (pTrigger) + if (pTrigger != NULL) { // Find the corresponding landmark pentLandmark = FindLandmark(pTrigger->m_szLandmarkName); @@ -645,11 +709,13 @@ NOBODY int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList) { count++; + // FULL!! if (count >= maxList) break; } } } + pentChangelevel = FIND_ENTITY_BY_STRING(pentChangelevel, "classname", "trigger_changelevel"); } @@ -692,7 +758,9 @@ NOBODY int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList) entityCount++; if (entityCount > MAX_ENTITY) + { ALERT( at_error, "Too many entities across a transition!" ); + } } } } @@ -735,17 +803,17 @@ NOBODY void NextLevel(void) LINK_ENTITY_TO_CLASS(func_ladder, CLadder); /* <1a1937> ../cstrike/dlls/triggers.cpp:1763 */ -NOBODY void CLadder::KeyValue_(KeyValueData *pkvd) +NOBODY void CLadder::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { } /* <19fe6c> ../cstrike/dlls/triggers.cpp:1772 */ -NOBODY void CLadder::Precache_(void) +NOBODY void CLadder::__MAKE_VHOOK(Precache)(void) { } /* <19fe95> ../cstrike/dlls/triggers.cpp:1786 */ -NOBODY void CLadder::Spawn_(void) +NOBODY void CLadder::__MAKE_VHOOK(Spawn)(void) { } @@ -753,19 +821,19 @@ NOBODY void CLadder::Spawn_(void) LINK_ENTITY_TO_CLASS(trigger_push, CTriggerPush); /* <1a18ff> ../cstrike/dlls/triggers.cpp:1807 */ -NOBODY void CTriggerPush::KeyValue_(KeyValueData *pkvd) +NOBODY void CTriggerPush::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { } /* <1a2eda> ../cstrike/dlls/triggers.cpp:1817 */ -NOBODY void CTriggerPush::Spawn_(void) +NOBODY void CTriggerPush::__MAKE_VHOOK(Spawn)(void) { // operator==(const class Vector *const this, // const class Vector &const v); // 1819 } /* <1a023c> ../cstrike/dlls/triggers.cpp:1835 */ -NOBODY void CTriggerPush::Touch_(CBaseEntity *pOther) +NOBODY void CTriggerPush::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // entvars_t *pevToucher; // 1837 @@ -802,7 +870,7 @@ NOBODY void CBaseTrigger::TeleportTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(trigger_teleport, CTriggerTeleport); /* <1a2eb1> ../cstrike/dlls/triggers.cpp:1942 */ -NOBODY void CTriggerTeleport::Spawn_(void) +NOBODY void CTriggerTeleport::__MAKE_VHOOK(Spawn)(void) { } @@ -813,7 +881,7 @@ LINK_ENTITY_TO_CLASS(info_teleport_destination, CPointEntity); LINK_ENTITY_TO_CLASS(func_buyzone, CBuyZone); /* <1a2e71> ../cstrike/dlls/triggers.cpp:1973 */ -NOBODY void CBuyZone::Spawn_(void) +NOBODY void CBuyZone::__MAKE_VHOOK(Spawn)(void) { // Spawn(class CBuyZone *const this); // 1973 } @@ -832,7 +900,7 @@ NOBODY void CBuyZone::BuyTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(func_bomb_target, CBombTarget); /* <1a2e48> ../cstrike/dlls/triggers.cpp:2019 */ -NOBODY void CBombTarget::Spawn_(void) +NOBODY void CBombTarget::__MAKE_VHOOK(Spawn)(void) { } @@ -855,7 +923,7 @@ NOBODY void CBombTarget::BombTargetUse(CBaseEntity *pActivator, CBaseEntity *pCa LINK_ENTITY_TO_CLASS(func_hostage_rescue, CHostageRescue); /* <1a2e1f> ../cstrike/dlls/triggers.cpp:2067 */ -NOBODY void CHostageRescue::Spawn_(void) +NOBODY void CHostageRescue::__MAKE_VHOOK(Spawn)(void) { } @@ -870,7 +938,7 @@ NOBODY void CHostageRescue::HostageRescueTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(func_escapezone, CEscapeZone); /* <1a2df6> ../cstrike/dlls/triggers.cpp:2108 */ -NOBODY void CEscapeZone::Spawn_(void) +NOBODY void CEscapeZone::__MAKE_VHOOK(Spawn)(void) { } @@ -890,7 +958,7 @@ NOBODY void CEscapeZone::EscapeTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(func_vip_safetyzone, CVIP_SafetyZone); /* <1a2dcd> ../cstrike/dlls/triggers.cpp:2166 */ -NOBODY void CVIP_SafetyZone::Spawn_(void) +NOBODY void CVIP_SafetyZone::__MAKE_VHOOK(Spawn)(void) { } @@ -910,7 +978,7 @@ NOBODY void CVIP_SafetyZone::VIP_SafetyTouch(CBaseEntity *pOther) LINK_ENTITY_TO_CLASS(trigger_autosave, CTriggerSave); /* <1a2d8e> ../cstrike/dlls/triggers.cpp:2206 */ -NOBODY void CTriggerSave::Spawn_(void) +NOBODY void CTriggerSave::__MAKE_VHOOK(Spawn)(void) { //Spawn(class CTriggerSave *const this); // 2206 } @@ -936,7 +1004,7 @@ NOBODY void CTriggerEndSection::EndSectionUse(CBaseEntity *pActivator, CBaseEnti } /* <1a2d4f> ../cstrike/dlls/triggers.cpp:2260 */ -NOBODY void CTriggerEndSection::Spawn_(void) +NOBODY void CTriggerEndSection::__MAKE_VHOOK(Spawn)(void) { // Spawn(class CTriggerEndSection *const this); // 2260 } @@ -949,7 +1017,7 @@ NOBODY void CTriggerEndSection::EndSectionTouch(CBaseEntity *pOther) } /* <1a196f> ../cstrike/dlls/triggers.cpp:2291 */ -NOBODY void CTriggerEndSection::KeyValue_(KeyValueData *pkvd) +NOBODY void CTriggerEndSection::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 2293 @@ -961,7 +1029,7 @@ NOBODY void CTriggerEndSection::KeyValue_(KeyValueData *pkvd) LINK_ENTITY_TO_CLASS(trigger_gravity, CTriggerGravity); /* <1a2d26> ../cstrike/dlls/triggers.cpp:2313 */ -NOBODY void CTriggerGravity::Spawn_(void) +NOBODY void CTriggerGravity::__MAKE_VHOOK(Spawn)(void) { } @@ -977,7 +1045,7 @@ LINK_ENTITY_TO_CLASS(trigger_changetarget, CTriggerChangeTarget); IMPLEMENT_SAVERESTORE(CTriggerChangeTarget, CBaseDelay); /* <1a1691> ../cstrike/dlls/triggers.cpp:2360 */ -NOBODY void CTriggerChangeTarget::KeyValue_(KeyValueData *pkvd) +NOBODY void CTriggerChangeTarget::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 2362 @@ -986,12 +1054,12 @@ NOBODY void CTriggerChangeTarget::KeyValue_(KeyValueData *pkvd) } /* <19ff1f> ../cstrike/dlls/triggers.cpp:2371 */ -NOBODY void CTriggerChangeTarget::Spawn_(void) +NOBODY void CTriggerChangeTarget::__MAKE_VHOOK(Spawn)(void) { } /* <1a010d> ../cstrike/dlls/triggers.cpp:2376 */ -NOBODY void CTriggerChangeTarget::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTriggerChangeTarget::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // { // class CBaseEntity *pTarget; // 2378 @@ -1008,12 +1076,12 @@ LINK_ENTITY_TO_CLASS(trigger_camera, CTriggerCamera); IMPLEMENT_SAVERESTORE(CTriggerCamera, CBaseDelay); /* <19ff6f> ../cstrike/dlls/triggers.cpp:2447 */ -NOBODY void CTriggerCamera::Spawn_(void) +NOBODY void CTriggerCamera::__MAKE_VHOOK(Spawn)(void) { } /* <1a1537> ../cstrike/dlls/triggers.cpp:2462 */ -NOBODY void CTriggerCamera::KeyValue_(KeyValueData *pkvd) +NOBODY void CTriggerCamera::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 2464 @@ -1025,7 +1093,7 @@ NOBODY void CTriggerCamera::KeyValue_(KeyValueData *pkvd) } /* <1a55e4> ../cstrike/dlls/triggers.cpp:2490 */ -NOBODY void CTriggerCamera::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CTriggerCamera::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Use(CTriggerCamera *const this, // class CBaseEntity *pActivator, @@ -1081,7 +1149,7 @@ LINK_ENTITY_TO_CLASS(env_rain, CWeather); LINK_ENTITY_TO_CLASS(func_rain, CWeather); /* <1a1477> ../cstrike/dlls/triggers.cpp:2716 */ -NOBODY void CClientFog::KeyValue_(KeyValueData *pkvd) +NOBODY void CClientFog::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 2718 @@ -1092,7 +1160,7 @@ NOBODY void CClientFog::KeyValue_(KeyValueData *pkvd) } /* <19ff97> ../cstrike/dlls/triggers.cpp:2735 */ -NOBODY void CClientFog::Spawn_(void) +NOBODY void CClientFog::__MAKE_VHOOK(Spawn)(void) { } diff --git a/regamedll/dlls/triggers.h b/regamedll/dlls/triggers.h index 1d38ba31..164d78c2 100644 --- a/regamedll/dlls/triggers.h +++ b/regamedll/dlls/triggers.h @@ -32,33 +32,29 @@ #pragma once #endif -#define savesolid team +#define GRENADETYPE_SMOKE 1 +#define GRENADETYPE_FLASH 2 -#define GRENADETYPE_SMOKE 1 -#define GRENADETYPE_FLASH 2 +#define MAX_ITEM_COUNTS 32 +#define MAX_ENTITY 512 // We can only ever move 512 entities across a transition -#define MAX_ITEM_COUNTS 32 +#define SF_TRIGGER_PUSH_START_OFF 2 +#define SF_TRIGGER_HURT_TARGETONCE 1 +#define SF_TRIGGER_HURT_START_OFF 2 +#define SF_TRIGGER_HURT_NO_CLIENTS 8 +#define SF_TRIGGER_HURT_CLIENTONLYFIRE 16 +#define SF_TRIGGER_HURT_CLIENTONLYTOUCH 32 -#define SF_TRIGGER_PUSH_START_OFF 2 -#define SF_TRIGGER_HURT_TARGETONCE 1 -#define SF_TRIGGER_HURT_START_OFF 2 -#define SF_TRIGGER_HURT_NO_CLIENTS 8 -#define SF_TRIGGER_HURT_CLIENTONLYFIRE 16 -#define SF_TRIGGER_HURT_CLIENTONLYTOUCH 32 +#define SF_AUTO_FIREONCE 0x0001 +#define SF_RELAY_FIREONCE 0x0001 -#define SF_AUTO_FIREONCE 0x0001 -#define SF_RELAY_FIREONCE 0x0001 +#define SF_MULTIMAN_CLONE 0x80000000 +#define SF_MULTIMAN_THREAD 0x00000001 -#define SF_MULTIMAN_CLONE 0x80000000 -#define SF_MULTIMAN_THREAD 0x00000001 - -#define SF_CHANGELEVEL_USEONLY 0x0002 - -#define MAX_ENTITY 512 - -#define SF_CAMERA_PLAYER_POSITION 1 -#define SF_CAMERA_PLAYER_TARGET 2 -#define SF_CAMERA_PLAYER_TAKECONTROL 4 +#define SF_CHANGELEVEL_USEONLY 0x0002 +#define SF_CAMERA_PLAYER_POSITION 1 +#define SF_CAMERA_PLAYER_TARGET 2 +#define SF_CAMERA_PLAYER_TAKECONTROL 4 class CFrictionModifier: public CBaseEntity { @@ -469,10 +465,10 @@ public: NOBODY void ChangeLevelNow(CBaseEntity *pActivator); - NOXREF static edict_t *FindLandmark(const char *pLandmarkName); - NOBODY static int ChangeList(LEVELLIST *pLevelList, int maxList); - NOBODY static int AddTransitionToList(LEVELLIST *pLevelList, int listCount, const char *pMapName, const char *pLandmarkName, edict_t *pentLandmark); - NOBODY static int InTransitionVolume(CBaseEntity *pEntity, char *pVolumeName); + static edict_t *FindLandmark(const char *pLandmarkName); + static int ChangeList(LEVELLIST *pLevelList, int maxList); + static int AddTransitionToList(LEVELLIST *pLevelList, int listCount, const char *pMapName, const char *pLandmarkName, edict_t *pentLandmark); + static int InTransitionVolume(CBaseEntity *pEntity, char *pVolumeName); public: static TYPEDESCRIPTION IMPLEMENT_ARRAY(m_SaveData)[4]; diff --git a/regamedll/dlls/tutor.cpp b/regamedll/dlls/tutor.cpp index 13b806d0..70ad7252 100644 --- a/regamedll/dlls/tutor.cpp +++ b/regamedll/dlls/tutor.cpp @@ -5,16 +5,16 @@ */ #ifndef HOOK_GAMEDLL -cvar_t cv_tutor_message_repeats = { "_tutor_message_repeats", "5", FCVAR_SERVER }; -cvar_t cv_tutor_debug_level = { "_tutor_debug_level", "0", FCVAR_SERVER }; -cvar_t cv_tutor_view_distance = { "_tutor_view_distance", "1000", FCVAR_SERVER }; -cvar_t cv_tutor_viewable_check_interval = { "_tutor_bomb_viewable_check_interval", "0.5", FCVAR_SERVER }; -cvar_t cv_tutor_look_distance = { "_tutor_look_distance", "200", FCVAR_SERVER }; -cvar_t cv_tutor_look_angle = { "_tutor_look_angle", "10", FCVAR_SERVER }; -cvar_t cv_tutor_examine_time = { "_tutor_examine_time", "0.5", FCVAR_SERVER }; -cvar_t cv_tutor_message_minimum_display_time = { "_tutor_message_minimum_display_time", "1", FCVAR_SERVER }; -cvar_t cv_tutor_message_character_display_time_coefficient = { "_tutor_message_character_display_time_coefficient", "0.07", FCVAR_SERVER }; -cvar_t cv_tutor_hint_interval_time = { "_tutor_hint_interval_time", "10.0", FCVAR_SERVER }; +cvar_t cv_tutor_message_repeats = { "_tutor_message_repeats", "5", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_debug_level = { "_tutor_debug_level", "0", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_view_distance = { "_tutor_view_distance", "1000", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_viewable_check_interval = { "_tutor_bomb_viewable_check_interval", "0.5", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_look_distance = { "_tutor_look_distance", "200", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_look_angle = { "_tutor_look_angle", "10", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_examine_time = { "_tutor_examine_time", "0.5", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_message_minimum_display_time = { "_tutor_message_minimum_display_time", "1", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_message_character_display_time_coefficient = { "_tutor_message_character_display_time_coefficient", "0.07", FCVAR_SERVER, 0.0f, NULL }; +cvar_t cv_tutor_hint_interval_time = { "_tutor_hint_interval_time", "10.0", FCVAR_SERVER, 0.0f, NULL }; #else @@ -35,26 +35,18 @@ bool s_tutorDisabledThisGame; float s_nextCvarCheckTime; /* <1dfdbc> ../cstrike/dlls/tutor.cpp:32 */ -NOBODY void InstallTutor(bool start) +void InstallTutor(bool start) { - // TODO: check out! - //if (TheTutor) - //{ - // (*((void (__cdecl **)(_DWORD))TheTutor->_vptr.CBaseTutor + 1))(TheTutor); - // TheTutor = 0; - //} - if (TheTutor) { delete TheTutor; - - - //TheTutor->~CBaseTutor(); - //TheTutor = NULL; + TheTutor = NULL; } if (start) + { TheTutor = new CCSTutor; + } s_tutorDisabledThisGame = false; s_nextCvarCheckTime = gpGlobals->time; @@ -76,24 +68,73 @@ void Tutor_RegisterCVars(void) } /* <1dfdff> ../cstrike/dlls/tutor.cpp:66 */ -NOBODY void MonitorTutorStatus(void) +void MonitorTutorStatus(void) { -// { -// cvar_t *tutor_enable; // 68 -// bool tutor_enableCvarExists; // 69 -// bool shouldTutorBeOn; // 82 -// int numHumans; // 96 -// { -// int i; // 97 -// { -// class CBasePlayer *pPlayer; // 99 -// } -// } -// { -// class CBasePlayer *localPlayer; // 125 -// } -// { -// class CBasePlayer *localPlayer; // 113 -// } -// } + static cvar_t *tutor_enable = NULL; + static bool tutor_enableCvarExists = true; + + bool shouldTutorBeOn = false; + int numHumans = 0; + + if (!tutor_enableCvarExists || s_nextCvarCheckTime > gpGlobals->time) + { + return; + } + + if (tutor_enable != NULL || (tutor_enable = CVAR_GET_POINTER("tutor_enable")) != NULL) + { + if (!s_tutorDisabledThisGame && tutor_enable->value > 0.0f) + { + shouldTutorBeOn = true; + } + } + else + tutor_enableCvarExists = false; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (pPlayer && !pPlayer->IsBot()) + { + ++numHumans; + } + } + + if (shouldTutorBeOn) + { + if (numHumans <= 1) + { + if (TheTutor == NULL) + { + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + ClientPrint(localPlayer->pev, HUD_PRINTCENTER, "#CZero_Tutor_Turned_On"); + } + + TheTutor = new CCSTutor; + } + } + else + s_tutorDisabledThisGame = true; + } + else + { + if (TheTutor != NULL) + { + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + ClientPrint(localPlayer->pev, HUD_PRINTCENTER, "#CZero_Tutor_Turned_Off"); + } + + delete TheTutor; + TheTutor = NULL; + } + } + + s_nextCvarCheckTime = gpGlobals->time + 1.0f; } diff --git a/regamedll/dlls/tutor.h b/regamedll/dlls/tutor.h index ce01661c..baf6944a 100644 --- a/regamedll/dlls/tutor.h +++ b/regamedll/dlls/tutor.h @@ -60,8 +60,8 @@ extern cvar_t cv_tutor_message_minimum_display_time; extern cvar_t cv_tutor_message_character_display_time_coefficient; extern cvar_t cv_tutor_hint_interval_time; -NOBODY void InstallTutor(bool start); +void InstallTutor(bool start); void Tutor_RegisterCVars(void); -NOBODY void MonitorTutorStatus(void); +void MonitorTutorStatus(void); #endif // TUTOR_H diff --git a/regamedll/dlls/tutor_base_states.cpp b/regamedll/dlls/tutor_base_states.cpp index d89fe9c0..f499bf3a 100644 --- a/regamedll/dlls/tutor_base_states.cpp +++ b/regamedll/dlls/tutor_base_states.cpp @@ -1,32 +1,42 @@ #include "precompiled.h" /* <21bf94> ../cstrike/dlls/tutor_base_states.cpp:6 */ -NOBODY CBaseTutorStateSystem::CBaseTutorStateSystem(void) +CBaseTutorStateSystem::CBaseTutorStateSystem(void) { + ; } /* <21bec7> ../cstrike/dlls/tutor_base_states.cpp:10 */ -NOBODY CBaseTutorStateSystem::~CBaseTutorStateSystem(void) +CBaseTutorStateSystem::~CBaseTutorStateSystem(void) { + ; } /* <21bfb5> ../cstrike/dlls/tutor_base_states.cpp:14 */ -NOBODY int CBaseTutorStateSystem::GetCurrentStateType(void) +int CBaseTutorStateSystem::GetCurrentStateType(void) { -// GetType(CBaseTutorState *const this); // 20 + if (m_currentState != NULL) + { + return m_currentState->GetType(); + } + + return 0; } /* <21c00d> ../cstrike/dlls/tutor_base_states.cpp:28 */ -NOBODY CBaseTutorState::CBaseTutorState(void) +CBaseTutorState::CBaseTutorState(void) { + ; } /* <21bcc6> ../cstrike/dlls/tutor_base_states.cpp:32 */ -NOBODY CBaseTutorState::~CBaseTutorState(void) +CBaseTutorState::~CBaseTutorState(void) { + ; } /* <21c02e> ../cstrike/dlls/tutor_base_states.cpp:36 */ -NOBODY int CBaseTutorState::GetType(void) +int CBaseTutorState::GetType(void) { + return m_type; } diff --git a/regamedll/dlls/tutor_base_states.h b/regamedll/dlls/tutor_base_states.h index eedb78f1..b7669007 100644 --- a/regamedll/dlls/tutor_base_states.h +++ b/regamedll/dlls/tutor_base_states.h @@ -36,28 +36,33 @@ class CBaseTutorState { public: CBaseTutorState(void); - virtual ~CBaseTutorState(void); + virtual ~CBaseTutorState(void); virtual int CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) = 0; virtual char *GetStateString(void) = 0; + public: int GetType(void); -private: + +protected: int m_type; + };/* size: 8, cachelines: 1, members: 2 */ class CBaseTutorStateSystem { public: CBaseTutorStateSystem(void); - virtual ~CBaseTutorStateSystem(void); + virtual ~CBaseTutorStateSystem(void); virtual bool UpdateState(GameEventType event, CBaseEntity *entity, CBaseEntity *other) = 0; virtual char *GetCurrentStateString(void) = 0; virtual CBaseTutorState *ConstructNewState(int stateType) = 0; +public: int GetCurrentStateType(void); -private: + +protected: CBaseTutorState *m_currentState; };/* size: 8, cachelines: 1, members: 2 */ diff --git a/regamedll/dlls/tutor_base_tutor.cpp b/regamedll/dlls/tutor_base_tutor.cpp index 04b83378..3a76fa8b 100644 --- a/regamedll/dlls/tutor_base_tutor.cpp +++ b/regamedll/dlls/tutor_base_tutor.cpp @@ -3,79 +3,137 @@ CBaseTutor *TheTutor; /* <1f545d> ../cstrike/dlls/tutor_base_tutor.cpp:22 */ -NOBODY TutorMessageEvent::TutorMessageEvent(int mid, int duplicateID, float time, float lifetime, int priority) +TutorMessageEvent::TutorMessageEvent(int mid, int duplicateID, float time, float lifetime, int priority) { + m_messageID = mid; + m_duplicateID = duplicateID; + m_activationTime = time; + m_lifetime = lifetime; + m_priority = priority; + + m_paramList = NULL; + m_numParameters = 0; + m_next = NULL; } /* <1f4d07> ../cstrike/dlls/tutor_base_tutor.cpp:34 */ -//NOBODY void TutorMessageEvent::~TutorMessageEvent(void) -//{ -//} +TutorMessageEvent::~TutorMessageEvent(void) +{ + ; +} /* <1f54a6> ../cstrike/dlls/tutor_base_tutor.cpp:38 */ -NOBODY bool TutorMessageEvent::IsActive(float time) +bool TutorMessageEvent::IsActive(float time) { + return (m_lifetime + m_activationTime >= time); } /* <1f54da> ../cstrike/dlls/tutor_base_tutor.cpp:48 */ -NOBODY int TutorMessageEvent::GetPriority(void) +int TutorMessageEvent::GetPriority(void) { + return m_priority; } /* <1f5500> ../cstrike/dlls/tutor_base_tutor.cpp:53 */ -NOBODY float TutorMessageEvent::GetTimeActive(float time) +float TutorMessageEvent::GetTimeActive(float time) { + return (time - m_activationTime); } /* <1f5534> ../cstrike/dlls/tutor_base_tutor.cpp:58 */ -NOBODY void TutorMessageEvent::SetActivationTime(float time) +void TutorMessageEvent::SetActivationTime(float time) { + m_activationTime = time; } /* <1f5568> ../cstrike/dlls/tutor_base_tutor.cpp:63 */ -NOBODY int TutorMessageEvent::GetID(void) +int TutorMessageEvent::GetID(void) { + return m_messageID; } /* <1f5589> ../cstrike/dlls/tutor_base_tutor.cpp:68 */ -NOBODY int TutorMessageEvent::GetDuplicateID(void) +int TutorMessageEvent::GetDuplicateID(void) { + return m_duplicateID; } /* <1f55af> ../cstrike/dlls/tutor_base_tutor.cpp:73 */ -NOBODY void TutorMessageEvent::SetNext(TutorMessageEvent *next) +void TutorMessageEvent::SetNext(TutorMessageEvent *next) { + m_next = next; } /* <1f55e3> ../cstrike/dlls/tutor_base_tutor.cpp:78 */ -NOBODY TutorMessageEvent *TutorMessageEvent::GetNext(void) +TutorMessageEvent *TutorMessageEvent::GetNext(void) { + return m_next; } /* <1f5604> ../cstrike/dlls/tutor_base_tutor.cpp:83 */ -NOBODY void TutorMessageEvent::AddParameter(char *str) +void TutorMessageEvent::AddParameter(char *str) { -// { -// class TutorMessageEventParam *param; // 88 -// class TutorMessageEventParam *temp; // 101 -// } + if (str == NULL) + { + return; + } + + TutorMessageEventParam *param = new TutorMessageEventParam; + + param->m_next = NULL; + param->m_data = new char[Q_strlen(str) + 1]; + + if (param->m_data != NULL) + { + Q_strcpy(param->m_data, str); + param->m_data[Q_strlen(str)] = '\0'; + ++m_numParameters; + + if (m_paramList != NULL) + { + TutorMessageEventParam *temp = m_paramList; + + while (temp->m_next) + temp = temp->m_next; + + temp->m_next = param; + } + else + m_paramList = param; + } } /* <1f565d> ../cstrike/dlls/tutor_base_tutor.cpp:117 */ -NOBODY char *TutorMessageEvent::GetNextParameter(char *buf, int buflen) +char *TutorMessageEvent::GetNextParameter(char *buf, int buflen) { -// { -// class TutorMessageEventParam *param; // 119 -// } + TutorMessageEventParam *param = m_paramList; + + if (param == NULL) + { + return NULL; + } + + m_numParameters--; + m_paramList = param->m_next; + + Q_strncpy(buf, param->m_data, buflen); + +#ifdef REGAMEDLL_FIXES + buf[buflen] = '\0'; +#endif // REGAMEDLL_FIXES + + delete param; + return buf; } /* <1f569e> ../cstrike/dlls/tutor_base_tutor.cpp:136 */ -NOBODY int TutorMessageEvent::GetNumParameters(void) +int TutorMessageEvent::GetNumParameters(void) { + return m_numParameters; } /* <1f56d8> ../cstrike/dlls/tutor_base_tutor.cpp:144 */ -NOBODY CBaseTutor::CBaseTutor(void) +CBaseTutor::CBaseTutor(void) { m_eventList = NULL; m_deadAirStartTime = 0; @@ -83,15 +141,17 @@ NOBODY CBaseTutor::CBaseTutor(void) } /* <1f4d28> ../cstrike/dlls/tutor_base_tutor.cpp:152 */ -NOBODY CBaseTutor::~CBaseTutor(void) +CBaseTutor::~CBaseTutor(void) { -// { -// class TutorMessageEvent *event; // 154 -// { -// class TutorMessageEvent *temp; // 157 -// GetNext(TutorMessageEvent *const this); // 158 -// } -// } + TutorMessageEvent *event = m_eventList; + + while (event != NULL) + { + TutorMessageEvent *temp = event; + event = event->GetNext(); + + delete temp; + } } /* <1f5766> ../cstrike/dlls/tutor_base_tutor.cpp:163 */ @@ -102,52 +162,88 @@ void CBaseTutor::OnEvent(GameEventType event, CBaseEntity *entity, CBaseEntity * } /* <1f5842> ../cstrike/dlls/tutor_base_tutor.cpp:172 */ -NOBODY void CBaseTutor::ShotFired(Vector source, Vector target) +void CBaseTutor::ShotFired(Vector source, Vector target) { -// Vector(Vector *const this, -// const Vector &v); // 175 -// Vector(Vector *const this, -// const Vector &v); // 175 + HandleShotFired(source, target); } /* <1f58ca> ../cstrike/dlls/tutor_base_tutor.cpp:178 */ -NOXREF void CBaseTutor::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +void CBaseTutor::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { if (m_stateSystem->UpdateState(event, entity, other)) + { DisplayNewStateDescriptionToPlayer(); + } } /* <1f58f5> ../cstrike/dlls/tutor_base_tutor.cpp:189 */ -NOBODY void CBaseTutor::StartFrame(float time) +void CBaseTutor::StartFrame(float time) { TutorThink(time); } /* <1f5993> ../cstrike/dlls/tutor_base_tutor.cpp:192 */ -NOBODY void CBaseTutor::DisplayMessageToPlayer(CBasePlayer *player, int id, const char *szMessage, TutorMessageEvent *event) +void CBaseTutor::DisplayMessageToPlayer(CBasePlayer *player, int id, const char *szMessage, TutorMessageEvent *event) { -// { -// class TutorMessage *definition; // 196 -// unsigned char numArgs; // 202 -// char param; // 207 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// entvars_t *ent); // 198 -// { -// int arg; // 210 -// { -// char *str; // 212 -// GetNextParameter(TutorMessageEvent *const this, -// char *buf, -// int buflen); // 212 -// } -// } -// } + TutorMessage *definition; + int numArgs; + char param[512]; + + numArgs = event->GetNumParameters(); + definition = GetTutorMessageDefinition(event->GetID()); + + MESSAGE_BEGIN(MSG_ONE, gmsgTutorText, NULL, player->pev); + WRITE_STRING(szMessage); + WRITE_BYTE(numArgs); + + for (int arg = 0; arg < numArgs; arg++) + { + char *str = event->GetNextParameter(param, sizeof(param)); + + if (str != NULL) + WRITE_STRING(str); + else + WRITE_STRING(""); + } + + WRITE_SHORT(id); + WRITE_SHORT(player->IsAlive() == FALSE); + + if (definition != NULL) + WRITE_SHORT(definition->m_type); + else + WRITE_SHORT(TUTORMESSAGETYPE_DEFAULT); + MESSAGE_END(); + + m_deadAirStartTime = -1.0f; + + if (definition != NULL) + { + if (gpGlobals->time - m_roundStartTime > 1.0f) + { + switch (definition->m_type) + { + case TUTORMESSAGETYPE_FRIEND_DEATH: + EMIT_SOUND_DYN(ENT(player->pev), CHAN_ITEM, "events/friend_died.wav", VOL_NORM, ATTN_NORM, 0, 120); + break; + case TUTORMESSAGETYPE_ENEMY_DEATH: + EMIT_SOUND_DYN(ENT(player->pev), CHAN_ITEM, "events/enemy_died.wav", VOL_NORM, ATTN_NORM, 0, 85); + break; + default: + EMIT_SOUND_DYN(ENT(player->pev), CHAN_ITEM, "events/tutor_msg.wav", VOL_NORM, ATTN_NORM, 0, 100); + break; + } + } + + if (definition->m_decay) + { + REGISTER_TUTOR_MESSAGE_SHOWN(id); + } + } } /* <1f5ad1> ../cstrike/dlls/tutor_base_tutor.cpp:264 */ -NOBODY void CBaseTutor::DrawLineToEntity(CBasePlayer *player, int entindex, int id) +NOXREF void CBaseTutor::DrawLineToEntity(CBasePlayer *player, int entindex, int id) { MESSAGE_BEGIN(MSG_ONE, gmsgTutorLine, NULL, player->pev); WRITE_SHORT(entindex); @@ -156,15 +252,16 @@ NOBODY void CBaseTutor::DrawLineToEntity(CBasePlayer *player, int entindex, int } /* <1f5b4f> ../cstrike/dlls/tutor_base_tutor.cpp:275 */ -NOXREF void CBaseTutor::DisplayNewStateDescriptionToPlayer(void) +void CBaseTutor::DisplayNewStateDescriptionToPlayer(void) { - char *desc; CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); if (localPlayer == NULL) + { return; + } - desc = m_stateSystem->GetCurrentStateString(); + char *desc = m_stateSystem->GetCurrentStateString(); if (!desc) { @@ -189,79 +286,195 @@ void CBaseTutor::CloseCurrentWindow(void) } /* <1f5c26> ../cstrike/dlls/tutor_base_tutor.cpp:307 */ -NOBODY void CBaseTutor::CalculatePathForObjective(CBaseEntity *player) +void CBaseTutor::CalculatePathForObjective(CBaseEntity *player) { + ; } /* <1f52e6> ../cstrike/dlls/tutor_base_tutor.cpp:312 */ -NOBODY bool CBaseTutor::IsEntityInViewOfPlayer(CBaseEntity *entity, CBasePlayer *player) +bool CBaseTutor::__MAKE_VHOOK(IsEntityInViewOfPlayer)(CBaseEntity *entity, CBasePlayer *player) { -// { -// Vector eye; // 332 -// TraceResult result; // 334 -// operator-(const Vector *const this, -// const Vector &v); // 320 -// Length(const Vector *const this); // 320 -// } -// IsEntityInViewOfPlayer(CBaseTutor *const this, -// class CBaseEntity *entity, -// class CBasePlayer *player); // 312 + if (entity == NULL || player == NULL) + { + return false; + } + + if (cv_tutor_view_distance.value < (entity->pev->origin - player->pev->origin).Length()) + { + return false; + } + + if (player->FInViewCone(entity)) + { + TraceResult result; + Vector eye = player->pev->view_ofs + player->pev->origin; + + UTIL_TraceLine(eye, entity->pev->origin, ignore_monsters, ignore_glass, player->pev->pContainingEntity, &result); + + if (result.flFraction == 1.0f) + { + return true; + } + } + + return false; } /* <1f508a> ../cstrike/dlls/tutor_base_tutor.cpp:343 */ -NOBODY bool CBaseTutor::IsPlayerLookingAtPosition(Vector *origin, CBasePlayer *player) +bool CBaseTutor::__MAKE_VHOOK(IsPlayerLookingAtPosition)(Vector *origin, CBasePlayer *player) { -// { -// Vector eye; // 363 -// TraceResult result; // 364 -// operator-(const Vector *const this, -// const Vector &v); // 351 -// Length(const Vector *const this); // 351 -// } -// IsPlayerLookingAtPosition(CBaseTutor *const this, -// Vector *origin, -// class CBasePlayer *player); // 343 + if (origin == NULL || player == NULL) + { + return false; + } + + if (cv_tutor_look_distance.value < (*origin - player->pev->origin).Length()) + { + return false; + } + + if (player->IsLookingAtPosition(origin, cv_tutor_look_angle.value)) + { + TraceResult result; + Vector eye = player->pev->origin + player->pev->view_ofs; + + UTIL_TraceLine(eye, *origin, ignore_monsters, ignore_glass, ENT(player->pev), &result); + + if (result.flFraction == 1.0f) + return true; + } + + return false; } /* <1f4e92> ../cstrike/dlls/tutor_base_tutor.cpp:373 */ -NOBODY bool CBaseTutor::IsPlayerLookingAtEntity(CBaseEntity *entity, CBasePlayer *player) +bool CBaseTutor::__MAKE_VHOOK(IsPlayerLookingAtEntity)(CBaseEntity *entity, CBasePlayer *player) { -// { -// Vector srcVec; // 380 -// Vector destVec; // 386 -// TraceResult result; // 389 -// } -// IsPlayerLookingAtEntity(CBaseTutor *const this, -// class CBaseEntity *entity, -// class CBasePlayer *player); // 373 + if (entity == NULL || player == NULL) + { + return false; + } + + UTIL_MakeVectors(player->pev->v_angle); + + Vector srcVec = player->pev->view_ofs + player->pev->origin; + Vector destVec = gpGlobals->v_forward * cv_tutor_look_distance.value + srcVec; + + TraceResult result; + UTIL_TraceLine(srcVec, destVec, dont_ignore_monsters, ignore_glass, ENT(player->pev), &result); + + if (result.pHit != NULL) + { + if (!FNullEnt(result.pHit) && CBaseEntity::Instance(result.pHit) == entity) + { + return true; + } + } + + return false; } /* <1f51b0> ../cstrike/dlls/tutor_base_tutor.cpp:402 */ -NOBODY bool CBaseTutor::IsBombsiteInViewOfPlayer(CBaseEntity *entity, CBasePlayer *player) +bool CBaseTutor::__MAKE_VHOOK(IsBombsiteInViewOfPlayer)(CBaseEntity *entity, CBasePlayer *player) { -// { -// Vector bombSiteCenter; // 410 -// Vector eye; // 426 -// TraceResult result; // 428 -// } -// IsBombsiteInViewOfPlayer(CBaseTutor *const this, -// class CBaseEntity *entity, -// class CBasePlayer *player); // 402 + if (entity == NULL || player == NULL) + { + return false; + } + + Vector bombSiteCenter = (entity->pev->absmax + entity->pev->absmin) * 0.5; + + if (cv_tutor_view_distance.value < (bombSiteCenter - player->pev->origin).Length()) + { + return false; + } + + if (player->FInViewCone(entity)) + { + TraceResult result; + Vector eye = player->pev->origin + player->pev->view_ofs; + + UTIL_TraceLine(eye, bombSiteCenter, ignore_monsters, ignore_glass, ENT(player->pev), &result); + + if (result.flFraction == 1.0f) + { + return true; + } + } + + return false; } /* <1f4e37> ../cstrike/dlls/tutor_base_tutor.cpp:436 */ -NOBODY bool CBaseTutor::IsEntityInBombsite(CBaseEntity *bombsite, CBaseEntity *entity) +bool CBaseTutor::__MAKE_VHOOK(IsEntityInBombsite)(CBaseEntity *bombsite, CBaseEntity *entity) { -// IsEntityInBombsite(CBaseTutor *const this, -// class CBaseEntity *bombsite, -// class CBaseEntity *entity); // 436 + if (bombsite == NULL || entity == NULL) + { + return false; + } + + if (entity->pev->origin.x <= bombsite->pev->absmax.x + && entity->pev->origin.y <= bombsite->pev->absmax.y + && entity->pev->origin.z <= bombsite->pev->absmax.z + && entity->pev->origin.x >= bombsite->pev->absmin.x + && entity->pev->origin.y >= bombsite->pev->absmin.y + && entity->pev->origin.z >= bombsite->pev->absmin.z) + { + return true; + } + + return false; } /* <1f5c5b> ../cstrike/dlls/tutor_base_tutor.cpp:457 */ -NOBODY bool CBaseTutor::DoMessagesHaveSameID(int id1, int id2) +bool CBaseTutor::DoMessagesHaveSameID(int id1, int id2) { -// { -// class TutorMessage *message1; // 464 -// class TutorMessage *message2; // 465 -// } + if (id1 == id2) + { + return true; + } + + TutorMessage *message1 = GetTutorMessageDefinition(id1); + TutorMessage *message2 = GetTutorMessageDefinition(id2); + + if (message1 == NULL || message2 == NULL) + { + return false; + } + + if (message1->m_duplicateID && message2->m_duplicateID) + { + return true; + } + + return false; } + +#ifdef HOOK_GAMEDLL + +bool CBaseTutor::IsEntityInViewOfPlayer(CBaseEntity *entity, CBasePlayer *player) +{ + return IsEntityInViewOfPlayer_(entity, player); +} + +bool CBaseTutor::IsBombsiteInViewOfPlayer(CBaseEntity *entity, CBasePlayer *player) +{ + return IsBombsiteInViewOfPlayer_(entity, player); +} + +bool CBaseTutor::IsEntityInBombsite(CBaseEntity *bombsite, CBaseEntity *entity) +{ + return IsEntityInBombsite_(bombsite, entity); +} + +bool CBaseTutor::IsPlayerLookingAtPosition(Vector *origin, CBasePlayer *player) +{ + return IsPlayerLookingAtPosition_(origin, player); +} + +bool CBaseTutor::IsPlayerLookingAtEntity(CBaseEntity *entity, CBasePlayer *player) +{ + return IsPlayerLookingAtEntity_(entity, player); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/tutor_base_tutor.h b/regamedll/dlls/tutor_base_tutor.h index 8d688c96..e02b4485 100644 --- a/regamedll/dlls/tutor_base_tutor.h +++ b/regamedll/dlls/tutor_base_tutor.h @@ -36,7 +36,7 @@ class TutorMessageEvent { public: TutorMessageEvent(int mid, int duplicateID, float time, float lifetime, int priority); - //virtual ~TutorMessageEvent(void); + virtual ~TutorMessageEvent(void); bool IsActive(float time); int GetPriority(void); @@ -62,7 +62,6 @@ private: };/* size: 36, cachelines: 1, members: 9 */ - class CBaseTutor { public: @@ -82,6 +81,17 @@ public: virtual void HandleShotFired(Vector source, Vector target) = 0; virtual struct TutorMessage *GetTutorMessageDefinition(int messageID) = 0; + +#ifdef HOOK_GAMEDLL + + bool IsEntityInViewOfPlayer_(CBaseEntity *entity, CBasePlayer *player); + bool IsBombsiteInViewOfPlayer_(CBaseEntity *entity, CBasePlayer *player); + bool IsEntityInBombsite_(CBaseEntity *bombsite, CBaseEntity *entity); + bool IsPlayerLookingAtPosition_(Vector *origin, CBasePlayer *player); + bool IsPlayerLookingAtEntity_(CBaseEntity *entity, CBasePlayer *player); + +#endif // HOOK_GAMEDLL + public: void StartFrame(float time); void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); @@ -89,17 +99,18 @@ public: void ShotFired(Vector source, Vector target); void DisplayMessageToPlayer(CBasePlayer *player, int id, const char *szMessage, TutorMessageEvent *event); NOXREF void DrawLineToEntity(CBasePlayer *player, int entindex, int id); - NOXREF void DisplayNewStateDescriptionToPlayer(void); + void DisplayNewStateDescriptionToPlayer(void); void CloseCurrentWindow(void); - NOXREF void CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + void CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other); void CalculatePathForObjective(CBaseEntity *player); bool DoMessagesHaveSameID(int id1, int id2); -private: +protected: CBaseTutorStateSystem *m_stateSystem; TutorMessageEvent *m_eventList; float m_deadAirStartTime; float m_roundStartTime; + };/* size: 20, cachelines: 1, members: 5 */ #ifdef HOOK_GAMEDLL diff --git a/regamedll/dlls/tutor_cs_states.cpp b/regamedll/dlls/tutor_cs_states.cpp index 7fd5ea3f..20ac619f 100644 --- a/regamedll/dlls/tutor_cs_states.cpp +++ b/regamedll/dlls/tutor_cs_states.cpp @@ -1,164 +1,310 @@ #include "precompiled.h" -enum TutorStateType -{ - TUTORSTATE_UNDEFINED = 0, - TUTORSTATE_LOOKING_FOR_HOSTAGE, - TUTORSTATE_ESCORTING_HOSTAGE, - TUTORSTATE_LOOKING_FOR_LOST_HOSTAGE, - TUTORSTATE_FOLLOWING_HOSTAGE_ESCORT, - TUTORSTATE_MOVING_TO_BOMBSITE, - TUTORSTATE_LOOKING_FOR_BOMB_CARRIER, - TUTORSTATE_GUARDING_LOOSE_BOMB, - TUTORSTATE_DEFUSING_BOMB, - TUTORSTATE_GUARDING_HOSTAGE, - TUTORSTATE_MOVING_TO_INTERCEPT_ENEMY, - TUTORSTATE_LOOKING_FOR_HOSTAGE_ESCORT, - TUTORSTATE_ATTACKING_HOSTAGE_ESCORT, - TUTORSTATE_ESCORTING_BOMB_CARRIER, - TUTORSTATE_MOVING_TO_BOMB_SITE, - TUTORSTATE_PLANTING_BOMB, - TUTORSTATE_GUARDING_BOMB, - TUTORSTATE_LOOKING_FOR_LOOSE_BOMB, - TUTORSTATE_RUNNING_AWAY_FROM_TICKING_BOMB, - TUTORSTATE_BUYTIME, - TUTORSTATE_WAITING_FOR_START, +/* +* Globals initialization +*/ +#ifndef HOOK_GAMEDLL + +char *const g_TutorStateStrings[20] = +{ + "#Cstrike_TutorState_Undefined", + "#Cstrike_TutorState_Looking_For_Hostage", + "#Cstrike_TutorState_Escorting_Hostage", + "#Cstrike_TutorState_Following_Hostage_Escort", + "#Cstrike_TutorState_Moving_To_Bombsite", + "#Cstrike_TutorState_Looking_For_Bomb_Carrier", + "#Cstrike_TutorState_Guarding_Loose_Bomb", + "#Cstrike_TutorState_Defusing_Bomb", + "#Cstrike_TutorState_Guarding_Hostage", + "#Cstrike_TutorState_Moving_To_Intercept_Enemy", + "#Cstrike_TutorState_Looking_For_Hostage_Escort", + "#Cstrike_TutorState_Attacking_Hostage_Escort", + "#Cstrike_TutorState_Escorting_Bomb_Carrier", + "#Cstrike_TutorState_Moving_To_Bomb_Site", + "#Cstrike_TutorState_Planting_Bomb", + "#Cstrike_TutorState_Guarding_Bomb", + "#Cstrike_TutorState_Looking_For_Loose_Bomb", + "#Cstrike_TutorState_Running_Away_From_Ticking_Bomb", + "#Cstrike_TutorState_Buy_Time", + "#Cstrike_TutorState_Waiting_For_Start" }; +#else + +char *const g_TutorStateStrings[20]; + +#endif // HOOK_GAMEDLL /* <22bf8e> ../cstrike/dlls/tutor_cs_states.cpp:53 */ -NOBODY CCSTutorStateSystem::CCSTutorStateSystem(void) +CCSTutorStateSystem::CCSTutorStateSystem(void) { -// CCSTutorUndefinedState(CCSTutorUndefinedState *const this); // 55 + m_currentState = new CCSTutorUndefinedState; } /* <22bd56> ../cstrike/dlls/tutor_cs_states.cpp:58 */ -NOBODY CCSTutorStateSystem::~CCSTutorStateSystem(void) +CCSTutorStateSystem::~CCSTutorStateSystem(void) { + if (m_currentState != NULL) + { + delete m_currentState; + m_currentState = NULL; + } } /* <22bccf> ../cstrike/dlls/tutor_cs_states.cpp:68 */ -NOBODY bool CCSTutorStateSystem::UpdateState(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +bool CCSTutorStateSystem::__MAKE_VHOOK(UpdateState)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { -// { -// enum TutorStateType nextStateType; // 70 -// CCSTutorUndefinedState(CCSTutorUndefinedState *const this); // 76 -// } + if (m_currentState == NULL) + { + m_currentState = new CCSTutorUndefinedState; + } + + if (m_currentState != NULL) + { + TutorStateType nextStateType = static_cast(m_currentState->CheckForStateTransition(event, entity, other)); + + if (nextStateType != TUTORSTATE_UNDEFINED) + { + if (m_currentState != NULL) + { + delete m_currentState; + } + + m_currentState = NULL; + m_currentState = ConstructNewState(nextStateType); + + return true; + } + } + + return false; } /* <22b96f> ../cstrike/dlls/tutor_cs_states.cpp:108 */ -NOBODY char *CCSTutorStateSystem::GetCurrentStateString(void) +char *CCSTutorStateSystem::__MAKE_VHOOK(GetCurrentStateString)(void) { + if (m_currentState != NULL) + { + return m_currentState->GetStateString(); + } + + return NULL; } /* <22bbfe> ../cstrike/dlls/tutor_cs_states.cpp:118 */ -NOBODY CBaseTutorState *CCSTutorStateSystem::ConstructNewState(int stateType) +CBaseTutorState *CCSTutorStateSystem::__MAKE_VHOOK(ConstructNewState)(int stateType) { -// { -// class CBaseTutorState *ret; // 120 -// CCSTutorWaitingForStartState(CCSTutorWaitingForStartState *const this); // 128 -// CCSTutorBuyMenuState(CCSTutorBuyMenuState *const this); // 132 -// } -// ConstructNewState(CCSTutorStateSystem *const this, -// int stateType); // 118 + CBaseTutorState *ret = NULL; + + if (stateType != TUTORSTATE_UNDEFINED) + { + if (stateType == TUTORSTATE_BUYTIME) + { + ret = new CCSTutorBuyMenuState; + } + else if (stateType == TUTORSTATE_WAITING_FOR_START) + { + ret = new CCSTutorWaitingForStartState; + } + } + else + { + ret = new CCSTutorUndefinedState; + } + + return ret; } /* <22bfcb> ../cstrike/dlls/tutor_cs_states.cpp:141 */ -NOBODY CCSTutorUndefinedState::CCSTutorUndefinedState(void) +CCSTutorUndefinedState::CCSTutorUndefinedState(void) { + m_type = 0; } /* <22bb33> ../cstrike/dlls/tutor_cs_states.cpp:146 */ -NOBODY CCSTutorUndefinedState::~CCSTutorUndefinedState(void) +CCSTutorUndefinedState::~CCSTutorUndefinedState(void) { -// ~CCSTutorUndefinedState(CCSTutorUndefinedState::~CCSTutorUndefinedState(); // 148 + ; } /* <22bdd8> ../cstrike/dlls/tutor_cs_states.cpp:150 */ -NOBODY int CCSTutorUndefinedState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +int CCSTutorUndefinedState::__MAKE_VHOOK(CheckForStateTransition)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { -// { -// int ret; // 152 -// HandlePlayerSpawned(CCSTutorUndefinedState *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 156 -// } + int ret = 0; + + if (event == EVENT_PLAYER_SPAWNED) + { + ret = HandlePlayerSpawned(entity, other); + } + + return ret; } /* <22bfed> ../cstrike/dlls/tutor_cs_states.cpp:163 */ -NOBODY int CCSTutorUndefinedState::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) +int CCSTutorUndefinedState::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 171 -// class CBasePlayer *player; // 178 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer) + { + // flags + return TUTOR_STATE_FLAG_1; + } + } + + return 0; } /* <22b995> ../cstrike/dlls/tutor_cs_states.cpp:190 */ -NOBODY char *CCSTutorUndefinedState::GetStateString(void) +char *CCSTutorUndefinedState::__MAKE_VHOOK(GetStateString)(void) { + return NULL; } /* <22c03e> ../cstrike/dlls/tutor_cs_states.cpp:198 */ -NOBODY CCSTutorWaitingForStartState::CCSTutorWaitingForStartState(void) +CCSTutorWaitingForStartState::CCSTutorWaitingForStartState(void) { + m_type = (TUTORMESSAGETYPE_ENEMY_DEATH | TUTORMESSAGETYPE_BUY); } /* <22bab6> ../cstrike/dlls/tutor_cs_states.cpp:203 */ -NOBODY CCSTutorWaitingForStartState::~CCSTutorWaitingForStartState(void) +CCSTutorWaitingForStartState::~CCSTutorWaitingForStartState(void) { + ; } /* <22beca> ../cstrike/dlls/tutor_cs_states.cpp:207 */ -NOBODY int CCSTutorWaitingForStartState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +int CCSTutorWaitingForStartState::__MAKE_VHOOK(CheckForStateTransition)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { -// { -// int ret; // 209 -// HandlePlayerSpawned(CCSTutorWaitingForStartState *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 214 -// } + int ret = 0; + + switch (event) + { + case EVENT_PLAYER_SPAWNED: + ret = HandlePlayerSpawned(entity, other); + break; + case EVENT_BUY_TIME_START: + ret = HandleBuyTimeStart(entity, other); + break; + } + + return ret; } /* <22b9bb> ../cstrike/dlls/tutor_cs_states.cpp:224 */ -NOBODY char *CCSTutorWaitingForStartState::GetStateString(void) +char *CCSTutorWaitingForStartState::__MAKE_VHOOK(GetStateString)(void) { + return g_TutorStateStrings[m_type]; } /* <22c060> ../cstrike/dlls/tutor_cs_states.cpp:230 */ -NOBODY int CCSTutorWaitingForStartState::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) +int CCSTutorWaitingForStartState::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 238 -// class CBasePlayer *player; // 245 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer) + { + // flags + return TUTOR_STATE_FLAG_1; + } + } + + return 0; } /* <22c0b1> ../cstrike/dlls/tutor_cs_states.cpp:257 */ -NOBODY int CCSTutorWaitingForStartState::HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other) +int CCSTutorWaitingForStartState::HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other) { + return TUTOR_STATE_FLAG_2; } /* <22c0e2> ../cstrike/dlls/tutor_cs_states.cpp:266 */ -NOBODY CCSTutorBuyMenuState::CCSTutorBuyMenuState(void) +CCSTutorBuyMenuState::CCSTutorBuyMenuState(void) { + m_type = (TUTORMESSAGETYPE_DEFAULT | TUTORMESSAGETYPE_FRIEND_DEATH | TUTORMESSAGETYPE_BUY); } /* <22ba5a> ../cstrike/dlls/tutor_cs_states.cpp:271 */ -NOBODY CCSTutorBuyMenuState::~CCSTutorBuyMenuState(void) +CCSTutorBuyMenuState::~CCSTutorBuyMenuState(void) { + ; } /* <22b9e1> ../cstrike/dlls/tutor_cs_states.cpp:275 */ -NOBODY int CCSTutorBuyMenuState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +int CCSTutorBuyMenuState::__MAKE_VHOOK(CheckForStateTransition)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { + if (event == EVENT_ROUND_START) + { + return HandleRoundStart(entity, other); + } + + return 0; } /* <22ba34> ../cstrike/dlls/tutor_cs_states.cpp:288 */ -NOBODY char *CCSTutorBuyMenuState::GetStateString(void) +char *CCSTutorBuyMenuState::__MAKE_VHOOK(GetStateString)(void) { + return g_TutorStateStrings[m_type]; } /* <22c104> ../cstrike/dlls/tutor_cs_states.cpp:293 */ -NOBODY int CCSTutorBuyMenuState::HandleRoundStart(CBaseEntity *entity, CBaseEntity *other) +int CCSTutorBuyMenuState::HandleRoundStart(CBaseEntity *entity, CBaseEntity *other) { + return TUTOR_STATE_FLAG_1; } + +#ifdef HOOK_GAMEDLL + +bool CCSTutorStateSystem::UpdateState(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +{ + return UpdateState_(event, entity, other); +} + +char *CCSTutorStateSystem::GetCurrentStateString(void) +{ + return GetCurrentStateString_(); +} + +CBaseTutorState *CCSTutorStateSystem::ConstructNewState(int stateType) +{ + return ConstructNewState_(stateType); +} + +int CCSTutorUndefinedState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +{ + return CheckForStateTransition_(event, entity, other); +} + +char *CCSTutorUndefinedState::GetStateString(void) +{ + return GetStateString_(); +} + +int CCSTutorWaitingForStartState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +{ + return CheckForStateTransition_(event, entity, other); +} + +char *CCSTutorWaitingForStartState::GetStateString(void) +{ + return GetStateString_(); +} + +int CCSTutorBuyMenuState::CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +{ + return CheckForStateTransition_(event, entity, other); +} + +char *CCSTutorBuyMenuState::GetStateString(void) +{ + return GetStateString_(); +} + +#endif // HOOK_GAMEDLL diff --git a/regamedll/dlls/tutor_cs_states.h b/regamedll/dlls/tutor_cs_states.h index 74606803..ac67cc3b 100644 --- a/regamedll/dlls/tutor_cs_states.h +++ b/regamedll/dlls/tutor_cs_states.h @@ -32,6 +32,35 @@ #pragma once #endif +// unknown flags +#define TUTOR_STATE_FLAG_1 0x00000014 +#define TUTOR_STATE_FLAG_2 0x00000013 + +enum TutorStateType +{ + TUTORSTATE_UNDEFINED = 0, + TUTORSTATE_LOOKING_FOR_HOSTAGE, + TUTORSTATE_ESCORTING_HOSTAGE, + TUTORSTATE_LOOKING_FOR_LOST_HOSTAGE, + TUTORSTATE_FOLLOWING_HOSTAGE_ESCORT, + TUTORSTATE_MOVING_TO_BOMBSITE, + TUTORSTATE_LOOKING_FOR_BOMB_CARRIER, + TUTORSTATE_GUARDING_LOOSE_BOMB, + TUTORSTATE_DEFUSING_BOMB, + TUTORSTATE_GUARDING_HOSTAGE, + TUTORSTATE_MOVING_TO_INTERCEPT_ENEMY, + TUTORSTATE_LOOKING_FOR_HOSTAGE_ESCORT, + TUTORSTATE_ATTACKING_HOSTAGE_ESCORT, + TUTORSTATE_ESCORTING_BOMB_CARRIER, + TUTORSTATE_MOVING_TO_BOMB_SITE, + TUTORSTATE_PLANTING_BOMB, + TUTORSTATE_GUARDING_BOMB, + TUTORSTATE_LOOKING_FOR_LOOSE_BOMB, + TUTORSTATE_RUNNING_AWAY_FROM_TICKING_BOMB, + TUTORSTATE_BUYTIME, + TUTORSTATE_WAITING_FOR_START, +}; + /* <22bf75> ../cstrike/dlls/tutor_cs_states.cpp:53 */ class CCSTutorStateSystem: public CBaseTutorStateSystem { @@ -40,9 +69,23 @@ public: virtual ~CCSTutorStateSystem(void); virtual bool UpdateState(GameEventType event, CBaseEntity *entity, CBaseEntity *other); - virtual char *GetCurrentStateString(void); + virtual char *GetCurrentStateString(void); + +#ifndef HOOK_GAMEDLL protected: - virtual CBaseTutorState *ConstructNewState(int stateType); +#endif // HOOK_GAMEDLL + + virtual CBaseTutorState *ConstructNewState(int stateType); + +#ifdef HOOK_GAMEDLL +public: + + bool UpdateState_(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + char *GetCurrentStateString_(void); + CBaseTutorState *ConstructNewState_(int stateType); + +#endif // HOOK_GAMEDLL + };/* size: 8, cachelines: 1, members: 1 */ /* <22bfcb> ../cstrike/dlls/tutor_cs_states.cpp:141 */ @@ -55,8 +98,16 @@ public: virtual int CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other); virtual char *GetStateString(void); +#ifdef HOOK_GAMEDLL + + int CheckForStateTransition_(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + char *GetStateString_(void); + +#endif // HOOK_GAMEDLL + protected: int HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other); + };/* size: 8, cachelines: 1, members: 1 */ /* <22c03e> ../cstrike/dlls/tutor_cs_states.cpp:198 */ @@ -69,6 +120,13 @@ public: virtual int CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other); virtual char *GetStateString(void); +#ifdef HOOK_GAMEDLL + + int CheckForStateTransition_(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + char *GetStateString_(void); + +#endif // HOOK_GAMEDLL + protected: int HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other); @@ -86,9 +144,22 @@ public: virtual int CheckForStateTransition(GameEventType event, CBaseEntity *entity, CBaseEntity *other); virtual char *GetStateString(void); +#ifdef HOOK_GAMEDLL + + int CheckForStateTransition_(GameEventType event, CBaseEntity *entity, CBaseEntity *other); + char *GetStateString_(void); + +#endif // HOOK_GAMEDLL + protected: int HandleRoundStart(CBaseEntity *entity, CBaseEntity *other); };/* size: 8, cachelines: 1, members: 1 */ +#ifdef HOOK_GAMEDLL +#define g_TutorStateStrings (*pg_TutorStateStrings) +#endif // HOOK_GAMEDLL + +extern char *const g_TutorStateStrings[20]; + #endif // TUTOR_CS_STATES_H diff --git a/regamedll/dlls/tutor_cs_tutor.cpp b/regamedll/dlls/tutor_cs_tutor.cpp index ab45e595..54ea8610 100644 --- a/regamedll/dlls/tutor_cs_tutor.cpp +++ b/regamedll/dlls/tutor_cs_tutor.cpp @@ -1,4 +1,5 @@ #include "precompiled.h" +#include /* * Globals initialization @@ -161,1264 +162,3193 @@ const char *TutorIdentifierList[] = #else // HOOK_GAMEDLL -const char *TutorIdentifierList[150]; +const char *TutorIdentifierList[ TUTOR_NUM_MESSAGES ]; #endif // HOOK_GAMEDLL +//#ifdef HOOK_GAMEDLL +//static TutorMessageMap m_messageMap_; +//#endif // HOOK_GAMEDLL + /* <212575> ../cstrike/dlls/tutor_cs_tutor.cpp:197 */ -NOBODY CCSTutor::CCSTutor(void) +CCSTutor::CCSTutor(void) { -// map(map, std::allocator>, TutorMessage*, std::less> *const this); // 197 -// ApplyPersistentDecay(CCSTutor *const this); // 216 -// ResetPlayerDeathInfo(CCSTutor *const this); // 218 + m_stateSystem = new CCSTutorStateSystem; + + m_nextViewableCheckTime = 0; + m_currentlyShownMessageID = TUTOR_NUM_MESSAGES; + m_currentMessageEvent = NULL; + m_messageTypeMask = TUTORMESSAGETYPE_ALL; + m_lastScenarioEvent = NULL; + m_haveSpawned = false; + m_lastHintShown = HINT_BEGIN; + m_lastInGameHintShown = INGAME_HINT_BEGIN; + + ReadTutorMessageFile(); + ApplyPersistentDecay(); + ResetPlayerDeathInfo(); } /* <217e69> ../cstrike/dlls/tutor_cs_tutor.cpp:221 */ -NOBODY CCSTutor::~CCSTutor(void) +CCSTutor::~CCSTutor(void) { -// DeleteEvent(CCSTutor::~CCSTutor(// class TutorMessageEvent *event); // 231 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 237 -// ClearEventList(CCSTutor *const this); // 243 -// ~vector(vector> *const this, -// int const __in_chrg); // 221 -// ~map(map, std::allocator>, TutorMessage*, std::less ../cstrike/dlls/tutor_cs_tutor.cpp:246 */ -NOBODY void ParseMessageParameters(const char *&messageData, TutorMessage *ret) +void ParseMessageParameters(char *&messageData, TutorMessage *ret) { -// { -// char *token; // 248 -// atof(const char *__nptr); // 397 -// atoi(const char *__nptr); // 267 -// atoi(const char *__nptr); // 274 -// atoi(const char *__nptr); // 313 -// atoi(const char *__nptr); // 362 -// atoi(const char *__nptr); // 369 -// atof(const char *__nptr); // 390 -// } + char *token; + static int iNumP = 0; + + while (true) + { + messageData = MP_COM_Parse((char *)messageData); + token = MP_COM_GetToken(); + + if (!messageData || !Q_stricmp(token, "End")) + { + break; + } + + if (!Q_stricmp(token, "String")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_text = Q_strdup(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "Duration")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_duration = Q_atoi(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "Priority")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_priority = Q_atoi(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "KeepOld")) + { + messageData = MP_COM_Parse((char *)messageData); + token = MP_COM_GetToken(); + + if (!Q_stricmp(token, "true")) + { + ret->m_keepOld = TUTORMESSAGEKEEPOLDTYPE_KEEP_OLD; + } + else if (!Q_stricmp(token, "updatecontent")) + { + ret->m_keepOld = TUTORMESSAGEKEEPOLDTYPE_UPDATE_CONTENT; + } + else + { + ret->m_keepOld = TUTORMESSAGEKEEPOLDTYPE_DONT_KEEP_OLD; + } + } + else if (!Q_stricmp(token, "Class")) + { + messageData = MP_COM_Parse((char *)messageData); + + if (!Q_stricmp(MP_COM_GetToken(), "Examine")) + { + ret->m_class = TUTORMESSAGECLASS_EXAMINE; + } + else + { + ret->m_class = TUTORMESSAGECLASS_NORMAL; + } + } + else if (!Q_stricmp(token, "Decay")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_decay = Q_atoi(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "Type")) + { + messageData = MP_COM_Parse((char *)messageData); + token = MP_COM_GetToken(); + + if (!Q_stricmp(token, "FriendDeath")) + { + ret->m_type = TUTORMESSAGETYPE_FRIEND_DEATH; + } + else if (!Q_stricmp(token, "EnemyDeath")) + { + ret->m_type = TUTORMESSAGETYPE_ENEMY_DEATH; + } + else if (!Q_stricmp(token, "Scenario")) + { + ret->m_type = TUTORMESSAGETYPE_SCENARIO; + } + else if (!Q_stricmp(token, "Buy")) + { + ret->m_type = TUTORMESSAGETYPE_BUY; + } + else if (!Q_stricmp(token, "Career")) + { + ret->m_type = TUTORMESSAGETYPE_CAREER; + } + else if (!Q_stricmp(token, "Hint")) + { + ret->m_type = TUTORMESSAGETYPE_HINT; + } + else if (!Q_stricmp(token, "InGameHint")) + { + ret->m_type = TUTORMESSAGETYPE_INGAME_HINT; + } + else if (!Q_stricmp(token, "EndGame")) + { + ret->m_type = TUTORMESSAGETYPE_END_GAME; + } + else + { + ret->m_type = TUTORMESSAGETYPE_DEFAULT; + } + } + else if (!Q_stricmp(token, "Lifetime")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_lifetime = Q_atoi(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "DuplicateID")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_duplicateID = Q_atoi(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "Interrupt")) + { + messageData = MP_COM_Parse((char *)messageData); + + if (!Q_stricmp(MP_COM_GetToken(), "Now")) + { + ret->m_interruptFlag = TUTORMESSAGEINTERRUPTFLAG_NOW_DAMMIT; + } + else + { + ret->m_interruptFlag = TUTORMESSAGEINTERRUPTFLAG_DEFAULT; + } + } + else if (!Q_stricmp(token, "MinDisplayTimeOverride")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_minDisplayTimeOverride = Q_atof(MP_COM_GetToken()); + } + else if (!Q_stricmp(token, "MinRepeatInterval")) + { + messageData = MP_COM_Parse((char *)messageData); + ret->m_minRepeatInterval = Q_atof(MP_COM_GetToken()); + } + } } /* <20ffde> ../cstrike/dlls/tutor_cs_tutor.cpp:405 */ -NOXREF TutorMessage *ConstructTutorMessage(const char *&messageData, TutorMessage *defaults) +TutorMessage *ConstructTutorMessage(char *&messageData, TutorMessage *defaults) { - // TODO: used in ReadTutorMessageFile - //TutorMessage *ret = new [sizeof(TutorMessage)]; - //memcpy(ret, defaults, sizeof(TutorMessage)); - //ParseMessageParameters(messageData, ret); - //return ret; + TutorMessage *ret = new TutorMessage; + + ret->m_text = NULL; + ret->m_duplicateID = defaults->m_duplicateID; + ret->m_keepOld = defaults->m_keepOld; + ret->m_duration = defaults->m_duration; + ret->m_priority = defaults->m_priority; + ret->m_class = defaults->m_class; + ret->m_type = defaults->m_type; + ret->m_decay = defaults->m_decay; + ret->m_lifetime = defaults->m_lifetime; + ret->m_interruptFlag = defaults->m_interruptFlag; + ret->m_minDisplayTimeOverride = defaults->m_minDisplayTimeOverride; + ret->m_minRepeatInterval = defaults->m_minRepeatInterval; + ret->m_examineStartTime = -1.0f; + ret->m_timesShown = 0; + ret->m_lastCloseTime = 0; + + ParseMessageParameters(messageData, ret); + + return ret; } /* <21005d> ../cstrike/dlls/tutor_cs_tutor.cpp:431 */ -NOBODY void ReadDefaultValues(const char *&messageData, TutorMessage *defaults) +void ReadDefaultValues(char *&messageData, TutorMessage *defaults) { + ParseMessageParameters(messageData, defaults); } /* <21164e> ../cstrike/dlls/tutor_cs_tutor.cpp:436 */ -NOBODY void CCSTutor::ReadTutorMessageFile(void) +void CCSTutor::ReadTutorMessageFile(void) { -// { -// int messageFileLen; // 438 -// char *messageFile; // 439 -// char *messageData; // 440 -// class TutorMessage defaultMessage; // 451 -// { -// char *token; // 472 -// { -// string identifier; // 476 -// class TutorMessage *tm; // 479 -// basic_string(basic_string, std::allocator> *const this); // 476 -// operator=(basic_string, std::allocator> *const this, -// const char *__s); // 477 -// ConstructTutorMessage(char *&const messageData, -// class TutorMessage *defaults); // 479 -// operator[](map, std::allocator>, TutorMessage*, std::less, std::allocator> *const this, -// int const __in_chrg); // 476 -// } -// ReadDefaultValues(char *&const messageData, -// class TutorMessage *defaults); // 484 -// } -// } + int messageFileLen = 0; + + char *messageFile; + char *messageData; + TutorMessage defaultMessage; + + messageFile = messageData = (char *)LOAD_FILE_FOR_ME("tutordata.txt", &messageFileLen); + + if (!messageFile) + { + if (UTIL_IsGame("czero")) + { + CONSOLE_ECHO("Warning: Cannot access tutor message file tutordata.txt\n"); + } + + return; + } + + defaultMessage.m_duplicateID = 0; + defaultMessage.m_keepOld = TUTORMESSAGEKEEPOLDTYPE_DONT_KEEP_OLD; + defaultMessage.m_duration = 1; + defaultMessage.m_priority = 0; + defaultMessage.m_class = TUTORMESSAGECLASS_NORMAL; + defaultMessage.m_type = TUTORMESSAGETYPE_DEFAULT; + defaultMessage.m_decay = 10; + defaultMessage.m_lifetime = 10; + defaultMessage.m_interruptFlag = TUTORMESSAGEINTERRUPTFLAG_DEFAULT; + defaultMessage.m_minDisplayTimeOverride = 0; + defaultMessage.m_minRepeatInterval = 0; + + int d = 0; + while (d < 200) + { + d++; + messageData = MP_COM_Parse(messageData); + + if (!messageData) + { + break; + } + + char *token = MP_COM_GetToken(); + + if (!Q_stricmp(token, "TutorMessage")) + { + messageData = MP_COM_Parse(messageData); + token = MP_COM_GetToken(); + + std::string identifier = token; + TutorMessage *tm = ConstructTutorMessage(messageData, &defaultMessage); + + m_messageMap[identifier] = tm; + } + else if (!Q_stricmp(token, "Defaults")) + { + ReadDefaultValues(messageData, &defaultMessage); + } + } + + FREE_FILE(messageFile); } /* <2126f8> ../cstrike/dlls/tutor_cs_tutor.cpp:491 */ -NOBODY void CCSTutor::ApplyPersistentDecay(void) +void CCSTutor::ApplyPersistentDecay(void) { -// { -// enum TutorMessageID mid; // 493 -// { -// class TutorMessage *definition; // 497 -// { -// int timesShown; // 500 -// } -// } -// } + for (TutorMessageID mid = YOU_FIRED_A_SHOT; mid < TUTOR_NUM_MESSAGES; mid++) + { + TutorMessage *definition = GetTutorMessageDefinition(mid); + + if (definition != NULL) + { + int timesShown = GET_TIMES_TUTOR_MESSAGE_SHOWN(mid); + + if (timesShown != -1) + { + definition->m_timesShown = timesShown; + } + } + } } /* <21275b> ../cstrike/dlls/tutor_cs_tutor.cpp:511 */ -NOBODY bool CCSTutor::HasCurrentWindowBeenActiveLongEnough(float time) +bool CCSTutor::HasCurrentWindowBeenActiveLongEnough(float time) { + return (m_currentlyShownMessageID < 0 || m_currentlyShownMessageID >= TUTOR_NUM_MESSAGES || time > m_currentlyShownMessageMinimumCloseTime); } /* <212787> ../cstrike/dlls/tutor_cs_tutor.cpp:528 */ -NOBODY bool CCSTutor::ShouldShowMessageEvent(TutorMessageEvent *event, float time) +bool CCSTutor::ShouldShowMessageEvent(TutorMessageEvent *event, float time) { -// { -// class TutorMessage *message; // 535 -// class TutorMessage *current; // 571 -// HasCurrentWindowBeenActiveLongEnough(CCSTutor *const this, -// float time); // 566 -// } + if (event == NULL) + { + return false; + } + + TutorMessage *message = GetTutorMessageDefinition(event->GetID()); + + if (message == NULL) + { + return false; + } + + if (message->m_class == TUTORMESSAGECLASS_NORMAL) + { + if (message->m_decay) + { + if (message->m_timesShown >= message->m_decay) + return false; + } + } + + if (!(m_messageTypeMask & message->m_type) || (time - message->m_lastCloseTime < message->m_minRepeatInterval)) + { + return false; + } + + if (HasCurrentWindowBeenActiveLongEnough(time)) + { + return true; + } + + if (message->m_interruptFlag != TUTORMESSAGEINTERRUPTFLAG_NOW_DAMMIT) + { + return false; + } + + TutorMessage *current = GetTutorMessageDefinition(m_currentlyShownMessageID); + + if (current == NULL || (DoMessagesHaveSameID(event->GetID(), m_currentlyShownMessageID) && current->m_keepOld != TUTORMESSAGEKEEPOLDTYPE_DONT_KEEP_OLD)) + { + return false; + } + + if (message->m_priority > current->m_priority + || message->m_priority == current->m_priority + || m_currentMessageEvent->GetTimeActive(time) < event->GetTimeActive(time)) + { + return true; + } + + return false; } /* <21362f> ../cstrike/dlls/tutor_cs_tutor.cpp:597 */ -NOBODY void CCSTutor::CheckForInterruptingMessageEvent(float time) +void CCSTutor::CheckForInterruptingMessageEvent(float time) { -// { -// bool newEvent; // 599 -// class TutorMessageEvent *event; // 600 -// class TutorMessage *oldMessage; // 602 -// class TutorMessageEvent *oldEvent; // 604 -// ProcessShownDeathsForEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 626 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 627 -// } + bool newEvent = false; + + TutorMessageEvent *event = m_eventList; + TutorMessage *oldMessage = GetTutorMessageDefinition(m_currentlyShownMessageID); + TutorMessageEvent *oldEvent = m_currentMessageEvent; + + if (event == NULL) + { + return; + } + + while (event != NULL) + { + if (ShouldShowMessageEvent(event, time)) + { + newEvent = true; + ShowTutorMessage(event); + } + + event = event->GetNext(); + } + + if (!newEvent) + { + return; + } + + if (oldEvent != NULL) + { + ProcessShownDeathsForEvent(event); + DeleteEvent(oldEvent); + } + + CloseCurrentWindow(); + if (oldMessage != NULL) + { + oldMessage->m_lastCloseTime = time; + } + + DeleteEventFromEventList(m_currentMessageEvent); + ConstructMessageAndDisplay(); } /* <215ff3> ../cstrike/dlls/tutor_cs_tutor.cpp:642 */ -NOBODY void CCSTutor::TutorThink_(float time) +void CCSTutor::__MAKE_VHOOK(TutorThink)(float time) { -// CheckForWindowClose(CCSTutor *const this, -// float time); // 684 -// CheckForContentUpdate(CCSTutor *const this); // 685 -// CheckInGameHintMessages(CCSTutor *const this, -// float time); // 659 -// CanLocalPlayerBuyStuff(CCSTutor *const this); // 669 -// CanLocalPlayerBuyStuff(CCSTutor *const this); // 675 -// CanLocalPlayerBuyStuff(CCSTutor *const this); // 663 + if (m_nextViewableCheckTime <= time) + { + CheckForBombViewable(); + CheckForLooseWeaponViewable(); + CheckForLooseDefuserViewable(); + CheckForTimeRunningOut(); + CheckForBombsiteViewable(); + CheckForHostageViewable(); + CheckExamineMessages(time); + CheckHintMessages(time); + CheckInGameHintMessages(time); + CheckForNeedToReload(true); + + if (m_haveSpawned && CanLocalPlayerBuyStuff()) + { + m_messageTypeMask = TUTORMESSAGETYPE_BUY; + CreateAndAddEventToList(BUY_TIME_BEGIN); + m_haveSpawned = false; + } + + if (CanLocalPlayerBuyStuff() && m_messageTypeMask == TUTORMESSAGETYPE_BUY) + { + CheckBuyZoneMessages(); + } + else + { + if (!CanLocalPlayerBuyStuff() && m_messageTypeMask == TUTORMESSAGETYPE_BUY) + { + OnEvent(EVENT_PLAYER_LEFT_BUY_ZONE); + } + } + + m_nextViewableCheckTime = cv_tutor_viewable_check_interval.value + time; + } + + CheckForInactiveEvents(time); + CheckForWindowClose(time); + CheckForContentUpdate(); + CheckForInterruptingMessageEvent(time); } /* <213556> ../cstrike/dlls/tutor_cs_tutor.cpp:691 */ -NOBODY void CCSTutor::CheckForWindowClose(float time) +void CCSTutor::CheckForWindowClose(float time) { -// { -// class TutorMessageEvent *event; // 700 -// GetTutorMessageUpdateEvent(CCSTutor *const this); // 700 -// } + if (m_currentlyShownMessageID < 0 || m_currentlyShownMessageID >= 150 || time <= m_currentlyShownMessageCloseTime) + { + return; + } + + TutorMessageEvent *event = GetTutorMessageUpdateEvent(); + + if (event == NULL) + { + ClearCurrentEvent(); + return; + } + + UpdateCurrentMessage(event); + DeleteEventFromEventList(event); } /* <2134a7> ../cstrike/dlls/tutor_cs_tutor.cpp:715 */ -NOBODY void CCSTutor::CheckForContentUpdate(void) +void CCSTutor::CheckForContentUpdate(void) { -// { -// class TutorMessage *definition; // 722 -// class TutorMessageEvent *event; // 733 -// GetTutorMessageUpdateEvent(CCSTutor *const this); // 733 -// } + if (m_currentlyShownMessageID < 0 || m_currentlyShownMessageID >= 150) + { + return; + } + + TutorMessage *definition = GetTutorMessageDefinition(m_currentlyShownMessageID); + + if (definition == NULL || definition->m_keepOld != TUTORMESSAGEKEEPOLDTYPE_UPDATE_CONTENT) + { + return; + } + + TutorMessageEvent *event = GetTutorMessageUpdateEvent(); + + if (event != NULL) + { + UpdateCurrentMessage(event); + DeleteEventFromEventList(event); + } } /* <21281f> ../cstrike/dlls/tutor_cs_tutor.cpp:744 */ -NOBODY void CCSTutor::ClearCurrentEvent(bool closeWindow, bool processDeathsForEvent) +void CCSTutor::ClearCurrentEvent(bool closeWindow, bool processDeathsForEvent) { -// { -// class TutorMessage *oldMessage; // 746 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 769 -// ProcessShownDeathsForEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 756 -// } + TutorMessage *oldMessage = GetTutorMessageDefinition(m_currentlyShownMessageID); + + if (oldMessage != NULL) + { + oldMessage->m_lastCloseTime = gpGlobals->time; + } + + if (processDeathsForEvent) + { + ProcessShownDeathsForEvent(m_currentMessageEvent); + } + + if (closeWindow) + { + CloseCurrentWindow(); + } + + m_currentlyShownMessageID = TUTOR_NUM_MESSAGES; + m_currentlyShownMessageCloseTime = 0; + m_currentlyShownMessageMinimumCloseTime = 0; + + if (m_currentMessageEvent != NULL) + { + DeleteEvent(m_currentMessageEvent); + m_currentMessageEvent = NULL; + } } -// OVERLOADED? -/* <210812> ../cstrike/dlls/tutor_cs_tutor.cpp:744 */ -//void CCSTutor::ClearCurrentEvent(bool processDeathsForEvent, bool closeWindow) -//{ -// { -// class TutorMessage *oldMessage; // 746 -// ProcessShownDeathsForEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 756 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 769 -// } -//} - /* <2128d0> ../cstrike/dlls/tutor_cs_tutor.cpp:775 */ -NOBODY void CCSTutor::ProcessShownDeathsForEvent(TutorMessageEvent *event) +void CCSTutor::ProcessShownDeathsForEvent(TutorMessageEvent *event) { -// { -// int i; // 782 -// } + if (event == NULL) + { + return; + } + + for (int i = 0; i < ARRAYSIZE(m_playerDeathInfo); i++) + { + if (m_playerDeathInfo[i].m_event == event) + { + m_playerDeathInfo[i].m_hasBeenShown = true; + m_playerDeathInfo[i].m_event = NULL; + } + } } /* <212949> ../cstrike/dlls/tutor_cs_tutor.cpp:794 */ -NOBODY TutorMessageEvent *CCSTutor::GetTutorMessageUpdateEvent(void) +TutorMessageEvent *CCSTutor::GetTutorMessageUpdateEvent(void) { -// { -// class TutorMessage *definition; // 796 -// class TutorMessageEvent *event; // 802 -// } + TutorMessage *definition = GetTutorMessageDefinition(m_currentlyShownMessageID); + + if (definition == NULL || definition->m_keepOld == TUTORMESSAGEKEEPOLDTYPE_DONT_KEEP_OLD) + { + return NULL; + } + + for (TutorMessageEvent *event = m_eventList; event != NULL; event = event->GetNext()) + { + if (DoMessagesHaveSameID(event->GetID(), m_currentlyShownMessageID)) + { + return event; + } + } + + return NULL; } /* <212988> ../cstrike/dlls/tutor_cs_tutor.cpp:816 */ -NOBODY bool CCSTutor::GetDuplicateMessagesFromEventList(const TutorMessageEvent *&event1, const TutorMessageEvent *&event2) +bool CCSTutor::GetDuplicateMessagesFromEventList(TutorMessageEvent *&event1, TutorMessageEvent *&event2) { + for (event1 = m_eventList; event1 != NULL; event1 = event1->GetNext()) + { + for (event2 = event1->GetNext(); event2 != NULL; event2 = event2->GetNext()) + { + if (DoMessagesHaveSameID(event1->GetID(), event2->GetID())) + { + return true; + } + } + } + + return false; } /* <212f62> ../cstrike/dlls/tutor_cs_tutor.cpp:836 */ -NOBODY void CCSTutor::CheckForInactiveEvents(float time) +void CCSTutor::CheckForInactiveEvents(float time) { -// { -// class TutorMessageEvent *event; // 838 -// class TutorMessageEvent *event1; // 859 -// class TutorMessageEvent *event2; // 860 -// bool foundDup; // 861 -// { -// class TutorMessageEvent *temp; // 845 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 849 -// } -// TransferDeathEvents(CCSTutor *const this, -// class TutorMessageEvent *oldEvent, -// class TutorMessageEvent *newEvent); // 868 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 870 -// TransferDeathEvents(CCSTutor *const this, -// class TutorMessageEvent *oldEvent, -// class TutorMessageEvent *newEvent); // 875 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 877 -// } + TutorMessageEvent *event = m_eventList; + + while (event != NULL) + { + if (!event->IsActive(time)) + { + TutorMessageEvent *temp = event->GetNext(); + + DeleteEventFromEventList(event); + DeleteEvent(event); + + event = temp; + } + else + event = event->GetNext(); + } + + TutorMessageEvent *event1 = NULL; + TutorMessageEvent *event2 = NULL; + + bool foundDup = GetDuplicateMessagesFromEventList(event1, event2); + + if (foundDup) + { + if (event1->GetTimeActive(time) < event2->GetTimeActive(time)) + { + TransferDeathEvents(event2, event1); + DeleteEventFromEventList(event2); + DeleteEvent(event2); + } + else + { + TransferDeathEvents(event1, event2); + DeleteEventFromEventList(event1); + DeleteEvent(event1); + } + } } /* <21314d> ../cstrike/dlls/tutor_cs_tutor.cpp:886 */ -NOBODY void CCSTutor::CancelEvent(TutorMessageID mid) +void CCSTutor::CancelEvent(TutorMessageID mid) { -// { -// class TutorMessageEvent *event; // 895 -// { -// class TutorMessageEvent *temp; // 900 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 903 -// } -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 914 -// } + if (m_currentlyShownMessageID == mid) + { + ClearCurrentEvent(); + } + + TutorMessageEvent *event = m_eventList; + + while (event != NULL) + { + TutorMessageEvent *temp = event->GetNext(); + + if (event->GetID() == mid) + { + DeleteEventFromEventList(event); + DeleteEvent(event); + } + + event = temp; + } + + if (m_lastScenarioEvent != NULL && m_lastScenarioEvent->GetID() == mid) + { + DeleteEvent(m_lastScenarioEvent); + m_lastScenarioEvent = NULL; + } } /* <2129db> ../cstrike/dlls/tutor_cs_tutor.cpp:920 */ -NOBODY void CCSTutor::LookupHotKey(TutorMessageID mid, int paramNum, wchar_t *buf, int buflen) +NOXREF void CCSTutor::LookupHotKey(TutorMessageID mid, int paramNum, wchar_t *buf, int buflen) { +#ifdef _WIN32 + _snwprintf(buf, buflen - 1, L"KEY%d", paramNum); +#endif // _WIN32 } /* <212aa0> ../cstrike/dlls/tutor_cs_tutor.cpp:930 */ -NOBODY TutorMessageEvent *CCSTutor::CreateTutorMessageEvent(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other) +TutorMessageEvent *CCSTutor::CreateTutorMessageEvent(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 932 -// class TutorMessage *message; // 938 -// class TutorMessageEvent *event; // 944 -// { -// int numT; // 1018 -// int numCT; // 1019 -// char numTStr; // 1022 -// char numCTStr; // 1025 -// GetNumPlayersAliveOnTeams(CCSTutor *const this, -// int &numT, -// int &numCT); // 1020 -// } -// { -// char enemyList; // 1057 -// } -// { -// char numLeftStr; // 1079 -// int numtasks; // 1081 -// } -// { -// int numT; // 958 -// int numCT; // 959 -// char numTStr; // 975 -// char numCTStr; // 978 -// GetNumPlayersAliveOnTeams(CCSTutor *const this, -// int &numT, -// int &numCT); // 960 -// } -// { -// char teammateList; // 1006 -// } -// } -} + CBasePlayer *localPlayer; + TutorMessage *message; + TutorMessageEvent *event; -/* <212d3b> ../cstrike/dlls/tutor_cs_tutor.cpp:1108 */ -NOBODY void CCSTutor::CreateAndAddEventToList(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other) -{ -// { -// class TutorMessageEvent *event; // 1110 -// class TutorMessage *message; // 1117 -// AddToEventList(CCSTutor *const this, -// class TutorMessageEvent *event); // 1132 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 1124 -// } -} + char enemyList[2048]; + char teammateList[2048]; -/* <212e1a> ../cstrike/dlls/tutor_cs_tutor.cpp:1136 */ -NOBODY void CCSTutor::DeleteEventFromEventList(TutorMessageEvent *event) -{ -// { -// class TutorMessageEvent *temp; // 1143 -// } -// DeleteEventFromEventList(CCSTutor *const this, -// class TutorMessageEvent *event); // 1136 -} + localPlayer = UTIL_GetLocalPlayer(); -/* <213215> ../cstrike/dlls/tutor_cs_tutor.cpp:1163 */ -NOBODY void CCSTutor::ClearEventList(void) -{ -// { -// class TutorMessageEvent *temp; // 1165 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 1169 -// } -} + if (localPlayer == NULL) + { + return NULL; + } -/* <213289> ../cstrike/dlls/tutor_cs_tutor.cpp:1175 */ -NOBODY void CCSTutor::DeleteEvent(TutorMessageEvent *event) -{ -// { -// int i; // 1177 -// } -} + message = GetTutorMessageDefinition(mid); -/* <210a17> ../cstrike/dlls/tutor_cs_tutor.cpp:1189 */ -NOBODY void CCSTutor::PurgeMessages_(void) -{ -// ClearEventList(CCSTutor *const this); // 1192 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 1196 + if (message == NULL) + { + return NULL; + } + + event = new TutorMessageEvent + ( + mid, + message->m_duplicateID, + gpGlobals->time, + message->m_lifetime, + message->m_priority + ); + + if (event != NULL) + { + switch (mid) + { + case YOU_KILLED_PLAYER_ONE_LEFT: + case YOU_KILLED_LAST_ENEMY: + case YOU_KILLED_PLAYER_HEADSHOT_ONE_LEFT: + case YOU_KILLED_LAST_ENEMY_HEADSHOT: + case ENEMY_KILLED_ONE_LEFT: + case LAST_ENEMY_KILLED: + { + switch (localPlayer->m_iTeam) + { + case CT: + ConstructRecentDeathsList(TERRORIST, enemyList, sizeof(enemyList), event); + event->AddParameter(enemyList); + break; + case TERRORIST: + ConstructRecentDeathsList(CT, teammateList, sizeof(teammateList), event); + event->AddParameter(teammateList); + break; + } + break; + } + case YOU_KILLED_PLAYER: + case YOU_KILLED_PLAYER_HEADSHOT: + case ENEMY_KILLED: + { + int numT; + int numCT; + + char numTStr[16]; + char numCTStr[16]; + + GetNumPlayersAliveOnTeams(numT, numCT); + + Q_snprintf(numTStr, sizeof(numTStr), "%i", numT); + Q_snprintf(numCTStr, sizeof(numCTStr), "%i", numCT); + + switch (localPlayer->m_iTeam) + { + case CT: + event->AddParameter(numCTStr); + ConstructRecentDeathsList(TERRORIST, enemyList, sizeof(enemyList), event); + event->AddParameter(enemyList); + break; + case TERRORIST: + event->AddParameter(numTStr); + ConstructRecentDeathsList(CT, teammateList, sizeof(teammateList), event); + event->AddParameter(teammateList); + break; + } + break; + } + case CAREER_TASK_DONE_MORE_LEFT: + { + char numLeftStr[16]; + int numtasks = 0; + + if (TheCareerTasks != NULL) + { + numtasks = TheCareerTasks->GetNumRemainingTasks(); + } + Q_sprintf(numLeftStr, "%d", numtasks); + event->AddParameter(numLeftStr); + break; + } + case YOU_KILLED_A_TEAMMATE: + case TEAMMATE_KILLED_ONE_LEFT: + case LAST_TEAMMATE_KILLED: + ConstructRecentDeathsList(localPlayer->m_iTeam, enemyList, sizeof(enemyList), event); + event->AddParameter(enemyList); + break; + case TEAMMATE_KILLED: + { + int numT; + int numCT; + + char numTStr[16]; + char numCTStr[16]; + + GetNumPlayersAliveOnTeams(numT, numCT); + + if (localPlayer->IsAlive()) + { + switch (localPlayer->m_iTeam) + { + case CT: + numCT--; + break; + case TERRORIST: + numT--; + break; + } + } + + Q_snprintf(numTStr, sizeof(numTStr), "%i", numT); + Q_snprintf(numCTStr, sizeof(numCTStr), "%i", numCT); + + switch (localPlayer->m_iTeam) + { + case CT: + event->AddParameter(numCTStr); + break; + case TERRORIST: + event->AddParameter(numTStr); + break; + } + + ConstructRecentDeathsList(localPlayer->m_iTeam, teammateList, sizeof(teammateList), event); + event->AddParameter(teammateList); + + break; + } + default: + break; + } + + } + + return event; } /* <212d0e> ../cstrike/dlls/tutor_cs_tutor.cpp:1096 */ -NOBODY void CCSTutor::AddToEventList(TutorMessageEvent *event) +void CCSTutor::AddToEventList(TutorMessageEvent *event) { + if (event != NULL) + { + event->SetNext(m_eventList); + m_eventList = event; + } +} + +/* <212d3b> ../cstrike/dlls/tutor_cs_tutor.cpp:1108 */ +void CCSTutor::CreateAndAddEventToList(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other) +{ + TutorMessageEvent *event; + TutorMessage *message; + + event = CreateTutorMessageEvent(mid, entity, other); + + if (event != NULL) + { + message = GetTutorMessageDefinition(mid); + + if (message != NULL && message->m_type == TUTORMESSAGETYPE_SCENARIO) + { + if (m_lastScenarioEvent != NULL) + { + DeleteEvent(m_lastScenarioEvent); + m_lastScenarioEvent = NULL; + } + + m_lastScenarioEvent = CreateTutorMessageEvent(mid, entity, other); + } + + AddToEventList(event); + } +} + +/* <212e1a> ../cstrike/dlls/tutor_cs_tutor.cpp:1136 */ +void CCSTutor::DeleteEventFromEventList(TutorMessageEvent *event) +{ + if (event == NULL) + { + return; + } + + TutorMessageEvent *temp = m_eventList; + + if (temp != event) + { + if (temp != NULL) + { + while (event != temp->GetNext()) + { + temp = temp->GetNext(); + + if (temp == NULL) + { + return; + } + } + + if (temp != NULL && temp->GetNext() == event) + { + temp->SetNext(temp->GetNext()->GetNext()); + } + } + } + else + m_eventList = m_eventList->GetNext(); +} + +/* <213215> ../cstrike/dlls/tutor_cs_tutor.cpp:1163 */ +void CCSTutor::ClearEventList(void) +{ + while (m_eventList != NULL) + { + TutorMessageEvent *temp = m_eventList; + m_eventList = m_eventList->GetNext(); + + DeleteEvent(temp); + } +} + +/* <213289> ../cstrike/dlls/tutor_cs_tutor.cpp:1175 */ +void CCSTutor::DeleteEvent(TutorMessageEvent *event) +{ + for (int i = 0; i < ARRAYSIZE(m_playerDeathInfo); i++) + { + if (m_playerDeathInfo[i].m_event == event) + { + m_playerDeathInfo[i].m_event = NULL; + } + } + + if (event != NULL) + { + delete event; + } +} + +/* <210a17> ../cstrike/dlls/tutor_cs_tutor.cpp:1189 */ +void CCSTutor::__MAKE_VHOOK(PurgeMessages)(void) +{ + ClearCurrentEvent(); + ClearEventList(); + + if (m_lastScenarioEvent != NULL) + { + DeleteEvent(m_lastScenarioEvent); + m_lastScenarioEvent = NULL; + } } /* <2132ca> ../cstrike/dlls/tutor_cs_tutor.cpp:1203 */ -NOBODY void CCSTutor::ComputeDisplayTimesForMessage(void) +void CCSTutor::ComputeDisplayTimesForMessage(void) { -// { -// float now; // 1205 -// class TutorMessage *message; // 1207 -// int stringLength; // 1218 -// float minShowTime; // 1219 -// } + TutorMessage *message = GetTutorMessageDefinition(m_currentlyShownMessageID); + float now = gpGlobals->time; + + if (message == NULL) + { + m_currentlyShownMessageCloseTime = now; + return; + } + + m_currentlyShownMessageCloseTime = message->m_duration + now; + m_currentlyShownMessageMinimumCloseTime = cv_tutor_message_minimum_display_time.value; + + int stringLength = GET_LOCALIZED_STRING_LENGTH(message->m_text); + float minShowTime = stringLength * cv_tutor_message_character_display_time_coefficient.value; + + if (minShowTime > m_currentlyShownMessageMinimumCloseTime) + { + m_currentlyShownMessageMinimumCloseTime = minShowTime; + } + + if (message->m_minDisplayTimeOverride <= m_currentlyShownMessageMinimumCloseTime) + { + message->m_minDisplayTimeOverride = m_currentlyShownMessageMinimumCloseTime; + } + + m_currentlyShownMessageMinimumCloseTime = message->m_minDisplayTimeOverride + now; + + if (m_currentlyShownMessageMinimumCloseTime > m_currentlyShownMessageCloseTime) + { + m_currentlyShownMessageCloseTime = m_currentlyShownMessageMinimumCloseTime; + } } /* <21333e> ../cstrike/dlls/tutor_cs_tutor.cpp:1241 */ -NOBODY bool CCSTutor::ShouldUpdateCurrentMessage(TutorMessageID messageID) +NOXREF bool CCSTutor::ShouldUpdateCurrentMessage(TutorMessageID messageID) { -// { -// class TutorMessage *definition; // 1249 -// } + if (DoMessagesHaveSameID(messageID, m_currentlyShownMessageID)) + { + TutorMessage *definition = GetTutorMessageDefinition(messageID); + + if (definition != NULL && definition->m_keepOld != TUTORMESSAGEKEEPOLDTYPE_DONT_KEEP_OLD) + { + return true; + } + } + + return false; } /* <213393> ../cstrike/dlls/tutor_cs_tutor.cpp:1259 */ -NOBODY void CCSTutor::UpdateCurrentMessage(TutorMessageEvent *event) +void CCSTutor::UpdateCurrentMessage(TutorMessageEvent *event) { -// { -// class TutorMessage *definition; // 1274 -// class CBasePlayer *localPlayer; // 1280 -// TransferDeathEvents(CCSTutor *const this, -// class TutorMessageEvent *oldEvent, -// class TutorMessageEvent *newEvent); // 1261 -// DeleteEvent(CCSTutor *const this, -// class TutorMessageEvent *event); // 1266 -// } + TransferDeathEvents(m_currentMessageEvent, event); + + if (m_currentMessageEvent != NULL) + { + DeleteEvent(m_currentMessageEvent); + m_currentMessageEvent = NULL; + } + + m_currentlyShownMessageID = (TutorMessageID)event->GetID(); + m_currentMessageEvent = event; + + TutorMessage *definition = GetTutorMessageDefinition(event->GetID()); + + if (definition != NULL) + { + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + m_currentlyShownMessageCloseTime = definition->m_duration + gpGlobals->time; + + if (definition->m_keepOld == TUTORMESSAGEKEEPOLDTYPE_UPDATE_CONTENT) + { + CloseCurrentWindow(); + DisplayMessageToPlayer(localPlayer, event->GetID(), definition->m_text, event); + } + } + } } /* <21060a> ../cstrike/dlls/tutor_cs_tutor.cpp:1299 */ -NOBODY void CCSTutor::ShowTutorMessage_(TutorMessageEvent *event) +void CCSTutor::__MAKE_VHOOK(ShowTutorMessage)(TutorMessageEvent *event) { -// { -// enum TutorMessageID mid; // 1301 -// class TutorMessage *message; // 1307 -// } + TutorMessageID mid = static_cast(event->GetID()); + + if (mid < 0 || mid >= TUTOR_NUM_MESSAGES) + { + return; + } + + TutorMessage *message = GetTutorMessageDefinition(mid); + + if (message != NULL) + { + m_currentlyShownMessageID = mid; + m_currentMessageEvent = event; + + m_currentlyShownMessageCloseTime = 0; + m_currentlyShownMessageMinimumCloseTime = 0; + } } /* <2135cc> ../cstrike/dlls/tutor_cs_tutor.cpp:1324 */ -NOBODY void CCSTutor::ConstructMessageAndDisplay(void) +void CCSTutor::ConstructMessageAndDisplay(void) { -// { -// class CBasePlayer *pLocalPlayer; // 1326 -// enum TutorMessageID mid; // 1338 -// class TutorMessage *message; // 1343 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL && !localPlayer->IsBot()) + { + TutorMessageID mid = static_cast(m_currentMessageEvent->GetID()); + + if (mid < 0 || mid >= TUTOR_NUM_MESSAGES) + { + return; + } + + TutorMessage *message = GetTutorMessageDefinition(mid); + + if (message != NULL) + { + message->m_timesShown++; + ComputeDisplayTimesForMessage(); + DisplayMessageToPlayer(localPlayer, mid, message->m_text, m_currentMessageEvent); + } + } } /* <2161ea> ../cstrike/dlls/tutor_cs_tutor.cpp:1356 */ -NOBODY void CCSTutor::CallEventHandler_(GameEventType event, CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::__MAKE_VHOOK(CallEventHandler)(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { -// HandleRadioGetOutOfThere(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1536 -// HandleBombPlanted(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1395 -// HandleRadioReportingIn(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1532 -// HandleRadioInPosition(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1528 -// HandleRadioSectorClear(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1524 -// HandleRadioNeedBackup(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1520 -// HandleRadioEnemySpotted(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1516 -// HandleRadioAffirmative(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1512 -// HandleRadioReportInTeam(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1508 -// HandleRadioStormTheFront(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1504 -// HandleRadioGetInPositionAndWait(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1500 -// HandleRadioStickTogetherTeam(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1496 -// HandleRadioTeamFallBack(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1492 -// HandleRadioGoGoGo(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1488 -// HandleRadioTakingFire(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1484 -// HandleRadioFollowMe(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1480 -// HandleRadioRegroupTeam(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1476 -// HandleRadioHoldThisPosition(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1472 -// HandleRadioYouTakeThePoint(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1468 -// HandleRadioCoverMe(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1464 -// HandleCareerTaskDone(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1585 -// HandleNeedToBuyGrenade(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1581 -// HandleNeedToBuyDefuseKit(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1577 -// HandleNeedToBuyArmor(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1573 -// HandleNeedToBuySecondaryAmmo(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1569 -// HandleNeedToBuyPrimaryAmmo(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1565 -// HandleNeedToBuyPrimaryWeapon(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1561 -// HandleNotBuyingAnything(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1557 -// HandleAutoBuy(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1553 -// HandleBuyMenuOpenned(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1549 -// HandleDeathCameraStart(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1459 -// HandleRadioNegative(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1540 -// HandlePlayerSpawned(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1378 -// HandleRoundDraw(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1447 -// HandleCTWin(CCSTutor *const this, -// class CBaseEntity *entith, -// class CBaseEntity *other); // 1451 -// HandleTWin(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1455 -// HandleAllHostagesRescued(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1435 -// HandlePlayerBlindedByFlashbang(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1411 -// HandleBeingShotAt(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1403 -// HandleWeaponReloaded(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1370 -// HandleWeaponFired(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1362 -// HandleRadioEnemyDown(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1544 -// HandleBombDefusing(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1415 -// HandleBombExploded(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1423 -// HandleHostageDamaged(CCSTutor *const this, -// class CBaseEntity *entity, -// class CBaseEntity *other); // 1439 + switch (event) + { + case EVENT_WEAPON_FIRED: + HandleWeaponFired(entity, other); + break; + case EVENT_WEAPON_FIRED_ON_EMPTY: + HandleWeaponFiredOnEmpty(entity, other); + break; + case EVENT_WEAPON_RELOADED: + HandleWeaponReloaded(entity, other); + break; + case EVENT_BEING_SHOT_AT: + HandleBeingShotAt(entity, other); + break; + case EVENT_PLAYER_BLINDED_BY_FLASHBANG: + HandlePlayerBlindedByFlashbang(entity, other); + break; + case EVENT_PLAYER_DIED: + HandlePlayerDied(entity, other); + break; + case EVENT_PLAYER_TOOK_DAMAGE: + HandlePlayerTookDamage(entity, other); + break; + case EVENT_HOSTAGE_DAMAGED: + HandleHostageDamaged(entity, other); + break; + case EVENT_HOSTAGE_KILLED: + HandleHostageKilled(entity, other); + break; + case EVENT_BOMB_PLANTED: + HandleBombPlanted(entity, other); + break; + case EVENT_BOMB_DEFUSING: + HandleBombDefusing(entity, other); + break; + case EVENT_BOMB_DEFUSED: + HandleBombDefused(entity, other); + break; + case EVENT_BOMB_EXPLODED: + HandleBombExploded(entity, other); + break; + case EVENT_HOSTAGE_USED: + HandleHostageUsed(entity, other); + break; + case EVENT_HOSTAGE_RESCUED: + HandleHostageRescued(entity, other); + break; + case EVENT_ALL_HOSTAGES_RESCUED: + HandleAllHostagesRescued(entity, other); + break; + case EVENT_TERRORISTS_WIN: + HandleTWin(entity, other); + break; + case EVENT_CTS_WIN: + HandleCTWin(entity, other); + break; + case EVENT_ROUND_DRAW: + HandleRoundDraw(entity, other); + break; + case EVENT_ROUND_START: + HandleRoundStart(entity, other); + break; + case EVENT_PLAYER_SPAWNED: + HandlePlayerSpawned(entity, other); + break; + case EVENT_PLAYER_LEFT_BUY_ZONE: + HandlePlayerLeftBuyZone(entity, other); + break; + case EVENT_DEATH_CAMERA_START: + HandleDeathCameraStart(entity, other); + break; + case EVENT_TUTOR_BUY_MENU_OPENNED: + HandleBuyMenuOpenned(entity, other); + break; + case EVENT_TUTOR_AUTOBUY: + HandleAutoBuy(entity, other); + break; + case EVENT_TUTOR_NOT_BUYING_ANYTHING: + HandleNotBuyingAnything(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_PRIMARY_WEAPON: + HandleNeedToBuyPrimaryWeapon(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_PRIMARY_AMMO: + HandleNeedToBuyPrimaryAmmo(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_SECONDARY_AMMO: + HandleNeedToBuySecondaryAmmo(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_ARMOR: + HandleNeedToBuyArmor(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_DEFUSE_KIT: + HandleNeedToBuyDefuseKit(entity, other); + break; + case EVENT_TUTOR_NEED_TO_BUY_GRENADE: + HandleNeedToBuyGrenade(entity, other); + break; + case EVENT_CAREER_TASK_DONE: + HandleCareerTaskDone(entity, other); + break; + case EVENT_RADIO_COVER_ME: + HandleRadioCoverMe(entity, other); + break; + case EVENT_RADIO_YOU_TAKE_THE_POINT: + HandleRadioYouTakeThePoint(entity, other); + break; + case EVENT_RADIO_HOLD_THIS_POSITION: + HandleRadioHoldThisPosition(entity, other); + break; + case EVENT_RADIO_REGROUP_TEAM: + HandleRadioRegroupTeam(entity, other); + break; + case EVENT_RADIO_FOLLOW_ME: + HandleRadioFollowMe(entity, other); + break; + case EVENT_RADIO_TAKING_FIRE: + HandleRadioTakingFire(entity, other); + break; + case EVENT_RADIO_GO_GO_GO: + HandleRadioGoGoGo(entity, other); + break; + case EVENT_RADIO_TEAM_FALL_BACK: + HandleRadioTeamFallBack(entity, other); + break; + case EVENT_RADIO_STICK_TOGETHER_TEAM: + HandleRadioStickTogetherTeam(entity, other); + break; + case EVENT_RADIO_GET_IN_POSITION_AND_WAIT: + HandleRadioGetInPositionAndWait(entity, other); + break; + case EVENT_RADIO_STORM_THE_FRONT: + HandleRadioStormTheFront(entity, other); + break; + case EVENT_RADIO_REPORT_IN_TEAM: + HandleRadioReportInTeam(entity, other); + break; + case EVENT_RADIO_AFFIRMATIVE: + HandleRadioAffirmative(entity, other); + break; + case EVENT_RADIO_ENEMY_SPOTTED: + HandleRadioEnemySpotted(entity, other); + break; + case EVENT_RADIO_NEED_BACKUP: + HandleRadioNeedBackup(entity, other); + break; + case EVENT_RADIO_SECTOR_CLEAR: + HandleRadioSectorClear(entity, other); + break; + case EVENT_RADIO_IN_POSITION: + HandleRadioInPosition(entity, other); + break; + case EVENT_RADIO_REPORTING_IN: + HandleRadioReportingIn(entity, other); + break; + case EVENT_RADIO_GET_OUT_OF_THERE: + HandleRadioGetOutOfThere(entity, other); + break; + case EVENT_RADIO_NEGATIVE: + HandleRadioNegative(entity, other); + break; + case EVENT_RADIO_ENEMY_DOWN: + HandleRadioEnemyDown(entity, other); + break; + default: + break; + } } /* <215cc0> ../cstrike/dlls/tutor_cs_tutor.cpp:1594 */ -NOBODY void CCSTutor::HandleWeaponFired(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleWeaponFired(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 1597 -// class CBasePlayer *target; // 1598 -// class CBasePlayer *localPlayer; // 1599 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL && localPlayer->IsAlive()) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player == localPlayer) + { + CheckForNeedToReload(); + } + } } /* <21371d> ../cstrike/dlls/tutor_cs_tutor.cpp:1616 */ -NOBODY void CCSTutor::HandleWeaponFiredOnEmpty(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleWeaponFiredOnEmpty(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 1618 -// class CBasePlayer *player; // 1629 -// { -// class CBasePlayerWeapon *currentWeapon; // 1635 -// { -// class TutorMessage *message; // 1641 -// } -// } -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer) + { + CBasePlayerWeapon *currentWeapon = reinterpret_cast(player->m_pActiveItem); + + if (currentWeapon != NULL && player->m_rgAmmo[currentWeapon->m_iPrimaryAmmoType] <= 0) + { + TutorMessage *message = GetTutorMessageDefinition(YOU_ARE_OUT_OF_AMMO); + + if (message != NULL) + { + message->m_lastCloseTime = 0; + } + + CreateAndAddEventToList(YOU_ARE_OUT_OF_AMMO); + } + } + } } /* <213817> ../cstrike/dlls/tutor_cs_tutor.cpp:1654 */ -NOBODY void CCSTutor::HandleWeaponReloaded(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleWeaponReloaded(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 1661 -// } + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == UTIL_GetLocalPlayer()) + { + CancelEvent(YOU_SHOULD_RELOAD); + } } /* <21385d> ../cstrike/dlls/tutor_cs_tutor.cpp:1673 */ -NOBODY void CCSTutor::HandlePlayerDied(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandlePlayerDied(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *victim; // 1675 -// class CBasePlayer *killer; // 1676 -// class CBasePlayer *localPlayer; // 1678 -// int numT; // 1717 -// int numCT; // 1717 -// GetNumPlayersAliveOnTeams(CCSTutor *const this, -// int &numT, -// int &numCT); // 1718 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL) + { + return; + } + + CBasePlayer *victim = reinterpret_cast(entity); + CBasePlayer *attacker = reinterpret_cast(other); + + if (victim != NULL && !victim->IsPlayer()) + { + victim = NULL; + } + + if (attacker != NULL && !attacker->IsPlayer()) + { + attacker = NULL; + } + + if (victim == localPlayer && !attacker) + { + if (localPlayer->m_bKilledByBomb) + { + CreateAndAddEventToList(YOU_DIED, entity, other); + } + else + { + CreateAndAddEventToList(YOU_FELL_TO_YOUR_DEATH); + } + } + + if (!victim || !attacker) + return; + + if (victim == attacker && victim == localPlayer) + { + CreateAndAddEventToList(YOU_DIED, entity, other); + return; + } + + int numT, numCT; + GetNumPlayersAliveOnTeams(numT, numCT); + + if (attacker == localPlayer) + { + if (victim->m_iTeam == attacker->m_iTeam) + { + CreateAndAddEventToList(YOU_KILLED_A_TEAMMATE, entity, other); + return; + } + + if (victim->m_bHeadshotKilled) + { + switch (attacker->m_iTeam) + { + case CT: + { + switch (numT) + { + case 0: + CreateAndAddEventToList(YOU_KILLED_LAST_ENEMY_HEADSHOT, entity, other); + break; + case 1: + CreateAndAddEventToList(YOU_KILLED_PLAYER_HEADSHOT_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(YOU_KILLED_PLAYER_HEADSHOT, entity, other); + break; + } + + break; + } + case TERRORIST: + { + switch (numCT) + { + case 0: + CreateAndAddEventToList(YOU_KILLED_LAST_ENEMY_HEADSHOT, entity, other); + break; + case 1: + CreateAndAddEventToList(YOU_KILLED_PLAYER_HEADSHOT_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(YOU_KILLED_PLAYER_HEADSHOT, entity, other); + break; + } + break; + } + } + } + else + { + switch (attacker->m_iTeam) + { + case CT: + { + switch (numT) + { + case 0: + CreateAndAddEventToList(YOU_KILLED_LAST_ENEMY, entity, other); + break; + case 1: + CreateAndAddEventToList(YOU_KILLED_PLAYER_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(YOU_KILLED_PLAYER, entity, other); + break; + } + + break; + } + case TERRORIST: + { + switch (numCT) + { + case 0: + CreateAndAddEventToList(YOU_KILLED_LAST_ENEMY, entity, other); + break; + case 1: + CreateAndAddEventToList(YOU_KILLED_PLAYER_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(YOU_KILLED_PLAYER, entity, other); + break; + } + break; + } + } + } + } + else if (victim == localPlayer) + { + CreateAndAddEventToList(victim->m_bHeadshotKilled ? YOU_DIED_HEADSHOT : YOU_DIED, entity, other); + } + else if (victim->m_iTeam == localPlayer->m_iTeam) + { + switch (victim->m_iTeam) + { + case CT: + { + if (localPlayer->IsAlive()) + { + if (numCT == 1) + { + CreateAndAddEventToList(LAST_TEAMMATE_KILLED, entity, other); + } + else if (numCT == 2) + { + CreateAndAddEventToList(TEAMMATE_KILLED_ONE_LEFT, entity, other); + } + else + { + CreateAndAddEventToList(TEAMMATE_KILLED, entity, other); + } + } + else + { + if (numCT == 1) + { + CreateAndAddEventToList(TEAMMATE_KILLED_ONE_LEFT, entity, other); + } + else if (numCT > 1) + { + CreateAndAddEventToList(TEAMMATE_KILLED, entity, other); + } + } + + break; + } + case TERRORIST: + { + if (localPlayer->IsAlive()) + { + if (numT == 1) + { + CreateAndAddEventToList(LAST_TEAMMATE_KILLED, entity, other); + } + else if (numT == 2) + { + CreateAndAddEventToList(TEAMMATE_KILLED_ONE_LEFT, entity, other); + } + else + { + CreateAndAddEventToList(TEAMMATE_KILLED, entity, other); + } + } + else + { + if (numT == 1) + { + CreateAndAddEventToList(TEAMMATE_KILLED_ONE_LEFT, entity, other); + } + else if (numT > 1) + { + CreateAndAddEventToList(TEAMMATE_KILLED, entity, other); + } + } + + break; + } + } + } + else + { + switch (localPlayer->m_iTeam) + { + case CT: + { + switch (numT) + { + case 0: + CreateAndAddEventToList(LAST_ENEMY_KILLED, entity, other); + break; + case 1: + CreateAndAddEventToList(ENEMY_KILLED_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(ENEMY_KILLED, entity, other); + break; + } + + break; + } + case TERRORIST: + { + switch (numCT) + { + case 0: + CreateAndAddEventToList(LAST_ENEMY_KILLED, entity, other); + break; + case 1: + CreateAndAddEventToList(ENEMY_KILLED_ONE_LEFT, entity, other); + break; + default: + CreateAndAddEventToList(ENEMY_KILLED, entity, other); + break; + } + break; + } + } + } } /* <21394c> ../cstrike/dlls/tutor_cs_tutor.cpp:1945 */ -NOBODY void CCSTutor::HandlePlayerTookDamage(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandlePlayerTookDamage(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 1947 -// class CBasePlayer *victim; // 1953 -// class CBasePlayer *attacker; // 1954 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *victim = reinterpret_cast(entity); + CBasePlayer *attacker = reinterpret_cast(other); + + if (victim != NULL && !victim->IsPlayer()) + { + victim = NULL; + } + + if (attacker != NULL && !attacker->IsPlayer()) + { + attacker = NULL; + } + + if (victim != NULL && victim == localPlayer) + { + CreateAndAddEventToList(YOU_WERE_JUST_HURT); + } + else if (attacker != NULL && victim != NULL && attacker == localPlayer && victim->m_iTeam == localPlayer->m_iTeam) + { + CreateAndAddEventToList(YOU_ATTACKED_TEAMMATE); + } + } } /* <213a21> ../cstrike/dlls/tutor_cs_tutor.cpp:1985 */ -NOBODY void CCSTutor::HandlePlayerBlindedByFlashbang(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandlePlayerBlindedByFlashbang(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 1992 -// class CBasePlayer *player; // 1998 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer) + { + CreateAndAddEventToList(YOU_ARE_BLIND_FROM_FLASHBANG); + } + } } /* <213ab7> ../cstrike/dlls/tutor_cs_tutor.cpp:2008 */ -NOBODY void CCSTutor::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 2015 -// } + CBasePlayer *player = reinterpret_cast(entity); + + if (player->IsPlayer() && player == UTIL_GetLocalPlayer()) + { + m_haveSpawned = true; + m_lastInGameHintShown = INGAME_HINT_BEGIN; + CreateAndAddEventToList(YOU_SPAWNED, entity, other); + } } /* <21868e> ../cstrike/dlls/tutor_cs_tutor.cpp:2033 */ -NOBODY void CCSTutor::HandleClientCorpseSpawned(CBaseEntity *entity, CBaseEntity *other) +NOXREF void CCSTutor::HandleClientCorpseSpawned(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 2040 -// class ClientCorpseStruct *corpse; // 2042 -// push_back(vector> *const this, -// const value_type &__x); // 2047 -// } + CBasePlayer *player = reinterpret_cast(entity); + + if (player == NULL || !player->IsPlayer()) + { + return; + } + + ClientCorpseStruct *corpse = new ClientCorpseStruct; + + corpse->m_position = player->pev->origin; + corpse->m_team = player->m_iTeam; + + m_clientCorpseList.push_back(corpse); } /* <215fbd> ../cstrike/dlls/tutor_cs_tutor.cpp:2050 */ -NOBODY void CCSTutor::HandleBuyMenuOpenned(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBuyMenuOpenned(CBaseEntity *entity, CBaseEntity *other) { + if (m_currentlyShownMessageID == BUY_TIME_BEGIN) + { + ClearCurrentEvent(); + CheckBuyZoneMessages(); + } } /* <213b32> ../cstrike/dlls/tutor_cs_tutor.cpp:2060 */ -NOBODY void CCSTutor::HandleAutoBuy(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleAutoBuy(CBaseEntity *entity, CBaseEntity *other) { + if (m_currentlyShownMessageID == BUY_TIME_BEGIN) + { + ClearCurrentEvent(); + } } /* <213b67> ../cstrike/dlls/tutor_cs_tutor.cpp:2069 */ -NOBODY void CCSTutor::HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other) +NOXREF void CCSTutor::HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other) { + ; } /* <213b9c> ../cstrike/dlls/tutor_cs_tutor.cpp:2074 */ -NOBODY void CCSTutor::HandlePlayerLeftBuyZone(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandlePlayerLeftBuyZone(CBaseEntity *entity, CBaseEntity *other) { -// ClearEventList(CCSTutor *const this); // 2078 -// AddToEventList(CCSTutor *const this, -// class TutorMessageEvent *event); // 2083 + m_messageTypeMask = (TUTORMESSAGETYPE_DEFAULT | TUTORMESSAGETYPE_FRIEND_DEATH | TUTORMESSAGETYPE_ENEMY_DEATH | TUTORMESSAGETYPE_SCENARIO | TUTORMESSAGETYPE_CAREER | TUTORMESSAGETYPE_INGAME_HINT | TUTORMESSAGETYPE_END_GAME); + + ClearEventList(); + ClearCurrentEvent(); + + if (m_lastScenarioEvent != NULL) + { + m_lastScenarioEvent->SetActivationTime(gpGlobals->time); + AddToEventList(m_lastScenarioEvent); + m_lastScenarioEvent = NULL; + } } /* <213cbb> ../cstrike/dlls/tutor_cs_tutor.cpp:2092 */ -NOBODY void CCSTutor::HandleBombPlanted(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBombPlanted(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 2094 -// } + CBasePlayer *player = UTIL_GetLocalPlayer(); + + if (player == NULL) + { + return; + } + + if (player->IsAlive() && player->m_iTeam == CT) + { + CreateAndAddEventToList(BOMB_PLANTED_CT, entity, other); + } + else + { + CreateAndAddEventToList(BOMB_PLANTED_T, entity, other); + } } /* <213d02> ../cstrike/dlls/tutor_cs_tutor.cpp:2112 */ -NOBODY void CCSTutor::HandleBombDefused(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBombDefused(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2114 -// class CBasePlayer *defuser; // 2120 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *defuser = reinterpret_cast(entity); + + if (defuser != NULL && defuser->IsPlayer() && defuser == localPlayer) + { + CreateAndAddEventToList(YOU_DEFUSED_BOMB); + } + else + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(BOMB_DEFUSED_CT); + break; + case TERRORIST: + CreateAndAddEventToList(BOMB_DEFUSED_T); + break; + default: + CreateAndAddEventToList(ROUND_OVER); + break; + } + } + } } /* <213dc6> ../cstrike/dlls/tutor_cs_tutor.cpp:2148 */ -NOBODY void CCSTutor::HandleBombDefusing(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBombDefusing(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2150 -// class CBasePlayer *player; // 2161 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer && !player->m_bHasDefuser) + { + CreateAndAddEventToList(DEFUSING_WITHOUT_KIT); + } + } } /* <213e5b> ../cstrike/dlls/tutor_cs_tutor.cpp:2172 */ -NOBODY void CCSTutor::HandleBombExploded(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBombExploded(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2174 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(BOMB_EXPLODED_CT); + break; + case TERRORIST: + CreateAndAddEventToList(BOMB_EXPLODED_T); + break; + default: + break; + } + } } /* <213ebd> ../cstrike/dlls/tutor_cs_tutor.cpp:2191 */ -NOBODY void CCSTutor::HandleRoundStart(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRoundStart(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 2194 -// IsBombMap(CCSTutor *const this); // 2200 -// IsHostageMap(CCSTutor *const this); // 2222 -// } + CBasePlayer *player = UTIL_GetLocalPlayer(); + + m_roundStartTime = gpGlobals->time; + if (player != NULL) + { + if (IsBombMap()) + { + switch (player->m_iTeam) + { + case CT: + CreateAndAddEventToList(ROUND_START_DE_CT); + break; + case TERRORIST: + { + if (player->m_bHasC4) + CreateAndAddEventToList(YOU_ARE_BOMB_CARRIER, entity, other); + else + CreateAndAddEventToList(ROUND_START_DE_T); + break; + } + default: + break; + } + } + else if (IsHostageMap()) + { + switch (player->m_iTeam) + { + case CT: + CreateAndAddEventToList(ROUND_START_CS_CT); + break; + case TERRORIST: + CreateAndAddEventToList(ROUND_START_CS_T); + break; + default: + break; + } + } + } } /* <213fc1> ../cstrike/dlls/tutor_cs_tutor.cpp:2239 */ -NOBODY void CCSTutor::HandleBeingShotAt(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleBeingShotAt(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *player; // 2246 -// class CBasePlayer *localPlayer; // 2247 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer && localPlayer->IsAlive()) + { + CreateAndAddEventToList(YOU_HAVE_BEEN_SHOT_AT, entity, other); + } + } } /* <2158b5> ../cstrike/dlls/tutor_cs_tutor.cpp:2265 */ -NOBODY void CCSTutor::HandleHostageUsed(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleHostageUsed(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2267 -// bool unusedHostages; // 2278 -// class CBasePlayer *activator; // 2280 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *activator = reinterpret_cast(entity); + + if (activator != NULL && activator->IsPlayer()) + { + bool unusedHostages = !CheckForAllHostagesFollowingSomeone(); + + if (activator == localPlayer) + { + CreateAndAddEventToList(unusedHostages ? YOU_USED_HOSTAGE_MORE_LEFT : YOU_USED_HOSTAGE_NO_MORE_LEFT); + } + else if (!unusedHostages) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(ALL_HOSTAGES_FOLLOWING_CT); + break; + case TERRORIST: + CreateAndAddEventToList(ALL_HOSTAGES_FOLLOWING_T); + break; + default: + break; + } + } + } + } } /* <214011> ../cstrike/dlls/tutor_cs_tutor.cpp:2307 */ -NOBODY void CCSTutor::HandleHostageRescued(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleHostageRescued(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2309 -// class CBasePlayer *rescuer; // 2320 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *rescuer = reinterpret_cast(entity); + + if (rescuer != NULL && rescuer->IsPlayer()) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList((localPlayer == rescuer) ? YOU_RESCUED_HOSTAGE : HOSTAGE_RESCUED_CT); + break; + case TERRORIST: + CreateAndAddEventToList(HOSTAGE_RESCUED_T); + break; + default: + break; + } + } + } } /* <2140c8> ../cstrike/dlls/tutor_cs_tutor.cpp:2342 */ -NOBODY void CCSTutor::HandleAllHostagesRescued(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleAllHostagesRescued(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2344 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(ALL_HOSTAGES_RESCUED_CT); + break; + case TERRORIST: + CreateAndAddEventToList(ALL_HOSTAGES_RESCUED_T); + break; + default: + break; + } + } } /* <214161> ../cstrike/dlls/tutor_cs_tutor.cpp:2361 */ -NOBODY void CCSTutor::HandleHostageDamaged(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleHostageDamaged(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2363 -// class CBasePlayer *attacker; // 2380 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *attacker = reinterpret_cast(other); + + if (entity != NULL && attacker != NULL && attacker->IsPlayer() && localPlayer == attacker) + { + CreateAndAddEventToList(YOU_DAMAGED_HOSTAGE); + } + } } /* <2157fb> ../cstrike/dlls/tutor_cs_tutor.cpp:2389 */ -NOBODY void CCSTutor::HandleHostageKilled(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleHostageKilled(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2391 -// class CBasePlayer *attacker; // 2410 -// bool unusedHostages; // 2417 -// CheckForAllHostagesDead(CCSTutor *const this); // 2397 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CheckForAllHostagesDead(); + + CBasePlayer *attacker = reinterpret_cast(other); + + if (entity != NULL && attacker != NULL && attacker->IsPlayer()) + { + bool unusedHostages = CheckForAllHostagesFollowingSomeone(); + + if (localPlayer == attacker) + { + CreateAndAddEventToList(YOU_KILLED_HOSTAGE); + } + + if (unusedHostages) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(ALL_HOSTAGES_FOLLOWING_CT); + break; + case TERRORIST: + CreateAndAddEventToList(ALL_HOSTAGES_FOLLOWING_T); + break; + default: + break; + } + } + } + } } /* <2141f5> ../cstrike/dlls/tutor_cs_tutor.cpp:2433 */ -NOBODY void CCSTutor::HandleRoundDraw(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRoundDraw(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CHalfLifeMultiplay *mp; // 2435 -// ResetPlayerDeathInfo(CCSTutor *const this); // 2441 -// } + CHalfLifeMultiplay *mp = g_pGameRules; + + if (mp->m_iTotalRoundsPlayed) + { + CreateAndAddEventToList(ROUND_DRAW); + } + + ResetPlayerDeathInfo(); } /* <21429a> ../cstrike/dlls/tutor_cs_tutor.cpp:2445 */ -NOBODY void CCSTutor::HandleCTWin(CBaseEntity *entith, CBaseEntity *other) +void CCSTutor::HandleCTWin(CBaseEntity *entith, CBaseEntity *other) { -// ResetPlayerDeathInfo(CCSTutor *const this); // 2449 + CreateAndAddEventToList(CT_WIN); + ResetPlayerDeathInfo(); } /* <214335> ../cstrike/dlls/tutor_cs_tutor.cpp:2453 */ -NOBODY void CCSTutor::HandleTWin(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleTWin(CBaseEntity *entity, CBaseEntity *other) { -// ResetPlayerDeathInfo(CCSTutor *const this); // 2457 + CreateAndAddEventToList(T_WIN); + ResetPlayerDeathInfo(); } /* <2143ed> ../cstrike/dlls/tutor_cs_tutor.cpp:2461 */ -NOBODY void CCSTutor::HandleDeathCameraStart(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleDeathCameraStart(CBaseEntity *entity, CBaseEntity *other) { -// { -// class CBasePlayer *localPlayer; // 2463 -// class CBasePlayer *player; // 2474 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player != NULL && player->IsPlayer() && player == localPlayer) + { + m_messageTypeMask = (TUTORMESSAGETYPE_FRIEND_DEATH | TUTORMESSAGETYPE_ENEMY_DEATH | TUTORMESSAGETYPE_HINT | TUTORMESSAGETYPE_END_GAME); + CreateAndAddEventToList(DEATH_CAMERA_START); + } + } } /* <214472> ../cstrike/dlls/tutor_cs_tutor.cpp:2487 */ -NOBODY void CCSTutor::HandleRadioCoverMe(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioCoverMe(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_COVER_ME, entity, other); } /* <2144dd> ../cstrike/dlls/tutor_cs_tutor.cpp:2492 */ -NOBODY void CCSTutor::HandleRadioYouTakeThePoint(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioYouTakeThePoint(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_YOU_TAKE_THE_POINT, entity, other); } /* <214548> ../cstrike/dlls/tutor_cs_tutor.cpp:2497 */ -NOBODY void CCSTutor::HandleRadioHoldThisPosition(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioHoldThisPosition(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_HOLD_THIS_POSITION, entity, other); } /* <2145b3> ../cstrike/dlls/tutor_cs_tutor.cpp:2502 */ -NOBODY void CCSTutor::HandleRadioRegroupTeam(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioRegroupTeam(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_REGROUP_TEAM, entity, other); } /* <21461e> ../cstrike/dlls/tutor_cs_tutor.cpp:2507 */ -NOBODY void CCSTutor::HandleRadioFollowMe(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioFollowMe(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_FOLLOW_ME, entity, other); } /* <214689> ../cstrike/dlls/tutor_cs_tutor.cpp:2512 */ -NOBODY void CCSTutor::HandleRadioTakingFire(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioTakingFire(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_TAKING_FIRE, entity, other); } /* <2146f4> ../cstrike/dlls/tutor_cs_tutor.cpp:2517 */ -NOBODY void CCSTutor::HandleRadioGoGoGo(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioGoGoGo(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_GO_GO_GO, entity, other); } /* <21475f> ../cstrike/dlls/tutor_cs_tutor.cpp:2522 */ -NOBODY void CCSTutor::HandleRadioTeamFallBack(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioTeamFallBack(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_TEAM_FALL_BACK, entity, other); } /* <2147ca> ../cstrike/dlls/tutor_cs_tutor.cpp:2527 */ -NOBODY void CCSTutor::HandleRadioStickTogetherTeam(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioStickTogetherTeam(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_STICK_TOGETHER_TEAM, entity, other); } /* <214835> ../cstrike/dlls/tutor_cs_tutor.cpp:2532 */ -NOBODY void CCSTutor::HandleRadioGetInPositionAndWait(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioGetInPositionAndWait(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_GET_IN_POSITION_AND_WAIT, entity, other); } /* <2148a0> ../cstrike/dlls/tutor_cs_tutor.cpp:2537 */ -NOBODY void CCSTutor::HandleRadioStormTheFront(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioStormTheFront(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_STORM_THE_FRONT, entity, other); } /* <21490b> ../cstrike/dlls/tutor_cs_tutor.cpp:2542 */ -NOBODY void CCSTutor::HandleRadioReportInTeam(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioReportInTeam(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_REPORT_IN_TEAM, entity, other); } /* <214976> ../cstrike/dlls/tutor_cs_tutor.cpp:2547 */ -NOBODY void CCSTutor::HandleRadioAffirmative(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioAffirmative(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_AFFIRMATIVE, entity, other); } /* <2149e1> ../cstrike/dlls/tutor_cs_tutor.cpp:2552 */ -NOBODY void CCSTutor::HandleRadioEnemySpotted(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioEnemySpotted(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_ENEMY_SPOTTED, entity, other); } /* <214a4c> ../cstrike/dlls/tutor_cs_tutor.cpp:2557 */ -NOBODY void CCSTutor::HandleRadioNeedBackup(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioNeedBackup(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_NEED_BACKUP, entity, other); } /* <214ab7> ../cstrike/dlls/tutor_cs_tutor.cpp:2562 */ -NOBODY void CCSTutor::HandleRadioSectorClear(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioSectorClear(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_SECTOR_CLEAR, entity, other); } /* <214b22> ../cstrike/dlls/tutor_cs_tutor.cpp:2567 */ -NOBODY void CCSTutor::HandleRadioInPosition(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioInPosition(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_IN_POSITION, entity, other); } /* <214b8d> ../cstrike/dlls/tutor_cs_tutor.cpp:2572 */ -NOBODY void CCSTutor::HandleRadioReportingIn(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioReportingIn(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_REPORTING_IN, entity, other); } /* <214bf8> ../cstrike/dlls/tutor_cs_tutor.cpp:2577 */ -NOBODY void CCSTutor::HandleRadioGetOutOfThere(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioGetOutOfThere(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_GET_OUT_OF_THERE, entity, other); } /* <214c63> ../cstrike/dlls/tutor_cs_tutor.cpp:2582 */ -NOBODY void CCSTutor::HandleRadioNegative(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioNegative(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_NEGATIVE, entity, other); } /* <214cce> ../cstrike/dlls/tutor_cs_tutor.cpp:2587 */ -NOBODY void CCSTutor::HandleRadioEnemyDown(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleRadioEnemyDown(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(RADIO_ENEMY_DOWN, entity, other); } /* <214d39> ../cstrike/dlls/tutor_cs_tutor.cpp:2592 */ -NOBODY void CCSTutor::HandleNotBuyingAnything(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNotBuyingAnything(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_TIME_BEGIN, entity, other); } /* <214da4> ../cstrike/dlls/tutor_cs_tutor.cpp:2597 */ -NOBODY void CCSTutor::HandleNeedToBuyPrimaryWeapon(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuyPrimaryWeapon(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_PRIMARY, entity, other); } /* <214e0f> ../cstrike/dlls/tutor_cs_tutor.cpp:2602 */ -NOBODY void CCSTutor::HandleNeedToBuyPrimaryAmmo(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuyPrimaryAmmo(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_PRIMARY_AMMO, entity, other); } /* <214e7a> ../cstrike/dlls/tutor_cs_tutor.cpp:2607 */ -NOBODY void CCSTutor::HandleNeedToBuySecondaryAmmo(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuySecondaryAmmo(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_SECONDARY_AMMO, entity, other); } /* <214ee5> ../cstrike/dlls/tutor_cs_tutor.cpp:2612 */ -NOBODY void CCSTutor::HandleNeedToBuyArmor(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuyArmor(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_ARMOR, entity, other); } /* <214f50> ../cstrike/dlls/tutor_cs_tutor.cpp:2617 */ -NOBODY void CCSTutor::HandleNeedToBuyDefuseKit(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuyDefuseKit(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_DEFUSE_KIT, entity, other); } /* <214fbb> ../cstrike/dlls/tutor_cs_tutor.cpp:2622 */ -NOBODY void CCSTutor::HandleNeedToBuyGrenade(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleNeedToBuyGrenade(CBaseEntity *entity, CBaseEntity *other) { + CreateAndAddEventToList(BUY_NEED_GRENADE, entity, other); } /* <215036> ../cstrike/dlls/tutor_cs_tutor.cpp:2627 */ -NOBODY void CCSTutor::HandleCareerTaskDone(CBaseEntity *entity, CBaseEntity *other) +void CCSTutor::HandleCareerTaskDone(CBaseEntity *entity, CBaseEntity *other) { -// { -// int numTasksRemaining; // 2629 -// } + int numTasksRemaining = 0; + + if (TheCareerTasks != NULL && (numTasksRemaining = TheCareerTasks->GetNumRemainingTasks()) > 0) + CreateAndAddEventToList((numTasksRemaining == 1) ? CAREER_TASK_DONE_ONE_LEFT : CAREER_TASK_DONE_MORE_LEFT); + else + CreateAndAddEventToList(CAREER_TASK_DONE_ALL_DONE); } /* <2108c4> ../cstrike/dlls/tutor_cs_tutor.cpp:2650 */ -NOBODY void CCSTutor::HandleShotFired_(Vector source, Vector target) +void CCSTutor::__MAKE_VHOOK(HandleShotFired)(Vector source, Vector target) { -// { -// class CBasePlayer *localPlayer; // 2652 -// float d1; // 2659 -// float d; // 2666 -// float angle; // 2667 -// float FiringLineDistanceToPlayer; // 2668 -// operator-(const Vector *const this, -// const Vector &v); // 2659 -// Length(const Vector *const this); // 2659 -// operator-(const Vector *const this, -// const Vector &v); // 2670 -// Length(const Vector *const this); // 2670 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + float d1, d, angle, FiringLineDistanceToPlayer; + + d1 = (source - localPlayer->pev->origin).Length(); + + if (d1 > 32.0f) + { + d = (target - source).Length(); + angle = d1 / d; + + FiringLineDistanceToPlayer = sin(acos(angle)) * d1; + + if (FiringLineDistanceToPlayer <= 3000.0f) + { + OnEvent(EVENT_BEING_SHOT_AT, localPlayer); + } + } + } } /* <21507d> ../cstrike/dlls/tutor_cs_tutor.cpp:2720 */ -NOBODY void CCSTutor::GetNumPlayersAliveOnTeams(int &numT, int &numCT) +void CCSTutor::GetNumPlayersAliveOnTeams(int &numT, int &numCT) { -// { -// int i; // 2726 -// { -// class CBasePlayer *player; // 2728 -// } -// } + numT = 0; + numCT = 0; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (player == NULL || !player->IsAlive()) + { + continue; + } + + switch (player->m_iTeam) + { + case CT: + numCT++; + break; + case TERRORIST: + numT++; + break; + } + } } /* <2150d5> ../cstrike/dlls/tutor_cs_tutor.cpp:2749 */ -NOBODY void CCSTutor::CheckForLooseWeaponViewable(void) +void CCSTutor::CheckForLooseWeaponViewable(void) { -// { -// class CBasePlayer *localPlayer; // 2751 -// class CBaseEntity *weapon; // 2757 -// bool sawFirst; // 2758 -// class TutorMessage *message; // 2761 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + bool sawFirst = false; + CBaseEntity *weapon = NULL; + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_LOOSE_WEAPON); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + while ((weapon = UTIL_FindEntityByClassname(weapon, "weaponbox")) != NULL) + { + if (IsEntityInViewOfPlayer(weapon, localPlayer)) + { + if (!sawFirst) + { + sawFirst = true; + CreateAndAddEventToList(YOU_SEE_LOOSE_WEAPON); + } + } + } + } + } } /* <21514d> ../cstrike/dlls/tutor_cs_tutor.cpp:2787 */ -NOBODY void CCSTutor::CheckForLooseDefuserViewable(void) +void CCSTutor::CheckForLooseDefuserViewable(void) { -// { -// class CBasePlayer *localPlayer; // 2789 -// class TutorMessage *message; // 2797 -// class CBaseEntity *defuser; // 2803 -// bool sawFirst; // 2804 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL && localPlayer->m_iTeam == CT) + { + bool sawFirst = false; + CBaseEntity *defuser = NULL; + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_LOOSE_DEFUSER); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + while ((defuser = UTIL_FindEntityByClassname(defuser, "item_thighpack")) != NULL) + { + if (IsEntityInViewOfPlayer(defuser, localPlayer)) + { + if (!sawFirst) + { + sawFirst = true; + CreateAndAddEventToList(YOU_SEE_LOOSE_DEFUSER); + } + } + } + } + } } /* <2151c1> ../cstrike/dlls/tutor_cs_tutor.cpp:2826 */ -NOBODY void CCSTutor::CheckForBombViewable(void) +void CCSTutor::CheckForBombViewable(void) { -// { -// class CBasePlayer *localPlayer; // 2828 -// class CBaseEntity *bomb; // 2835 -// class CBasePlayer *bombCarrier; // 2870 -// { -// class TutorMessage *message; // 2856 -// } -// { -// class TutorMessage *message; // 2844 -// } -// { -// int i; // 2872 -// { -// class CBasePlayer *player; // 2874 -// } -// } -// { -// class TutorMessage *message; // 2946 -// } -// { -// class TutorMessage *message; // 2934 -// } -// { -// class TutorMessage *message; // 2915 -// } -// { -// class TutorMessage *message; // 2903 -// } -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL) + { + return; + } + + CBaseEntity *bomb = UTIL_FindEntityByClassname(NULL, "grenade"); + + if (bomb != NULL && ((CGrenade *)bomb)->m_bIsC4 && IsEntityInViewOfPlayer(bomb, localPlayer)) + { + switch (localPlayer->m_iTeam) + { + case CT: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_PLANTED_BOMB_CT); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_PLANTED_BOMB_CT); + } + break; + } + case TERRORIST: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_PLANTED_BOMB_T); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_PLANTED_BOMB_T); + } + break; + } + } + } + else + { + CBasePlayer *bombCarrier = NULL; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *player = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (player && player->m_bHasC4) + { + bombCarrier = player; + break; + } + } + + bomb = UTIL_FindEntityByClassname(NULL, "weapon_c4"); + + if (bomb != NULL && IsEntityInViewOfPlayer(bomb, localPlayer)) + { + if (bombCarrier != NULL) + { + if (bombCarrier != localPlayer) + { + switch (localPlayer->m_iTeam) + { + case CT: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_BOMB_CARRIER_CT); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_BOMB_CARRIER_CT); + } + break; + } + case TERRORIST: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_BOMB_CARRIER_T); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_BOMB_CARRIER_T); + } + break; + } + } + } + } + else + { + switch (localPlayer->m_iTeam) + { + case CT: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_LOOSE_BOMB_CT); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_LOOSE_BOMB_CT); + } + break; + } + case TERRORIST: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_LOOSE_BOMB_T); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + CreateAndAddEventToList(YOU_SEE_LOOSE_BOMB_T); + } + break; + } + } + } + } + } } /* <215431> ../cstrike/dlls/tutor_cs_tutor.cpp:2959 */ -NOBODY void CCSTutor::CheckForBombsiteViewable(void) +void CCSTutor::CheckForBombsiteViewable(void) { -// { -// class CBasePlayer *localPlayer; // 2961 -// enum TutorMessageID mid; // 2967 -// class TutorMessage *definition; // 2991 -// class CBaseEntity *bombTarget; // 2998 -// bool sawFirst; // 3000 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL) + { + return; + } + + TutorMessageID mid = CheckForInBombZone(); + + if (mid == TUTOR_NUM_MESSAGES) + { + switch (localPlayer->m_iTeam) + { + case CT: + { + mid = YOU_SEE_BOMBSITE_CT; + break; + } + case TERRORIST: + { + if (localPlayer->m_bHasC4) + { + mid = YOU_SEE_BOMBSITE_T_BOMB; + } + else if (TheCSBots() == NULL || !TheCSBots()->IsBombPlanted()) + { + mid = YOU_SEE_BOMBSITE_T; + } + break; + } + } + + TutorMessage *definition = GetTutorMessageDefinition(mid); + + if (definition == NULL || definition->m_class != TUTORMESSAGECLASS_EXAMINE) + { + bool sawFirst = false; + CBaseEntity *bombTarget = NULL; + + while ((bombTarget = UTIL_FindEntityByClassname(bombTarget, "func_bomb_target")) != NULL) + { + if (IsBombPlantedInBombsite(bombTarget)) + { + if (!sawFirst) + { + sawFirst = true; + CreateAndAddEventToList(mid); + break; + } + } + } + + while ((bombTarget = UTIL_FindEntityByClassname(bombTarget, "info_bomb_target")) != NULL) + { + if (sawFirst) + break; + + if (IsBombPlantedInBombsite(bombTarget)) + { + if (!sawFirst) + { + sawFirst = true; + CreateAndAddEventToList(mid); + break; + } + } + } + } + } + else + CreateAndAddEventToList(mid); } /* <21534e> ../cstrike/dlls/tutor_cs_tutor.cpp:3026 */ -NOBODY TutorMessageID CCSTutor::CheckForInBombZone(void) +TutorMessageID CCSTutor::CheckForInBombZone(void) { -// { -// class CBasePlayer *localPlayer; // 3028 -// enum TutorMessageID mid; // 3034 -// class CBaseEntity *bombTarget; // 3044 -// bool sawFirst; // 3046 -// IsBombPlantedInBombsite(CCSTutor *const this, -// class CBaseEntity *bombTarget); // 3053 -// IsBombPlantedInBombsite(CCSTutor *const this, -// class CBaseEntity *bombTarget); // 3067 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + TutorMessageID mid = TUTOR_NUM_MESSAGES; + + if (localPlayer != NULL && localPlayer->m_iTeam == CT) + { + CBaseEntity *bombTarget = NULL; + + while ((bombTarget = UTIL_FindEntityByClassname(bombTarget, "func_bomb_target")) != NULL) + { + if (IsBombPlantedInBombsite(bombTarget)) + { + return YOU_SEE_PLANTED_BOMB_CT; + } + } + + while ((bombTarget = UTIL_FindEntityByClassname(bombTarget, "info_bomb_target")) != NULL) + { + if (IsBombPlantedInBombsite(bombTarget)) + { + return YOU_SEE_PLANTED_BOMB_CT; + } + } + } + + return mid; } /* <2154b6> ../cstrike/dlls/tutor_cs_tutor.cpp:3078 */ -NOBODY bool CCSTutor::IsBombPlantedInBombsite(CBaseEntity *bombTarget) +bool CCSTutor::IsBombPlantedInBombsite(CBaseEntity *bombTarget) { -// { -// class CGrenade *bomb; // 3081 -// } + CGrenade *bomb = NULL; + + while ((bomb = (CGrenade *)UTIL_FindEntityByClassname(bomb, "grenade")) != NULL) + { + if (bomb->m_bIsC4 && IsEntityInBombsite(bomb, bombTarget)) + { + return true; + } + } + + return false; } /* <2154f4> ../cstrike/dlls/tutor_cs_tutor.cpp:3102 */ -NOBODY void CCSTutor::CheckForHostageViewable(void) +void CCSTutor::CheckForHostageViewable(void) { -// { -// class CBasePlayer *localPlayer; // 3104 -// class CBaseEntity *hostageEntity; // 3110 -// bool sawFirst; // 3111 -// { -// bool validHostage; // 3117 -// class CHostage *hostage; // 3118 -// IsFollowingSomeone(CHostage *const this); // 3119 -// { -// class TutorMessage *message; // 3151 -// } -// { -// class TutorMessage *message; // 3139 -// } -// IsValid(CHostage *const this); // 3123 -// } -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL) + { + return; + } + + CBaseEntity *hostageEntity = NULL; + bool sawFirst = false; + + while ((hostageEntity = UTIL_FindEntityByClassname(hostageEntity, "hostage_entity")) != NULL) + { + bool validHostage = false; + CHostage *hostage = reinterpret_cast(hostageEntity); + + if (hostage->pev->takedamage == DAMAGE_YES) + { + if (hostage->m_improv != NULL) + { + if (!hostage->IsFollowingSomeone()) + { + validHostage = true; + } + } + else if (hostage->m_hTargetEnt == NULL || hostage->m_State != CHostage::FOLLOW) + { + validHostage = true; + } + } + + if (hostage->IsValid() && validHostage && IsEntityInViewOfPlayer(hostage, localPlayer) && !sawFirst) + { + sawFirst = true; + + switch (localPlayer->m_iTeam) + { + case CT: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_HOSTAGE_CT); + + if (message != NULL && message->m_class == TUTORMESSAGECLASS_EXAMINE) + { + return; + } + + CreateAndAddEventToList(YOU_SEE_HOSTAGE_CT); + break; + } + case TERRORIST: + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SEE_HOSTAGE_T); + + if (message != NULL && message->m_class == TUTORMESSAGECLASS_EXAMINE) + { + return; + } + + CreateAndAddEventToList(YOU_SEE_HOSTAGE_T); + break; + } + } + } + } } /* <215646> ../cstrike/dlls/tutor_cs_tutor.cpp:3168 */ -NOBODY void CCSTutor::CheckForTimeRunningOut(void) +void CCSTutor::CheckForTimeRunningOut(void) { -// { -// class CBasePlayer *localPlayer; // 3170 -// class CHalfLifeMultiplay *mpRules; // 3176 -// TimeRemaining(CHalfLifeMultiplay *const this); // 3185 -// IsHostageMap(CCSTutor *const this); // 3202 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + CHalfLifeMultiplay *mpRules = g_pGameRules; + + if (localPlayer == NULL || mpRules->IsFreezePeriod() || mpRules->TimeRemaining() > 30.0f) + { + return; + } + + if (IsBombMap()) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(TIME_RUNNING_OUT_DE_CT); + break; + case TERRORIST: + CreateAndAddEventToList(TIME_RUNNING_OUT_DE_T); + break; + } + } + else if (IsHostageMap()) + { + switch (localPlayer->m_iTeam) + { + case CT: + CreateAndAddEventToList(TIME_RUNNING_OUT_CS_CT); + break; + case TERRORIST: + CreateAndAddEventToList(TIME_RUNNING_OUT_CS_T); + break; + } + } } /* <2156fd> ../cstrike/dlls/tutor_cs_tutor.cpp:3218 */ -NOBODY void CCSTutor::CheckForAllHostagesDead(void) +void CCSTutor::CheckForAllHostagesDead(void) { -// { -// bool foundLiveOne; // 3220 -// class CBaseEntity *hostage; // 3222 -// } + bool foundLiveOne = false; + CHostage *hostage = NULL; + + while ((hostage = (CHostage *)UTIL_FindEntityByClassname(hostage, "hostage_entity")) != NULL) + { + if (hostage->IsAlive()) + { + foundLiveOne = true; + break; + } + } + + if (!foundLiveOne) + { + CreateAndAddEventToList(ALL_HOSTAGES_DEAD); + } } /* <21573c> ../cstrike/dlls/tutor_cs_tutor.cpp:3242 */ -NOBODY bool CCSTutor::CheckForAllHostagesFollowingSomeone(void) +bool CCSTutor::CheckForAllHostagesFollowingSomeone(void) { -// { -// bool foundUnusedOne; // 3244 -// class CHostage *hostage; // 3246 -// IsFollowingSomeone(CHostage *const this); // 3251 -// } + bool foundUnusedOne = false; + CHostage *hostage = NULL; + + while ((hostage = (CHostage *)UTIL_FindEntityByClassname(hostage, "hostage_entity")) != NULL) + { + if (hostage->pev->takedamage == DAMAGE_YES) + { + if (hostage->m_improv != NULL) + { + if (!hostage->IsFollowingSomeone()) + { + foundUnusedOne = true; + break; + } + } + else if (hostage->m_hTargetEnt == NULL || hostage->m_State != CHostage::FOLLOW) + { + foundUnusedOne = true; + break; + } + } + } + + return foundUnusedOne ? false : true; } /* <210b98> ../cstrike/dlls/tutor_cs_tutor.cpp:3268 */ -NOBODY TutorMessage *CCSTutor::GetTutorMessageDefinition_(int messageID) +TutorMessage *CCSTutor::__MAKE_VHOOK(GetTutorMessageDefinition)(int messageID) { -// { -// TutorMessageMapIter iter; // 3275 -// find(map, std::allocator>, TutorMessage*, std::less, std::allocator> *const this, -// int const __in_chrg); // 3275 -// } + if (messageID < 0 || messageID >= TUTOR_NUM_MESSAGES) + { + return NULL; + } + + TutorMessageMapIter iter = m_messageMap.find(TutorIdentifierList[messageID]); + + if (iter != m_messageMap.end()) + { + return (*iter).second; + } + + return NULL; } /* <215938> ../cstrike/dlls/tutor_cs_tutor.cpp:3285 */ -NOBODY CBaseEntity *CCSTutor::GetEntityForMessageID(int messageID, CBaseEntity *last) +CBaseEntity *CCSTutor::GetEntityForMessageID(int messageID, CBaseEntity *last) { -// { -// class CBaseEntity *ret; // 3287 -// { -// class CBasePlayer *localPlayer; // 3323 -// class ClientCorpseStruct *lastCorpse; // 3334 -// ClientCorpseListIter iter; // 3340 -// { -// class ClientCorpseStruct *corpse; // 3343 -// operator++(__normal_iterator> > *const this, -// int); // 3353 -// operator++(__normal_iterator> > *const this, -// int); // 3346 -// } -// empty(const class vector> *const this); // 3329 -// } -// } + CBaseEntity *ret = NULL; + + switch (messageID) + { + case YOU_SEE_FRIEND: + case YOU_SEE_ENEMY: + ret = UTIL_FindEntityByClassname(last, "player"); + break; + case YOU_SEE_FRIEND_CORPSE: + { + // TODO: this code is noxref + // this code fucked my brain, in that pointer Vector * is passed through the CBaseEntity * + +#if 1 + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + if (m_clientCorpseList.empty()) + { + return NULL; + } + + ClientCorpseStruct *lastCorpse = NULL; + ClientCorpseListIter iter; + + if (last != NULL) + { + iter = m_clientCorpseList.begin(); + + while (iter != m_clientCorpseList.end()) + { + lastCorpse = (*iter); + + if ((CBaseEntity *)lastCorpse == last) + { + break; + } + + ++iter; + } + + while (iter != m_clientCorpseList.end()) + { + ClientCorpseStruct *corpse = (*iter); + + if (corpse->m_team == localPlayer->m_iTeam) + { + return (CBaseEntity *)&corpse->m_position; + } + + ++iter; + } + + return NULL; + } + else + return (CBaseEntity *)&m_clientCorpseList.front()->m_position; + } +#endif + break; + } + case YOU_SEE_LOOSE_BOMB_T: + case YOU_SEE_LOOSE_BOMB_CT: + case YOU_SEE_BOMB_CARRIER_T: + case YOU_SEE_BOMB_CARRIER_CT: + ret = UTIL_FindEntityByClassname(last, "weapon_c4"); + break; + case YOU_SEE_PLANTED_BOMB_T: + case YOU_SEE_PLANTED_BOMB_CT: + ret = UTIL_FindEntityByClassname(last, "grenade"); + break; + case YOU_SEE_LOOSE_WEAPON: + ret = UTIL_FindEntityByClassname(last, "weaponbox"); + break; + case YOU_SEE_LOOSE_DEFUSER: + ret = UTIL_FindEntityByClassname(last, "item_thighpack"); + break; + case YOU_SEE_HOSTAGE_T: + case YOU_SEE_HOSTAGE_CT: + case YOU_SEE_HOSTAGE_CT_EXAMINE: + ret = UTIL_FindEntityByClassname(last, "hostage_entity"); + break; + } + + return ret; } /* <215a44> ../cstrike/dlls/tutor_cs_tutor.cpp:3374 */ -NOBODY void CCSTutor::CheckHintMessages(float time) +void CCSTutor::CheckHintMessages(float time) { -// { -// bool confusingHint; // 3397 -// class TutorMessage *message; // 3445 -// IsHostageMap(CCSTutor *const this); // 3400 -// IsBombMap(CCSTutor *const this); // 3417 -// } + if (m_deadAirStartTime <= 0.0f || (time - m_deadAirStartTime <= cv_tutor_hint_interval_time.value)) + { + return; + } + + m_lastHintShown++; + + bool confusingHint = false; + + if (IsHostageMap()) + { + if (m_lastHintShown > HINT_HOSTAGE_START) + { + confusingHint = true; + } + } + + if (!confusingHint) + { + if (IsBombMap() && m_lastHintShown < HINT_END) + { + if (m_lastHintShown == HINT_END) + { + m_lastHintShown = HINT_1; + } + } + } + + if (m_lastHintShown > HINT_END) + { + m_lastHintShown = HINT_1; + } + + TutorMessage *message = GetTutorMessageDefinition(m_lastHintShown); + + if (message != NULL) + { + CreateAndAddEventToList(m_lastHintShown); + } } /* <215b23> ../cstrike/dlls/tutor_cs_tutor.cpp:3456 */ -NOBODY void CCSTutor::CheckInGameHintMessages(float time) +void CCSTutor::CheckInGameHintMessages(float time) { -// { -// class TutorMessage *message; // 3482 -// } + if (m_deadAirStartTime <= 0.0f || (time - m_deadAirStartTime <= cv_tutor_hint_interval_time.value)) + { + return; + } + + m_lastInGameHintShown++; + + if (m_lastInGameHintShown <= INGAME_HINT_BEGIN || m_lastInGameHintShown >= INGAME_HINT_END) + { + return; + } + + TutorMessage *message = GetTutorMessageDefinition(m_lastInGameHintShown); + + if (message != NULL) + { + CreateAndAddEventToList(m_lastInGameHintShown); + } } /* <215b61> ../cstrike/dlls/tutor_cs_tutor.cpp:3493 */ -NOBODY void CCSTutor::CheckForNeedToReload(bool isPassiveCheck) +void CCSTutor::CheckForNeedToReload(bool isPassiveCheck) { -// { -// class CBasePlayer *localPlayer; // 3495 -// class CBasePlayerItem *currentItem; // 3502 -// class CBasePlayerWeapon *currentWeapon; // 3511 -// ItemInfo itemInfo; // 3512 -// iMaxClip(CBasePlayerItem *const this); // 3541 -// { -// class TutorMessage *message; // 3543 -// } -// { -// class TutorMessage *message; // 3553 -// } -// iMaxClip(CBasePlayerItem *const this); // 3561 -// { -// class TutorMessage *message; // 3526 -// } -// } + CBasePlayer *localPlayer; + CBasePlayerItem *currentItem; + CBasePlayerWeapon *currentWeapon; + ItemInfo itemInfo; + + localPlayer = UTIL_GetLocalPlayer(); + Q_memset(&itemInfo, 0, sizeof(itemInfo)); + + if (localPlayer == NULL || !localPlayer->IsPlayer()) + { + return; + } + + currentItem = localPlayer->m_pActiveItem; + + if (currentItem == NULL || !currentItem->IsWeapon()) + { + return; + } + + currentWeapon = reinterpret_cast(currentItem); + currentWeapon->GetItemInfo(&itemInfo); + + if (itemInfo.iSlot && itemInfo.iSlot != 1) + { + return; + } + + if (localPlayer->m_rgAmmo[currentWeapon->m_iPrimaryAmmoType]) + { + if (isPassiveCheck) + { + if (2 * currentWeapon->m_iClip < currentItem->iMaxClip() && !currentWeapon->m_fInReload) + { + CreateAndAddEventToList(YOU_SHOULD_RELOAD); + } + } + else + { + if (5 * currentWeapon->m_iClip < currentItem->iMaxClip() && !currentWeapon->m_fInReload) + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SHOULD_RELOAD); + + if (message != NULL) + { + message->m_lastCloseTime = 0; + } + + CreateAndAddEventToList(YOU_SHOULD_RELOAD); + } + else + { + TutorMessage *message = GetTutorMessageDefinition(YOU_SHOULD_RELOAD); + + if (message != NULL) + { + message->m_lastCloseTime = gpGlobals->time; + } + } + } + } + else if (!currentWeapon->m_iClip) + { + if (!isPassiveCheck) + { + TutorMessage *message = GetTutorMessageDefinition(YOU_ARE_OUT_OF_AMMO); + + if (message != NULL) + { + message->m_lastCloseTime = 0; + } + } + + CreateAndAddEventToList(YOU_ARE_OUT_OF_AMMO); + } } /* <215d16> ../cstrike/dlls/tutor_cs_tutor.cpp:3568 */ -NOBODY void CCSTutor::CheckExamineMessages(float time) +void CCSTutor::CheckExamineMessages(float time) { -// { -// class CBasePlayer *localPlayer; // 3570 -// { -// int i; // 3576 -// { -// class TutorMessage *message; // 3578 -// class CBaseEntity *entity; // 3585 -// bool sawOne; // 3588 -// { -// bool isPlayerLooking; // 3592 -// { -// bool validEntity; // 3617 -// { -// class CBasePlayer *player; // 3627 -// } -// { -// class CHostage *hostage; // 3665 -// IsFollowingSomeone(CHostage *const this); // 3666 -// IsValid(CHostage *const this); // 3670 -// } -// { -// class CBasePlayer *player; // 3648 -// } -// } -// } -// } -// } -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL) + { + return; + } + + for (int i = 0; i < TUTOR_NUM_MESSAGES; i++) + { + //bool sawOne = false; + + TutorMessage *message = GetTutorMessageDefinition(i); + + if (message == NULL || message->m_class != TUTORMESSAGECLASS_EXAMINE) + { + continue; + } + + CBaseEntity *entity = GetEntityForMessageID(i); + + if (entity == NULL) + { + message->m_examineStartTime = -1.0f; + continue; + } + + bool isPlayerLooking = false; + + if (i == YOU_SEE_FRIEND_CORPSE || i == YOU_SEE_ENEMY_CORPSE) + { + if (IsPlayerLookingAtPosition((Vector *)entity, localPlayer)) + { + isPlayerLooking = true; + } + } + else if (i == YOU_SEE_HOSTAGE_CT_EXAMINE || i == YOU_SEE_FRIEND || i == YOU_SEE_ENEMY) + { + if (IsPlayerLookingAtEntity(entity, localPlayer)) + { + isPlayerLooking = true; + } + } + else if (IsPlayerLookingAtPosition(&entity->pev->origin, localPlayer)) + { + isPlayerLooking = true; + } + else + isPlayerLooking = false; + + entity = GetEntityForMessageID(i, entity); + + if (!isPlayerLooking) + { + if (entity == NULL) + { + message->m_examineStartTime = -1.0f; + continue; + } + } + + if (message->m_examineStartTime == -1.0f || (time - message->m_examineStartTime <= cv_tutor_examine_time.value)) + { + continue; + } + + bool validEntity = false; + + if (i == YOU_SEE_FRIEND) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player->IsPlayer() && player->IsAlive() && player->m_iTeam == localPlayer->m_iTeam) + { + validEntity = true; + } + } + else if (i == YOU_SEE_ENEMY) + { + CBasePlayer *player = reinterpret_cast(entity); + + if (player->IsPlayer() && player->IsAlive() && player->m_iTeam == localPlayer->m_iTeam) + { + if ((player->m_iTeam != CT || localPlayer->m_iTeam == TERRORIST) && (player->m_iTeam != TERRORIST || localPlayer->m_iTeam == CT)) + { + validEntity = true; + } + } + } + else if (i == YOU_SEE_HOSTAGE_CT_EXAMINE) + { + CHostage *hostage = reinterpret_cast(entity); + + if (entity->pev->takedamage == DAMAGE_YES) + { + if (hostage->m_improv != NULL) + { + if (!hostage->IsFollowingSomeone()) + { + validEntity = true; + } + } + else if (hostage->m_hTargetEnt == NULL || hostage->m_State != CHostage::FOLLOW) + { + validEntity = true; + } + } + + if (!hostage->IsValid() || !validEntity) + { + continue; + } + } + + if (validEntity) + { + CreateAndAddEventToList((TutorMessageID)i, entity); + } + } } /* <215eec> ../cstrike/dlls/tutor_cs_tutor.cpp:3696 */ -NOBODY bool CCSTutor::CanLocalPlayerBuyStuff(void) +bool CCSTutor::CanLocalPlayerBuyStuff(void) { -// { -// class CBasePlayer *localPlayer; // 3698 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer != NULL) + { + return localPlayer->CanPlayerBuy(); + } + + return false; } /* <215f25> ../cstrike/dlls/tutor_cs_tutor.cpp:3714 */ -NOBODY void CCSTutor::CheckBuyZoneMessages(void) +void CCSTutor::CheckBuyZoneMessages(void) { -// { -// class CBasePlayer *localPlayer; // 3716 -// class CBasePlayerWeapon *primary; // 3729 -// class CBasePlayerWeapon *secondary; // 3730 -// } + CBasePlayer *localPlayer = UTIL_GetLocalPlayer(); + + if (localPlayer == NULL || m_currentlyShownMessageID == BUY_TIME_BEGIN) + { + return; + } + + CBasePlayerWeapon *primary = reinterpret_cast(localPlayer->m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]); + CBasePlayerWeapon *secondary = reinterpret_cast(localPlayer->m_rgpPlayerItems[PISTOL_SLOT]); + + if (primary != NULL) + { + if (localPlayer->NeedsPrimaryAmmo() && localPlayer->CanAffordPrimaryAmmo()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_PRIMARY_AMMO); + return; + } + } + else + { + if (localPlayer->CanAffordPrimary()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_PRIMARY_WEAPON); + return; + } + } + + if (secondary != NULL && localPlayer->NeedsSecondaryAmmo() && localPlayer->CanAffordSecondaryAmmo()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_SECONDARY_AMMO); + } + else if (localPlayer->NeedsArmor() && localPlayer->CanAffordArmor()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_ARMOR); + } + else if (localPlayer->NeedsDefuseKit() && localPlayer->CanAffordDefuseKit()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_DEFUSE_KIT); + } + else if (localPlayer->NeedsGrenade() && localPlayer->CanAffordGrenade()) + { + TheTutor->OnEvent(EVENT_TUTOR_NEED_TO_BUY_GRENADE); + } + else + TheTutor->OnEvent(EVENT_TUTOR_NOT_BUYING_ANYTHING); } /* <216cdd> ../cstrike/dlls/tutor_cs_tutor.cpp:3767 */ -NOBODY bool CCSTutor::IsHostageMap(void) +bool CCSTutor::IsHostageMap(void) { + return UTIL_FindEntityByClassname(NULL, "hostage_entity") != NULL; } /* <216d01> ../cstrike/dlls/tutor_cs_tutor.cpp:3773 */ -NOBODY bool CCSTutor::IsBombMap(void) +bool CCSTutor::IsBombMap(void) { -// { -// class CHalfLifeMultiplay *mpRules; // 3775 -// } + CHalfLifeMultiplay *mpRules = g_pGameRules; + + return mpRules->m_bMapHasBombTarget; } /* <216d35> ../cstrike/dlls/tutor_cs_tutor.cpp:3781 */ -NOBODY void CCSTutor::ResetPlayerDeathInfo(void) +void CCSTutor::ResetPlayerDeathInfo(void) { -// { -// int i; // 3785 -// } + for (int i = 0; i < ARRAYSIZE(m_playerDeathInfo); i++) + { + m_playerDeathInfo[i].m_hasBeenShown = false; + m_playerDeathInfo[i].m_event = NULL; + } } /* <216d6d> ../cstrike/dlls/tutor_cs_tutor.cpp:3795 */ -NOBODY void CCSTutor::ConstructRecentDeathsList(TeamName team, char *buf, int buflen, TutorMessageEvent *event) +void CCSTutor::ConstructRecentDeathsList(TeamName team, char *buf, int buflen, TutorMessageEvent *event) { -// { -// int i; // 3804 -// } + if (!buf || !buflen) + { + return; + } + + char scratch[32]; + buf[0] = '\0'; + + for (int i = 1; i <= gpGlobals->maxClients; i++) + { + CBasePlayer *pPlayer = reinterpret_cast(UTIL_PlayerByIndex(i)); + + if (pPlayer == NULL) + continue; + + // ignore alive players + if (pPlayer->IsAlive()) + continue; + + if (pPlayer->m_iTeam != team) + continue; + + Q_strcat(buf, " %n"); + Q_sprintf(scratch, "%d\n", i); + Q_strcat(buf, scratch); + + m_playerDeathInfo[i].m_event = event; + } } /* <216dc2> ../cstrike/dlls/tutor_cs_tutor.cpp:3853 */ -NOBODY void CCSTutor::TransferDeathEvents(TutorMessageEvent *oldEvent, TutorMessageEvent *newEvent) +void CCSTutor::TransferDeathEvents(TutorMessageEvent *oldEvent, TutorMessageEvent *newEvent) { -// { -// int i; // 3855 -// } + for (int i = 0; i < ARRAYSIZE(m_playerDeathInfo); i++) + { + if (m_playerDeathInfo[i].m_event == oldEvent) + { + m_playerDeathInfo[i].m_event = newEvent; + } + } } #ifdef HOOK_GAMEDLL @@ -1426,28 +3356,28 @@ NOBODY void CCSTutor::TransferDeathEvents(TutorMessageEvent *oldEvent, TutorMess void CCSTutor::TutorThink(float time) { TutorThink_(time); -} - +} + void CCSTutor::PurgeMessages(void) { PurgeMessages_(); -} - +} + void CCSTutor::CallEventHandler(GameEventType event, CBaseEntity *entity, CBaseEntity *other) { CallEventHandler_(event, entity, other); -} - +} + void CCSTutor::ShowTutorMessage(TutorMessageEvent *event) { ShowTutorMessage_(event); -} - +} + void CCSTutor::HandleShotFired(Vector source, Vector target) { HandleShotFired_(source, target); -} - +} + TutorMessage *CCSTutor::GetTutorMessageDefinition(int messageID) { return GetTutorMessageDefinition_(messageID); diff --git a/regamedll/dlls/tutor_cs_tutor.h b/regamedll/dlls/tutor_cs_tutor.h index 9d5d8e0f..131a82a9 100644 --- a/regamedll/dlls/tutor_cs_tutor.h +++ b/regamedll/dlls/tutor_cs_tutor.h @@ -43,17 +43,18 @@ enum TutorMessageClass enum TutorMessageType { - TUTORMESSAGETYPE_DEFAULT = (1<<0), - TUTORMESSAGETYPE_FRIEND_DEATH = (1<<1), - TUTORMESSAGETYPE_ENEMY_DEATH = (1<<2), - TUTORMESSAGETYPE_SCENARIO = (1<<3), - TUTORMESSAGETYPE_BUY = (1<<4), - TUTORMESSAGETYPE_CAREER = (1<<5), - TUTORMESSAGETYPE_HINT = (1<<6), - TUTORMESSAGETYPE_INGAME_HINT = (1<<7), - TUTORMESSAGETYPE_END_GAME = (1<<8), + TUTORMESSAGETYPE_DEFAULT = (1 << 0), // icon info | color green + TUTORMESSAGETYPE_FRIEND_DEATH = (1 << 1), // icon skull | color red + TUTORMESSAGETYPE_ENEMY_DEATH = (1 << 2), // icon skull | color blue + TUTORMESSAGETYPE_SCENARIO = (1 << 3), // icon info | color yellow + TUTORMESSAGETYPE_BUY = (1 << 4), // icon info | color green + TUTORMESSAGETYPE_CAREER = (1 << 5), // icon info | color green + TUTORMESSAGETYPE_HINT = (1 << 6), // icon info | color green + TUTORMESSAGETYPE_INGAME_HINT = (1 << 7), // icon info | color green + TUTORMESSAGETYPE_END_GAME = (1 << 8), // icon info | color yellow + TUTORMESSAGETYPE_LAST, - TUTORMESSAGETYPE_ALL = 511 + TUTORMESSAGETYPE_ALL = (1 << 9) - 1 }; enum TutorMessageInterruptFlag @@ -237,15 +238,15 @@ enum TutorMessageID HINT_51, HINT_52, HINT_53, - HINT_BOMB_START, - HINT_60 = 139, - HINT_61, + HINT_BOMB_START = 139, + HINT_60 = 139, + HINT_61 = 140, HINT_BOMB_END = 140, - HINT_HOSTAGE_START, + HINT_HOSTAGE_START = 141, HINT_70 = 141, HINT_71, HINT_72, - HINT_73, + HINT_73 = 144, HINT_HOSTAGE_END = 144, HINT_END, INGAME_HINT_BEGIN, @@ -256,7 +257,8 @@ enum TutorMessageID }; //typedef map, std::allocator >, TutorMessage*, std::less, std::allocator > >, std::allocator, std::allocator >, TutorMessage*> > > TutorMessageMap; -typedef std::map TutorMessageMap; +typedef std::map TutorMessageMap; +typedef TutorMessageMap::iterator TutorMessageMapIter; struct ClientCorpseStruct { @@ -266,6 +268,7 @@ struct ClientCorpseStruct };/* size: 16, cachelines: 1, members: 2 */ typedef std::vector ClientCorpseList; +typedef ClientCorpseList::iterator ClientCorpseListIter; class CCSTutor: public CBaseTutor { @@ -287,19 +290,19 @@ public: virtual void HandleShotFired(Vector source, Vector target); virtual TutorMessage *GetTutorMessageDefinition(int messageID); - void CreateAndAddEventToList(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other); - TutorMessageEvent *CreateTutorMessageEvent(TutorMessageID mid, CBaseEntity *entity, CBaseEntity *other); + void CreateAndAddEventToList(TutorMessageID mid, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); + TutorMessageEvent *CreateTutorMessageEvent(TutorMessageID mid, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); void AddToEventList(TutorMessageEvent *event); void DeleteEventFromEventList(TutorMessageEvent *event); void ClearEventList(void); - void ClearCurrentEvent(bool closeWindow, bool processDeathsForEvent); + void ClearCurrentEvent(bool closeWindow = true, bool processDeathsForEvent = true); void DeleteEvent(TutorMessageEvent *event); bool ShouldShowMessageEvent(TutorMessageEvent *event, float time); - bool ShouldUpdateCurrentMessage(TutorMessageID messageID); + NOXREF bool ShouldUpdateCurrentMessage(TutorMessageID messageID); void ComputeDisplayTimesForMessage(void); void UpdateCurrentMessage(TutorMessageEvent *event); void ConstructMessageAndDisplay(void); - void LookupHotKey(TutorMessageID mid, int paramNum, wchar_t *buf, int buflen); + NOXREF void LookupHotKey(TutorMessageID mid, int paramNum, wchar_t *buf, int buflen); void CheckForWindowClose(float time); void CheckForContentUpdate(void); bool HasCurrentWindowBeenActiveLongEnough(float time); @@ -309,7 +312,7 @@ public: void ProcessShownDeathsForEvent(TutorMessageEvent *event); void TransferDeathEvents(TutorMessageEvent *oldEvent, TutorMessageEvent *newEvent); TutorMessageEvent *GetTutorMessageUpdateEvent(void); - bool GetDuplicateMessagesFromEventList(const TutorMessageEvent *&event1, const TutorMessageEvent *&event2); + bool GetDuplicateMessagesFromEventList(TutorMessageEvent *&event1, TutorMessageEvent *&event2); bool IsBombMap(void); bool IsHostageMap(void); public: @@ -318,10 +321,10 @@ public: void HandleWeaponReloaded(CBaseEntity *entity, CBaseEntity *other); void HandlePlayerDied(CBaseEntity *entity, CBaseEntity *other); void HandlePlayerSpawned(CBaseEntity *entity, CBaseEntity *other); - void HandleClientCorpseSpawned(CBaseEntity *entity, CBaseEntity *other); + NOXREF void HandleClientCorpseSpawned(CBaseEntity *entity, CBaseEntity *other); void HandlePlayerTookDamage(CBaseEntity *entity, CBaseEntity *other); void HandlePlayerBlindedByFlashbang(CBaseEntity *entity, CBaseEntity *other); - void HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other); + NOXREF void HandleBuyTimeStart(CBaseEntity *entity, CBaseEntity *other); void HandlePlayerLeftBuyZone(CBaseEntity *entity, CBaseEntity *other); void HandleBombPlanted(CBaseEntity *entity, CBaseEntity *other); void HandleRoundStart(CBaseEntity *entity, CBaseEntity *other); @@ -383,13 +386,13 @@ public: void CheckHintMessages(float time); void CheckInGameHintMessages(float time); void CheckExamineMessages(float time); - void CheckForNeedToReload(bool isPassiveCheck); + void CheckForNeedToReload(bool isPassiveCheck = false); bool CanLocalPlayerBuyStuff(void); void CheckBuyZoneMessages(void); bool IsBombPlantedInBombsite(CBaseEntity *bombTarget); void ReadTutorMessageFile(void); void ApplyPersistentDecay(void); - CBaseEntity *GetEntityForMessageID(int messageID, CBaseEntity *last); + CBaseEntity *GetEntityForMessageID(int messageID, CBaseEntity *last = NULL); void ResetPlayerDeathInfo(void); void ConstructRecentDeathsList(TeamName team, char *buf, int buflen, TutorMessageEvent *event); @@ -406,16 +409,7 @@ public: private: float m_nextViewableCheckTime; - TutorMessageMap m_messageMap; // Win: 16 | Lin - 20 - -#ifdef HOOK_GAMEDLL -#ifdef _WIN32 - int padding1[2]; -#else - int padding1[4]; -#endif // _WIN32 -#endif // HOOK_GAMEDLL - + TutorMessageMap m_messageMap; TutorMessageID m_currentlyShownMessageID; float m_currentlyShownMessageCloseTime; float m_currentlyShownMessageStartTime; @@ -424,13 +418,7 @@ private: TutorMessageEvent *m_lastScenarioEvent; TutorMessageID m_lastHintShown; TutorMessageID m_lastInGameHintShown; - - ClientCorpseList m_clientCorpseList; // Win: 16 | Lin - 12 - -#if defined(HOOK_GAMEDLL) && defined(_WIN32) - int padding2; -#endif // HOOK_GAMEDLL - + ClientCorpseList m_clientCorpseList; int m_messageTypeMask; bool m_haveSpawned; PlayerDeathStruct m_playerDeathInfo[32]; @@ -443,10 +431,22 @@ private: #endif // HOOK_GAMEDLL -extern const char *TutorIdentifierList[150]; +extern const char *TutorIdentifierList[ TUTOR_NUM_MESSAGES ]; -NOBODY void ParseMessageParameters(const char *&messageData, TutorMessage *ret); -NOBODY TutorMessage *ConstructTutorMessage(const char *&messageData, TutorMessage *defaults); -NOBODY void ReadDefaultValues(const char *&messageData, TutorMessage *defaults); +void ParseMessageParameters(char *&messageData, TutorMessage *ret); +TutorMessage *ConstructTutorMessage(char *&messageData, TutorMessage *defaults); +void ReadDefaultValues(char *&messageData, TutorMessage *defaults); + +// custom operator +inline TutorMessageID operator++(TutorMessageID &e, int) +{ + if (e == TUTOR_NUM_MESSAGES) + { + return YOU_FIRED_A_SHOT; + } + + const int i = static_cast(e); + return e = static_cast(i + 1); +} #endif // TUTOR_CS_TUTOR_H diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp index 7074a76b..95a9e98d 100644 --- a/regamedll/dlls/util.cpp +++ b/regamedll/dlls/util.cpp @@ -1,6 +1,6 @@ #include "precompiled.h" -#if 1 +#if 0 void *addr_orig; char patchByte[5]; @@ -175,6 +175,7 @@ int UTIL_SharedRandomLong(unsigned int seed, int low, int high) int offset = rnum % range; return (low + offset); } + return low; } @@ -193,6 +194,7 @@ float UTIL_SharedRandomFloat(unsigned int seed, float low, float high) float offset = (float)tensixrand / 0x10000u; return (low + offset * range); } + return low; } @@ -341,6 +343,7 @@ int UTIL_EntitiesInBox(CBaseEntity **pList, int listMax, const Vector &mins, con if (count >= listMax) break; } + return count; } @@ -399,6 +402,7 @@ NOXREF int UTIL_MonstersInSphere(CBaseEntity ** pList, int listMax, const Vector if (count >= listMax) return count; } + return count; } @@ -413,7 +417,10 @@ CBaseEntity *UTIL_FindEntityInSphere(CBaseEntity *pStartEntity, const Vector &ve pentEntity = FIND_ENTITY_IN_SPHERE(pentEntity, vecCenter, flRadius); if (!FNullEnt(pentEntity)) + { return CBaseEntity::Instance(pentEntity); + } + return NULL; } @@ -428,7 +435,10 @@ CBaseEntity *UTIL_FindEntityByString_Old(CBaseEntity *pStartEntity, const char * pentEntity = FIND_ENTITY_BY_STRING(pentEntity, szKeyword, szValue); if (!FNullEnt(pentEntity)) + { return CBaseEntity::Instance(pentEntity); + } + return NULL; } @@ -454,52 +464,63 @@ CBaseEntity *UTIL_FindEntityByString(CBaseEntity *pStartEntity, const char *szKe hash = CaseInsensitiveHash(szValue, stringsHashTable.Count()); count = stringsHashTable.Count(); - item = &stringsHashTable[hash]; + item = &stringsHashTable[ hash ]; - while (item->pev) - { - if (!strcmp(STRING(item->pev->classname), szValue)) - break; - - hash = (hash + 1) % count; - item = &stringsHashTable[hash]; - } if (!item->pev) { item->lastHash = NULL; return NULL; } - if (pStartEntity) + + while (item->pev != NULL) + { + if (!Q_strcmp(STRING(item->pev->classname), szValue)) + break; + + hash = (hash + 1) % count; + item = &stringsHashTable[ hash ]; + } + + if (!item->pev) + { + item->lastHash = NULL; + return NULL; + } + + if (pStartEntity != NULL) { if (item->lastHash && item->lastHash->pevIndex <= startEntityIndex) item = item->lastHash; - while (item->pevIndex <= startEntityIndex) + if (item->pevIndex <= startEntityIndex) { - if (!item->next) - break; + while (item->pevIndex <= startEntityIndex) + { + if (!item->next) + break; - item = item->next; + item = item->next; + } - if (!(item->pevIndex <= startEntityIndex)) - break; - } - - if (item->pevIndex == startEntityIndex) - { - stringsHashTable[hash].lastHash = NULL; - return NULL; + if (item->pevIndex == startEntityIndex) + { + stringsHashTable[ hash ].lastHash = NULL; + return NULL; + } } } - stringsHashTable[hash].lastHash = item; + stringsHashTable[ hash ].lastHash = item; pentEntity = ENT(item->pev); } else pentEntity = FIND_ENTITY_BY_STRING(pentEntity, szKeyword, szValue); if (!FNullEnt(pentEntity)) + { return CBaseEntity::Instance(pentEntity); + } + return NULL; } @@ -1052,11 +1073,7 @@ char *UTIL_VarArgs(char *format, ...) static char string[1024]; va_start(argptr, format); -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(string, sizeof(string), format, argptr); -#else vsprintf(string, format, argptr); -#endif // REGAMEDLL_FIXES va_end(argptr); return string; @@ -1084,6 +1101,7 @@ int UTIL_IsMasterTriggered(string_t sMaster, CBaseEntity *pActivator) } ALERT(at_console, "Master was null or not a master!\n"); } + return 1; } @@ -1130,7 +1148,7 @@ void UTIL_BloodStream(const Vector &origin, const Vector &direction, int color, WRITE_COORD(direction.y); WRITE_COORD(direction.z); WRITE_BYTE(color); - WRITE_BYTE(min( amount, 255 )); + WRITE_BYTE(_min( amount, 255 )); MESSAGE_END(); } @@ -1160,7 +1178,7 @@ void UTIL_BloodDrips(const Vector &origin, const Vector &direction, int color, i WRITE_SHORT(g_sModelIndexBloodSpray); WRITE_SHORT(g_sModelIndexBloodDrop); WRITE_BYTE(color); - WRITE_BYTE(min( max( 3, amount / 10 ), 16 )); + WRITE_BYTE(_min( _max( 3, amount / 10 ), 16 )); MESSAGE_END(); } @@ -1264,7 +1282,7 @@ void UTIL_PlayerDecalTrace(TraceResult *pTrace, int playernum, int decalNumber, WRITE_COORD(pTrace->vecEndPos.x); WRITE_COORD(pTrace->vecEndPos.y); WRITE_COORD(pTrace->vecEndPos.z); - WRITE_SHORT((short)ENTINDEX(pTrace->pHit)); + WRITE_SHORT((int)ENTINDEX(pTrace->pHit)); WRITE_BYTE(index); MESSAGE_END(); } @@ -1286,11 +1304,11 @@ void UTIL_GunshotDecalTrace(TraceResult *pTrace, int decalNumber, bool ClientOnl MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, pTrace->vecEndPos); WRITE_BYTE(TE_GUNSHOTDECAL); - WRITE_COORD(pTrace->vecEndPos.x); - WRITE_COORD(pTrace->vecEndPos.y); - WRITE_COORD(pTrace->vecEndPos.z); - WRITE_SHORT((short)ENTINDEX(pTrace->pHit)); - WRITE_BYTE(index); + WRITE_COORD(pTrace->vecEndPos.x); + WRITE_COORD(pTrace->vecEndPos.y); + WRITE_COORD(pTrace->vecEndPos.z); + WRITE_SHORT((int)ENTINDEX(pTrace->pHit)); + WRITE_BYTE(index); MESSAGE_END(); } @@ -1350,7 +1368,7 @@ void UTIL_StringToVector(float *pVector, const char *pString) for (j = 0; j < 3; j++) { - pVector[j] = atof(pfront); + pVector[j] = Q_atof(pfront); while (*pstr && *pstr != ' ') pstr++; @@ -1381,7 +1399,7 @@ void UTIL_StringToIntArray(int *pVector, int count, const char *pString) for (j = 0; j < count; j++) { - pVector[j] = atoi(pfront); + pVector[j] = Q_atoi(pfront); while (*pstr && *pstr != ' ') pstr++; @@ -1537,7 +1555,9 @@ void UTIL_PrecacheOther(const char *szClassname) CBaseEntity *pEntity = CBaseEntity::Instance(VARS(pent)); if (pEntity) + { pEntity->Precache(); + } REMOVE_ENTITY(pent); } @@ -1549,13 +1569,7 @@ void UTIL_LogPrintf(char *fmt, ...) static char string[1024]; va_start(argptr, fmt); - -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(string, sizeof(string), fmt, argptr); -#else vsprintf(string, fmt, argptr); -#endif // REGAMEDLL_FIXES - va_end(argptr); ALERT(at_logged, "%s", string); @@ -1662,8 +1676,8 @@ int CSaveRestoreBuffer::EntityFlagsSet(int entityIndex, int flags) if (!m_pdata || entityIndex < 0 || entityIndex > m_pdata->tableCount) return 0; - m_pdata->pTable[entityIndex].flags |= flags; - return m_pdata->pTable[entityIndex].flags; + m_pdata->pTable[ entityIndex ].flags |= flags; + return m_pdata->pTable[ entityIndex ].flags; } /* <1b0445> ../cstrike/dlls/util.cpp:1933 */ @@ -1866,10 +1880,10 @@ void EntvarsKeyvalue(entvars_t *pev, KeyValueData *pkvd) break; case FIELD_FLOAT: case FIELD_TIME: - *(float *)((char *)pev + pField->fieldOffset) = atof(pkvd->szValue); + *(float *)((char *)pev + pField->fieldOffset) = Q_atof(pkvd->szValue); break; case FIELD_INTEGER: - *(string_t *)((char *)pev + pField->fieldOffset) = atoi(pkvd->szValue); + *(string_t *)((char *)pev + pField->fieldOffset) = Q_atoi(pkvd->szValue); break; case FIELD_VECTOR: case FIELD_POSITION_VECTOR: @@ -1910,7 +1924,7 @@ int CSave::WriteFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pFie emptyCount++; } - int entityArray[MAX_ENTITYARRAY]; + int entityArray[ MAX_ENTITY_ARRAY ]; int actualCount = fieldCount - emptyCount; WriteInt(pname, &actualCount, 1); @@ -1944,8 +1958,8 @@ int CSave::WriteFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pFie case FIELD_ENTITY: case FIELD_EHANDLE: { - if (pTest->fieldSize > MAX_ENTITYARRAY) - ALERT(at_error, "Can't save more than %d entities in an array!!!\n", MAX_ENTITYARRAY); + if (pTest->fieldSize > MAX_ENTITY_ARRAY) + ALERT(at_error, "Can't save more than %d entities in an array!!!\n", MAX_ENTITY_ARRAY); for (int j = 0; j < pTest->fieldSize; j++) { @@ -2032,7 +2046,7 @@ void CSave::BufferField(const char *pname, int size, const char *pdata) void CSave::BufferHeader(const char *pname, int size) { short hashvalue = TokenHash(pname); - if (size > (1<<(sizeof(short) * 8))) + if (size > (1 << (sizeof(short) * 8))) ALERT(at_error, "CSave :: BufferHeader() size parameter exceeds 'short'!"); BufferData((const char *)&size, sizeof(short)); diff --git a/regamedll/dlls/util.h b/regamedll/dlls/util.h index 83f99a4f..14e13a6d 100644 --- a/regamedll/dlls/util.h +++ b/regamedll/dlls/util.h @@ -115,6 +115,24 @@ extern globalvars_t *gpGlobals; #define VEC_DUCK_HULL_MAX Vector(16, 16, 32) #define VEC_DUCK_VIEW Vector(0, 0, 12) +#define PLAYBACK_EVENT(flags, who, index)\ + PLAYBACK_EVENT_FULL(flags, who, index, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0) + +#define PLAYBACK_EVENT_DELAY(flags, who, index, delay)\ + PLAYBACK_EVENT_FULL(flags, who, index, delay, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0) + +#ifdef HOOK_GAMEDLL + +// prefix _ +#define __MAKE_VHOOK(fname)\ + fname##_ +#else + +#define __MAKE_VHOOK(fname)\ + fname + +#endif // HOOK_GAMEDLL + #define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName)\ C_DLLEXPORT void mapClassName(entvars_t *pev);\ void mapClassName(entvars_t *pev)\ @@ -460,7 +478,7 @@ typedef int (CSaveRestoreBuffer::*CSAVERESTOREBUFFER_POINTER)(const char *,const #endif // HOOK_GAMEDLL -#if 1 +#if 0 extern void *addr_orig; extern char patchByte[5]; diff --git a/regamedll/dlls/vector.h b/regamedll/dlls/vector.h index 89ca9adf..ce9e3e6b 100644 --- a/regamedll/dlls/vector.h +++ b/regamedll/dlls/vector.h @@ -32,19 +32,6 @@ #pragma once #endif -#ifdef HOOK_GAMEDLL - -// probably gamedll compiled with flag /fpmath:fasted, -// so we need to use type double, otherwise will be the test failed - -typedef double float_precision; - -#else // HOOK_GAMEDLL - -typedef float float_precision; - -#endif // HOOK_GAMEDLL - /* <5d3ffa> ../cstrike/dlls/vector.h:26 */ class Vector2D { @@ -103,16 +90,16 @@ public: } inline Vector2D Normalize(void) const { - float_precision flLength = Length(); - if (!flLength) + float_precision flLen = Length(); + if (!flLen) return Vector2D(0, 0); - flLength = 1 / flLength; + flLen = 1 / flLen; #ifdef HOOK_GAMEDLL - return Vector2D((vec_t)(x * flLength), (vec_t)(y * flLength)); + return Vector2D((vec_t)(x * flLen), (vec_t)(y * flLen)); #else - return Vector2D(x * flLength, y * flLength); + return Vector2D(x * flLen, y * flLen); #endif // HOOK_GAMEDLL } inline bool IsLengthLessThan(float length) const @@ -125,18 +112,18 @@ public: } inline float_precision NormalizeInPlace(void) { - float_precision flLength = Length(); - if (flLength > 0.0) + float_precision flLen = Length(); + if (flLen > 0.0) { - x /= (vec_t)flLength; - y /= (vec_t)flLength; + x /= (vec_t)flLen; + y /= (vec_t)flLen; } else { x = 1.0; y = 0.0; } - return flLength; + return flLen; } inline bool IsZero(float tolerance = 0.01f) const { @@ -234,9 +221,16 @@ public: rgfl[1] = y; rgfl[2] = z; } - inline double Length(void) const + inline float_precision Length(void) const { - return sqrt((float_precision)(x * x + y * y + z * z)); + float_precision x1 = (float_precision)x; + float_precision y1 = (float_precision)y; + float_precision z1 = (float_precision)z; + + + return sqrt(x1 * x1 + y1 * y1 + z1 * z1); + + //return sqrt((float_precision)(x * x + y * y + z * z)); } inline float LengthSquared(void) const { @@ -250,19 +244,41 @@ public: { return &x; } - inline Vector Normalize(void) const +#ifndef HOOK_GAMEDLL + inline Vector Normalize(void) { - float_precision flLength = Length(); - if (!flLength) + float flLen = Length(); + if (flLen == 0) return Vector(0, 0, 1); - - flLength = 1 / flLength; -#ifdef HOOK_GAMEDLL - return Vector((vec_t)(x * flLength), (vec_t)(y * flLength), (vec_t)(z * flLength)); + + flLen = 1 / flLen; + return Vector(x * flLen, y * flLen, z * flLen); + } #else - return Vector(x * flLength, y * flLength, z * flLength); + inline Vector Normalize(void) + { + float_precision flLen = Length(); + if (flLen == 0) + return Vector(0, 0, 1); + + vec_t fTemp = (vec_t)(1 / flLen); + return Vector(x * fTemp, y * fTemp, z * fTemp); + } + // for out precision normalize + inline Vector NormalizePrecision(void) + { +#ifndef HOOK_GAMEDLL + return Normalize(); +#else + float_precision flLen = Length(); + if (flLen == 0) + return Vector(0, 0, 1); + + flLen = 1 / flLen; + return Vector((vec_t)(x * flLen), (vec_t)(y * flLen), (vec_t)(z * flLen)); #endif // HOOK_GAMEDLL } +#endif // HOOK_GAMEDLL inline Vector2D Make2D(void) const { Vector2D Vec2; @@ -285,12 +301,12 @@ public: } inline float_precision NormalizeInPlace(void) { - float_precision flLength = Length(); - if (flLength > 0.0) + float_precision flLen = Length(); + if (flLen > 0.0) { - x /= (vec_t)flLength; - y /= (vec_t)flLength; - z /= (vec_t)flLength; + x /= (vec_t)flLen; + y /= (vec_t)flLen; + z /= (vec_t)flLen; } else { @@ -298,7 +314,7 @@ public: y = 0.0; z = 1.0; } - return flLength; + return flLen; } inline bool IsZero(float tolerance = 0.01f) const { @@ -315,7 +331,7 @@ inline Vector operator*(float fl, const Vector &v) } /* <5d9a4> ../cstrike/dlls/vector.h:185 */ -inline float DotProduct(const Vector &a, const Vector &b) +inline float_precision DotProduct(const Vector &a, const Vector &b) { return (a.x * b.x + a.y * b.y + a.z * b.z); } @@ -334,4 +350,56 @@ inline void SWAP(T &first, T &second) second = temp; } +template< + typename X, + typename Y, + typename Z, + typename LenType +> +inline LenType LenghtSubtract(Vector vecStart, Vector vecDest) +{ + X floatX = (vecDest.x - vecStart.x); + Y floatY = (vecDest.y - vecStart.y); + Z floatZ = (vecDest.z - vecStart.z); + + return sqrt((float_precision)(floatX * floatX + floatY * floatY + floatZ * floatZ)); +} + +template< + typename X, + typename Y, + typename Z, + typename LenType +> +inline Vector NormalizeSubtract(Vector vecStart, Vector vecDest) +{ + Vector dir; + +#ifdef HOOK_GAMEDLL + + X floatX = (vecDest.x - vecStart.x); + Y floatY = (vecDest.y - vecStart.y); + Z floatZ = (vecDest.z - vecStart.z); + + LenType flLen = sqrt((float_precision)(floatX * floatX + floatY * floatY + floatZ * floatZ)); + + if (flLen == 0.0) + { + dir = Vector(0, 0, 1); + } + else + { + flLen = 1.0 / flLen; + + dir.x = (vec_t)(floatX * flLen); + dir.y = (vec_t)(floatY * flLen); + dir.z = (vec_t)(floatZ * flLen); + } +#else + dir = (vecDest - vecStart).Normalize(); +#endif // HOOK_GAMEDLL + + return dir; +} + #endif // VECTOR_H diff --git a/regamedll/dlls/vehicle.cpp b/regamedll/dlls/vehicle.cpp index 5820ad1b..a2c8c6a2 100644 --- a/regamedll/dlls/vehicle.cpp +++ b/regamedll/dlls/vehicle.cpp @@ -39,7 +39,7 @@ IMPLEMENT_SAVERESTORE(CFuncVehicle, CBaseEntity); LINK_ENTITY_TO_CLASS(func_vehicle, CFuncVehicle); /* <1bb408> ../cstrike/dlls/vehicle.cpp:57 */ -NOBODY void CFuncVehicle::KeyValue_(KeyValueData *pkvd) +NOBODY void CFuncVehicle::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // FStrEq(const char *sz1, // const char *sz2); // 59 @@ -75,7 +75,7 @@ NOBODY void CFuncVehicle::NextThink(float thinkTime, BOOL alwaysThink) } /* <1bb9d0> ../cstrike/dlls/vehicle.cpp:120 */ -NOBODY void CFuncVehicle::Blocked_(CBaseEntity *pOther) +NOBODY void CFuncVehicle::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther) { // { // entvars_t *pevOther; // 122 @@ -125,7 +125,7 @@ NOBODY void CFuncVehicle::Blocked_(CBaseEntity *pOther) } /* <1bcf96> ../cstrike/dlls/vehicle.cpp:179 */ -NOBODY void CFuncVehicle::Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +NOBODY void CFuncVehicle::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // StopSound(CFuncVehicle *const this); // 197 // { @@ -358,7 +358,7 @@ NOBODY void CFuncVehicle::SetControls(entvars_t *pevControls) } /* <1bb1b2> ../cstrike/dlls/vehicle.cpp:819 */ -BOOL CFuncVehicle::OnControls_(entvars_t *pevTest) +BOOL CFuncVehicle::__MAKE_VHOOK(OnControls)(entvars_t *pevTest) { Vector offset = pevTest->origin - pev->origin; @@ -426,7 +426,7 @@ NOBODY void CFuncVehicle::NearestPath(void) } /* <1bb00a> ../cstrike/dlls/vehicle.cpp:926 */ -NOBODY void CFuncVehicle::OverrideReset_(void) +NOBODY void CFuncVehicle::__MAKE_VHOOK(OverrideReset)(void) { // NextThink(class CFuncVehicle *const this, float thinkTime, BOOL alwaysThink); // 928 } @@ -440,20 +440,20 @@ NOBODY CFuncVehicle *CFuncVehicle::Instance(edict_t *pent) } /* <1bb055> ../cstrike/dlls/vehicle.cpp:951 */ -int CFuncVehicle::Classify_(void) +int CFuncVehicle::__MAKE_VHOOK(Classify)(void) { return CLASS_VEHICLE; } /* <1bb0ef> ../cstrike/dlls/vehicle.cpp:956 */ -NOBODY void CFuncVehicle::Spawn_(void) +NOBODY void CFuncVehicle::__MAKE_VHOOK(Spawn)(void) { // NextThink(CFuncVehicle::Spawn(// float thinkTime, // BOOL alwaysThink); // 999 } /* <1bb13e> ../cstrike/dlls/vehicle.cpp:1005 */ -NOBODY void CFuncVehicle::Restart_(void) +NOBODY void CFuncVehicle::__MAKE_VHOOK(Restart)(void) { // STOP_SOUND(edict_t *entity, // int channel, @@ -464,7 +464,7 @@ NOBODY void CFuncVehicle::Restart_(void) } /* <1bb07b> ../cstrike/dlls/vehicle.cpp:1032 */ -void CFuncVehicle::Precache_(void) +void CFuncVehicle::__MAKE_VHOOK(Precache)(void) { if (m_flVolume == 0.0f) m_flVolume = 1.0f; @@ -525,7 +525,7 @@ NOBODY void CFuncVehicleControls::Find(void) } /* <1bb0c8> ../cstrike/dlls/vehicle.cpp:1088 */ -NOBODY void CFuncVehicleControls::Spawn_(void) +NOBODY void CFuncVehicleControls::__MAKE_VHOOK(Spawn)(void) { } diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 0d1e00d6..148f712c 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -197,7 +197,7 @@ void UTIL_PrecacheOtherWeapon(const char *szClassname) { ItemInfo II; pEntity->Precache(); - memset(&II, 0, sizeof(II)); + Q_memset(&II, 0, sizeof(II)); if (((CBasePlayerItem *)pEntity)->GetItemInfo(&II)) { @@ -231,7 +231,7 @@ NOXREF void UTIL_PrecacheOtherWeapon2(const char *szClassname) { ItemInfo II; pEntity->Precache(); - memset(&II, 0, sizeof(II)); + Q_memset(&II, 0, sizeof(II)); if (((CBasePlayerItem *)pEntity)->GetItemInfo(&II)) { @@ -251,7 +251,7 @@ NOXREF void UTIL_PrecacheOtherWeapon2(const char *szClassname) /* <1d3191> ../cstrike/dlls/weapons.cpp:345 */ void W_Precache(void) { - memset(IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray), 0, ARRAYSIZE( IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray) )); + Q_memset(IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray), 0, ARRAYSIZE(IMPLEMENT_ARRAY_CLASS(CBasePlayerItem, ItemInfoArray))); giAmmoIndex = 0; UTIL_PrecacheOther("item_suit"); @@ -304,7 +304,9 @@ void W_Precache(void) UTIL_PrecacheOtherWeapon("weapon_famas"); if (g_pGameRules->IsDeathmatch()) + { UTIL_PrecacheOther("weaponbox"); + } g_sModelIndexFireball = PRECACHE_MODEL("sprites/zerogxplode.spr"); g_sModelIndexWExplosion = PRECACHE_MODEL("sprites/WXplo1.spr"); @@ -361,22 +363,13 @@ IMPLEMENT_SAVERESTORE(CBasePlayerItem, CBaseAnimating); IMPLEMENT_SAVERESTORE(CBasePlayerWeapon, CBasePlayerItem); /* <1d1730> ../cstrike/dlls/weapons.cpp:475 */ -NOBODY void CBasePlayerItem::SetObjectCollisionBox_(void) +NOBODY void CBasePlayerItem::__MAKE_VHOOK(SetObjectCollisionBox)(void) { // operator+(const Vector ::SetObjectCollisionBox(// const Vector &v); // 477 // operator+(const Vector *const this, // const Vector &v); // 478 } -//BOOL CBasePlayerItem::CanDrop_(void)//252 -//{ -// return TRUE; -//} -//BOOL CBasePlayerItem::CanDrop(void)//252 -//{ -// return CanDrop_();//TRUE; -//} - /* <1d32bc> ../cstrike/dlls/weapons.cpp:506 */ void CBasePlayerItem::FallThink(void) { @@ -401,7 +394,9 @@ void CBasePlayerItem::Materialize(void) if (pev->effects & EF_NODRAW) { if (g_pGameRules->IsMultiplayer()) + { EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); + } pev->effects &= ~EF_NODRAW; pev->effects |= EF_MUZZLEFLASH; @@ -444,7 +439,7 @@ void CBasePlayerItem::CheckRespawn(void) } /* <1d1e09> ../cstrike/dlls/weapons.cpp:616 */ -NOBODY CBaseEntity *CBasePlayerItem::Respawn_(void) +NOBODY CBaseEntity *CBasePlayerItem::__MAKE_VHOOK(Respawn)(void) { // { // class CBaseEntity *pNewWeapon; // 620 @@ -455,17 +450,32 @@ NOBODY CBaseEntity *CBasePlayerItem::Respawn_(void) /* <1d26f0> ../cstrike/dlls/weapons.cpp:642 */ void CBasePlayerItem::DefaultTouch(CBaseEntity *pOther) { + // if it's not a player, ignore if (!pOther->IsPlayer()) + { return; + } - CBasePlayer *pPlayer = (CBasePlayer *)pOther; - if (pPlayer->m_bIsVIP && !((1<(pOther); + + if (pPlayer->m_bIsVIP + && m_iId != WEAPON_USP + && m_iId != WEAPON_GLOCK18 + && m_iId != WEAPON_P228 + && m_iId != WEAPON_DEAGLE + && m_iId != WEAPON_KNIFE) + { return; + } + // can I have this? if (!g_pGameRules->CanHavePlayerItem(pPlayer, this)) { if (gEvilImpulse101) + { UTIL_Remove(this); + } + return; } @@ -649,7 +659,7 @@ NOBODY bool CBasePlayerWeapon::HasSecondaryAttack(void) } /* <1d3919> ../cstrike/dlls/weapons.cpp:915 */ -NOBODY void CBasePlayerWeapon::ItemPostFrame_(void) +NOBODY void CBasePlayerWeapon::__MAKE_VHOOK(ItemPostFrame)(void) { // { // int usableButtons; // 918 @@ -679,7 +689,7 @@ NOBODY void CBasePlayerItem::DestroyItem(void) } /* <1d17d4> ../cstrike/dlls/weapons.cpp:1081 */ -NOXREF int CBasePlayerItem::AddToPlayer_(CBasePlayer *pPlayer) +NOXREF int CBasePlayerItem::__MAKE_VHOOK(AddToPlayer)(CBasePlayer *pPlayer) { m_pPlayer = pPlayer; @@ -691,7 +701,7 @@ NOXREF int CBasePlayerItem::AddToPlayer_(CBasePlayer *pPlayer) } /* <1d183d> ../cstrike/dlls/weapons.cpp:1092 */ -void CBasePlayerItem::Drop_(void) +void CBasePlayerItem::__MAKE_VHOOK(Drop)(void) { SetTouch(NULL); SetThink(&CBaseEntity::SUB_Remove); @@ -699,7 +709,7 @@ void CBasePlayerItem::Drop_(void) } /* <1d1866> ../cstrike/dlls/weapons.cpp:1099 */ -void CBasePlayerItem::Kill_(void) +void CBasePlayerItem::__MAKE_VHOOK(Kill)(void) { SetTouch(NULL); SetThink(&CBaseEntity::SUB_Remove); @@ -707,14 +717,14 @@ void CBasePlayerItem::Kill_(void) } /* <1d188f> ../cstrike/dlls/weapons.cpp:1106 */ -void CBasePlayerItem::Holster_(int skiplocal) +void CBasePlayerItem::__MAKE_VHOOK(Holster)(int skiplocal) { m_pPlayer->pev->viewmodel = 0; m_pPlayer->pev->weaponmodel = 0; } /* <1d18c7> ../cstrike/dlls/weapons.cpp:1112 */ -void CBasePlayerItem::AttachToPlayer_(CBasePlayer *pPlayer) +void CBasePlayerItem::__MAKE_VHOOK(AttachToPlayer)(CBasePlayer *pPlayer) { pev->movetype = MOVETYPE_FOLLOW; pev->solid = SOLID_NOT; @@ -729,7 +739,7 @@ void CBasePlayerItem::AttachToPlayer_(CBasePlayer *pPlayer) } /* <1d1e4a> ../cstrike/dlls/weapons.cpp:1126 */ -int CBasePlayerWeapon::AddDuplicate_(CBasePlayerItem *pOriginal) +int CBasePlayerWeapon::__MAKE_VHOOK(AddDuplicate)(CBasePlayerItem *pOriginal) { if (m_iDefaultAmmo) return ExtractAmmo((CBasePlayerWeapon *)pOriginal); @@ -738,7 +748,7 @@ int CBasePlayerWeapon::AddDuplicate_(CBasePlayerItem *pOriginal) } /* <1d237f> ../cstrike/dlls/weapons.cpp:1140 */ -int CBasePlayerWeapon::AddToPlayer_(CBasePlayer *pPlayer) +int CBasePlayerWeapon::__MAKE_VHOOK(AddToPlayer)(CBasePlayer *pPlayer) { m_pPlayer = pPlayer; pPlayer->pev->weapons |= (1 << m_iId); @@ -761,7 +771,7 @@ int CBasePlayerWeapon::AddToPlayer_(CBasePlayer *pPlayer) } /* <1d24a3> ../cstrike/dlls/weapons.cpp:1164 */ -int CBasePlayerWeapon::UpdateClientData_(CBasePlayer *pPlayer) +int CBasePlayerWeapon::__MAKE_VHOOK(UpdateClientData)(CBasePlayer *pPlayer) { BOOL bSend = FALSE; int state = 0; @@ -807,7 +817,7 @@ int CBasePlayerWeapon::UpdateClientData_(CBasePlayer *pPlayer) } /* <1d22c7> ../cstrike/dlls/weapons.cpp:1218 */ -void CBasePlayerWeapon::SendWeaponAnim_(int iAnim, int skiplocal) +void CBasePlayerWeapon::__MAKE_VHOOK(SendWeaponAnim)(int iAnim, int skiplocal) { m_pPlayer->pev->weaponanim = iAnim; if (!skiplocal || !ENGINE_CANSKIP(ENT(m_pPlayer->pev))) @@ -832,7 +842,7 @@ BOOL CBasePlayerWeapon::AddPrimaryAmmo(int iCount, char *szName, int iMaxClip, i iIdAmmo = m_pPlayer->GiveAmmo(iCount, szName, iMaxCarry); else { - int i = min(m_iClip + iCount, iMaxClip); + int i = _min(m_iClip + iCount, iMaxClip); m_iClip = i; iIdAmmo = m_pPlayer->GiveAmmo(iCount - i, szName, iMaxCarry); @@ -859,14 +869,14 @@ NOXREF BOOL CBasePlayerWeapon::AddSecondaryAmmo(int iCount, char *szName, int iM } /* <1d19ba> ../cstrike/dlls/weapons.cpp:1287 */ -NOBODY BOOL CBasePlayerWeapon::IsUseable_(void) +NOBODY BOOL CBasePlayerWeapon::__MAKE_VHOOK(IsUseable)(void) { // iMaxAmmo1(CBasePlayerItem *const this); // 1291 return FALSE; } /* <1d19f4> ../cstrike/dlls/weapons.cpp:1301 */ -NOBODY BOOL CBasePlayerWeapon::CanDeploy_(void) +NOBODY BOOL CBasePlayerWeapon::__MAKE_VHOOK(CanDeploy)(void) { return FALSE; } @@ -937,7 +947,7 @@ int CBasePlayerWeapon::DefaultReload(int iClipSize, int iAnim, float fDelay) if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) return FALSE; - int j = min(iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); + int j = _min(iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); if (!j) return FALSE; @@ -953,7 +963,7 @@ int CBasePlayerWeapon::DefaultReload(int iClipSize, int iAnim, float fDelay) } /* <1d2607> ../cstrike/dlls/weapons.cpp:1389 */ -BOOL CBasePlayerWeapon::PlayEmptySound_(void) +BOOL CBasePlayerWeapon::__MAKE_VHOOK(PlayEmptySound)(void) { if (m_iPlayEmptySound) { @@ -966,25 +976,25 @@ BOOL CBasePlayerWeapon::PlayEmptySound_(void) } /* <1d1a1c> ../cstrike/dlls/weapons.cpp:1414 */ -void CBasePlayerWeapon::ResetEmptySound_(void) +void CBasePlayerWeapon::__MAKE_VHOOK(ResetEmptySound)(void) { m_iPlayEmptySound = 1; } /* <1d1a44> ../cstrike/dlls/weapons.cpp:1421 */ -NOBODY int CBasePlayerWeapon::PrimaryAmmoIndex_(void) +NOBODY int CBasePlayerWeapon::__MAKE_VHOOK(PrimaryAmmoIndex)(void) { return 0; } /* <1d1a6c> ../cstrike/dlls/weapons.cpp:1428 */ -NOBODY int CBasePlayerWeapon::SecondaryAmmoIndex_(void) +NOBODY int CBasePlayerWeapon::__MAKE_VHOOK(SecondaryAmmoIndex)(void) { return 0; } /* <1d1a94> ../cstrike/dlls/weapons.cpp:1433 */ -void CBasePlayerWeapon::Holster_(int skiplocal) +void CBasePlayerWeapon::__MAKE_VHOOK(Holster)(int skiplocal) { m_fInReload = 0; m_pPlayer->pev->viewmodel = 0; @@ -992,7 +1002,7 @@ void CBasePlayerWeapon::Holster_(int skiplocal) } /* <1d20fb> ../cstrike/dlls/weapons.cpp:1440 */ -void CBasePlayerAmmo::Spawn_(void) +void CBasePlayerAmmo::__MAKE_VHOOK(Spawn)(void) { pev->movetype = MOVETYPE_TOSS; pev->solid = SOLID_TRIGGER; @@ -1009,7 +1019,7 @@ void CBasePlayerAmmo::Spawn_(void) } /* <1d1d10> ../cstrike/dlls/weapons.cpp:1458 */ -CBaseEntity *CBasePlayerAmmo::Respawn_(void) +CBaseEntity *CBasePlayerAmmo::__MAKE_VHOOK(Respawn)(void) { pev->effects |= EF_NODRAW; SetTouch(NULL); @@ -1018,6 +1028,7 @@ CBaseEntity *CBasePlayerAmmo::Respawn_(void) SetThink(&CBasePlayerAmmo::Materialize); pev->nextthink = g_pGameRules->FlAmmoRespawnTime(this); + return this; } @@ -1027,7 +1038,9 @@ void CBasePlayerAmmo::Materialize(void) if (pev->effects & EF_NODRAW) { if (g_pGameRules->IsMultiplayer()) + { EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); + } pev->effects &= ~EF_NODRAW; pev->effects |= EF_MUZZLEFLASH; @@ -1044,7 +1057,9 @@ void CBasePlayerAmmo::DefaultTouch(CBaseEntity *pOther) if (AddAmmo(pOther)) { if (g_pGameRules->AmmoShouldRespawn(this) == GR_AMMO_RESPAWN_YES) + { Respawn(); + } else { SetTouch(NULL); @@ -1061,7 +1076,7 @@ void CBasePlayerAmmo::DefaultTouch(CBaseEntity *pOther) } /* <1d3bc3> ../cstrike/dlls/weapons.cpp:1525 */ -int CBasePlayerWeapon::ExtractAmmo_(CBasePlayerWeapon *pWeapon) +int CBasePlayerWeapon::__MAKE_VHOOK(ExtractAmmo)(CBasePlayerWeapon *pWeapon) { int iReturn = 0; if (pszAmmo1()) @@ -1076,7 +1091,7 @@ int CBasePlayerWeapon::ExtractAmmo_(CBasePlayerWeapon *pWeapon) } /* <1d1acc> ../cstrike/dlls/weapons.cpp:1548 */ -int CBasePlayerWeapon::ExtractClipAmmo_(CBasePlayerWeapon *pWeapon) +int CBasePlayerWeapon::__MAKE_VHOOK(ExtractClipAmmo)(CBasePlayerWeapon *pWeapon) { int iAmmo; if (m_iClip == WEAPON_NOCLIP) @@ -1088,7 +1103,7 @@ int CBasePlayerWeapon::ExtractClipAmmo_(CBasePlayerWeapon *pWeapon) } /* <1d1b2e> ../cstrike/dlls/weapons.cpp:1567 */ -NOBODY void CBasePlayerWeapon::RetireWeapon_(void) +NOBODY void CBasePlayerWeapon::__MAKE_VHOOK(RetireWeapon)(void) { } @@ -1141,12 +1156,12 @@ LINK_ENTITY_TO_CLASS(weaponbox, CWeaponBox); IMPLEMENT_SAVERESTORE(CWeaponBox, CBaseEntity); /* <1d1b57> ../cstrike/dlls/weapons.cpp:1629 */ -NOBODY void CWeaponBox::Precache_(void) +NOBODY void CWeaponBox::__MAKE_VHOOK(Precache)(void) { } /* <1d2978> ../cstrike/dlls/weapons.cpp:1636 */ -NOBODY void CWeaponBox::KeyValue_(KeyValueData *pkvd) +NOBODY void CWeaponBox::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { // KeyValue(CWeaponBox *const this, // KeyValueData *pkvd); // 1636 @@ -1184,7 +1199,7 @@ void CWeaponBox::BombThink(void) } /* <1d1ce7> ../cstrike/dlls/weapons.cpp:1687 */ -NOBODY void CWeaponBox::Spawn_(void) +NOBODY void CWeaponBox::__MAKE_VHOOK(Spawn)(void) { } @@ -1206,7 +1221,7 @@ void CWeaponBox::Kill(void) } /* <1d0640> ../cstrike/dlls/weapons.cpp:1732 */ -NOBODY void CWeaponBox::Touch_(CBaseEntity *pOther) +NOBODY void CWeaponBox::__MAKE_VHOOK(Touch)(CBaseEntity *pOther) { // { // class CBasePlayer *pPlayer; // 1751 @@ -1307,7 +1322,7 @@ int CWeaponBox::GiveAmmo(int iCount, char *szName, int iMax, int *pIndex) if (pIndex) *pIndex = i; - int iAdd = min(iCount, iMax - m_rgAmmo[i]); + int iAdd = _min(iCount, iMax - m_rgAmmo[i]); if (iCount <= 0 || iAdd > 0) { m_rgAmmo[i] += iAdd; @@ -1365,7 +1380,7 @@ BOOL CWeaponBox::IsEmpty(void) } /* <1d1b7f> ../cstrike/dlls/weapons.cpp:2145 */ -NOBODY void CWeaponBox::SetObjectCollisionBox_(void) +NOBODY void CWeaponBox::__MAKE_VHOOK(SetObjectCollisionBox)(void) { // operator+(const Vector ::SetObjectCollisionBox(// const Vector &v); // 2147 // operator+(const Vector *const this, diff --git a/regamedll/dlls/weapons.h b/regamedll/dlls/weapons.h index 0e0444ed..bc953383 100644 --- a/regamedll/dlls/weapons.h +++ b/regamedll/dlls/weapons.h @@ -1675,6 +1675,7 @@ NOXREF void UTIL_PrecacheOtherWeapon2(const char *szClassname); void W_Precache(void); NOXREF BOOL CanAttack(float attack_time, float curtime, BOOL isPredicted); +// linked object C_DLLEXPORT void weapon_usp(entvars_t *pev); #endif // WEAPONS_H diff --git a/regamedll/dlls/weapontype.cpp b/regamedll/dlls/weapontype.cpp index b38a0945..f1d0bf70 100644 --- a/regamedll/dlls/weapontype.cpp +++ b/regamedll/dlls/weapontype.cpp @@ -7,216 +7,215 @@ AutoBuyInfoStruct g_autoBuyInfo[] = { - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "galil", "weapon_galil" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "ak47", "weapon_ak47" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SNIPERRIFLE, "scout", "weapon_scout" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "sg552", "weapon_sg552" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SNIPERRIFLE, "awp", "weapon_awp" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SNIPERRIFLE, "g3sg1", "weapon_g3sg1" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "famas", "weapon_famas" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "m4a1", "weapon_m4a1" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "aug", "weapon_aug" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SNIPERRIFLE, "sg550", "weapon_sg550" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "glock", "weapon_glock18" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "usp", "weapon_usp" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "p228", "weapon_p228" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "deagle", "weapon_deagle" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "elites", "weapon_elite" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_PISTOL, "fn57", "weapon_fiveseven" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SHOTGUN, "m3", "weapon_m3" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SHOTGUN, "xm1014", "weapon_xm1014" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SMG, "mac10", "weapon_mac10" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SMG, "tmp", "weapon_tmp" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SMG, "mp5", "weapon_mp5navy" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SMG, "ump45", "weapon_ump45" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SMG, "p90", "weapon_p90" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_MACHINEGUN, "m249", "weapon_m249" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_AMMO, "primammo", "primammo" }, - { AUTOBUYCLASS_SECONDARY|AUTOBUYCLASS_AMMO, "secammo", "secammo" }, - { AUTOBUYCLASS_ARMOR, "vest", "item_kevlar" }, - { AUTOBUYCLASS_ARMOR, "vesthelm", "item_assaultsuit" }, - { AUTOBUYCLASS_GRENADE, "flash", "weapon_flashbang" }, - { AUTOBUYCLASS_GRENADE, "hegren", "weapon_hegrenade" }, - { AUTOBUYCLASS_GRENADE, "sgren", "weapon_smokegrenade"}, - { AUTOBUYCLASS_NIGHTVISION, "nvgs", "nvgs" }, - { AUTOBUYCLASS_DEFUSER, "defuser", "defuser" }, - { AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_SHIELD, "shield", "shield" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "galil", "weapon_galil" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "ak47", "weapon_ak47" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SNIPERRIFLE, "scout", "weapon_scout" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "sg552", "weapon_sg552" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SNIPERRIFLE, "awp", "weapon_awp" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SNIPERRIFLE, "g3sg1", "weapon_g3sg1" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "famas", "weapon_famas" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "m4a1", "weapon_m4a1" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_RIFLE, "aug", "weapon_aug" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SNIPERRIFLE, "sg550", "weapon_sg550" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "glock", "weapon_glock18" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "usp", "weapon_usp" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "p228", "weapon_p228" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "deagle", "weapon_deagle" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "elites", "weapon_elite" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_PISTOL, "fn57", "weapon_fiveseven" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SHOTGUN, "m3", "weapon_m3" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SHOTGUN, "xm1014", "weapon_xm1014" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SMG, "mac10", "weapon_mac10" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SMG, "tmp", "weapon_tmp" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SMG, "mp5", "weapon_mp5navy" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SMG, "ump45", "weapon_ump45" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SMG, "p90", "weapon_p90" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_MACHINEGUN, "m249", "weapon_m249" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_AMMO, "primammo", "primammo" }, + { AUTOBUYCLASS_SECONDARY | AUTOBUYCLASS_AMMO, "secammo", "secammo" }, + { AUTOBUYCLASS_ARMOR, "vest", "item_kevlar" }, + { AUTOBUYCLASS_ARMOR, "vesthelm", "item_assaultsuit" }, + { AUTOBUYCLASS_GRENADE, "flash", "weapon_flashbang" }, + { AUTOBUYCLASS_GRENADE, "hegren", "weapon_hegrenade" }, + { AUTOBUYCLASS_GRENADE, "sgren", "weapon_smokegrenade"}, + { AUTOBUYCLASS_NIGHTVISION, "nvgs", "nvgs" }, + { AUTOBUYCLASS_DEFUSER, "defuser", "defuser" }, + { AUTOBUYCLASS_PRIMARY | AUTOBUYCLASS_SHIELD, "shield", "shield" }, { 0, NULL, NULL } }; WeaponAliasInfo weaponAliasInfo[] = { - { "p228", WEAPON_P228 }, - { "???", WEAPON_GLOCK }, - { "scout", WEAPON_SCOUT }, - { "hegren", WEAPON_HEGRENADE }, - { "xm1014", WEAPON_XM1014 }, - { "c4", WEAPON_C4 }, - { "mac10", WEAPON_MAC10 }, - { "aug", WEAPON_AUG }, - { "sgren", WEAPON_SMOKEGRENADE }, - { "elites", WEAPON_ELITE }, - { "fn57", WEAPON_FIVESEVEN }, - { "ump45", WEAPON_UMP45 }, - { "sg550", WEAPON_SG550 }, - { "galil", WEAPON_GALIL }, - { "famas", WEAPON_FAMAS }, - { "usp", WEAPON_USP }, - { "glock", WEAPON_GLOCK18 }, - { "awp", WEAPON_AWP }, - { "mp5", WEAPON_MP5N }, - { "m249", WEAPON_M249 }, - { "m3", WEAPON_M3 }, - { "m4a1", WEAPON_M4A1 }, - { "tmp", WEAPON_TMP }, - { "g3sg1", WEAPON_G3SG1 }, - { "flash", WEAPON_FLASHBANG }, - { "deagle", WEAPON_DEAGLE }, - { "sg552", WEAPON_SG552 }, - { "ak47", WEAPON_AK47 }, - { "knife", WEAPON_KNIFE }, - { "p90", WEAPON_P90 }, - { "shield", WEAPON_SHIELDGUN }, - { "none", WEAPON_NONE }, - { "grenade", WEAPON_HEGRENADE }, - { "hegrenade", WEAPON_HEGRENADE }, - { "glock18", WEAPON_GLOCK18 }, - { "elite", WEAPON_ELITE }, - { "fiveseven", WEAPON_FIVESEVEN }, - { "mp5navy", WEAPON_MP5N }, - { NULL, WEAPON_NONE } + { "p228", WEAPON_P228 }, + { "???", WEAPON_GLOCK }, + { "scout", WEAPON_SCOUT }, + { "hegren", WEAPON_HEGRENADE }, + { "xm1014", WEAPON_XM1014 }, + { "c4", WEAPON_C4 }, + { "mac10", WEAPON_MAC10 }, + { "aug", WEAPON_AUG }, + { "sgren", WEAPON_SMOKEGRENADE }, + { "elites", WEAPON_ELITE }, + { "fn57", WEAPON_FIVESEVEN }, + { "ump45", WEAPON_UMP45 }, + { "sg550", WEAPON_SG550 }, + { "galil", WEAPON_GALIL }, + { "famas", WEAPON_FAMAS }, + { "usp", WEAPON_USP }, + { "glock", WEAPON_GLOCK18 }, + { "awp", WEAPON_AWP }, + { "mp5", WEAPON_MP5N }, + { "m249", WEAPON_M249 }, + { "m3", WEAPON_M3 }, + { "m4a1", WEAPON_M4A1 }, + { "tmp", WEAPON_TMP }, + { "g3sg1", WEAPON_G3SG1 }, + { "flash", WEAPON_FLASHBANG }, + { "deagle", WEAPON_DEAGLE }, + { "sg552", WEAPON_SG552 }, + { "ak47", WEAPON_AK47 }, + { "knife", WEAPON_KNIFE }, + { "p90", WEAPON_P90 }, + { "shield", WEAPON_SHIELDGUN }, + { "none", WEAPON_NONE }, + { "grenade", WEAPON_HEGRENADE }, + { "hegrenade", WEAPON_HEGRENADE }, + { "glock18", WEAPON_GLOCK18 }, + { "elite", WEAPON_ELITE }, + { "fiveseven", WEAPON_FIVESEVEN }, + { "mp5navy", WEAPON_MP5N }, + { NULL, WEAPON_NONE } }; WeaponBuyAliasInfo weaponBuyAliasInfo[] = { - { "galil", WEAPON_GALIL, "#Galil" }, - { "defender", WEAPON_GALIL, "#Galil" }, - { "ak47", WEAPON_AK47, "#AK47" }, - { "cv47", WEAPON_AK47, "#AK47" }, - { "scout", WEAPON_SCOUT, NULL }, - { "sg552", WEAPON_SG552, "#SG552" }, - { "krieg552", WEAPON_SG552, "#SG552" }, - { "awp", WEAPON_AWP, NULL }, - { "magnum", WEAPON_AWP, NULL }, - { "g3sg1", WEAPON_G3SG1, "#G3SG1" }, - { "d3au1", WEAPON_G3SG1, "#G3SG1" }, - { "famas", WEAPON_FAMAS, "#Famas" }, - { "clarion", WEAPON_FAMAS, "#Famas" }, - { "m4a1", WEAPON_M4A1, "#M4A1" }, - { "aug", WEAPON_AUG, "#Aug" }, - { "bullpup", WEAPON_AUG, "#Aug" }, - { "sg550", WEAPON_SG550, "#SG550" }, - { "krieg550", WEAPON_SG550, "#SG550" }, - { "glock", WEAPON_GLOCK18, NULL }, - { "9x19mm", WEAPON_GLOCK18, NULL }, - { "usp", WEAPON_USP, NULL }, - { "km45", WEAPON_USP, NULL }, - { "p228", WEAPON_P228, NULL }, - { "228compact", WEAPON_P228, NULL }, - { "deagle", WEAPON_DEAGLE, NULL }, - { "nighthaw", WEAPON_DEAGLE, NULL }, - { "elites", WEAPON_ELITE, "#Beretta96G" }, - { "fn57", WEAPON_FIVESEVEN, "#FiveSeven" }, - { "fiveseven", WEAPON_FIVESEVEN, "#FiveSeven" }, - { "m3", WEAPON_M3, NULL }, - { "12gauge", WEAPON_M3, NULL }, - { "xm1014", WEAPON_XM1014, NULL }, - { "autoshotgun", WEAPON_XM1014, NULL }, - { "mac10", WEAPON_MAC10, "#Mac10" }, - { "tmp", WEAPON_TMP, "#tmp" }, - { "mp", WEAPON_TMP, "#tmp" }, - { "mp5", WEAPON_MP5N, NULL }, - { "smg", WEAPON_MP5N, NULL }, - { "ump45", WEAPON_UMP45, NULL }, - { "p90", WEAPON_P90, NULL }, - { "c90", WEAPON_P90, NULL }, - { "m249", WEAPON_M249, NULL }, - { NULL, WEAPON_NONE, NULL } + { "galil", WEAPON_GALIL, "#Galil" }, + { "defender", WEAPON_GALIL, "#Galil" }, + { "ak47", WEAPON_AK47, "#AK47" }, + { "cv47", WEAPON_AK47, "#AK47" }, + { "scout", WEAPON_SCOUT, NULL }, + { "sg552", WEAPON_SG552, "#SG552" }, + { "krieg552", WEAPON_SG552, "#SG552" }, + { "awp", WEAPON_AWP, NULL }, + { "magnum", WEAPON_AWP, NULL }, + { "g3sg1", WEAPON_G3SG1, "#G3SG1" }, + { "d3au1", WEAPON_G3SG1, "#G3SG1" }, + { "famas", WEAPON_FAMAS, "#Famas" }, + { "clarion", WEAPON_FAMAS, "#Famas" }, + { "m4a1", WEAPON_M4A1, "#M4A1" }, + { "aug", WEAPON_AUG, "#Aug" }, + { "bullpup", WEAPON_AUG, "#Aug" }, + { "sg550", WEAPON_SG550, "#SG550" }, + { "krieg550", WEAPON_SG550, "#SG550" }, + { "glock", WEAPON_GLOCK18, NULL }, + { "9x19mm", WEAPON_GLOCK18, NULL }, + { "usp", WEAPON_USP, NULL }, + { "km45", WEAPON_USP, NULL }, + { "p228", WEAPON_P228, NULL }, + { "228compact", WEAPON_P228, NULL }, + { "deagle", WEAPON_DEAGLE, NULL }, + { "nighthaw", WEAPON_DEAGLE, NULL }, + { "elites", WEAPON_ELITE, "#Beretta96G" }, + { "fn57", WEAPON_FIVESEVEN, "#FiveSeven" }, + { "fiveseven", WEAPON_FIVESEVEN, "#FiveSeven" }, + { "m3", WEAPON_M3, NULL }, + { "12gauge", WEAPON_M3, NULL }, + { "xm1014", WEAPON_XM1014, NULL }, + { "autoshotgun", WEAPON_XM1014, NULL }, + { "mac10", WEAPON_MAC10, "#Mac10" }, + { "tmp", WEAPON_TMP, "#tmp" }, + { "mp", WEAPON_TMP, "#tmp" }, + { "mp5", WEAPON_MP5N, NULL }, + { "smg", WEAPON_MP5N, NULL }, + { "ump45", WEAPON_UMP45, NULL }, + { "p90", WEAPON_P90, NULL }, + { "c90", WEAPON_P90, NULL }, + { "m249", WEAPON_M249, NULL }, + { NULL, WEAPON_NONE, NULL } }; WeaponClassAliasInfo weaponClassAliasInfo[] = { - { "p228", WEAPONCLASS_PISTOL }, - { "???", WEAPONCLASS_PISTOL }, - { "scout", WEAPONCLASS_SNIPERRIFLE }, - { "hegren", WEAPONCLASS_GRENADE }, - { "xm1014", WEAPONCLASS_SHOTGUN }, - { "c4", WEAPONCLASS_GRENADE }, - { "mac10", WEAPONCLASS_SUBMACHINEGUN }, - { "aug", WEAPONCLASS_RIFLE }, - { "sgren", WEAPONCLASS_GRENADE }, - { "elites", WEAPONCLASS_PISTOL }, - { "fn57", WEAPONCLASS_PISTOL }, - { "ump45", WEAPONCLASS_SUBMACHINEGUN }, - { "sg550", WEAPONCLASS_SNIPERRIFLE }, - { "galil", WEAPONCLASS_RIFLE }, - { "famas", WEAPONCLASS_RIFLE }, - { "usp", WEAPONCLASS_PISTOL }, - { "glock", WEAPONCLASS_PISTOL }, - { "awp", WEAPONCLASS_SNIPERRIFLE }, - { "mp5", WEAPONCLASS_SUBMACHINEGUN }, - { "m249", WEAPONCLASS_MACHINEGUN }, - { "m3", WEAPONCLASS_SHOTGUN }, - { "m4a1", WEAPONCLASS_RIFLE }, - { "tmp", WEAPONCLASS_SUBMACHINEGUN }, - { "g3sg1", WEAPONCLASS_SNIPERRIFLE }, - { "flash", WEAPONCLASS_GRENADE }, - { "deagle", WEAPONCLASS_PISTOL }, - { "sg552", WEAPONCLASS_RIFLE }, - { "ak47", WEAPONCLASS_RIFLE }, - { "knife", WEAPONCLASS_KNIFE }, - { "p90", WEAPONCLASS_SUBMACHINEGUN }, - { "shield", WEAPONCLASS_PISTOL }, - { "grenade", WEAPONCLASS_GRENADE }, - { "hegrenade", WEAPONCLASS_GRENADE }, - { "glock18", WEAPONCLASS_PISTOL }, - { "elite", WEAPONCLASS_PISTOL }, - { "fiveseven", WEAPONCLASS_PISTOL }, - { "mp5navy", WEAPONCLASS_SUBMACHINEGUN }, - { "grenade", WEAPONCLASS_GRENADE }, - { "pistol", WEAPONCLASS_PISTOL }, - { "SMG", WEAPONCLASS_SUBMACHINEGUN }, - { "machinegun", WEAPONCLASS_MACHINEGUN }, - { "shotgun", WEAPONCLASS_SHOTGUN }, - { "rifle", WEAPONCLASS_RIFLE }, - { "rifle", WEAPONCLASS_RIFLE }, - { "sniper", WEAPONCLASS_SNIPERRIFLE }, - { "none", WEAPONCLASS_NONE }, - { NULL, WEAPONCLASS_NONE } + { "p228", WEAPONCLASS_PISTOL }, + { "???", WEAPONCLASS_PISTOL }, + { "scout", WEAPONCLASS_SNIPERRIFLE }, + { "hegren", WEAPONCLASS_GRENADE }, + { "xm1014", WEAPONCLASS_SHOTGUN }, + { "c4", WEAPONCLASS_GRENADE }, + { "mac10", WEAPONCLASS_SUBMACHINEGUN }, + { "aug", WEAPONCLASS_RIFLE }, + { "sgren", WEAPONCLASS_GRENADE }, + { "elites", WEAPONCLASS_PISTOL }, + { "fn57", WEAPONCLASS_PISTOL }, + { "ump45", WEAPONCLASS_SUBMACHINEGUN }, + { "sg550", WEAPONCLASS_SNIPERRIFLE }, + { "galil", WEAPONCLASS_RIFLE }, + { "famas", WEAPONCLASS_RIFLE }, + { "usp", WEAPONCLASS_PISTOL }, + { "glock", WEAPONCLASS_PISTOL }, + { "awp", WEAPONCLASS_SNIPERRIFLE }, + { "mp5", WEAPONCLASS_SUBMACHINEGUN }, + { "m249", WEAPONCLASS_MACHINEGUN }, + { "m3", WEAPONCLASS_SHOTGUN }, + { "m4a1", WEAPONCLASS_RIFLE }, + { "tmp", WEAPONCLASS_SUBMACHINEGUN }, + { "g3sg1", WEAPONCLASS_SNIPERRIFLE }, + { "flash", WEAPONCLASS_GRENADE }, + { "deagle", WEAPONCLASS_PISTOL }, + { "sg552", WEAPONCLASS_RIFLE }, + { "ak47", WEAPONCLASS_RIFLE }, + { "knife", WEAPONCLASS_KNIFE }, + { "p90", WEAPONCLASS_SUBMACHINEGUN }, + { "shield", WEAPONCLASS_PISTOL }, + { "grenade", WEAPONCLASS_GRENADE }, + { "hegrenade", WEAPONCLASS_GRENADE }, + { "glock18", WEAPONCLASS_PISTOL }, + { "elite", WEAPONCLASS_PISTOL }, + { "fiveseven", WEAPONCLASS_PISTOL }, + { "mp5navy", WEAPONCLASS_SUBMACHINEGUN }, + { "grenade", WEAPONCLASS_GRENADE }, + { "pistol", WEAPONCLASS_PISTOL }, + { "SMG", WEAPONCLASS_SUBMACHINEGUN }, + { "machinegun", WEAPONCLASS_MACHINEGUN }, + { "shotgun", WEAPONCLASS_SHOTGUN }, + { "rifle", WEAPONCLASS_RIFLE }, + { "rifle", WEAPONCLASS_RIFLE }, + { "sniper", WEAPONCLASS_SNIPERRIFLE }, + { "none", WEAPONCLASS_NONE }, + { NULL, WEAPONCLASS_NONE } }; WeaponInfoStruct weaponInfo[27] = { - { WEAPON_P228, P228_PRICE, AMMO_357SIG_PRICE, AMMO_357SIG_BUY, P228_MAX_CLIP, MAX_AMMO_357SIG, AMMO_357SIG, "weapon_p228" }, - { WEAPON_GLOCK, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" }, - { WEAPON_GLOCK18, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" }, - { WEAPON_SCOUT, SCOUT_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, SCOUT_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_scout" }, - { WEAPON_XM1014, XM1014_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, XM1014_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_xm1014" }, - { WEAPON_MAC10, MAC10_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, MAC10_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_mac10" }, - { WEAPON_AUG, AUG_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, AUG_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_aug" }, - { WEAPON_ELITE, ELITE_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, ELITE_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_elite" }, - { WEAPON_FIVESEVEN, FIVESEVEN_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, FIVESEVEN_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_fiveseven" }, - { WEAPON_UMP45, UMP45_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, UMP45_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_ump45" }, - { WEAPON_SG550, SG550_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG550_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg550" }, - { WEAPON_GALIL, GALIL_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, GALIL_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_galil" }, - { WEAPON_FAMAS, FAMAS_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, FAMAS_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_famas" }, - { WEAPON_USP, USP_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, USP_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_usp" }, - { WEAPON_AWP, AWP_PRICE, AMMO_338MAG_PRICE, AMMO_338MAG_BUY, AWP_MAX_CLIP, MAX_AMMO_338MAGNUM, AMMO_338MAGNUM, "weapon_awp" }, - { WEAPON_MP5N, MP5NAVY_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, MP5N_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_mp5navy" }, - { WEAPON_M249, M249_PRICE, AMMO_556MM_PRICE, AMMO_556NATOBOX_BUY, M249_MAX_CLIP, MAX_AMMO_556NATOBOX, AMMO_556NATOBOX, "weapon_m249" }, - { WEAPON_M3, M3_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, M3_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_m3" }, - { WEAPON_M4A1, M4A1_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, M4A1_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_m4a1" }, - { WEAPON_TMP, TMP_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, TMP_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_tmp" }, - { WEAPON_G3SG1, G3SG1_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, G3SG1_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_g3sg1" }, - { WEAPON_DEAGLE, DEAGLE_PRICE, AMMO_50AE_PRICE, AMMO_50AE_BUY, DEAGLE_MAX_CLIP, MAX_AMMO_50AE, AMMO_50AE, "weapon_deagle" }, - { WEAPON_SG552, SG552_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG552_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg552" }, - { WEAPON_AK47, AK47_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, AK47_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_ak47" }, - { WEAPON_P90, P90_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, P90_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_p90" }, - { WEAPON_SHIELDGUN, SHIELDGUN_PRICE, 0, 0, 0, 0, 0xFFFFFFFFu, NULL }, - { 0, 0, 0, 0, 0, 0, 0xFFFFFFFFu, NULL } + { WEAPON_P228, P228_PRICE, AMMO_357SIG_PRICE, AMMO_357SIG_BUY, P228_MAX_CLIP, MAX_AMMO_357SIG, AMMO_357SIG, "weapon_p228" }, + { WEAPON_GLOCK, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" }, + { WEAPON_GLOCK18, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" }, + { WEAPON_SCOUT, SCOUT_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, SCOUT_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_scout" }, + { WEAPON_XM1014, XM1014_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, XM1014_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_xm1014" }, + { WEAPON_MAC10, MAC10_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, MAC10_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_mac10" }, + { WEAPON_AUG, AUG_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, AUG_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_aug" }, + { WEAPON_ELITE, ELITE_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, ELITE_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_elite" }, + { WEAPON_FIVESEVEN, FIVESEVEN_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, FIVESEVEN_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_fiveseven" }, + { WEAPON_UMP45, UMP45_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, UMP45_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_ump45" }, + { WEAPON_SG550, SG550_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG550_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg550" }, + { WEAPON_GALIL, GALIL_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, GALIL_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_galil" }, + { WEAPON_FAMAS, FAMAS_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, FAMAS_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_famas" }, + { WEAPON_USP, USP_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, USP_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_usp" }, + { WEAPON_AWP, AWP_PRICE, AMMO_338MAG_PRICE, AMMO_338MAG_BUY, AWP_MAX_CLIP, MAX_AMMO_338MAGNUM, AMMO_338MAGNUM, "weapon_awp" }, + { WEAPON_MP5N, MP5NAVY_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, MP5N_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_mp5navy" }, + { WEAPON_M249, M249_PRICE, AMMO_556MM_PRICE, AMMO_556NATOBOX_BUY, M249_MAX_CLIP, MAX_AMMO_556NATOBOX, AMMO_556NATOBOX, "weapon_m249" }, + { WEAPON_M3, M3_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, M3_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_m3" }, + { WEAPON_M4A1, M4A1_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, M4A1_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_m4a1" }, + { WEAPON_TMP, TMP_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, TMP_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_tmp" }, + { WEAPON_G3SG1, G3SG1_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, G3SG1_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_g3sg1" }, + { WEAPON_DEAGLE, DEAGLE_PRICE, AMMO_50AE_PRICE, AMMO_50AE_BUY, DEAGLE_MAX_CLIP, MAX_AMMO_50AE, AMMO_50AE, "weapon_deagle" }, + { WEAPON_SG552, SG552_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG552_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg552" }, + { WEAPON_AK47, AK47_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, AK47_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_ak47" }, + { WEAPON_P90, P90_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, P90_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_p90" }, + { WEAPON_SHIELDGUN, SHIELDGUN_PRICE, 0, 0, 0, 0, -1, NULL }, + { 0, 0, 0, 0, 0, 0, -1, NULL } }; -//TODO: 0xFFFFFFFFu changed to -1 ? what unsigned int ? if ammoType int type #else // HOOK_GAMEDLL AutoBuyInfoStruct g_autoBuyInfo[35]; @@ -293,32 +292,32 @@ WeaponClassType WeaponIDToWeaponClass(int id) /* <22cee3> ../cstrike/dlls/weapontype.cpp:285 */ bool IsPrimaryWeapon(int id) { - switch(id) + switch (id) { - case WEAPON_SCOUT: - case WEAPON_XM1014: - case WEAPON_MAC10: - case WEAPON_AUG: - case WEAPON_UMP45: - case WEAPON_SG550: - case WEAPON_GALIL: - case WEAPON_FAMAS: - case WEAPON_AWP: - case WEAPON_MP5N: - case WEAPON_M249: - case WEAPON_M3: - case WEAPON_M4A1: - case WEAPON_TMP: - case WEAPON_G3SG1: - case WEAPON_SG552: - case WEAPON_AK47: - case WEAPON_P90: - case WEAPON_SHIELDGUN: - { - return true; - } - default: - break; + case WEAPON_SCOUT: + case WEAPON_XM1014: + case WEAPON_MAC10: + case WEAPON_AUG: + case WEAPON_UMP45: + case WEAPON_SG550: + case WEAPON_GALIL: + case WEAPON_FAMAS: + case WEAPON_AWP: + case WEAPON_MP5N: + case WEAPON_M249: + case WEAPON_M3: + case WEAPON_M4A1: + case WEAPON_TMP: + case WEAPON_G3SG1: + case WEAPON_SG552: + case WEAPON_AK47: + case WEAPON_P90: + case WEAPON_SHIELDGUN: + { + return true; + } + default: + break; } return false; } @@ -328,17 +327,15 @@ NOXREF bool IsSecondaryWeapon(int id) { switch(id) { - case WEAPON_P228: - case WEAPON_ELITE: - case WEAPON_FIVESEVEN: - case WEAPON_USP: - case WEAPON_GLOCK18: - case WEAPON_DEAGLE: - { - return true; - } - default: - break; + case WEAPON_P228: + case WEAPON_ELITE: + case WEAPON_FIVESEVEN: + case WEAPON_USP: + case WEAPON_GLOCK18: + case WEAPON_DEAGLE: + return true; + default: + break; } return false; } @@ -361,7 +358,7 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi { if (playerTeam == CT) { - switch(weaponID) + switch (weaponID) { case WEAPON_P228: case WEAPON_XM1014: @@ -391,7 +388,7 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi } else if (playerTeam == TERRORIST) { - switch(weaponID) + switch (weaponID) { case WEAPON_P228: case WEAPON_MAC10: @@ -416,7 +413,7 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi } if (playerTeam == CT) { - switch(weaponID) + switch (weaponID) { case WEAPON_P228: case WEAPON_SCOUT: diff --git a/regamedll/dlls/world.cpp b/regamedll/dlls/world.cpp index 54242f60..1cda0090 100644 --- a/regamedll/dlls/world.cpp +++ b/regamedll/dlls/world.cpp @@ -75,7 +75,7 @@ TYPEDESCRIPTION gGlobalEntitySaveData[] = DLL_DECALLIST gDecals[42]; -TYPEDESCRIPTION (*CGlobalState::pm_SaveData)[1]; +TYPEDESCRIPTION IMPLEMENT_ARRAY_CLASS(CGlobalState, m_SaveData)[1]; TYPEDESCRIPTION gGlobalEntitySaveData[3]; #endif // HOOK_GAMEDLL @@ -84,85 +84,155 @@ TYPEDESCRIPTION gGlobalEntitySaveData[3]; LINK_ENTITY_TO_CLASS(infodecal, CDecal); /* <1db00a> ../cstrike/dlls/world.cpp:123 */ -NOBODY void CDecal::Spawn(void) +void CDecal::__MAKE_VHOOK(Spawn)(void) { -// Spawn(CDecal *const this); // 123 -} + if (pev->skin < 0 || (gpGlobals->deathmatch != 0.0f && (pev->spawnflags & SF_DECAL_NOTINDEATHMATCH))) + { + REMOVE_ENTITY(ENT(pev)); + return; + } -/* <1daee2> ../cstrike/dlls/world.cpp:171 */ -NOBODY void CDecal::StaticDecal(void) -{ -// { -// TraceResult trace; // 173 -// int entityIndex; // 174 -// int modelIndex; // 174 -// operator+(const Vector *const this, -// const Vector &v); // 176 -// operator-(const Vector *const this, -// const Vector &v); // 176 -// ENTINDEX(edict_t *pEdict); // 178 -// VARS(edict_t *pent); // 180 -// } + if (FStringNull(pev->targetname)) + { + SetThink(&CDecal::StaticDecal); + + // if there's no targetname, the decal will spray itself on as soon as the world is done spawning. + pev->nextthink = gpGlobals->time; + } + else + { + // if there IS a targetname, the decal sprays itself on when it is triggered. + SetThink(&CBaseEntity::SUB_DoNothing); + SetUse(&CDecal::TriggerDecal); + } } /* <1dad69> ../cstrike/dlls/world.cpp:145 */ -NOBODY void CDecal::TriggerDecal(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) +void CDecal::TriggerDecal(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { -// { -// TraceResult trace; // 149 -// int entityIndex; // 150 -// operator+(const Vector *const this, -// const Vector &v); // 152 -// operator-(const Vector *const this, -// const Vector &v); // 152 -// MESSAGE_BEGIN(int msg_dest, -// int msg_type, -// const float *pOrigin, -// edict_t *ed); // 154 -// ENTINDEX(edict_t *pEdict); // 160 -// VARS(edict_t *pent); // 163 -// } + // this is set up as a USE function for infodecals that have targetnames, so that the + // decal doesn't get applied until it is fired. (usually by a scripted sequence) + TraceResult trace; + int entityIndex; + + UTIL_TraceLine(pev->origin - Vector(5, 5, 5), pev->origin + Vector(5, 5, 5), ignore_monsters, ENT(pev), &trace); + + MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); + WRITE_BYTE(TE_BSPDECAL); + WRITE_COORD(pev->origin.x); + WRITE_COORD(pev->origin.y); + WRITE_COORD(pev->origin.z); + WRITE_SHORT((int)pev->skin); + entityIndex = (short)ENTINDEX(trace.pHit); + WRITE_SHORT(entityIndex); + if (entityIndex) + { + WRITE_SHORT((int)VARS(trace.pHit)->modelindex); + } + MESSAGE_END(); + + SetThink(&CDecal::SUB_Remove); + pev->nextthink = gpGlobals->time + 0.1f; +} + +/* <1daee2> ../cstrike/dlls/world.cpp:171 */ +void CDecal::StaticDecal(void) +{ + TraceResult trace; + int entityIndex, modelIndex; + + UTIL_TraceLine(pev->origin - Vector(5, 5, 5), pev->origin + Vector(5, 5, 5), ignore_monsters, ENT(pev), &trace); + + entityIndex = (short)ENTINDEX(trace.pHit); + + if (entityIndex) + modelIndex = (int)VARS(trace.pHit)->modelindex; + else + modelIndex = 0; + + STATIC_DECAL(pev->origin, (int)pev->skin, entityIndex, modelIndex); + SUB_Remove(); } /* <1db068> ../cstrike/dlls/world.cpp:190 */ -NOBODY void CDecal::KeyValue(KeyValueData *pkvd) +void CDecal::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { -// FStrEq(const char *sz1, -// const char *sz2); // 192 -// KeyValue(CBaseEntity *const this, -// KeyValueData *pkvd); // 202 -// KeyValue(CDecal *const this, -// KeyValueData *pkvd); // 190 + if (FStrEq(pkvd->szKeyName, "texture")) + { + pev->skin = DECAL_INDEX(pkvd->szValue); + + // Found + if (pev->skin >= 0) + return; + + ALERT(at_console, "Can't find decal %s\n", pkvd->szValue); + } + else + CBaseEntity::KeyValue(pkvd); } /* <1db4f5> ../cstrike/dlls/world.cpp:212 */ LINK_ENTITY_TO_CLASS(bodyque, CCorpse); /* <1da107> ../cstrike/dlls/world.cpp:214 */ -NOXREF void InitBodyQue(void) +static void InitBodyQue(void) { g_pBodyQueueHead = NULL; } +// make a body que entry for the given ent so the ent can be respawned elsewhere +// GLOBALS ASSUMED SET: g_eoBodyQueueHeadstion + /* <1db5bf> ../cstrike/dlls/world.cpp:242 */ -NOBODY void CopyToBodyQue(entvars_t *pev) +void CopyToBodyQue(entvars_t *pev) { +#if 0 + if (pev->effects & EF_NODRAW) + return; + + entvars_t *pevHead = VARS(g_pBodyQueueHead); + + pevHead->angles = pev->angles; + pevHead->model = pev->model; + pevHead->modelindex = pev->modelindex; + pevHead->frame = pev->frame; + pevHead->colormap = pev->colormap; + pevHead->movetype = MOVETYPE_TOSS; + pevHead->velocity = pev->velocity; + pevHead->flags = 0; + pevHead->deadflag = pev->deadflag; + pevHead->renderfx = kRenderFxDeadPlayer; + pevHead->renderamt = ENTINDEX(ENT(pev)); + + pevHead->effects = pev->effects | EF_NOINTERP; + + pevHead->sequence = pev->sequence; + pevHead->animtime = pev->animtime; + + UTIL_SetOrigin(pevHead, pev->origin); + UTIL_SetSize(pevHead, pev->mins, pev->maxs); + + g_pBodyQueueHead = pevHead->owner; +#endif } /* <1db5e9> ../cstrike/dlls/world.cpp:275 */ -NOBODY void ClearBodyQue(void) +void ClearBodyQue(void) { + ; } /* <1db601> ../cstrike/dlls/world.cpp:294 */ CGlobalState::CGlobalState(void) { -// Reset(CGlobalState *const this); // 296 + Reset(); } /* <1db63b> ../cstrike/dlls/world.cpp:299 */ -NOBODY void CGlobalState::Reset(void) +void CGlobalState::Reset(void) { + m_pList = NULL; + m_listCount = 0; } /* <1db69e> ../cstrike/dlls/world.cpp:305 */ @@ -173,12 +243,15 @@ globalentity_t *CGlobalState::Find(string_t globalname) globalentity_t *pTest = m_pList; const char *pEntityName = STRING(globalname); - while (pTest) + + while (pTest != NULL) { if (!Q_strcmp(pEntityName, pTest->name)) break; + pTest = pTest->pNext; } + return pTest; } @@ -201,183 +274,409 @@ void CGlobalState::DumpGlobals(void) } /* <1db76a> ../cstrike/dlls/world.cpp:345 */ -NOBODY void CGlobalState::EntityAdd(string_t globalname, string_t mapName, GLOBALESTATE state) +void CGlobalState::EntityAdd(string_t globalname, string_t mapName, GLOBALESTATE state) { -// { -// globalentity_t *pNewEntity; // 349 -// } + assert(!Find(globalname)); + + globalentity_t *pNewEntity = (globalentity_t *)calloc(sizeof(globalentity_t), 1); + assert(pNewEntity != NULL); + + pNewEntity->pNext = m_pList; + m_pList = pNewEntity; + Q_strcpy(pNewEntity->name, STRING(globalname)); + Q_strcpy(pNewEntity->levelName, STRING(mapName)); + pNewEntity->state = state; + + m_listCount++; } /* <1db7b3> ../cstrike/dlls/world.cpp:360 */ void CGlobalState::EntitySetState(string_t globalname, GLOBALESTATE state) { globalentity_t *pEnt = Find(globalname); + if (pEnt) + { pEnt->state = state; + } } /* <1db873> ../cstrike/dlls/world.cpp:369 */ -NOBODY const globalentity_t *CGlobalState::EntityFromTable(string_t globalname) +const globalentity_t *CGlobalState::EntityFromTable(string_t globalname) { -// { -// globalentity_t *pEnt; // 371 -// Find(CGlobalState *const this, -// string_t globalname); // 371 -// } + globalentity_t *pEnt = Find(globalname); + + return pEnt; } /* <1db91c> ../cstrike/dlls/world.cpp:377 */ -NOBODY GLOBALESTATE CGlobalState::EntityGetState(string_t globalname) +GLOBALESTATE CGlobalState::EntityGetState(string_t globalname) { -// { -// globalentity_t *pEnt; // 379 -// Find(CGlobalState *const this, -// string_t globalname); // 379 -// } + globalentity_t *pEnt = Find(globalname); + + if (pEnt != NULL) + { + return pEnt->state; + } + + return GLOBAL_OFF; } /* <1db9c5> ../cstrike/dlls/world.cpp:402 */ -NOBODY int CGlobalState::Save(CSave &save) +int CGlobalState::Save(CSave &save) { -// { -// int i; // 404 -// globalentity_t *pEntity; // 405 -// } + int i; + globalentity_t *pEntity; + + if (!save.WriteFields("GLOBAL", this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData)))) + { + return 0; + } + + pEntity = m_pList; + for (i = 0; i < m_listCount && pEntity != NULL; i++) + { + if (!save.WriteFields("GENT", pEntity, gGlobalEntitySaveData, ARRAYSIZE(gGlobalEntitySaveData))) + { + return 0; + } + + pEntity = pEntity->pNext; + } + + return 1; } /* <1dba07> ../cstrike/dlls/world.cpp:422 */ -NOBODY int CGlobalState::Restore(CRestore &restore) +int CGlobalState::Restore(CRestore &restore) { -// { -// int i; // 424 -// int listCount; // 424 -// globalentity_t tmpEntity; // 425 -// ClearStates(CGlobalState *const this); // 428 -// EntityAdd(CGlobalState *const this, -// string_t globalname, -// string_t mapName, -// GLOBALESTATE state); // 439 -// } + int i, listCount; + globalentity_t tmpEntity; + + ClearStates(); + + if (!restore.ReadFields("GLOBAL", this, IMPLEMENT_ARRAY(m_SaveData), ARRAYSIZE(IMPLEMENT_ARRAY(m_SaveData)))) + { + return 0; + } + + // Get new list count + listCount = m_listCount; + + // Clear loaded data + m_listCount = 0; + + for (i = 0; i < listCount; i++) + { + if (!restore.ReadFields("GENT", &tmpEntity, gGlobalEntitySaveData, ARRAYSIZE(gGlobalEntitySaveData))) + { + return 0; + } + + EntityAdd(MAKE_STRING(tmpEntity.name), MAKE_STRING(tmpEntity.levelName), tmpEntity.state); + } + + return 1; } /* <1dbaf2> ../cstrike/dlls/world.cpp:444 */ -NOBODY void CGlobalState::EntityUpdate(string_t globalname, string_t mapname) +void CGlobalState::EntityUpdate(string_t globalname, string_t mapname) { -// { -// globalentity_t *pEnt; // 446 -// Find(CGlobalState *const this, -// string_t globalname); // 446 -// } + globalentity_t *pEnt = Find(globalname); + + if (pEnt != NULL) + { + Q_strcpy(pEnt->levelName, STRING(mapname)); + } } /* <1dbbae> ../cstrike/dlls/world.cpp:453 */ -NOBODY void CGlobalState::ClearStates(void) +void CGlobalState::ClearStates(void) { -// { -// globalentity_t *pFree; // 455 -// { -// globalentity_t *pNext; // 458 -// } -// Reset(CGlobalState *const this); // 462 -// } + globalentity_t *pFree = m_pList; + + while (pFree != NULL) + { + globalentity_t *pNext = pFree->pNext; + + free(pFree); + pFree = pNext; + } + + Reset(); } /* <1dbc13> ../cstrike/dlls/world.cpp:466 */ -NOBODY void SaveGlobalState(SAVERESTOREDATA *pSaveData) +void SaveGlobalState(SAVERESTOREDATA *pSaveData) { -// { -// class CSave saveHelper; // 468 -// Save(CGlobalState *const this, -// class CSave &save); // 469 -// CSave(CSave *const this, -// SAVERESTOREDATA *pdata); // 468 -// ~CSave(CSave *const this, -// int const __in_chrg); // 468 -// } + CSave saveHelper(pSaveData); + gGlobalState.Save(saveHelper); } /* <1dbcde> ../cstrike/dlls/world.cpp:473 */ -NOBODY void RestoreGlobalState(SAVERESTOREDATA *pSaveData) +void RestoreGlobalState(SAVERESTOREDATA *pSaveData) { -// { -// class CRestore restoreHelper; // 475 -// CRestore(CRestore *const this, -// SAVERESTOREDATA *pdata); // 475 -// Restore(CGlobalState *const this, -// class CRestore &restore); // 476 -// ~CRestore(CRestore *const this, -// int const __in_chrg); // 475 -// } + CRestore restoreHelper(pSaveData); + gGlobalState.Restore(restoreHelper); } /* <1dbe72> ../cstrike/dlls/world.cpp:480 */ -NOBODY void ResetGlobalState(void) +void ResetGlobalState(void) { -// ClearStates(CGlobalState *const this); // 482 + gGlobalState.ClearStates(); + + // Init the HUD on a new game / load game + gInitHUD = TRUE; } /* <1dbeff> ../cstrike/dlls/world.cpp:493 */ LINK_ENTITY_TO_CLASS(worldspawn, CWorld); /* <1dad1d> ../cstrike/dlls/world.cpp:502 */ -void CWorld::Spawn_(void) +void CWorld::__MAKE_VHOOK(Spawn)(void) { - //int flength; - //char *pFile; - EmptyEntityHashTable(); g_fGameOver = FALSE; - //TODO: reverse me - //Precache(); + Precache(); - g_flWeaponCheat = g_engfuncs.pfnCVarGetFloat("sv_cheats"); - /*g_szMapBriefingText[0] = 0; - flength = 0; + g_flWeaponCheat = CVAR_GET_FLOAT("sv_cheats"); + g_szMapBriefingText[0] = '\0'; - pFile = (char *)LOAD_FILE_FOR_ME(UTIL_VarArgs("maps/%s.txt",STRING(gpGlobals->mapname)), &flength); - if (pFile && flength) + int flength = 0; + char *pFile = (char *)LOAD_FILE_FOR_ME(UTIL_VarArgs("maps/%s.txt", STRING(gpGlobals->mapname)), &flength); + + if (pFile && flength != NULL) { - Q_strncpy(g_szMapBriefingText, pFile, 510); + Q_strncpy(g_szMapBriefingText, pFile, ARRAYSIZE(g_szMapBriefingText) - 2); + #ifdef REGAMEDLL_FIXES - g_szMapBriefingText[510] = 0; + g_szMapBriefingText[ ARRAYSIZE(g_szMapBriefingText) - 2 ] = 0; #endif // REGAMEDLL_FIXES - PRECACHE_GENERIC(UTIL_VarArgs("maps/%s.txt",STRING(gpGlobals->mapname))); + PRECACHE_GENERIC(UTIL_VarArgs("maps/%s.txt", STRING(gpGlobals->mapname))); FREE_FILE(pFile); } else { pFile = (char *)LOAD_FILE_FOR_ME(UTIL_VarArgs("maps/default.txt"), &flength); - if (pFile && flength) + + if (pFile != NULL && flength) { - Q_strncpy(g_szMapBriefingText, pFile, 510); + Q_strncpy(g_szMapBriefingText, pFile, ARRAYSIZE(g_szMapBriefingText) - 2); #ifdef REGAMEDLL_FIXES - g_szMapBriefingText[510] = 0; + g_szMapBriefingText[ ARRAYSIZE(g_szMapBriefingText) - 2 ] = 0; #endif // REGAMEDLL_FIXES + PRECACHE_GENERIC(UTIL_VarArgs("maps/default.txt")); FREE_FILE(pFile); } - if (pFile) + + if (pFile != NULL) + { FREE_FILE(pFile); - }*/ + } + } } /* <1dac06> ../cstrike/dlls/world.cpp:542 */ -NOBODY void CWorld::Precache_(void) +void CWorld::__MAKE_VHOOK(Precache)(void) { -// GetClassPtr(CSoundEnt *a); // 566 -// InitBodyQue(void); // 574 -// { -// int i; // 673 -// } -// { -// class CBaseEntity *pEntity; // 705 -// } + g_pLastSpawn = NULL; + g_pLastCTSpawn = NULL; + g_pLastTerroristSpawn = NULL; + + CVAR_SET_STRING("sv_gravity", "800"); + CVAR_SET_STRING("sv_maxspeed", "900"); + CVAR_SET_STRING("sv_stepsize", "18"); + + // clear DSP + CVAR_SET_STRING("room_type", "0"); + + // Set up game rules + if (g_pGameRules) + { + delete g_pGameRules; + } + + g_pGameRules = (CHalfLifeMultiplay *)InstallGameRules(); + + //!!!UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here + + ///!!!LATER - do we want a sound ent in deathmatch? (sjb) + //pSoundEnt = CBaseEntity::Create( "soundent", g_vecZero, g_vecZero, edict() ); + pSoundEnt = GetClassPtr((CSoundEnt *)NULL); + pSoundEnt->Spawn(); + + if (!pSoundEnt) + { + ALERT(at_console, "**COULD NOT CREATE SOUNDENT**\n"); + } + + InitBodyQue(); + + // init sentence group playback stuff from sentences.txt. + // ok to call this multiple times, calls after first are ignored. + SENTENCEG_Init(); + + // init texture type array from materials.txt + TEXTURETYPE_Init(); + + // the area based ambient sounds MUST be the first precache_sounds + // player precaches + // get weapon precaches + + W_Precache(); + ClientPrecache(); + BotPrecache(); + + // sounds used from C physics code + // clears sound channels + PRECACHE_SOUND("common/null.wav"); + + //!!! temporary sound for respawning weapons. + PRECACHE_SOUND("items/suitchargeok1.wav"); + + // player picks up a gun. + PRECACHE_SOUND("items/gunpickup2.wav"); + + // dead bodies hitting the ground (animation events) + PRECACHE_SOUND("common/bodydrop3.wav"); + PRECACHE_SOUND("common/bodydrop4.wav"); + + g_Language = (int)CVAR_GET_FLOAT("sv_language"); + if (g_Language == LANGUAGE_GERMAN) + { + PRECACHE_MODEL("models/germangibs.mdl"); + } + else + { + PRECACHE_MODEL("models/hgibs.mdl"); + PRECACHE_MODEL("models/agibs.mdl"); + } + + PRECACHE_SOUND("weapons/ric1.wav"); + PRECACHE_SOUND("weapons/ric2.wav"); + PRECACHE_SOUND("weapons/ric3.wav"); + PRECACHE_SOUND("weapons/ric4.wav"); + PRECACHE_SOUND("weapons/ric5.wav"); + + PRECACHE_SOUND("weapons/ric_metal-1.wav"); + PRECACHE_SOUND("weapons/ric_metal-2.wav"); + PRECACHE_SOUND("weapons/ric_conc-1.wav"); + PRECACHE_SOUND("weapons/ric_conc-2.wav"); + + // Setup light animation tables. 'a' is total darkness, 'z' is maxbright. + + // 0 normal + LIGHT_STYLE(0, "m"); + + // 1 FLICKER (first variety) + LIGHT_STYLE(1, "mmnmmommommnonmmonqnmmo"); + + // 2 SLOW STRONG PULSE + LIGHT_STYLE(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba"); + + // 3 CANDLE (first variety) + LIGHT_STYLE(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); + + // 4 FAST STROBE + LIGHT_STYLE(4, "mamamamamama"); + + // 5 GENTLE PULSE 1 + LIGHT_STYLE(5, "jklmnopqrstuvwxyzyxwvutsrqponmlkj"); + + // 6 FLICKER (second variety) + LIGHT_STYLE(6, "nmonqnmomnmomomno"); + + // 7 CANDLE (second variety) + LIGHT_STYLE(7, "mmmaaaabcdefgmmmmaaaammmaamm"); + + // 8 CANDLE (third variety) + LIGHT_STYLE(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa"); + + // 9 SLOW STROBE (fourth variety) + LIGHT_STYLE(9, "aaaaaaaazzzzzzzz"); + + // 10 FLUORESCENT FLICKER + LIGHT_STYLE(10, "mmamammmmammamamaaamammma"); + + // 11 SLOW PULSE NOT FADE TO BLACK + LIGHT_STYLE(11, "abcdefghijklmnopqrrqponmlkjihgfedcba"); + + // 12 UNDERWATER LIGHT MUTATION + // this light only distorts the lightmap - no contribution + // is made to the brightness of affected surfaces + LIGHT_STYLE(12, "mmnnmmnnnmmnn"); + + // styles 32-62 are assigned by the light program for switchable lights + // 63 testing + LIGHT_STYLE(63, "a"); + + for (int i = 0; i < ARRAYSIZE(gDecals); i++) + gDecals[i].index = DECAL_INDEX(gDecals[i].name); + + // init the WorldGraph. + WorldGraph.InitGraph(); + + // make sure the .NOD file is newer than the .BSP file. + if (!WorldGraph.CheckNODFile((char *)STRING(gpGlobals->mapname))) + { + // NOD file is not present, or is older than the BSP file. + WorldGraph.AllocNodes(); + } + else + { + // Load the node graph for this level + if (!WorldGraph.FLoadGraph((char *)STRING(gpGlobals->mapname))) + { + // couldn't load, so alloc and prepare to build a graph. + ALERT(at_console, "*Error opening .NOD file\n"); + WorldGraph.AllocNodes(); + } + else + { + ALERT(at_console, "\n*Graph Loaded!\n"); + } + } + + if (pev->speed > 0) + CVAR_SET_FLOAT("sv_zmax", pev->speed); + else + CVAR_SET_FLOAT("sv_zmax", 4096); + + if (pev->netname) + { + ALERT(at_aiconsole, "Chapter title: %s\n", STRING(pev->netname)); + + CBaseEntity *pEntity = CBaseEntity::Create("env_message", g_vecZero, g_vecZero, NULL); + + if (pEntity != NULL) + { + pEntity->SetThink(&CBaseEntity::SUB_CallUseToggle); + pEntity->pev->message = pev->netname; + pev->netname = 0; + pEntity->pev->nextthink = gpGlobals->time + 0.3f; + pEntity->pev->spawnflags = SF_MESSAGE_ONCE; + } + } + + if (pev->spawnflags & SF_WORLD_DARK) + CVAR_SET_FLOAT("v_dark", 1); + else + CVAR_SET_FLOAT("v_dark", 0); + + if (pev->spawnflags & SF_WORLD_TITLE) + { + // display the game title if this key is set + gDisplayTitle = TRUE; + } + else + gDisplayTitle = FALSE; } /* <1db153> ../cstrike/dlls/world.cpp:731 */ -void CWorld::KeyValue_(KeyValueData *pkvd) +void CWorld::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "skyname")) { @@ -386,18 +685,18 @@ void CWorld::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "sounds")) { - gpGlobals->cdAudioTrack = atoi(pkvd->szValue); + gpGlobals->cdAudioTrack = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "WaveHeight")) { - pev->scale = atof(pkvd->szValue) * 0.125; - pkvd->fHandled = TRUE; + pev->scale = Q_atof(pkvd->szValue) * 0.125; CVAR_SET_FLOAT("sv_wateramp", pev->scale); + pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "MaxRange")) { - pev->speed = atof(pkvd->szValue); + pev->speed = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "chaptertitle")) @@ -407,21 +706,25 @@ void CWorld::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "startdark")) { - int flag = atoi(pkvd->szValue); - pkvd->fHandled = TRUE; + int flag = Q_atoi(pkvd->szValue); if (flag) + { pev->spawnflags |= SF_WORLD_DARK; + } + pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "newunit")) { - if (atoi(pkvd->szValue)) - CVAR_SET_FLOAT("sv_newunit", 1.0); + if (Q_atoi(pkvd->szValue)) + CVAR_SET_FLOAT("sv_newunit", 1.0); + pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "gametitle")) { - if (atoi(pkvd->szValue)) - pev->spawnflags |= SF_WORLD_TITLE; + if (Q_atoi(pkvd->szValue)) + pev->spawnflags |= SF_WORLD_TITLE; + pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "mapteams")) @@ -431,8 +734,9 @@ void CWorld::KeyValue_(KeyValueData *pkvd) } else if (FStrEq(pkvd->szKeyName, "defaultteam")) { - if (atoi(pkvd->szValue)) - pev->spawnflags |= SF_WORLD_FORCETEAM; + if (Q_atoi(pkvd->szValue)) + pev->spawnflags |= SF_WORLD_FORCETEAM; + pkvd->fHandled = TRUE; } else @@ -441,6 +745,16 @@ void CWorld::KeyValue_(KeyValueData *pkvd) #ifdef HOOK_GAMEDLL +void CDecal::Spawn(void) +{ + Spawn_(); +} + +void CDecal::KeyValue(KeyValueData *pkvd) +{ + KeyValue_(pkvd); +} + void CWorld::Spawn(void) { Spawn_(); diff --git a/regamedll/dlls/world.h b/regamedll/dlls/world.h index a49c888d..914196da 100644 --- a/regamedll/dlls/world.h +++ b/regamedll/dlls/world.h @@ -32,6 +32,8 @@ #pragma once #endif +#define SF_DECAL_NOTINDEATHMATCH 2048 + #ifdef HOOK_GAMEDLL #define g_pBodyQueueHead (*pg_pBodyQueueHead) @@ -41,11 +43,16 @@ #endif // HOOK_GAMEDLL -NOBODY void CopyToBodyQue(entvars_t *pev); -NOBODY void ClearBodyQue(void); -NOBODY void SaveGlobalState(SAVERESTOREDATA *pSaveData); -NOBODY void RestoreGlobalState(SAVERESTOREDATA *pSaveData); -NOBODY void ResetGlobalState(void); +void CopyToBodyQue(entvars_t *pev); +void ClearBodyQue(void); +void SaveGlobalState(SAVERESTOREDATA *pSaveData); +void RestoreGlobalState(SAVERESTOREDATA *pSaveData); +void ResetGlobalState(void); + +// linked object +C_DLLEXPORT void infodecal(entvars_t *pev); +C_DLLEXPORT void bodyque(entvars_t *pev); +C_DLLEXPORT void worldspawn(entvars_t *pev); extern edict_t *g_pBodyQueueHead; extern CGlobalState gGlobalState; diff --git a/regamedll/dlls/wpn_shared/wpn_usp.cpp b/regamedll/dlls/wpn_shared/wpn_usp.cpp index 1dd12875..1312806f 100644 --- a/regamedll/dlls/wpn_shared/wpn_usp.cpp +++ b/regamedll/dlls/wpn_shared/wpn_usp.cpp @@ -37,7 +37,7 @@ enum usp_shield_e LINK_ENTITY_TO_CLASS(weapon_usp, CUSP); /* <2bad55> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:70 */ -void CUSP::Spawn_(void) +void CUSP::__MAKE_VHOOK(Spawn)(void) { Precache(); m_iId = WEAPON_USP; @@ -48,7 +48,7 @@ void CUSP::Spawn_(void) FallInit(); } -void CUSP::Precache_(void) +void CUSP::__MAKE_VHOOK(Precache)(void) { PRECACHE_MODEL("models/v_usp.mdl"); PRECACHE_MODEL("models/w_usp.mdl"); @@ -69,7 +69,7 @@ void CUSP::Precache_(void) } /* <2bacfb> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:107 */ -int CUSP::GetItemInfo_(ItemInfo *p) +int CUSP::__MAKE_VHOOK(GetItemInfo)(ItemInfo *p) { p->pszAmmo1 = "45ACP"; p->iMaxAmmo1 = MAX_AMMO_45ACP; @@ -88,7 +88,7 @@ int CUSP::GetItemInfo_(ItemInfo *p) } /* <2bad2e> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:124 */ -BOOL CUSP::Deploy_(void) +BOOL CUSP::__MAKE_VHOOK(Deploy)(void) { m_iWeaponState &= ~WPNSTATE_SHIELD_DRAWN; m_flAccuracy = 0.92f; @@ -106,13 +106,13 @@ BOOL CUSP::Deploy_(void) } /* <2bae77> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:147 */ -NOBODY void CUSP::SecondaryAttack_(void) +NOBODY void CUSP::__MAKE_VHOOK(SecondaryAttack)(void) { // SecondaryAttack(CUSP *const this); // 147 } /* <2bb000> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:173 */ -NOBODY void CUSP::PrimaryAttack_(void) +NOBODY void CUSP::__MAKE_VHOOK(PrimaryAttack)(void) { // Length2D(const Vector *const this); // 179 // Length2D(const Vector *const this); // 190 @@ -122,9 +122,9 @@ NOBODY void CUSP::PrimaryAttack_(void) UNTESTED void CUSP::USPFire(float flSpread, float flCycleTime, BOOL fUseSemi) { int flag; - //int iDamage;;//unused + //int iDamage;//unused //Vector vecAiming;//unused - //Vector vecSrc;;//unused + //Vector vecSrc;//unused Vector vecDir; flCycleTime -= 0.075f; @@ -182,7 +182,9 @@ UNTESTED void CUSP::USPFire(float flSpread, float flCycleTime, BOOL fUseSemi) PLAYBACK_EVENT_FULL(flag, m_pPlayer->edict(), m_usFireUSP, 0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, (int)(m_pPlayer->pev->punchangle.x * 100.0f), 0, m_iClip == 0, (int)(m_iWeaponState & WPNSTATE_USP_SILENCED)); if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) + { m_pPlayer->SetSuitUpdate("!HEV_AMO0", 0, 0); + } m_flTimeWeaponIdle = 2.0f; m_pPlayer->pev->punchangle.x -= 2.0f; @@ -190,7 +192,7 @@ UNTESTED void CUSP::USPFire(float flSpread, float flCycleTime, BOOL fUseSemi) } /* <2bae19> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:297 */ -void CUSP::Reload_(void) +void CUSP::__MAKE_VHOOK(Reload)(void) { if (m_pPlayer->ammo_45acp <= 0) return; @@ -211,7 +213,7 @@ void CUSP::Reload_(void) } /* <2b9c2a> ../cstrike/dlls/wpn_shared/wpn_usp.cpp:318 */ -void CUSP::WeaponIdle_(void) +void CUSP::__MAKE_VHOOK(WeaponIdle)(void) { ResetEmptySound(); m_pPlayer->GetAutoaimVector(0.173648); diff --git a/regamedll/engine/common.h b/regamedll/engine/common.h index 7284d683..ffd1ded6 100644 --- a/regamedll/engine/common.h +++ b/regamedll/engine/common.h @@ -102,6 +102,7 @@ typedef struct incomingtransfer_s #define Q_strncmp strncmp //#define Q_strcasecmp _stricmp // Use Q_stricmp //#define Q_strncasecmp _strnicmp // Use Q_strnicmp +#define Q_strdup _strdup #define Q_stricmp _stricmp #define Q_strnicmp _strnicmp #define Q_strstr strstr diff --git a/regamedll/engine/unicode_strtools.cpp b/regamedll/engine/unicode_strtools.cpp index 39cf86ae..1072ece3 100644 --- a/regamedll/engine/unicode_strtools.cpp +++ b/regamedll/engine/unicode_strtools.cpp @@ -28,28 +28,6 @@ #include "precompiled.h" -int __cdecl Q_IsUnprintableW(uchar16 c) -{ - switch (c) - { - case 0x202A: - case 0x202B: - case 0x202C: - case 0x202D: - case 0x202E: - case 0x206A: - case 0x206B: - case 0x206C: - case 0x206D: - case 0x206E: - case 0x206F: - return 1; - - default: - return 0; - } -} - // Purpose: determine if a uchar32 represents a valid Unicode code point /* ../engine/unicode_strtools.cpp:23 */ bool Q_IsValidUChar32(uchar32 uVal) @@ -60,18 +38,56 @@ bool Q_IsValidUChar32(uchar32 uVal) } /* ../engine/unicode_strtools.cpp:50 */ -NOBODY void Q_UTF32ToUChar32(const uchar32 *pUTF32, uchar32 &uVal, bool &bErr) +int Q_UTF32ToUChar32(const uchar32 *pUTF32, uchar32 &uVal, bool &bErr) { + if (Q_IsValidUChar32(pUTF32[0])) + { + uVal = pUTF32[0]; + bErr = false; + return 1; + } + else if (pUTF32[0] - 55296 >= 0x400 || (pUTF32[1] - 56320) >= 0x400) + { + uVal = 63; + bErr = true; + return 1; + } + else + { + uVal = pUTF32[1] + ((uchar32)(pUTF32[0] - 55287) << 10); + if (Q_IsValidUChar32(uVal)) + { + bErr = false; + } + else + { + uVal = 63; + bErr = true; + } + return 2; + } } /* ../engine/unicode_strtools.cpp:57 */ -NOBODY void Q_UChar32ToUTF32Len(uchar32 uVal) +int Q_UChar32ToUTF32Len(uchar32 uVal) { + return (uVal > 0xFFFF) ? 2 : 1; } /* ../engine/unicode_strtools.cpp:62 */ -NOBODY void Q_UChar32ToUTF32(uchar32 uVal, uchar32 *pUTF32) +int Q_UChar32ToUTF32(uchar32 uVal, uchar32 *pUTF32) { + if (uVal <= 0xFFFF) + { + pUTF32[0] = uVal; + return 1; + } + else + { + pUTF32[1] = uVal & 0x3FF | 0xDC00; + pUTF32[0] = ((uVal - 0x10000) >> 10) | 0xD800; + return 2; + } } /* ../engine/unicode_strtools.cpp:70 */ @@ -250,8 +266,9 @@ int Q_UTF8ToUTF16(const char *pUTF8, uchar16 *pUTF16, int cubDestSizeInBytes, ES } /* ../engine/unicode_strtools.cpp:254 */ -NOBODY int Q_UTF8ToUTF32(const char *pUTF8, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) +int Q_UTF8ToUTF32(const char *pUTF8, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) { + return Q_UnicodeConvertT(pUTF8, pUTF32, cubDestSizeInBytes, ePolicy); } /* ../engine/unicode_strtools.cpp:262 */ @@ -261,31 +278,26 @@ int Q_UTF16ToUTF8(const uchar16 *pUTF16, char *pUTF8, int cubDestSizeInBytes, ES } /* ../engine/unicode_strtools.cpp:270 */ -NOBODY int Q_UTF16ToUTF32(const uchar16 *pUTF16, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) +NOXREF int Q_UTF16ToUTF32(const uchar16 *pUTF16, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) { -// Q_UnicodeConvertT(const short unsigned int *pIn, -// int nInChars, -// uchar16 *pOut, -// int nOutBytes, -// enum EStringConvertErrorPolicy ePolicy); // 272 + return Q_UnicodeConvertT(pUTF16, pUTF32, cubDestSizeInBytes, ePolicy); } /* ../engine/unicode_strtools.cpp:278 */ -NOBODY int Q_UTF32ToUTF8(const uchar32 *pUTF32, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) +int Q_UTF32ToUTF8(const uchar32 *pUTF32, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) { + return Q_UnicodeConvertT(pUTF32, pUTF8, cubDestSizeInBytes, ePolicy); } /* ../engine/unicode_strtools.cpp:286 */ -NOBODY int Q_UTF32ToUTF16(const uchar32 *pUTF32, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) +NOXREF int Q_UTF32ToUTF16(const uchar32 *pUTF32, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy) { -// Q_UnicodeConvertT(const uchar16 *pIn, -// int nInChars, -// short unsigned int *pOut, -// int nOutBytes, -// enum EStringConvertErrorPolicy ePolicy); // 288 + return Q_UnicodeConvertT(pUTF32, pUTF16, cubDestSizeInBytes, ePolicy); } + // Decode one character from a UTF-8 encoded string. Treats 6-byte CESU-8 sequences // as a single character, as if they were a correctly-encoded 4-byte UTF-8 sequence. + /* ../engine/unicode_strtools.cpp:346 */ int Q_UTF8ToUChar32(const char *pUTF8_, uchar32 &uValueOut, bool &bErrorOut) { @@ -377,19 +389,25 @@ qboolean Q_UnicodeValidate(const char *pUTF8) } /* ../engine/unicode_strtools.cpp:442 */ -NOBODY int Q_UnicodeLength(const char *pUTF8) +NOXREF int Q_UnicodeLength(const char *pUTF8) { -// { -// int nChars; // 444 -// { -// bool bError; // 447 -// uchar32 uVal; // 448 -// } -// } + int nChars = 0; + + while (*pUTF8) + { + bool bError; + uchar32 uVal; + + pUTF8 += Q_UTF8ToUChar32(pUTF8, uVal, bError); + + ++nChars; + } + + return nChars; } /* ../engine/unicode_strtools.cpp:459 */ -char *Q_UnicodeAdvance(char *pUTF8, int nChars) +NOXREF char *Q_UnicodeAdvance(char *pUTF8, int nChars) { uchar32 uVal = 0; bool bError = false; @@ -410,7 +428,7 @@ char *Q_UnicodeAdvance(char *pUTF8, int nChars) // characters in this set are removed from the beginning and/or end of strings // by Q_AggressiveStripPrecedingAndTrailingWhitespaceW() /* ../engine/unicode_strtools.cpp:479 */ -NOBODY qboolean Q_IsMeanSpaceW(uchar16 wch) +qboolean Q_IsMeanSpaceW(uchar16 wch) { bool bIsMean = false; @@ -448,11 +466,28 @@ NOBODY qboolean Q_IsMeanSpaceW(uchar16 wch) } /* ../engine/unicode_strtools.cpp:566 */ -NOBODY qboolean Q_IsDeprecatedW(uchar16 wch) +qboolean Q_IsDeprecatedW(uchar16 wch) { -// { -// qboolean bIsDeprecated; // 568 -// } + qboolean bIsDeprecated = FALSE; + + switch (wch) + { + case 0x202A: + case 0x202B: + case 0x202C: + case 0x202D: + case 0x202E: + case 0x206A: + case 0x206B: + case 0x206C: + case 0x206D: + case 0x206E: + case 0x206F: + bIsDeprecated = TRUE; + break; + } + + return bIsDeprecated; } // Purpose: strips trailing whitespace; returns pointer inside string just past @@ -461,6 +496,7 @@ NOBODY qboolean Q_IsDeprecatedW(uchar16 wch) // bAggresive = true causes this function to also check for "mean" spaces, // which we don't want in persona names or chat strings as they're disruptive // to the user experience. + /* ../engine/unicode_strtools.cpp:600 */ static uchar16 *StripWhitespaceWorker(uchar16 *pwch, int cchLength, bool *pbStrippedWhitespace) { @@ -500,7 +536,7 @@ uchar16 *StripUnprintableWorker(uchar16 *pwch, bool *pbStrippedAny) while (*pwchSource) { uchar16 cc = *pwchSource; - if (*pwchSource >= 0x20u && !Q_IsUnprintableW(cc) && cc != 0x2026) + if (*pwchSource >= 0x20u && !Q_IsDeprecatedW(cc) && cc != 0x2026) { *pwchDest = cc; ++pwchDest; @@ -524,18 +560,23 @@ qboolean Q_StripUnprintableAndSpace(char *pch) uchar16 *pwch_alloced = (uchar16*)malloc(cubDest); bStrippedAny = false; bStrippedWhitespace = false; + + // TODO: here is used Q_UTF8ToUTF32, and not this Q_UTF8ToUTF16 int cwch = (unsigned int)Q_UTF8ToUTF16(pch, (uchar16 *)pwch_alloced, cubDest, _STRINGCONVERTFLAG_ASSERT) >> 1; uchar16 * pwch = StripUnprintableWorker(pwch_alloced, &bStrippedAny); pwch = StripWhitespaceWorker(pwch, cwch - 1, &bStrippedWhitespace); if (bStrippedWhitespace || bStrippedAny) + { + // TODO:: here is used Q_UTF32ToUTF8 Q_UTF16ToUTF8(pwch, pch, cch, STRINGCONVERT_ASSERT_REPLACE); + } free(pwch_alloced); return bStrippedAny; } /* ../engine/unicode_strtools.cpp:717 */ -qboolean V_UTF8ToUChar32(const char *pUTF8_, uchar32 *uValueOut) +NOXREF qboolean V_UTF8ToUChar32(const char *pUTF8_, uchar32 *uValueOut) { bool bError = false; Q_UTF8ToUChar32(pUTF8_, *uValueOut, bError); @@ -543,7 +584,7 @@ qboolean V_UTF8ToUChar32(const char *pUTF8_, uchar32 *uValueOut) } /* ../engine/unicode_strtools.cpp:724 */ -int Q_UnicodeRepair(char *pUTF8) +NOXREF int Q_UnicodeRepair(char *pUTF8) { return Q_UnicodeConvertT(pUTF8, pUTF8, 65535, STRINGCONVERT_SKIP); } diff --git a/regamedll/engine/unicode_strtools.h b/regamedll/engine/unicode_strtools.h index 29c95eaf..ebcbd2e9 100644 --- a/regamedll/engine/unicode_strtools.h +++ b/regamedll/engine/unicode_strtools.h @@ -59,31 +59,30 @@ enum EStringConvertErrorPolicy STRINGCONVERT_ASSERT_FAIL = 6, }; -NOBODY bool Q_IsValidUChar32(uchar32 uVal); -NOXREF NOBODY void Q_UTF32ToUChar32(const uchar32 *pUTF32, uchar32 &uVal, bool &bErr); -NOXREF NOBODY void Q_UChar32ToUTF32Len(uchar32 uVal); -NOXREF NOBODY void Q_UChar32ToUTF32(uchar32 uVal, uchar32 *pUTF32); -NOXREF NOBODY int Q_UChar32ToUTF8Len(uchar32 uVal); -NOXREF NOBODY int Q_UChar32ToUTF16Len(uchar32 uVal); -NOXREF NOBODY int Q_UChar32ToUTF16(uchar32 uVal, uchar16 *pUTF16Out); -NOXREF NOBODY int Q_UChar32ToUTF8(uchar32 uVal, char *pUTF8Out); -NOXREF NOBODY int Q_UTF16ToUChar32(const uchar16 *pUTF16, uchar32 &uValueOut, bool &bErrorOut); -NOXREF NOBODY int Q_UTF8ToUTF16(const char *pUTF8, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOXREF NOBODY int Q_UTF8ToUTF32(const char *pUTF8, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOXREF NOBODY int Q_UTF16ToUTF8(const uchar16 *pUTF16, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOXREF NOBODY int Q_UTF16ToUTF32(const uchar16 *pUTF16, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOXREF NOBODY int Q_UTF32ToUTF8(const uchar32 *pUTF32, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOXREF NOBODY int Q_UTF32ToUTF16(const uchar32 *pUTF32, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); -NOBODY int Q_UTF8ToUChar32(const char *pUTF8_, uchar32 &uValueOut, bool &bErrorOut); -NOBODY qboolean Q_UnicodeValidate(const char *pUTF8); -NOXREF NOBODY int Q_UnicodeLength(const char *pUTF8); -NOBODY char *Q_UnicodeAdvance(char *pUTF8, int nChars); -NOXREF NOBODY qboolean Q_IsMeanSpaceW(uchar16 wch); -NOXREF NOBODY qboolean Q_IsDeprecatedW(uchar16 wch); -//NOXREF NOBODY uchar16 *StripWhitespaceWorker(uchar16 *pwch, int cchLength, bool *pbStrippedWhitespace); -NOXREF NOBODY uchar16 *StripUnprintableWorker(uchar16 *pwch, bool *pbStrippedAny); -NOBODY qboolean Q_StripUnprintableAndSpace(char *pch); -NOBODY qboolean V_UTF8ToUChar32(const char *pUTF8_, uchar32 *uValueOut); -NOBODY int Q_UnicodeRepair(char *pUTF8); +bool Q_IsValidUChar32(uchar32 uVal); +int Q_UTF32ToUChar32(const uchar32 *pUTF32, uchar32 &uVal, bool &bErr); +int Q_UChar32ToUTF32Len(uchar32 uVal); +int Q_UChar32ToUTF32(uchar32 uVal, uchar32 *pUTF32); +int Q_UChar32ToUTF8Len(uchar32 uVal); +int Q_UChar32ToUTF16Len(uchar32 uVal); +int Q_UChar32ToUTF16(uchar32 uVal, uchar16 *pUTF16Out); +int Q_UChar32ToUTF8(uchar32 uVal, char *pUTF8Out); +int Q_UTF16ToUChar32(const uchar16 *pUTF16, uchar32 &uValueOut, bool &bErrorOut); +int Q_UTF8ToUTF16(const char *pUTF8, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +int Q_UTF8ToUTF32(const char *pUTF8, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +int Q_UTF16ToUTF8(const uchar16 *pUTF16, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +NOXREF int Q_UTF16ToUTF32(const uchar16 *pUTF16, uchar32 *pUTF32, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +int Q_UTF32ToUTF8(const uchar32 *pUTF32, char *pUTF8, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +NOXREF int Q_UTF32ToUTF16(const uchar32 *pUTF32, uchar16 *pUTF16, int cubDestSizeInBytes, EStringConvertErrorPolicy ePolicy); +int Q_UTF8ToUChar32(const char *pUTF8_, uchar32 &uValueOut, bool &bErrorOut); +qboolean Q_UnicodeValidate(const char *pUTF8); +NOXREF int Q_UnicodeLength(const char *pUTF8); +NOXREF char *Q_UnicodeAdvance(char *pUTF8, int nChars); +qboolean Q_IsMeanSpaceW(uchar16 wch); +qboolean Q_IsDeprecatedW(uchar16 wch); +uchar16 *StripUnprintableWorker(uchar16 *pwch, bool *pbStrippedAny); +qboolean Q_StripUnprintableAndSpace(char *pch); +NOXREF qboolean V_UTF8ToUChar32(const char *pUTF8_, uchar32 *uValueOut); +NOXREF int Q_UnicodeRepair(char *pUTF8); #endif // UNICODE_STR_TOOLS_H diff --git a/regamedll/game_shared/bot/bot.cpp b/regamedll/game_shared/bot/bot.cpp index 25d97427..d529e751 100644 --- a/regamedll/game_shared/bot/bot.cpp +++ b/regamedll/game_shared/bot/bot.cpp @@ -251,7 +251,7 @@ NOXREF byte CBot::ThrottledMsec(void) const } /* <49016e> ../game_shared/bot/bot.cpp:389 */ -NOBODY void CBot::ClientCommand(const char *cmd, const char *arg1, const char *arg2, const char *arg3) +void CBot::ClientCommand(const char *cmd, const char *arg1, const char *arg2, const char *arg3) { BotArgs[0] = cmd; BotArgs[1] = arg1; @@ -314,7 +314,7 @@ bool CBot::IsLocalPlayerWatchingMe(void) const if (pev == NULL) return false; - int myIndex = const_cast< CBot * >(this)->entindex(); + int myIndex = const_cast(this)->entindex(); CBasePlayer *player = UTIL_GetLocalPlayer(); if (player == NULL) @@ -341,10 +341,10 @@ NOXREF void CBot::Print(char *format, ...) const // prefix the message with the bot's name Q_sprintf(buffer, "%s: ", STRING(pev->netname)); - SERVER_PRINT( buffer ); + SERVER_PRINT(buffer); va_start(varg, format); - Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); + vsprintf(buffer, format, varg); va_end(varg); SERVER_PRINT(buffer); @@ -371,16 +371,13 @@ void CBot::PrintIfWatched(char *format, ...) const Q_sprintf(buffer, "%s: ", (name != NULL) ? name : "(NULL netname)"); - SERVER_PRINT( buffer ); - //_logf(buffer); + SERVER_PRINT(buffer); va_start(varg, format); - Q_vsnprintf(buffer, ARRAYSIZE(buffer), format, varg); + vsprintf(buffer, format, varg); va_end(varg); - //_logf(buffer); - - SERVER_PRINT( buffer ); + SERVER_PRINT(buffer); } } diff --git a/regamedll/game_shared/bot/bot.h b/regamedll/game_shared/bot/bot.h index 99cc6105..625cc7ee 100644 --- a/regamedll/game_shared/bot/bot.h +++ b/regamedll/game_shared/bot/bot.h @@ -272,7 +272,9 @@ public: { return m_profile; } +#ifndef HOOK_GAMEDLL protected: +#endif // HOOK_GAMEDLL // Do a "client command" - useful for invoking menu choices, etc. void ClientCommand(const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL, const char *arg3 = NULL); diff --git a/regamedll/game_shared/bot/bot_manager.h b/regamedll/game_shared/bot/bot_manager.h index 1e49e4a9..8ee40eef 100644 --- a/regamedll/game_shared/bot/bot_manager.h +++ b/regamedll/game_shared/bot/bot_manager.h @@ -39,13 +39,13 @@ #ifndef _WIN32 -#ifndef max -#define max(a,b) ((a) > (b) ? (a) : (b)) -#endif // max +//#ifndef max +//#define max(a,b) ((a) > (b) ? (a) : (b)) +//#endif // max -#ifndef min -#define min(a,b) ((a) < (b) ? (a) : (b)) -#endif // min +//#ifndef min +//#define min(a,b) ((a) < (b) ? (a) : (b)) +//#endif // min #endif // _WIN32 diff --git a/regamedll/game_shared/bot/bot_profile.cpp b/regamedll/game_shared/bot/bot_profile.cpp index 38437636..c95afd71 100644 --- a/regamedll/game_shared/bot/bot_profile.cpp +++ b/regamedll/game_shared/bot/bot_profile.cpp @@ -181,8 +181,14 @@ NOBODY void BotProfileManager::Reset(void) } /* <4a7fdf> ../game_shared/bot/bot_profile.cpp:579 */ -NOBODY const char *BotProfileManager::GetCustomSkin(int index) +const char *BotProfileManager::GetCustomSkin(int index) { + if (index < FirstCustomSkin || index > LastCustomSkin) + { + return NULL; + } + + return m_skins[ index - FirstCustomSkin ]; } /* <4a8019> ../game_shared/bot/bot_profile.cpp:593 */ @@ -193,7 +199,7 @@ const char *BotProfileManager::GetCustomSkinFname(int index) return NULL; } - return m_skinModelnames[ index - FirstCustomSkin ]; + return m_skinFilenames[ index - FirstCustomSkin ]; //return m_skinModelnames[ index - FirstCustomSkin ]; } /* <4a8053> ../game_shared/bot/bot_profile.cpp:607 */ @@ -203,7 +209,8 @@ const char *BotProfileManager::GetCustomSkinModelname(int index) { return NULL; } - return m_skins[ index - FirstCustomSkin ]; + + return m_skinModelnames[ index - FirstCustomSkin ]; //return m_skins[ index - FirstCustomSkin ]; } /* <4a80db> ../game_shared/bot/bot_profile.cpp:621 */ diff --git a/regamedll/game_shared/bot/bot_profile.h b/regamedll/game_shared/bot/bot_profile.h index cfa873e2..d977de7b 100644 --- a/regamedll/game_shared/bot/bot_profile.h +++ b/regamedll/game_shared/bot/bot_profile.h @@ -32,6 +32,16 @@ #pragma once #endif +#pragma warning(disable : 4786) // long STL names get truncated in browse info. + +#ifndef _WIN32 +#include +#include +#endif // _WIN32 + +#undef min +#undef max + #include #include diff --git a/regamedll/game_shared/bot/bot_util.cpp b/regamedll/game_shared/bot/bot_util.cpp index 3f14424a..c2f306d8 100644 --- a/regamedll/game_shared/bot/bot_util.cpp +++ b/regamedll/game_shared/bot/bot_util.cpp @@ -76,7 +76,7 @@ int UTIL_ClientsInGame(void) } /* <4ad385> ../game_shared/bot/bot_util.cpp:93 */ -NOBODY int UTIL_ActivePlayersInGame(void) +int UTIL_ActivePlayersInGame(void) { int iCount = 0; for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++) @@ -103,11 +103,12 @@ NOBODY int UTIL_ActivePlayersInGame(void) iCount++; } + return iCount; } /* <4ad43f> ../game_shared/bot/bot_util.cpp:128 */ -NOBODY int UTIL_HumansInGame(bool ignoreSpectators) +int UTIL_HumansInGame(bool ignoreSpectators) { int iCount = 0; @@ -137,6 +138,7 @@ NOBODY int UTIL_HumansInGame(bool ignoreSpectators) iCount++; } + return iCount; } @@ -200,12 +202,15 @@ NOBODY int UTIL_BotsInGame(void) } /* <4ad686> ../game_shared/bot/bot_util.cpp:240 */ -NOBODY bool UTIL_KickBotFromTeam(TeamName kickTeam) +bool UTIL_KickBotFromTeam(TeamName kickTeam) { int i; + + // try to kick a dead bot first for (i = 1; i <= gpGlobals->maxClients; ++i) { CBasePlayer *player = static_cast(UTIL_PlayerByIndex(i)); + if (player == NULL) continue; @@ -221,10 +226,13 @@ NOBODY bool UTIL_KickBotFromTeam(TeamName kickTeam) if (!player->IsAlive() && player->m_iTeam == kickTeam) { + // its a bot on the right team - kick it SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", STRING(player->pev->netname))); return true; } } + + // no dead bots, kick any bot on the given team for (i = 1; i <= gpGlobals->maxClients; ++i) { CBasePlayer *player = static_cast(UTIL_PlayerByIndex(i)); @@ -244,6 +252,7 @@ NOBODY bool UTIL_KickBotFromTeam(TeamName kickTeam) if (player->m_iTeam == kickTeam) { + // its a bot on the right team - kick it SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", STRING(player->pev->netname))); return true; } @@ -484,14 +493,10 @@ void CONSOLE_ECHO(char *pszMsg, ...) static char szStr[1024]; va_start(argptr, pszMsg); -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(szStr, sizeof(szStr), pszMsg, argptr); -#else vsprintf(szStr, pszMsg, argptr); -#endif // REGAMEDLL_FIXES va_end(argptr); - (*g_engfuncs.pfnServerPrint)(szStr); + SERVER_PRINT(szStr); } /* <4ae13e> ../game_shared/bot/bot_util.cpp:577 */ @@ -501,14 +506,10 @@ void CONSOLE_ECHO_LOGGED(char *pszMsg, ...) static char szStr[1024]; va_start(argptr, pszMsg); -#ifdef REGAMEDLL_FIXES - Q_vsnprintf(szStr, sizeof(szStr), pszMsg, argptr); -#else vsprintf(szStr, pszMsg, argptr); -#endif // REGAMEDLL_FIXES va_end(argptr); - (*g_engfuncs.pfnServerPrint)(szStr); + SERVER_PRINT(szStr); UTIL_LogPrintf(szStr); } @@ -537,26 +538,10 @@ void InitBotTrig(void) for (int i = 0; i < COS_TABLE_SIZE; i++) { float_precision angle = 2.0f * M_PI * (float)i / (float)(COS_TABLE_SIZE - 1); - cosTable[i] = cos( angle ); + cosTable[i] = cos(angle); } } -///* <4ae1fd> ../game_shared/bot/bot_util.cpp:675 */ -//float BotCOS(float angle) -//{ -// angle = NormalizeAnglePositive(angle); -// int i = angle * (COS_TABLE_SIZE - 1) / 360.0f; -// return cosTable[ i ]; -//} -// -///* <4ae261> ../game_shared/bot/bot_util.cpp:682 */ -//float BotSIN(float angle) -//{ -// angle = NormalizeAnglePositive(angle - 90); -// int i = angle * (COS_TABLE_SIZE - 1) / 360.0f; -// return cosTable[ i ]; -//} - /* <4ae1fd> ../game_shared/bot/bot_util.cpp:675 */ float BotCOS(float angle) { @@ -703,22 +688,22 @@ void HintMessageToAllPlayers(const char *message) { hudtextparms_t textParms; - textParms.x = -1; - textParms.y = -1; + textParms.x = -1.0f; + textParms.y = -1.0f; textParms.effect = 0; textParms.r1 = 100; - textParms.g1 = -1; + textParms.g1 = 255; textParms.b1 = 100; - textParms.r2 = -1; - textParms.g2 = -1; - textParms.b2 = -1; + textParms.r2 = 255; + textParms.g2 = 255; + textParms.b2 = 255; - textParms.fadeinTime = 1; - textParms.fadeoutTime = 5; - textParms.holdTime = 5; - textParms.fxTime = 0; + textParms.fadeinTime = 1.0f; + textParms.fadeoutTime = 5.0f; + textParms.holdTime = 5.0f; + textParms.fxTime = 0.0f; textParms.channel = 0; diff --git a/regamedll/game_shared/bot/bot_util.h b/regamedll/game_shared/bot/bot_util.h index 0903af8e..5f78bb17 100644 --- a/regamedll/game_shared/bot/bot_util.h +++ b/regamedll/game_shared/bot/bot_util.h @@ -230,11 +230,11 @@ extern float cosTable[COS_TABLE_SIZE]; bool UTIL_IsNameTaken(const char *name, bool ignoreHumans = false); int UTIL_ClientsInGame(void); -NOBODY int UTIL_ActivePlayersInGame(void); -NOBODY int UTIL_HumansInGame(bool ignoreSpectators); +int UTIL_ActivePlayersInGame(void); +int UTIL_HumansInGame(bool ignoreSpectators); NOBODY int UTIL_HumansOnTeam(int teamID, bool isAlive = false); NOBODY int UTIL_BotsInGame(void); -NOBODY bool UTIL_KickBotFromTeam(TeamName kickTeam); +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); diff --git a/regamedll/game_shared/bot/nav_area.cpp b/regamedll/game_shared/bot/nav_area.cpp index da510c08..fc5a8bc3 100644 --- a/regamedll/game_shared/bot/nav_area.cpp +++ b/regamedll/game_shared/bot/nav_area.cpp @@ -209,57 +209,48 @@ NOBODY CNavArea::CNavArea(CNavNode *nwNode, class CNavNode *neNode, class CNavNo /* <4d58d7> ../game_shared/bot/nav_area.cpp:295 */ NOBODY CNavArea::~CNavArea(void) { + // if we are resetting the system, don't bother cleaning up - all areas are being destroyed if (IMPLEMENT_ARRAY(m_isReset)) { - //m_overlapList.~list(); - //m_ladder->~list(); - //m_connect->~list(); - //m_spotEncounterList.~list(); - //m_hidingSpotList.~list(); - return; } // tell the other areas we are going away - NavAreaList::iterator iter; - for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) - { - CNavArea *area = *iter; + //NavAreaList::iterator iter; + //for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + //{ + // CNavArea *area = *iter; - if (area == this) - continue; + // if (area == this) + // continue; - area->OnDestroyNotify(this); - } + // area->OnDestroyNotify(this); + //} - // unhook from ladders - for (int i = 0; i < NUM_LADDER_DIRECTIONS; ++i) - { - for (NavLadderList::iterator liter = m_ladder[i].begin(); liter != m_ladder[i].end(); ++liter) - { - CNavLadder *ladder = *liter; + //// unhook from ladders + //for (int i = 0; i < NUM_LADDER_DIRECTIONS; ++i) + //{ + // for (NavLadderList::iterator liter = m_ladder[i].begin(); liter != m_ladder[i].end(); ++liter) + // { + // CNavLadder *ladder = *liter; - ladder->OnDestroyNotify(this); - } - } + // ladder->OnDestroyNotify(this); + // } + //} // remove the area from the grid - TheNavAreaGrid.RemoveNavArea(this); + //TheNavAreaGrid.RemoveNavArea(this); } /* <4c67f0> ../game_shared/bot/nav_area.cpp:333 */ NOBODY void CNavArea::OnDestroyNotify(CNavArea *dead) { -// { -// union NavConnect con; // 335 -// { -// int d; // 337 -// remove(list> *const this, -// const value_type &__value); // 338 -// } -// remove(list> *const this, -// const value_type &__value); // 340 -// } + NavConnect con; + con.area = dead; + for(int d = 0; d < NUM_DIRECTIONS; ++d) + m_connect[ d ].remove(con); + + m_overlapList.remove(dead); } /* <4c6b75> ../game_shared/bot/nav_area.cpp:347 */ @@ -395,20 +386,53 @@ NOBODY bool CNavArea::SplitEdit(bool splitAlongX, float splitEdge, CNavArea **ou /* <4c7708> ../game_shared/bot/nav_area.cpp:615 */ NOBODY bool CNavArea::IsConnected(const CNavArea *area, NavDirType dir) const { -// { -// const_iterator iter; // 621 -// operator++(_List_const_iterator *const this); // 659 -// { -// const_iterator liter; // 636 -// { -// int d; // 626 -// operator++(_List_const_iterator *const this); // 628 -// } -// } -// } -// IsConnected(const class CNavArea *const this, -// const class CNavArea *area, -// enum NavDirType dir); // 615 + // we are connected to ourself + if (area == this) + return true; + + NavConnectList::const_iterator iter; + + if (dir == NUM_DIRECTIONS) + { + // search all directions + for (int d = 0; dm_topBehindArea == area || ladder->m_topForwardArea == area || ladder->m_topLeftArea == area || ladder->m_topRightArea == area) + return true; + } + + for (liter = m_ladder[ LADDER_DOWN ].begin(); liter != m_ladder[ LADDER_DOWN ].end(); ++liter) + { + CNavLadder *ladder = *liter; + + if (ladder->m_bottomArea == area) + return true; + } + } + else + { + // check specific direction + for (iter = m_connect[ dir ].begin(); iter != m_connect[ dir ].end(); ++iter) + { + if (area == (*iter).area) + return true; + } + } + + return false; } /* <4c89fd> ../game_shared/bot/nav_area.cpp:674 */ @@ -598,39 +622,47 @@ void DestroyLadders(void) } } +void (*pDestroyNavigationMap)(void); + /* <4d6733> ../game_shared/bot/nav_area.cpp:994 */ -void DestroyNavigationMap(void) +void __declspec(naked) DestroyNavigationMap(void) { - IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = true; - - // remove each element of the list and delete them - while (!TheNavAreaList.empty()) + __asm { - CNavArea *area = TheNavAreaList.front(); - TheNavAreaList.pop_front(); - delete area; + jmp pDestroyNavigationMap } - IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = false; + //IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = true; - // destroy ladder representations - DestroyLadders(); + //// remove each element of the list and delete them + //while (!TheNavAreaList.empty()) + //{ + // CNavArea *area = TheNavAreaList.front(); + // TheNavAreaList.pop_front(); + // //delete area;//TODO: FIX ME stl m_connect + //} - // destroy all hiding spots - DestroyHidingSpots(); + ////TheNavAreaList.clear(); + //IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = false; - // 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; - } + //// destroy ladder representations + //DestroyLadders(); - IMPLEMENT_ARRAY_CLASS(CNavNode, m_list) = NULL; + //// destroy all hiding spots + //DestroyHidingSpots(); - // reset the grid - TheNavAreaGrid.Reset(); + //// 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 */ @@ -2780,7 +2812,10 @@ NOBODY CNavAreaGrid::~CNavAreaGrid(void) void CNavAreaGrid::Reset(void) { if (m_grid) - delete[] m_grid; + { + // TODO: FIX ME + //delete[] m_grid; + } m_grid = NULL; m_gridSizeX = 0; @@ -2836,32 +2871,44 @@ NOBODY void CNavAreaGrid::AddNavArea(CNavArea *area) /* <4cfc86> ../game_shared/bot/nav_area.cpp:5039 */ NOBODY void CNavAreaGrid::RemoveNavArea(CNavArea *area) { -// { -// const class Extent *extent; // 5042 -// int loX; // 5044 -// int loY; // 5045 -// int hiX; // 5046 -// int hiY; // 5047 -// int key; // 5054 -// WorldToGridX(const class CNavAreaGrid *const this, -// float wx); // 5044 -// WorldToGridY(const class CNavAreaGrid *const this, -// float wy); // 5045 -// WorldToGridX(const class CNavAreaGrid *const this, -// float wx); // 5046 -// WorldToGridY(const class CNavAreaGrid *const this, -// float wy); // 5047 -// { -// int y; // 5049 -// { -// int x; // 5050 -// remove(list> *const this, -// const value_type &__value); // 5051 -// } -// } -// ComputeHashKey(const class CNavAreaGrid *const this, -// unsigned int id); // 5054 -// } + // add to grid + const Extent *extent = area->GetExtent(); + + int loX = WorldToGridX(extent->lo.x); + int loY = WorldToGridY(extent->lo.y); + int hiX = WorldToGridX(extent->hi.x); + int hiY = WorldToGridY(extent->hi.y); + + for (int y = loY; y <= hiY; ++y) + { + for (int x = loX; x <= hiX; ++x) + { + m_grid[x + y * m_gridSizeX].remove(area); + } + } + + // remove from hash table + int key = ComputeHashKey(area->GetID()); + + if (area->m_prevHash) + { + area->m_prevHash->m_nextHash = area->m_nextHash; + } + else + { + // area was at start of list + m_hashTable[key] = area->m_nextHash; + + if (m_hashTable[key]) + m_hashTable[key]->m_prevHash = NULL; + } + + if (area->m_nextHash) + { + area->m_nextHash->m_prevHash = area->m_prevHash; + } + + --m_areaCount; } CNavArea *(*pGetNavArea)(const Vector *pos, float beneathLimit); diff --git a/regamedll/game_shared/bot/nav_area.h b/regamedll/game_shared/bot/nav_area.h index 0cce214e..23ae7342 100644 --- a/regamedll/game_shared/bot/nav_area.h +++ b/regamedll/game_shared/bot/nav_area.h @@ -157,6 +157,7 @@ public: if (dead == m_bottomArea) m_bottomArea = NULL; } + };/* size: 68, cachelines: 2, members: 12 */ typedef std::list NavLadderList; @@ -570,31 +571,30 @@ private: CNavArea *m_prevOpen; unsigned int m_openMarker; -#ifdef _WIN32 +#if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding3; -#endif // _WIN32 - +#endif // HOOK_GAMEDLL NavConnectList m_connect[ NUM_DIRECTIONS ]; -#ifdef _WIN32 +#if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding4; int unknown_padding5; int unknown_padding6; int unknown_padding7; -#endif // _WIN32 +#endif // HOOK_GAMEDLL NavLadderList m_ladder[ NUM_LADDER_DIRECTIONS ]; -#ifdef _WIN32 +#if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding8; -#endif // _WIN32 +#endif // HOOK_GAMEDLL CNavNode *m_node[ NUM_CORNERS ]; -#ifdef _WIN32 +#if defined(_WIN32) && defined(HOOK_GAMEDLL) int unknown_padding9; -#endif // _WIN32 +#endif // HOOK_GAMEDLL NavAreaList m_overlapList; @@ -1270,12 +1270,6 @@ 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); @@ -1318,5 +1312,6 @@ NOBODY void GenerateNavigationAreaMesh(void); extern float (*pGetZ__Vector)(const Vector *pos); extern CNavArea *(*pGetNearestNavArea)(const Vector *pos, bool anyZ); extern CNavArea *(*pGetNavArea)(const Vector *pos, float beneathLimit); +extern void (*pDestroyNavigationMap)(void); #endif // NAV_AREA_H diff --git a/regamedll/game_shared/bot/nav_file.cpp b/regamedll/game_shared/bot/nav_file.cpp index e93550fa..0dcf384b 100644 --- a/regamedll/game_shared/bot/nav_file.cpp +++ b/regamedll/game_shared/bot/nav_file.cpp @@ -1,540 +1,861 @@ #include "precompiled.h" +#pragma warning(disable : 4530) // STL uses exceptions, but we are not compiling with them - ignore warning +#pragma warning(disable : 4786) // long STL names get truncated in browse info. + /* * Globals initialization */ #ifndef HOOK_GAMEDLL -//static PlaceDirectory placeDirectory; +static PlaceDirectory placeDirectory; #else // HOOK_GAMEDLL -//PlaceDirectory placeDirectory; +PlaceDirectory placeDirectory; #endif // HOOK_GAMEDLL /* <4edbfc> ../game_shared/bot/nav_file.cpp:60 */ -NOBODY void PlaceDirectory::Reset(void) +void PlaceDirectory::Reset(void) { - //m_directory.clear(); + m_directory.clear(); } /* <4edbaf> ../game_shared/bot/nav_file.cpp:66 */ -NOBODY bool PlaceDirectory::IsKnown(Place place) const +bool PlaceDirectory::IsKnown(Place place) const { - //std::vector::const_iterator it = std::find(m_directory.begin(), m_directory.end(), place); - //return (it != m_directory.end()); + std::vector::const_iterator it = std::find(m_directory.begin(), m_directory.end(), place); + return (it != m_directory.end()); } /* <4ec844> ../game_shared/bot/nav_file.cpp:74 */ -NOBODY PlaceDirectory::EntryType PlaceDirectory::GetEntry(Place place) const +PlaceDirectory::EntryType PlaceDirectory::GetEntry(Place place) const { - //if (place == UNDEFINED_PLACE) - // return 0; + if (place == UNDEFINED_PLACE) + return 0; - //std::vector::const_iterator it = std::find(m_directory.begin(), m_directory.end(), place); + std::vector::const_iterator it = std::find(m_directory.begin(), m_directory.end(), place); - //if (it == m_directory.end()) - //{ - // assert(false && "PlaceDirectory::GetEntry failure"); - // return 0; - //} - //return 1 + (it - m_directory.begin()); + if (it == m_directory.end()) + { + assert(false && "PlaceDirectory::GetEntry failure"); + return 0; + } + return 1 + (it - m_directory.begin()); } /* <4ee200> ../game_shared/bot/nav_file.cpp:91 */ -NOBODY void PlaceDirectory::AddPlace(Place place) +void PlaceDirectory::AddPlace(Place place) { - //if (place == UNDEFINED_PLACE) - // return; + if (place == UNDEFINED_PLACE) + return; - //assert(place < 1000); + assert(place < 1000); - //if (IsKnown(place)) - // return; + if (IsKnown(place)) + return; - //m_directory.push_back(place); + m_directory.push_back(place); } /* <4edf61> ../game_shared/bot/nav_file.cpp:105 */ -NOBODY Place PlaceDirectory::EntryToPlace(EntryType entry) const +Place PlaceDirectory::EntryToPlace(EntryType entry) const { - //if (entry == 0) - // return UNDEFINED_PLACE; + if (entry == 0) + return UNDEFINED_PLACE; - //unsigned int i = entry - 1; + unsigned int i = entry - 1; - //if (i > m_directory.size()) - //{ - // assert(false && "PlaceDirectory::EntryToPlace: Invalid entry"); - // return UNDEFINED_PLACE; - //} + if (i > m_directory.size()) + { + assert(false && "PlaceDirectory::EntryToPlace: Invalid entry"); + return UNDEFINED_PLACE; + } - //return m_directory[ i ]; + return m_directory[ i ]; } /* <4edc2e> ../game_shared/bot/nav_file.cpp:122 */ -NOBODY void PlaceDirectory::Save(int fd) +void PlaceDirectory::Save(int fd) { // store number of entries in directory - //EntryType count = m_directory.size(); - //Q_write(fd, &count, sizeof(EntryType)); + EntryType count = m_directory.size(); + Q_write(fd, &count, sizeof(EntryType)); // store entries - //std::vector::iterator it; - //for (it = m_directory.begin(); it != m_directory.end(); ++it) - //{ - // const char *placeName = TheBotPhrases->IDToName(*it); + std::vector::iterator it; + for (it = m_directory.begin(); it != m_directory.end(); ++it) + { + const char *placeName = TheBotPhrases->IDToName(*it); // store string length followed by string itself - // unsigned short len = strlen(placeName)+1; - // Q_write(fd, &len, sizeof(unsigned short)); - // Q_write(fd, placeName, len); - //} + unsigned short len = Q_strlen(placeName) + 1; + Q_write(fd, &len, sizeof(unsigned short)); + Q_write(fd, placeName, len); + } } /* <4edfaa> ../game_shared/bot/nav_file.cpp:142 */ -NOBODY void PlaceDirectory::Load(SteamFile *file) +void PlaceDirectory::Load(SteamFile *file) { // read number of entries - //EntryType count; - //file->Read(&count, sizeof(EntryType)); + EntryType count; + file->Read(&count, sizeof(EntryType)); - //m_directory.reserve(count); + m_directory.reserve(count); // read each entry - //char placeName[256]; - //unsigned short len; - //for (int i = 0; iRead(&len, sizeof(unsigned short)); - // file->Read(placeName, len); + char placeName[256]; + unsigned short len; + for (int i = 0; i < count; i++) + { + file->Read(&len, sizeof(unsigned short)); + file->Read(placeName, len); - // AddPlace(TheBotPhrases->NameToID(placeName)); - //} + AddPlace(TheBotPhrases->NameToID(placeName)); + } } /* <4ee54b> ../game_shared/bot/nav_file.cpp:173 */ -NOBODY char *GetBspFilename(const char *navFilename) +char *GetBspFilename(const char *navFilename) { -// { -// char bspFilename; // 175 -// int len; // 179 -// } + static char bspFilename[256]; + + Q_sprintf(bspFilename, "maps\\%s.bsp", STRING(gpGlobals->mapname)); + + int len = Q_strlen(bspFilename); + if (len < 3) + return NULL; + + bspFilename[len - 3] = 'b'; + bspFilename[len - 2] = 's'; + bspFilename[len - 1] = 'p'; + + return bspFilename; } /* <4ee5c1> ../game_shared/bot/nav_file.cpp:191 */ -NOBODY void CNavArea::Save(FILE *fp) const +void CNavArea::Save(FILE *fp) const { -// { -// int base; // 198 -// } + fprintf(fp, "v %f %f %f\n", m_extent.lo.x, m_extent.lo.y, m_extent.lo.z); + fprintf(fp, "v %f %f %f\n", m_extent.hi.x, m_extent.lo.y, m_neZ); + fprintf(fp, "v %f %f %f\n", m_extent.hi.x, m_extent.hi.y, m_extent.hi.z); + fprintf(fp, "v %f %f %f\n", m_extent.lo.x, m_extent.hi.y, m_swZ); + + static int base = 1; + fprintf(fp, "\n\ng %04dArea%s%s%s%s\n", + m_id, + (GetAttributes() & NAV_CROUCH) ? "CROUCH" : "", + (GetAttributes() & NAV_JUMP) ? "JUMP" : "", + (GetAttributes() & NAV_PRECISE) ? "PRECISE" : "", + (GetAttributes() & NAV_NO_JUMP) ? "NO_JUMP" : "" + ); + + fprintf(fp, "f %d %d %d %d\n\n", base, base + 1, base + 2, base + 3); + base += 4; } /* <4f09b8> ../game_shared/bot/nav_file.cpp:212 */ NOBODY void CNavArea::Save(int fd, unsigned int version) { -// { -// unsigned char count; // 246 -// unsigned int saveCount; // 259 -// unsigned char type; // 281 -// unsigned int zero; // 282 -// EntryType entry; // 370 -// { -// int d; // 229 -// { -// unsigned int count; // 232 -// const_iterator iter; // 235 -// size(const class list> *const this); // 232 -// { -// union NavConnect connect; // 238 -// } -// operator++(_List_const_iterator *const this); // 236 -// } -// } -// size(const class list> *const this); // 247 -// size(const class list> *const this); // 254 -// { -// iterator iter; // 260 -// operator++(_List_iterator *const this); // 260 -// { -// class HidingSpot *spot; // 262 -// } -// } -// { -// int a; // 283 -// } -// { -// unsigned int count; // 310 -// class SpotEncounter *e; // 316 -// size(const class list> *const this); // 310 -// { -// iterator iter; // 317 -// { -// unsigned char dir; // 326 -// unsigned char spotCount; // 338 -// size(const class list> *const this); // 339 -// size(const class list> *const this); // 346 -// { -// iterator oiter; // 351 -// operator++(_List_iterator *const this); // 351 -// { -// class SpotOrder *order; // 353 -// unsigned int id; // 356 -// unsigned char t; // 359 -// } -// } -// } -// operator++(_List_iterator *const this); // 317 -// } -// } -// GetEntry(const class PlaceDirectory *const this, -// Place place); // 370 -// } + // save ID + Q_write(fd, &m_id, sizeof(unsigned int)); + + // save attribute flags + Q_write(fd, &m_attributeFlags, sizeof(unsigned char)); + + // save extent of area + Q_write(fd, &m_extent, 6 * sizeof(float)); + + // save heights of implicit corners + Q_write(fd, &m_neZ, sizeof(float)); + Q_write(fd, &m_swZ, sizeof(float)); + + // save connections to adjacent areas + // in the enum order NORTH, EAST, SOUTH, WEST + for (int d = 0; d < NUM_DIRECTIONS; d++) + { + // save number of connections for this direction + unsigned int count = m_connect[d].size(); + Q_write(fd, &count, sizeof(unsigned int)); + + NavConnectList::const_iterator iter; + for (iter = m_connect[d].begin(); iter != m_connect[d].end(); ++iter) + { + NavConnect connect = *iter; + Q_write(fd, &connect.area->m_id, sizeof(unsigned int)); + } + } + + // + // Store hiding spots for this area + // + unsigned char count; + if (m_hidingSpotList.size() > 255) + { + count = 255; + CONSOLE_ECHO("Warning: NavArea #%d: Truncated hiding spot list to 255\n", m_id); + } + else + { + count = m_hidingSpotList.size(); + } + + Q_write(fd, &count, sizeof(unsigned char)); + + // store HidingSpot objects + unsigned int saveCount = 0; + for (HidingSpotList::iterator iter = m_hidingSpotList.begin(); iter != m_hidingSpotList.end(); ++iter) + { + HidingSpot *spot = *iter; + + spot->Save(fd, version); + + // overflow check + if (++saveCount == count) + break; + } + + // + // Save the approach areas for this area + // + + // save number of approach areas + Q_write(fd, &m_approachCount, sizeof(unsigned char)); + if (cv_bot_debug.value > 0.0f) + CONSOLE_ECHO(" m_approachCount = %d\n", m_approachCount); + + // save approach area info + unsigned char type; + unsigned int zero = 0; + for (int a = 0; a < m_approachCount; ++a) + { + if (m_approach[a].here.area) + Q_write(fd, &m_approach[a].here.area->m_id, sizeof(unsigned int)); + else + Q_write(fd, &zero, sizeof(unsigned int)); + + if (m_approach[a].prev.area) + Q_write(fd, &m_approach[a].prev.area->m_id, sizeof(unsigned int)); + else + Q_write(fd, &zero, sizeof(unsigned int)); + + type = (unsigned char)m_approach[a].prevToHereHow; + Q_write(fd, &type, sizeof(unsigned char)); + + if (m_approach[a].next.area) + Q_write(fd, &m_approach[a].next.area->m_id, sizeof(unsigned int)); + else + Q_write(fd, &zero, sizeof(unsigned int)); + + type = (unsigned char)m_approach[a].hereToNextHow; + Q_write(fd, &type, sizeof(unsigned char)); + } + + // + // Save encounter spots for this area + // + { + // save number of encounter paths for this area + unsigned int count = m_spotEncounterList.size(); + Q_write(fd, &count, sizeof(unsigned int)); + + if (cv_bot_debug.value > 0.0f) + CONSOLE_ECHO(" m_spotEncounterList.size() = %d\n", count); + + SpotEncounter *e; + for (SpotEncounterList::iterator iter = m_spotEncounterList.begin(); iter != m_spotEncounterList.end(); ++iter) + { + e = &(*iter); + + if (e->from.area) + Q_write(fd, &e->from.area->m_id, sizeof(unsigned int)); + else + Q_write(fd, &zero, sizeof(unsigned int)); + + unsigned char dir = e->fromDir; + Q_write(fd, &dir, sizeof(unsigned char)); + + if (e->to.area) + Q_write(fd, &e->to.area->m_id, sizeof(unsigned int)); + else + Q_write(fd, &zero, sizeof(unsigned int)); + + dir = e->toDir; + Q_write(fd, &dir, sizeof(unsigned char)); + + // write list of spots along this path + unsigned char spotCount; + if (e->spotList.size() > 255) + { + spotCount = 255; + CONSOLE_ECHO("Warning: NavArea #%d: Truncated encounter spot list to 255\n", m_id); + } + else + { + spotCount = e->spotList.size(); + } + Q_write(fd, &spotCount, sizeof(unsigned char)); + + saveCount = 0; + for (SpotOrderList::iterator oiter = e->spotList.begin(); oiter != e->spotList.end(); ++oiter) + { + SpotOrder *order = &(*oiter); + + // order->spot may be NULL if we've loaded a nav mesh that has been edited but not re-analyzed + unsigned int id = (order->spot) ? order->spot->GetID() : 0; + Q_write(fd, &id, sizeof(unsigned int)); + + unsigned char t = 255 * order->t; + Q_write(fd, &t, sizeof(unsigned char)); + + // overflow check + if (++saveCount == spotCount) + break; + } + } + } + + // store place dictionary entry + PlaceDirectory::EntryType entry = placeDirectory.GetEntry(GetPlace()); + Q_write(fd, &entry, sizeof(entry)); } /* <4ee669> ../game_shared/bot/nav_file.cpp:379 */ NOBODY void CNavArea::Load(SteamFile *file, unsigned int version) { -// { -// unsigned char hidingSpotCount; // 424 -// unsigned char type; // 461 -// unsigned int count; // 479 -// EntryType entry; // 550 -// Read(SteamFile *const this, -// void *data, -// int length); // 382 -// { -// unsigned int e; // 485 -// { -// class SpotEncounter encounter; // 487 -// unsigned char spotCount; // 496 -// Read(SteamFile *const this, -// void *data, -// int length); // 493 -// Read(SteamFile *const this, -// void *data, -// int length); // 489 -// SpotEncounter(SpotEncounter *const this); // 487 -// Read(SteamFile *const this, -// void *data, -// int length); // 490 -// Read(SteamFile *const this, -// void *data, -// int length); // 492 -// Read(SteamFile *const this, -// void *data, -// int length); // 497 -// { -// int s; // 499 -// { -// Vector pos; // 501 -// Read(SteamFile *const this, -// void *data, -// int length); // 502 -// Read(SteamFile *const this, -// void *data, -// int length); // 503 -// } -// } -// ~SpotEncounter(SpotEncounter *const this, -// int const __in_chrg); // 487 -// } -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 389 -// Read(SteamFile *const this, -// void *data, -// int length); // 392 -// Read(SteamFile *const this, -// void *data, -// int length); // 399 -// Read(SteamFile *const this, -// void *data, -// int length); // 400 -// { -// int d; // 404 -// { -// unsigned int count; // 407 -// Read(SteamFile *const this, -// void *data, -// int length); // 408 -// { -// unsigned int i; // 410 -// { -// union NavConnect connect; // 412 -// Read(SteamFile *const this, -// void *data, -// int length); // 413 -// push_back(list> *const this, -// const value_type &__x); // 415 -// } -// } -// } -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 425 -// { -// int h; // 444 -// { -// class HidingSpot *spot; // 447 -// push_back(list> *const this, -// const value_type &__x); // 451 -// } -// } -// { -// Vector pos; // 430 -// { -// int h; // 431 -// { -// class HidingSpot *spot; // 436 -// Read(SteamFile *const this, -// void *data, -// int length); // 433 -// push_back(list> *const this, -// const value_type &__x); // 438 -// } -// } -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 458 -// { -// int a; // 462 -// Read(SteamFile *const this, -// void *data, -// int length); // 464 -// Read(SteamFile *const this, -// void *data, -// int length); // 466 -// Read(SteamFile *const this, -// void *data, -// int length); // 467 -// Read(SteamFile *const this, -// void *data, -// int length); // 470 -// Read(SteamFile *const this, -// void *data, -// int length); // 471 -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 480 -// { -// unsigned int e; // 509 -// { -// class SpotEncounter encounter; // 511 -// unsigned char dir; // 515 -// unsigned char spotCount; // 525 -// class SpotOrder order; // 528 -// Read(SteamFile *const this, -// void *data, -// int length); // 513 -// SpotEncounter(SpotEncounter *const this); // 511 -// Read(SteamFile *const this, -// void *data, -// int length); // 516 -// Read(SteamFile *const this, -// void *data, -// int length); // 519 -// Read(SteamFile *const this, -// void *data, -// int length); // 521 -// Read(SteamFile *const this, -// void *data, -// int length); // 526 -// { -// int s; // 529 -// { -// unsigned char t; // 533 -// Read(SteamFile *const this, -// void *data, -// int length); // 531 -// Read(SteamFile *const this, -// void *data, -// int length); // 534 -// push_back(list> *const this, -// const value_type &__x); // 538 -// } -// } -// push_back(list> *const this, -// const value_type &__x); // 541 -// ~SpotEncounter(SpotEncounter *const this, -// int const __in_chrg); // 511 -// } -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 551 -// EntryToPlace(const class PlaceDirectory *const this, -// EntryType entry); // 554 -// SetPlace(CNavArea *const this, -// Place place); // 554 -// } + // load ID + file->Read(&m_id, sizeof(unsigned int)); + + // update nextID to avoid collisions + if (m_id >= IMPLEMENT_ARRAY(m_nextID)) + IMPLEMENT_ARRAY(m_nextID) = m_id + 1; + + // load attribute flags + file->Read(&m_attributeFlags, sizeof(unsigned char)); + + // load extent of area + file->Read(&m_extent, 6 * sizeof(float)); + + m_center.x = (m_extent.lo.x + m_extent.hi.x) / 2.0f; + m_center.y = (m_extent.lo.y + m_extent.hi.y) / 2.0f; + m_center.z = (m_extent.lo.z + m_extent.hi.z) / 2.0f; + + // load heights of implicit corners + file->Read(&m_neZ, sizeof(float)); + file->Read(&m_swZ, sizeof(float)); + + // load connections (IDs) to adjacent areas + // in the enum order NORTH, EAST, SOUTH, WEST + for (int d = 0; d < NUM_DIRECTIONS; d++) + { + // load number of connections for this direction + unsigned int count; + file->Read(&count, sizeof(unsigned int)); + + for (unsigned int i = 0; iRead(&connect.id, sizeof(unsigned int)); + + m_connect[d].push_back(connect); + } + } + + // + // Load hiding spots + // + + // load number of hiding spots + unsigned char hidingSpotCount; + file->Read(&hidingSpotCount, sizeof(unsigned char)); + + if (version == 1) + { + // load simple vector array + Vector pos; + for (int h = 0; h < hidingSpotCount; ++h) + { + file->Read(&pos, 3 * sizeof(float)); + + // create new hiding spot and put on master list + HidingSpot *spot = new HidingSpot(&pos, HidingSpot::IN_COVER); + + m_hidingSpotList.push_back(spot); + } + } + else + { + // load HidingSpot objects for this area + for (int h=0; hLoad(file, version); + + m_hidingSpotList.push_back(spot); + } + } + + // + // Load number of approach areas + // + file->Read(&m_approachCount, sizeof(unsigned char)); + + // load approach area info (IDs) + unsigned char type; + for (int a = 0; a < m_approachCount; ++a) + { + file->Read(&m_approach[a].here.id, sizeof(unsigned int)); + + file->Read(&m_approach[a].prev.id, sizeof(unsigned int)); + file->Read(&type, sizeof(unsigned char) ); + m_approach[a].prevToHereHow = (NavTraverseType)type; + + file->Read(&m_approach[a].next.id, sizeof(unsigned int)); + file->Read(&type, sizeof(unsigned char)); + m_approach[a].hereToNextHow = (NavTraverseType)type; + } + + // + // Load encounter paths for this area + // + unsigned int count; + file->Read(&count, sizeof(unsigned int)); + + if (version < 3) + { + // old data, read and discard + for (unsigned int e = 0; e < count; ++e) + { + SpotEncounter encounter; + + file->Read(&encounter.from.id, sizeof(unsigned int)); + file->Read(&encounter.to.id, sizeof(unsigned int)); + + file->Read(&encounter.path.from.x, 3 * sizeof(float)); + file->Read(&encounter.path.to.x, 3 * sizeof(float)); + + // read list of spots along this path + unsigned char spotCount; + file->Read(&spotCount, sizeof(unsigned char)); + + for (int s = 0; s < spotCount; ++s) + { + Vector pos; + file->Read(&pos, 3 * sizeof(float)); + file->Read(&pos, sizeof(float)); + } + } + return; + } + + for (unsigned int e = 0; eRead(&encounter.from.id, sizeof(unsigned int)); + + unsigned char dir; + file->Read(&dir, sizeof(unsigned char)); + encounter.fromDir = static_cast(dir); + + file->Read(&encounter.to.id, sizeof(unsigned int)); + + file->Read(&dir, sizeof(unsigned char)); + encounter.toDir = static_cast(dir); + + // read list of spots along this path + unsigned char spotCount; + file->Read(&spotCount, sizeof(unsigned char)); + + SpotOrder order; + for( int s = 0; s < spotCount; ++s) + { + file->Read(&order.id, sizeof(unsigned int)); + + unsigned char t; + file->Read(&t, sizeof(unsigned char)); + + order.t = (float)t / 255.0f; + + encounter.spotList.push_back(order); + } + + m_spotEncounterList.push_back(encounter); + } + + if (version < 5) + return; + + // + // Load Place data + // + PlaceDirectory::EntryType entry; + file->Read(&entry, sizeof(entry)); + + // convert entry to actual Place + SetPlace(placeDirectory.EntryToPlace(entry)); } /* <4f029e> ../game_shared/bot/nav_file.cpp:562 */ NOBODY NavErrorType CNavArea::PostLoad(void) { -// { -// enum NavErrorType error; // 564 -// class SpotEncounter *e; // 610 -// { -// int d; // 567 -// { -// iterator iter; // 569 -// { -// union NavConnect *connect; // 572 -// unsigned int id; // 574 -// } -// operator++(_List_iterator *const this); // 570 -// } -// } -// { -// int a; // 585 -// } -// { -// iterator iter; // 611 -// end(list> *const this); // 611 -// { -// float halfWidth; // 632 -// float const eyeHeight; // 636 -// } -// { -// iterator oiter; // 642 -// end(list> *const this); // 642 -// { -// class SpotOrder *order; // 644 -// } -// operator++(_List_iterator *const this); // 642 -// } -// operator++(_List_iterator *const this); // 611 -// } -// { -// iterator oiter; // 657 -// { -// class CNavArea *area; // 659 -// push_back(list> *const this, -// const value_type &__x); // 665 -// } -// operator++(_List_iterator *const this); // 657 -// } -// } + NavErrorType error = NAV_OK; + + // connect areas together + for (int d = 0; d < NUM_DIRECTIONS; d++) + { + NavConnectList::iterator iter; + for (iter = m_connect[d].begin(); iter != m_connect[d].end(); ++iter) + { + NavConnect *connect = &(*iter); + + unsigned int id = connect->id; + connect->area = TheNavAreaGrid.GetNavAreaByID(id); + if (id && connect->area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Cannot connect Navigation Areas.\n"); + error = NAV_CORRUPT_DATA; + } + } + } + + // resolve approach area IDs + for (int a = 0; a < m_approachCount; ++a) + { + m_approach[a].here.area = TheNavAreaGrid.GetNavAreaByID(m_approach[a].here.id); + if (m_approach[a].here.id && m_approach[a].here.area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing Approach Area (here).\n"); + error = NAV_CORRUPT_DATA; + } + + m_approach[a].prev.area = TheNavAreaGrid.GetNavAreaByID(m_approach[a].prev.id); + if (m_approach[a].prev.id && m_approach[a].prev.area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing Approach Area (prev).\n"); + error = NAV_CORRUPT_DATA; + } + + m_approach[a].next.area = TheNavAreaGrid.GetNavAreaByID(m_approach[a].next.id); + if (m_approach[a].next.id && m_approach[a].next.area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing Approach Area (next).\n"); + error = NAV_CORRUPT_DATA; + } + } + + // resolve spot encounter IDs + SpotEncounter *e; + for (SpotEncounterList::iterator iter = m_spotEncounterList.begin(); iter != m_spotEncounterList.end(); ++iter) + { + e = &(*iter); + + e->from.area = TheNavAreaGrid.GetNavAreaByID(e->from.id); + if (e->from.area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing \"from\" Navigation Area for Encounter Spot.\n"); + error = NAV_CORRUPT_DATA; + } + + e->to.area = TheNavAreaGrid.GetNavAreaByID(e->to.id); + if (e->to.area == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing \"to\" Navigation Area for Encounter Spot.\n"); + error = NAV_CORRUPT_DATA; + } + + if (e->from.area && e->to.area) + { + // compute path + float halfWidth; + ComputePortal(e->to.area, e->toDir, &e->path.to, &halfWidth); + ComputePortal(e->from.area, e->fromDir, &e->path.from, &halfWidth); + + const float eyeHeight = HalfHumanHeight; + e->path.from.z = e->from.area->GetZ(&e->path.from) + eyeHeight; + e->path.to.z = e->to.area->GetZ(&e->path.to) + eyeHeight; + } + + // resolve HidingSpot IDs + for (SpotOrderList::iterator oiter = e->spotList.begin(); oiter != e->spotList.end(); ++oiter) + { + SpotOrder *order = &(*oiter); + + order->spot = GetHidingSpotByID(order->id); + if (order->spot == NULL) + { + CONSOLE_ECHO("ERROR: Corrupt navigation data. Missing Hiding Spot\n"); + error = NAV_CORRUPT_DATA; + } + } + } + + // build overlap list + /// @todo Optimize this + for (NavAreaList::iterator oiter = TheNavAreaList.begin(); oiter != TheNavAreaList.end(); ++oiter) + { + CNavArea *area = *oiter; + + if (area == this) + continue; + + if (IsOverlapping(area)) + m_overlapList.push_back(area); + } + + return error; } /* <4edbe0> ../game_shared/bot/nav_file.cpp:680 */ -NOBODY void COM_FixSlashes(char *pname) +void COM_FixSlashes(char *pname) { +#ifdef _WIN32 + while (*pname) + { + if (*pname == '/') + *pname = '\\'; + pname++; + } +#else + while (*pname) + { + if (*pname == '\\') + *pname = '/'; + pname++; + } +#endif // _WIN32 } /* <4f3e47> ../game_shared/bot/nav_file.cpp:702 */ NOBODY bool SaveNavigationMap(const char *filename) { -// { -// int fd; // 716 -// unsigned int magic; // 723 -// unsigned int version; // 733 -// char *bspFilename; // 739 -// unsigned int bspSize; // 743 -// iterator it; // 754 -// unsigned int count; // 775 -// COM_FixSlashes(char *pname); // 710 -// GetBspFilename(const char *navFilename); // 739 -// Reset(PlaceDirectory *const this); // 752 -// { -// class CNavArea *area; // 757 -// Place place; // 759 -// AddPlace(PlaceDirectory *const this, -// Place place); // 763 -// } -// operator++(_List_iterator *const this); // 755 -// Save(PlaceDirectory *const this, -// int fd); // 767 -// size(const class list> *const this); // 775 -// { -// class CNavArea *area; // 781 -// } -// operator++(_List_iterator *const this); // 779 -// } + if (filename == NULL) + return false; + + // + // Store the NAV file + // + COM_FixSlashes(const_cast(filename)); + +#ifdef WIN32 + int fd = _open(filename, _O_BINARY | _O_CREAT | _O_WRONLY, _S_IREAD | _S_IWRITE); +#else + int fd = creat(filename, S_IRUSR | S_IWUSR | S_IRGRP); +#endif // WIN32 + + if (fd < 0) + return false; + + // store "magic number" to help identify this kind of file + unsigned int magic = NAV_MAGIC_NUMBER; + Q_write(fd, &magic, sizeof(unsigned int)); + + // store version number of file + // 1 = hiding spots as plain vector array + // 2 = hiding spots as HidingSpot objects + // 3 = Encounter spots use HidingSpot ID's instead of storing vector again + // 4 = Includes size of source bsp file to verify nav data correlation + // ---- Beta Release at V4 ----- + // 5 = Added Place info + unsigned int version = 5; + Q_write(fd, &version, sizeof(unsigned int)); + + // get size of source bsp file and store it in the nav file + // so we can test if the bsp changed since the nav file was made + char *bspFilename = GetBspFilename(filename); + if (bspFilename == NULL) + return false; + + unsigned int bspSize = (unsigned int)GET_FILE_SIZE(bspFilename); + CONSOLE_ECHO("Size of bsp file '%s' is %u bytes.\n", bspFilename, bspSize); + + Q_write(fd, &bspSize, sizeof(unsigned int)); + + // + // Build a directory of the Places in this map + // + placeDirectory.Reset(); + + NavAreaList::iterator it; + for (it = TheNavAreaList.begin(); it != TheNavAreaList.end(); ++it) + { + CNavArea *area = *it; + Place place = area->GetPlace(); + + if (place) + { + placeDirectory.AddPlace(place); + } + } + + placeDirectory.Save(fd); + + // + // Store navigation areas + // + + // store number of areas + unsigned int count = TheNavAreaList.size(); + Q_write(fd, &count, sizeof(unsigned int)); + + // store each area + for (it = TheNavAreaList.begin(); it != TheNavAreaList.end(); ++it) + { + CNavArea *area = *it; + area->Save(fd, version); + } + + Q_close(fd); + +#ifdef _WIN32 + // output a simple Wavefront file to visualize the generated areas in 3DSMax + FILE *fp = fopen("c:\\tmp\\nav.obj", "w"); + if (fp) + { + for (NavAreaList::iterator iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + { + (*iter)->Save(fp); + } + + fclose(fp); + } +#endif // _WIN32 + + return true; } /* <4f169d> ../game_shared/bot/nav_file.cpp:811 */ NOBODY void LoadLocationFile(const char *filename) { -// { -// char locFilename; // 813 -// char *dot; // 816 -// strchr(char *__s, -// int __c); // 816 -// { -// int locDataLength; // 821 -// char *locDataFile; // 822 -// char *locData; // 823 -// { -// int dirSize; // 831 -// atoi(const char *__nptr); // 831 -// { -// class vector> directory; // 835 -// unsigned int areaID; // 846 -// unsigned int locDirIndex; // 846 -// vector(vector> *const this); // 835 -// reserve(vector> *const this, -// size_type __n); // 837 -// { -// int i; // 839 -// push_back(vector> *const this, -// const value_type &__x); // 842 -// } -// { -// class CNavArea *area;// 858 -// unsigned int place; // 859 -// atoi(const char *__nptr); // 853 -// atoi(const char *__nptr); // 856 -// SetPlace(CNavArea *const this, -// Place place); // 862 -// } -// ~vector(vector> *const this, -// int const __in_chrg); // 835 -// } -// } -// } -// } + char locFilename[256]; + Q_strcpy(locFilename, filename); + + char *dot = Q_strchr(locFilename, '.'); + if (dot) + { + Q_strcpy(dot, ".loc"); + + int locDataLength; + char *locDataFile = (char *)LOAD_FILE_FOR_ME(const_cast(locFilename), &locDataLength); + char *locData = locDataFile; + + if (locData) + { + CONSOLE_ECHO("Loading legacy 'location file' '%s'\n", locFilename); + + // read directory + locData = MP_COM_Parse(locData); + int dirSize = Q_atoi(MP_COM_GetToken()); + + if (dirSize) + { + std::vector directory; + directory.reserve(dirSize); + + for (int i = 0; i < dirSize; ++i) + { + locData = MP_COM_Parse(locData); + directory.push_back(TheBotPhrases->NameToID(MP_COM_GetToken())); + } + + // read places for each nav area + unsigned int areaID, locDirIndex; + while (true) + { + locData = MP_COM_Parse(locData); + if (locData == NULL) + break; + + areaID = Q_atoi(MP_COM_GetToken()); + + locData = MP_COM_Parse(locData); + locDirIndex = Q_atoi(MP_COM_GetToken()); + + CNavArea *area = TheNavAreaGrid.GetNavAreaByID(areaID); + unsigned int place = (locDirIndex > 0) ? directory[locDirIndex - 1] : UNDEFINED_PLACE; + + if (area) + area->SetPlace(place); + } + } + + FREE_FILE(locDataFile); + } + } } /* <4f05c5> ../game_shared/bot/nav_file.cpp:876 */ NOBODY void SanityCheckNavigationMap(const char *mapName) { -// { -// int const BufLen; // 885 -// char bspFilename; // 886 -// char navFilename; // 887 -// class SteamFile navFile; // 891 -// bool result; // 900 -// unsigned int magic; // 901 -// unsigned int version; // 910 -// SteamFile(SteamFile *const this, -// const char *filename); // 891 -// Read(SteamFile *const this, -// void *data, -// int length); // 902 -// ~SteamFile(SteamFile *const this, -// int const __in_chrg); // 891 -// ~SteamFile(SteamFile *const this, -// int const __in_chrg); // 891 -// Read(SteamFile *const this, -// void *data, -// int length); // 911 -// { -// unsigned int saveBspSize; // 921 -// unsigned int bspSize; // 931 -// Read(SteamFile *const this, -// void *data, -// int length); // 922 -// } -// } + if (!mapName) + { + CONSOLE_ECHO("ERROR: navigation file not specified.\n"); + return; + } + + // nav filename is derived from map filename + const int BufLen = 4096; + char bspFilename[BufLen]; + char navFilename[BufLen]; + + Q_snprintf(bspFilename, BufLen, "maps\\%s.bsp", mapName); + Q_snprintf(navFilename, BufLen, "maps\\%s.nav", mapName); + + SteamFile navFile(navFilename); + + if (!navFile.IsValid()) + { + CONSOLE_ECHO("ERROR: navigation file %s does not exist.\n", navFilename); + return; + } + + // check magic number + bool result; + unsigned int magic; + result = navFile.Read(&magic, sizeof(unsigned int)); + if (!result || magic != NAV_MAGIC_NUMBER) + { + CONSOLE_ECHO("ERROR: Invalid navigation file '%s'.\n", navFilename); + return; + } + + // read file version number + unsigned int version; + result = navFile.Read(&version, sizeof(unsigned int)); + if (!result || version > 5) + { + CONSOLE_ECHO("ERROR: Unknown version in navigation file %s.\n", navFilename); + return; + } + + if (version >= 4) + { + // get size of source bsp file and verify that the bsp hasn't changed + unsigned int saveBspSize; + navFile.Read(&saveBspSize, sizeof(unsigned int)); + + // verify size + if (bspFilename == NULL) + { + CONSOLE_ECHO("ERROR: No map corresponds to navigation file %s.\n", navFilename); + return; + } + + unsigned int bspSize = (unsigned int)GET_FILE_SIZE(bspFilename); + + if (bspSize != saveBspSize) + { + // this nav file is out of date for this bsp file + CONSOLE_ECHO("ERROR: Out-of-date navigation data in navigation file %s.\n", navFilename); + return; + } + } + CONSOLE_ECHO("navigation file %s passes the sanity check.\n", navFilename); } void (*pLoadNavigationMap)(void); @@ -546,58 +867,137 @@ NOBODY NavErrorType __declspec(naked) LoadNavigationMap(void) { jmp pLoadNavigationMap } -// { -// char filename; // 955 -// class SteamFile navFile; // 965 -// bool result; // 971 -// unsigned int magic; // 972 -// unsigned int version; // 981 -// unsigned int count; // 1020 -// class Extent extent; // 1023 -// iterator iter; // 1056 -// Reset(PlaceDirectory *const this); // 961 -// SteamFile(SteamFile *const this, -// const char *filename); // 965 -// Read(SteamFile *const this, -// void *data, -// int length); // 973 -// Read(SteamFile *const this, -// void *data, -// int length); // 982 -// { -// unsigned int saveBspSize; // 992 -// char *bspFilename; // 996 -// unsigned int bspSize; // 1000 -// Read(SteamFile *const this, -// void *data, -// int length); // 993 -// { -// char *msg; // 1005 -// } -// } -// Read(SteamFile *const this, -// void *data, -// int length); // 1021 -// { -// unsigned int i; // 1030 -// { -// class CNavArea *area; // 1032 -// const class Extent *areaExtent; // 1036 -// Load(CNavArea *const this, -// class SteamFile *file, -// unsigned int version); // 1033 -// push_back(list> *const this, -// const value_type &__x); // 1034 -// } -// } -// ~SteamFile(SteamFile *const this, -// int const __in_chrg); // 965 -// operator++(_List_iterator *const this); // 1057 -// { -// class CNavArea *area; // 1064 -// } -// operator++(_List_iterator *const this); // 1062 -// Load(PlaceDirectory *const this, -// class SteamFile *file); // 1016 -// } + + //// since the navigation map is destroyed on map change, + //// if it exists it has already been loaded for this map + //if (!TheNavAreaList.empty()) + // return NAV_OK; + + //// nav filename is derived from map filename + //char filename[256]; + //Q_sprintf(filename, "maps\\%s.nav", STRING(gpGlobals->mapname)); + + //// free previous navigation map data + //DestroyNavigationMap(); + //placeDirectory.Reset(); + + //IMPLEMENT_ARRAY_CLASS(CNavArea, m_nextID) = 1; + + //SteamFile navFile(filename); + + //if (!navFile.IsValid()) + // return NAV_CANT_ACCESS_FILE; + + //// check magic number + //bool result; + //unsigned int magic; + //result = navFile.Read(&magic, sizeof(unsigned int)); + //if (!result || magic != NAV_MAGIC_NUMBER) + //{ + // CONSOLE_ECHO("ERROR: Invalid navigation file '%s'.\n", filename); + // return NAV_INVALID_FILE; + //} + + //// read file version number + //unsigned int version; + //result = navFile.Read(&version, sizeof(unsigned int)); + //if (!result || version > 5) + //{ + // CONSOLE_ECHO( "ERROR: Unknown navigation file version.\n"); + // return NAV_BAD_FILE_VERSION; + //} + + //if (version >= 4) + //{ + // // get size of source bsp file and verify that the bsp hasn't changed + // unsigned int saveBspSize; + // navFile.Read(&saveBspSize, sizeof(unsigned int)); + + // // verify size + // char *bspFilename = GetBspFilename(filename); + // if (bspFilename == NULL) + // return NAV_INVALID_FILE; + + // unsigned int bspSize = (unsigned int)GET_FILE_SIZE(bspFilename); + + // if (bspSize != saveBspSize) + // { + // // this nav file is out of date for this bsp file + // char *msg = "*** WARNING ***\nThe AI navigation data is from a different version of this map.\nThe CPU players will likely not perform well.\n"; + // HintMessageToAllPlayers(msg); + // CONSOLE_ECHO("\n-----------------\n"); + // CONSOLE_ECHO(msg); + // CONSOLE_ECHO("-----------------\n\n"); + // } + //} + + //// load Place directory + //if (version >= 5) + //{ + // placeDirectory.Load(&navFile); + //} + + //// get number of areas + //unsigned int count; + //result = navFile.Read(&count, sizeof(unsigned int)); + + //Extent extent; + //extent.lo.x = 9999999999.9f; + //extent.lo.y = 9999999999.9f; + //extent.hi.x = -9999999999.9f; + //extent.hi.y = -9999999999.9f; + + //// load the areas and compute total extent + //for (unsigned int i = 0; i < count; i++) + //{ + // CNavArea *area = new CNavArea; + // area->Load(&navFile, version); + // TheNavAreaList.push_back(area); + + // const Extent *areaExtent = area->GetExtent(); + + // // check validity of nav area + // if (areaExtent->lo.x >= areaExtent->hi.x || areaExtent->lo.y >= areaExtent->hi.y) + // CONSOLE_ECHO( "WARNING: Degenerate Navigation Area #%d at ( %g, %g, %g )\n", + // area->GetID(), area->m_center.x, area->m_center.y, area->m_center.z); + + // if (areaExtent->lo.x < extent.lo.x) + // extent.lo.x = areaExtent->lo.x; + + // if (areaExtent->lo.y < extent.lo.y) + // extent.lo.y = areaExtent->lo.y; + + // if (areaExtent->hi.x > extent.hi.x) + // extent.hi.x = areaExtent->hi.x; + + // if (areaExtent->hi.y > extent.hi.y) + // extent.hi.y = areaExtent->hi.y; + //} + + //// add the areas to the grid + //TheNavAreaGrid.Initialize(extent.lo.x, extent.hi.x, extent.lo.y, extent.hi.y); + + //NavAreaList::iterator iter; + //for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + // TheNavAreaGrid.AddNavArea(*iter); + + //// allow areas to connect to each other, etc + //for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter) + //{ + // CNavArea *area = *iter; + // area->PostLoad(); + //} + + //// load legacy location file (Places) + //if (version < 5) + //{ + // LoadLocationFile(filename); + //} + + //// + //// Set up all the ladders + //// + //BuildLadders(); + + //return NAV_OK; } diff --git a/regamedll/game_shared/bot/nav_file.h b/regamedll/game_shared/bot/nav_file.h index d90fc062..27260204 100644 --- a/regamedll/game_shared/bot/nav_file.h +++ b/regamedll/game_shared/bot/nav_file.h @@ -32,8 +32,12 @@ #pragma once #endif +#undef min +#undef max + #include #include +#include #include #include @@ -45,6 +49,16 @@ #endif // _WIN32 +// The 'place directory' is used to save and load places from +// nav files in a size-efficient manner that also allows for the +// order of the place ID's to change without invalidating the +// nav files. +// +// The place directory is stored in the nav file as a list of +// place name strings. Each nav area then contains an index +// into that directory, or zero if no place has been assigned to +// that area. + /* <4ecb57> ../game_shared/bot/nav_file.cpp:54 */ class PlaceDirectory { @@ -58,10 +72,17 @@ public: Place EntryToPlace(EntryType entry) const; // given an entry, return the Place void Save(int fd); // store the directory void Load(SteamFile *file); // load the directory + private: std::vector m_directory; }; +#ifdef HOOK_GAMEDLL +#define placeDirectory (*pplaceDirectory) +#endif // HOOK_GAMEDLL + +extern PlaceDirectory placeDirectory; + NOBODY char *GetBspFilename(const char *navFilename); NOBODY void COM_FixSlashes(char *pname); NOBODY bool SaveNavigationMap(const char *filename); diff --git a/regamedll/game_shared/perf_counter.h b/regamedll/game_shared/perf_counter.h index 5cfa6ec4..fdd1d322 100644 --- a/regamedll/game_shared/perf_counter.h +++ b/regamedll/game_shared/perf_counter.h @@ -1,4 +1,4 @@ -/* +/* * * 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 @@ -58,9 +58,10 @@ class CPerformanceCounter { public: - CPerformanceCounter(); + CPerformanceCounter(void); + void InitializePerformanceCounter(void); - double GetCurTime(); + double GetCurTime(void); private: int m_iLowShift; @@ -71,7 +72,11 @@ private: };/* size: 28, cachelines: 1, members: 4 */ /* <2ebfc> ../game_shared/perf_counter.h:61 */ -inline CPerformanceCounter::CPerformanceCounter() +inline CPerformanceCounter::CPerformanceCounter(void) : + m_iLowShift(0), + m_flPerfCounterFreq(0), + m_flCurrentTime(0), + m_flLastCurrentTime(0) { InitializePerformanceCounter(); } @@ -80,46 +85,52 @@ inline CPerformanceCounter::CPerformanceCounter() inline void CPerformanceCounter::InitializePerformanceCounter(void) { #ifdef _WIN32 - unsigned int lowpart; - unsigned int highpart; - LARGE_INTEGER performanceFreq; - QueryPerformanceFrequency(&performanceFreq); - - lowpart = (unsigned int)performanceFreq.LowPart; - highpart = (unsigned int)performanceFreq.HighPart; - m_iLowShift = 0; - - while (highpart || (lowpart > 2000000.0)) - { - m_iLowShift++; - lowpart >>= 1; - lowpart |= (highpart & 1)<<31; - highpart >>= 1; - } + LARGE_INTEGER performanceFreq; + QueryPerformanceFrequency(&performanceFreq); + + // get 32 out of the 64 time bits such that we have around + // 1 microsecond resolution + unsigned int lowpart, highpart; + lowpart = (unsigned int)performanceFreq.LowPart; + highpart = (unsigned int)performanceFreq.HighPart; + m_iLowShift = 0; + + while (highpart || (lowpart > 2000000.0)) + { + m_iLowShift++; + lowpart >>= 1; + lowpart |= (highpart & 1) << 31; + highpart >>= 1; + } + m_flPerfCounterFreq = 1.0 / (double)lowpart; -#endif + +#endif // _WIN32 } /* <2ec16> ../game_shared/perf_counter.h:97 */ inline double CPerformanceCounter::GetCurTime(void) { #ifdef _WIN32 - static int first = 1; - static int sametimecount; - static unsigned int oldtime; - - unsigned int t2; - unsigned int temp; + static int sametimecount; + static unsigned int oldtime; + static int first = 1; + LARGE_INTEGER PerformanceCount; + unsigned int temp, t2; double time; - LARGE_INTEGER PerformanceCount; QueryPerformanceCounter(&PerformanceCount); - if (!m_iLowShift) + if (m_iLowShift == 0) + { temp = (unsigned int)PerformanceCount.LowPart; + } else - temp = ((unsigned int)PerformanceCount.LowPart>>m_iLowShift)|((unsigned int)PerformanceCount.HighPart<<(32 - m_iLowShift)); + { + temp = ((unsigned int)PerformanceCount.LowPart >> m_iLowShift) | + ((unsigned int)PerformanceCount.HighPart << (32 - m_iLowShift)); + } if (first) { @@ -128,8 +139,12 @@ inline double CPerformanceCounter::GetCurTime(void) } else { + // check for turnover or backward time if ((temp <= oldtime) && ((oldtime - temp) < 0x10000000)) - oldtime = temp; + { + // so we can't get stuck + oldtime = temp; + } else { t2 = temp - oldtime; @@ -142,6 +157,7 @@ inline double CPerformanceCounter::GetCurTime(void) if (m_flCurrentTime == m_flLastCurrentTime) { sametimecount++; + if (sametimecount > 100000) { m_flCurrentTime += 1.0; @@ -149,24 +165,32 @@ inline double CPerformanceCounter::GetCurTime(void) } } else - sametimecount = 0; + { + sametimecount = 0; + } m_flLastCurrentTime = m_flCurrentTime; } } + return m_flCurrentTime; -#else + +#else // _WIN32 + struct timeval tp; static int secbase = 0; - gettimeofday(&tp,NULL); + gettimeofday(&tp, NULL); + if (!secbase) { secbase = tp.tv_sec; return (tp.tv_usec / 1000000.0); } + return ((tp.tv_sec - secbase) + tp.tv_usec / 1000000.0); -#endif + +#endif // _WIN32 } #endif // PERF_COUNTER_H diff --git a/regamedll/game_shared/steam_util.h b/regamedll/game_shared/steam_util.h index 0dd85410..e5520eae 100644 --- a/regamedll/game_shared/steam_util.h +++ b/regamedll/game_shared/steam_util.h @@ -43,12 +43,14 @@ public: return (m_fileData) ? true : false; } bool Read(void *data, int length); + private: byte *m_fileData; int m_fileDataLength; byte *m_cursor; int m_bytesLeft; + };/* size: 16, cachelines: 1, members: 4 */ /* <4eb7b4> ../game_shared/steam_util.h:29 */ diff --git a/regamedll/game_shared/voice_gamemgr.cpp b/regamedll/game_shared/voice_gamemgr.cpp index 395a65c2..95ecebc8 100644 --- a/regamedll/game_shared/voice_gamemgr.cpp +++ b/regamedll/game_shared/voice_gamemgr.cpp @@ -5,8 +5,8 @@ */ #ifndef HOOK_GAMEDLL -cvar_t voice_serverdebug = { "voice_serverdebug", "0" }; -cvar_t sv_alltalk = { "sv_alltalk", "0", FCVAR_SERVER }; +cvar_t voice_serverdebug = { "voice_serverdebug", "0", 0, 0.0f, NULL }; +cvar_t sv_alltalk = { "sv_alltalk", "0", FCVAR_SERVER, 0.0f, NULL }; #else @@ -31,7 +31,7 @@ void VoiceServerDebug(const char *pFmt, ...) return; va_start(marker, pFmt); - Q_vsnprintf(msg, sizeof(msg), pFmt, marker); + Q_vsnprintf(msg, ARRAYSIZE(msg), pFmt, marker); va_end(marker); ALERT(at_console, "%s", msg); @@ -149,9 +149,9 @@ bool CVoiceGameMgr::ClientCommand(CBasePlayer *pPlayer, const char *cmd) } else if (Q_stricmp(cmd, "VModEnable") == 0 && CMD_ARGC() >= 2) { - VoiceServerDebug("CVoiceGameMgr::ClientCommand: VModEnable (%d)\n", !!atoi(CMD_ARGV(1))); + VoiceServerDebug("CVoiceGameMgr::ClientCommand: VModEnable (%d)\n", !!Q_atoi(CMD_ARGV(1))); - g_PlayerModEnable[ playerClientIndex ] = !!atoi(CMD_ARGV(1)); + g_PlayerModEnable[ playerClientIndex ] = !!Q_atoi(CMD_ARGV(1)); g_bWantModEnable[ playerClientIndex ] = false; return true; diff --git a/regamedll/game_shared/voice_gamemgr.h b/regamedll/game_shared/voice_gamemgr.h index 7baf9924..7f880932 100644 --- a/regamedll/game_shared/voice_gamemgr.h +++ b/regamedll/game_shared/voice_gamemgr.h @@ -63,7 +63,7 @@ class IVoiceGameMgrHelper { public: virtual ~IVoiceGameMgrHelper() {} - NOBODY virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pTalker) = 0; + virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pTalker) = 0; };/* size: 4, cachelines: 1, members: 1 */ @@ -80,13 +80,12 @@ public: bool ClientCommand(CBasePlayer *pPlayer, const char *cmd); bool PlayerHasBlockedPlayer(CBasePlayer *pReceiver, CBasePlayer *pSender); -#ifdef HOOK_GAMEDLL -public: -#else +#ifndef HOOK_GAMEDLL private: #endif // HOOK_GAMEDLL void UpdateMasks(void); + private: int m_msgPlayerVoiceMask; int m_msgRequestState; diff --git a/regamedll/hookers/6153_hooker.cpp b/regamedll/hookers/6153_hooker.cpp index 5aad6c1b..5d191895 100644 --- a/regamedll/hookers/6153_hooker.cpp +++ b/regamedll/hookers/6153_hooker.cpp @@ -84,6 +84,7 @@ extern const size_t g_BaseOffset = NULL; //#define Animation_Region //#define GameRules_Region //#define Multiplay_GameRules_Region +//#define Singleplay_GameRules_Region //#define Training_Gamerules_Region //#define CareerTasks_Region //#define MemoryPool_Region @@ -102,7 +103,6 @@ extern const size_t g_BaseOffset = NULL; //#define GameShr_BotProfile_Region //#define VoiceManager_Region //#define Vector_Region - //#define Data_References_Region //#define Function_References_Region @@ -131,6 +131,9 @@ FunctionHook g_FunctionHooks[] = #ifndef PM_Shared_Region + { 0x01DB6640, "PM_Move", (size_t)&PM_Move }, + { 0x01DB6710, "PM_Init", (size_t)&PM_Init }, + { 0x01DB1020, "PM_FindTextureType", (size_t)&PM_FindTextureType }, //pm_debug //{ 0x0, "PM_ShowClipBox", (size_t)&PM_ShowClipBox }, //{ 0x0, "PM_ParticleLine", (size_t)&PM_ParticleLine }, @@ -148,56 +151,53 @@ FunctionHook g_FunctionHooks[] = //{ 0x01DB17E0, "PM_MapTextureTypeStepType", (size_t)&PM_MapTextureTypeStepType }, // NOXREF { 0x01DB1860, "PM_CatagorizeTextureType", (size_t)&PM_CatagorizeTextureType }, { 0x01DB19B0, "PM_UpdateStepSound", (size_t)&PM_UpdateStepSound }, - //{ 0x0, "PM_AddToTouched", (size_t)&PM_AddToTouched }, - //{ 0x0, "PM_CheckVelocity", (size_t)&PM_CheckVelocity }, - //{ 0x0, "PM_ClipVelocity", (size_t)&PM_ClipVelocity }, - //{ 0x0, "PM_AddCorrectGravity", (size_t)&PM_AddCorrectGravity }, - //{ 0x0, "PM_FixupGravityVelocity", (size_t)&PM_FixupGravityVelocity }, - //{ 0x0, "PM_FlyMove", (size_t)&PM_FlyMove }, - //{ 0x0, "PM_Accelerate", (size_t)&PM_Accelerate }, - //{ 0x0, "PM_WalkMove", (size_t)&PM_WalkMove }, - //{ 0x0, "PM_Friction", (size_t)&PM_Friction }, - //{ 0x0, "PM_AirAccelerate", (size_t)&PM_AirAccelerate }, - //{ 0x0, "PM_WaterMove", (size_t)&PM_WaterMove }, - //{ 0x0, "PM_AirMove", (size_t)&PM_AirMove }, - //{ 0x0, "PM_InWater", (size_t)&PM_InWater }, - //{ 0x0, "PM_CheckWater", (size_t)&PM_CheckWater }, - //{ 0x0, "PM_CatagorizePosition", (size_t)&PM_CatagorizePosition }, - //{ 0x0, "PM_GetRandomStuckOffsets", (size_t)&PM_GetRandomStuckOffsets }, - //{ 0x0, "PM_ResetStuckOffsets", (size_t)&PM_ResetStuckOffsets }, - //{ 0x0, "PM_CheckStuck", (size_t)&PM_CheckStuck }, - //{ 0x0, "PM_SpectatorMove", (size_t)&PM_SpectatorMove }, - //{ 0x0, "PM_SplineFraction", (size_t)&PM_SplineFraction }, - //{ 0x0, "PM_SimpleSpline", (size_t)&PM_SimpleSpline }, - //{ 0x0, "PM_FixPlayerCrouchStuck", (size_t)&PM_FixPlayerCrouchStuck }, - //{ 0x0, "PM_Duck", (size_t)&PM_Duck }, - //{ 0x0, "PM_LadderMove", (size_t)&PM_LadderMove }, - //{ 0x0, "PM_Ladder", (size_t)&PM_Ladder }, - //{ 0x0, "PM_WaterJump", (size_t)&PM_WaterJump }, - //{ 0x0, "PM_AddGravity", (size_t)&PM_AddGravity }, - //{ 0x0, "PM_PushEntity", (size_t)&PM_PushEntity }, - //{ 0x0, "PM_Physics_Toss", (size_t)&PM_Physics_Toss }, - //{ 0x0, "PM_NoClip", (size_t)&PM_NoClip }, - //{ 0x0, "PM_PreventMegaBunnyJumping", (size_t)&PM_PreventMegaBunnyJumping }, - //{ 0x0, "PM_Jump", (size_t)&PM_Jump }, - //{ 0x0, "PM_CheckWaterJump", (size_t)&PM_CheckWaterJump }, - //{ 0x0, "PM_CheckFalling", (size_t)&PM_CheckFalling }, - //{ 0x0, "PM_PlayWaterSounds", (size_t)&PM_PlayWaterSounds }, // NOXREF + //{ 0x01DB1CB0, "PM_AddToTouched", (size_t)&PM_AddToTouched }, // NOXREF + { 0x01DB1D50, "PM_CheckVelocity", (size_t)&PM_CheckVelocity }, + { 0x01DB1E40, "PM_ClipVelocity", (size_t)&PM_ClipVelocity }, + //{ 0x01DB1EF0, "PM_AddCorrectGravity", (size_t)&PM_AddCorrectGravity }, // NOXREF + //{ 0x01DB1F70, "PM_FixupGravityVelocity", (size_t)&PM_FixupGravityVelocity }, // NOXREF + { 0x01DB1FD0, "PM_FlyMove", (size_t)&PM_FlyMove }, + //{ 0x01DB24E0, "PM_Accelerate", (size_t)&PM_Accelerate }, // NOXREF + { 0x01DB2580, "PM_WalkMove", (size_t)&PM_WalkMove }, + { 0x01DB2B50, "PM_Friction", (size_t)&PM_Friction }, + { 0x01DB2CF0, "PM_AirAccelerate", (size_t)&PM_AirAccelerate }, + { 0x01DB2DB0, "PM_WaterMove", (size_t)&PM_WaterMove }, + { 0x01DB30C0, "PM_AirMove", (size_t)&PM_AirMove }, + //{ 0x01DB3200, "PM_InWater", (size_t)&PM_InWater }, // NOXREF + { 0x01DB3220, "PM_CheckWater", (size_t)&PM_CheckWater }, + { 0x01DB33E0, "PM_CatagorizePosition", (size_t)&PM_CatagorizePosition }, + //{ 0x01DB3590, "PM_GetRandomStuckOffsets", (size_t)&PM_GetRandomStuckOffsets }, // NOXREF + //{ 0x01DB35E0, "PM_ResetStuckOffsets", (size_t)&PM_ResetStuckOffsets }, // NOXREF + { 0x01DB3600, "PM_CheckStuck", (size_t)&PM_CheckStuck }, + { 0x01DB3970, "PM_SpectatorMove", (size_t)&PM_SpectatorMove }, + //{ 0x01DB3C70, "PM_SplineFraction", (size_t)&PM_SplineFraction }, // NOXREF + //{ 0x01DB3C90, "PM_SimpleSpline", (size_t)&PM_SimpleSpline }, // NOXREF + //{ 0x01DB3CB0, "PM_FixPlayerCrouchStuck", (size_t)&PM_FixPlayerCrouchStuck }, // NOXREF + { 0x01DB3D50, "PM_Duck", (size_t)&PM_Duck }, + { 0x01DB4110, "PM_LadderMove", (size_t)&PM_LadderMove }, + { 0x01DB44D0, "PM_Ladder", (size_t)&PM_Ladder }, + //{ 0x01DB45A0, "PM_WaterJump", (size_t)&PM_WaterJump }, // NOXREF + //{ 0x01DB4660, "PM_AddGravity", (size_t)&PM_AddGravity }, // NOXREF + //{ 0x01DB46C0, "PM_PushEntity", (size_t)&PM_PushEntity }, // NOXREF + { 0x01DB4820, "PM_Physics_Toss", (size_t)&PM_Physics_Toss }, + { 0x01DB4DE0, "PM_NoClip", (size_t)&PM_NoClip }, + //{ 0x01DB4E90, "PM_PreventMegaBunnyJumping", (size_t)&PM_PreventMegaBunnyJumping }, // NOXREF + { 0x01DB4F00, "PM_Jump", (size_t)&PM_Jump }, + { 0x01DB52F0, "PM_CheckWaterJump", (size_t)&PM_CheckWaterJump }, + { 0x01DB5560, "PM_CheckFalling", (size_t)&PM_CheckFalling }, + //{ 0x01DB5810, "PM_PlayWaterSounds", (size_t)&PM_PlayWaterSounds }, // NOXREF //{ 0x01DB5810, "PM_CalcRoll", (size_t)&PM_CalcRoll }, // NOXREF //{ 0x01DB58A0, "PM_DropPunchAngle", (size_t)&PM_DropPunchAngle }, // NOXREF - - //#@{ 0x01DB58F0, "PM_CheckParamters", (size_t)&PM_CheckParamters }, + { 0x01DB58F0, "PM_CheckParamters", (size_t)&PM_CheckParamters }, { 0x01DB5BE0, "PM_ReduceTimers", (size_t)&PM_ReduceTimers }, - //{ 0x01DB5D20, "PM_ShouldDoSpectMode", (size_t)&PM_ShouldDoSpectMode }, // NOXREF - //{ 0x01DB5D50, "PM_PlayerMove", (size_t)&PM_PlayerMove }, - //5@{ 0x01DB6430, "PM_CreateStuckTable", (size_t)&PM_CreateStuckTable }, + { 0x01DB5D50, "PM_PlayerMove", (size_t)&PM_PlayerMove }, + { 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 //{ 0x0, "anglemod", (size_t)&anglemod }, { 0x01DB0000, "AngleVectors", (size_t)&AngleVectors }, - //{ 0x0, "AngleVectorsTranspose", (size_t)&AngleVectorsTranspose }, { 0x01DB0200, "AngleMatrix", (size_t)&AngleMatrix }, //{ 0x0, "AngleIMatrix", (size_t)&AngleIMatrix }, @@ -206,7 +206,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "AngleBetweenVectors", (size_t)&AngleBetweenVectors }, //{ 0x0, "VectorTransform", (size_t)&VectorTransform }, { 0x01DB0610, "VectorCompare", (size_t)&VectorCompare }, - //{ 0x0, "VectorMA", (size_t)&VectorMA }, + { 0x01DB0640, "VectorMA", (size_t)&VectorMA }, //{ 0x01DB0680, "_DotProduct", (size_t)&_DotProduct }, // NOXREF //{ 0x01DB06A0, "_VectorSubtract", (size_t)&_VectorSubtract }, // NOXREF //{ 0x01DB06D0, "_VectorAdd", (size_t)&_VectorAdd }, // NOXREF @@ -241,15 +241,16 @@ FunctionHook g_FunctionHooks[] = #ifndef AirTank_Region //virtual func - //{ 0x0, "_ZN8CAirtank5SpawnEv", mfunc_ptr_cast(&CAirtank::Spawn_) }, - //{ 0x0, "_ZN8CAirtank8PrecacheEv", mfunc_ptr_cast(&CAirtank::Precache_) }, - //{ 0x0, "_ZN8CAirtank4SaveER5CSave", mfunc_ptr_cast(&CAirtank::Save_) }, - //{ 0x0, "_ZN8CAirtank7RestoreER8CRestore", mfunc_ptr_cast(&CAirtank::Restore_) }, - //{ 0x0, "_ZN8CAirtank6KilledEP9entvars_si", mfunc_ptr_cast(&CAirtank::Killed_) }, - //{ 0x0, "_ZN8CAirtank10BloodColorEv", mfunc_ptr_cast(&CAirtank::BloodColor_) }, + { 0x01D592B0, "_ZN8CAirtank5SpawnEv", mfunc_ptr_cast(&CAirtank::Spawn_) }, + { 0x01D593A0, "_ZN8CAirtank8PrecacheEv", mfunc_ptr_cast(&CAirtank::Precache_) }, + { 0x01D59250, "_ZN8CAirtank4SaveER5CSave", mfunc_ptr_cast(&CAirtank::Save_) }, + { 0x01D59280, "_ZN8CAirtank7RestoreER8CRestore", mfunc_ptr_cast(&CAirtank::Restore_) }, + { 0x01D593C0, "_ZN8CAirtank6KilledEP9entvars_si", mfunc_ptr_cast(&CAirtank::Killed_) }, + { 0x01D59240, "_ZN8CAirtank10BloodColorEv", mfunc_ptr_cast(&CAirtank::BloodColor_) }, //non-virtual func - //{ 0x01D591F0, "item_airtank", (size_t)&item_airtank }, - + { 0x01D59410, "_ZN8CAirtank9TankThinkEv", mfunc_ptr_cast(&CAirtank::TankThink) }, + { 0x01D59430, "_ZN8CAirtank9TankTouchEP11CBaseEntity", mfunc_ptr_cast(&CAirtank::TankTouch) }, + { 0x01D591F0, "item_airtank", (size_t)&item_airtank }, #endif // AirTank_Region @@ -272,36 +273,39 @@ FunctionHook g_FunctionHooks[] = { 0x01D649A0, "_Z15CheckStartMoneyv", (size_t)&CheckStartMoney }, { 0x01D649F0, "_Z17ClientPutInServerP7edict_s", (size_t)&ClientPutInServer }, { 0x01D64F00, "Q_strlen", (size_t)&Q_strlen_ }, - //{ 0x01D64F20, "_Z8Host_SayP7edict_si", (size_t)&Host_Say }, + { 0x01D64F20, "_Z8Host_SayP7edict_si", (size_t)&Host_Say }, + //{ 0x0, "", (size_t)&DropSecondary }, // NOXREF { 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 }, - //{ 0x0, "_Z19BuyWeaponByWeaponIDP11CBasePlayer12WeaponIdType", (size_t)&BuyWeaponByWeaponID }, - //{ 0x0, "_Z8BuyRifleP11CBasePlayeri", (size_t)&BuyRifle }, - //{ 0x0, "_Z13BuyMachineGunP11CBasePlayeri", (size_t)&BuyMachineGun }, - //{ 0x0, "_Z7BuyItemP11CBasePlayeri", (size_t)&BuyItem }, - //{ 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 }, - //{ 0x0, "_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb", (size_t)&BuyGunAmmo }, - //{ 0x0, "_Z7BuyAmmoP11CBasePlayerib", (size_t)&BuyAmmo }, - //{ 0x0, "_Z16EntityFromUserIDi", (size_t)&EntityFromUserID }, - //{ 0x0, "_Z20CountPlayersInServerv", (size_t)&CountPlayersInServer }, - //{ 0x0, "_Z22HandleBuyAliasCommandsP11CBasePlayerPKc", (size_t)&HandleBuyAliasCommands }, - //{ 0x0, "_Z24HandleRadioAliasCommandsP11CBasePlayerPKc", (size_t)&HandleRadioAliasCommands }, - //{ 0x01D68840, "_Z13ClientCommandP7edict_s", (size_t)&ClientCommand }, - //{ 0x01D6B230, "_Z21ClientUserInfoChangedP7edict_sPc", (size_t)&ClientUserInfoChanged }, + { 0x01D65740, "_Z10CanBuyThisP11CBasePlayeri", (size_t)&CanBuyThis }, + { 0x01D65850, "_Z9BuyPistolP11CBasePlayeri", (size_t)&BuyPistol }, + { 0x01D65A30, "_Z10BuyShotgunP11CBasePlayeri", (size_t)&BuyShotgun }, + { 0x01D65B70, "_Z16BuySubMachineGunP11CBasePlayeri", (size_t)&BuySubMachineGun }, + { 0x01D65D00, "_Z19BuyWeaponByWeaponIDP11CBasePlayer12WeaponIdType", (size_t)&BuyWeaponByWeaponID }, + { 0x01D65E80, "_Z8BuyRifleP11CBasePlayeri", (size_t)&BuyRifle }, + { 0x01D66070, "_Z13BuyMachineGunP11CBasePlayeri", (size_t)&BuyMachineGun }, + { 0x01D66170, "_Z7BuyItemP11CBasePlayeri", (size_t)&BuyItem }, + { 0x01D669A0, "_Z27HandleMenu_ChooseAppearanceP11CBasePlayeri", (size_t)&HandleMenu_ChooseAppearance }, + { 0x01D66D10, "_Z21HandleMenu_ChooseTeamP11CBasePlayeri", (size_t)&HandleMenu_ChooseTeam }, + + { 0x01D67930, "_Z6Radio1P11CBasePlayeri", (size_t)&Radio1 }, + { 0x01D67A20, "_Z6Radio2P11CBasePlayeri", (size_t)&Radio2 }, + { 0x01D67B10, "_Z6Radio3P11CBasePlayeri", (size_t)&Radio3 }, + { 0x01D67C70, "_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb", (size_t)&BuyGunAmmo }, + + //{ 0x01D67E50, "_Z7BuyAmmoP11CBasePlayerib", (size_t)&BuyAmmo }, // NOXREF + //{ 0x01D67EC0, "_Z16EntityFromUserIDi", (size_t)&EntityFromUserID }, // NOXREF + //{ 0x01D67FC0, "_Z20CountPlayersInServerv", (size_t)&CountPlayersInServer }, // NOXREF + { 0x01D680D0, "_Z22HandleBuyAliasCommandsP11CBasePlayerPKc", (size_t)&HandleBuyAliasCommands }, + { 0x01D68540, "_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 }, //{ 0x01D6B660, "_Z13ParmsNewLevelv", (size_t)&ParmsNewLevel }, // PURE - //{ 0x01D6B670, "_Z16ParmsChangeLevelv", (size_t)&ParmsChangeLevel }, - //{ 0x01D6B6A0, "_Z10StartFramev", (size_t)&StartFrame }, + { 0x01D6B670, "_Z16ParmsChangeLevelv", (size_t)&ParmsChangeLevel }, + { 0x01D6B6A0, "_Z10StartFramev", (size_t)&StartFrame }, { 0x01D6B740, "_Z14ClientPrecachev", (size_t)&ClientPrecache }, { 0x01D6CCE0, "_Z18GetGameDescriptionv", (size_t)&GetGameDescription }, { 0x01D6CD00, "_Z9Sys_ErrorPKc", (size_t)&Sys_Error }, @@ -343,56 +347,49 @@ FunctionHook g_FunctionHooks[] = { 0x01D61AE0, "_Z18AddEntityHashValueP9entvars_sPKc12hash_types_e", (size_t)&AddEntityHashValue }, { 0x01D61CA0, "_Z21RemoveEntityHashValueP9entvars_sPKc12hash_types_e", (size_t)&RemoveEntityHashValue }, - //{ 0x01D61E20, "_Z13printEntitiesv", (size_t)&printEntities }, + { 0x01D61E20, "_Z13printEntitiesv", (size_t)&printEntities }, { 0x01D61ED0, "_Z19CREATE_NAMED_ENTITYj", (size_t)&CREATE_NAMED_ENTITY }, { 0x01D61F10, "_Z13REMOVE_ENTITYP7edict_s", (size_t)&REMOVE_ENTITY }, - //{ 0x01D62540, "_Z12CONSOLE_ECHOPcz", (size_t)&CONSOLE_ECHO }, // already? - //{ 0x01D61F30, "_Z15loopPerformancev", (size_t)&loopPerformance }, + { 0x01D62540, "_Z12CONSOLE_ECHOPcz", (size_t)&CONSOLE_ECHO_ }, + { 0x01D61F30, "_Z15loopPerformancev", (size_t)&loopPerformance }, { 0x01D62570, "GetEntityAPI", (size_t)&GetEntityAPI }, //{ 0x01D62670, "_Z13GetEntityAPI2P13DLL_FUNCTIONSPi", (size_t)&GetEntityAPI2 }, // NOXREF { 0x01D626B0, "GetNewDLLFunctions", (size_t)&GetNewDLLFunctions }, //{ 0x01D62B20, "_Z16FindGlobalEntityjj", (size_t)&FindGlobalEntity }, // NOXREF - //{ 0x01D63700, "_ZL21SetObjectCollisionBoxP9entvars_s", (size_t)&SetObjectCollisionBox }, - //{ 0x01D63BE0, "_Z20OnFreeEntPrivateDataP7edict_s", (size_t)&OnFreeEntPrivateData }, - //{ 0x01D80630, "_Z11GameDLLInitv", (size_t)&GameDLLInit }, - //{ 0x0, "_Z12GetSkillCvarPc", (size_t)&GetSkillCvar }, //NOXREF - //{ 0x01D626F0, "_Z13DispatchSpawnP7edict_s", (size_t)&DispatchSpawn }, - //{ 0x01D629D0, "_Z13DispatchThinkP7edict_s", (size_t)&DispatchThink }, - //{ 0x01D62990, "_Z11DispatchUseP7edict_sS0_", (size_t)&DispatchUse }, + { 0x01D63700, "_ZL21SetObjectCollisionBoxP9entvars_s", (size_t)&SetObjectCollisionBox }, + { 0x01D63BE0, "_Z20OnFreeEntPrivateDataP7edict_s", (size_t)&OnFreeEntPrivateData }, + { 0x01D80630, "_Z11GameDLLInitv", (size_t)&GameDLLInit }, + //{ 0x01DB6BD0, "_Z12GetSkillCvarPc", (size_t)&GetSkillCvar }, //NOXREF + { 0x01D626F0, "_Z13DispatchSpawnP7edict_s", (size_t)&DispatchSpawn }, + { 0x01D629D0, "_Z13DispatchThinkP7edict_s", (size_t)&DispatchThink }, + { 0x01D62990, "_Z11DispatchUseP7edict_sS0_", (size_t)&DispatchUse }, { 0x01D62930, "_Z13DispatchTouchP7edict_sS0_", (size_t)&DispatchTouch }, - //{ 0x01D62A20, "_Z15DispatchBlockedP7edict_sS0_", (size_t)&DispatchBlocked }, + { 0x01D62A20, "_Z15DispatchBlockedP7edict_sS0_", (size_t)&DispatchBlocked }, { 0x01D628F0, "_Z16DispatchKeyValueP7edict_sP14KeyValueData_s", (size_t)&DispatchKeyValue }, - //{ 0x01D62A50, "_Z12DispatchSaveP7edict_sP13saverestore_s", (size_t)&DispatchSave }, - //{ 0x01D62BD0, "_Z15DispatchRestoreP7edict_sP13saverestore_si", (size_t)&DispatchRestore }, - //{ 0x01D62FF0, "_Z25DispatchObjectCollsionBoxP7edict_s", (size_t)&DispatchObjectCollsionBox }, - //{ 0x01D63020, "_Z15SaveWriteFieldsP13saverestore_sPKcPvP15TYPEDESCRIPTIONi", (size_t)&SaveWriteFields }, - //{ 0x01D63060, "_Z14SaveReadFieldsP13saverestore_sPKcPvP15TYPEDESCRIPTIONi", (size_t)&SaveReadFields }, - //{ 0x01DD1C80, "_Z15SaveGlobalStateP13saverestore_s", (size_t)&SaveGlobalState }, - //{ 0x01DD1D00, "_Z18RestoreGlobalStateP13saverestore_s", (size_t)&RestoreGlobalState }, - //{ 0x01DD1E50, "_Z16ResetGlobalStatev", (size_t)&ResetGlobalState }, - //!@{ 0x01DB6640, "PM_Move", (size_t)&PM_Move }, - //5@{ 0x01DB6710, "PM_Init", (size_t)&PM_Init }, - { 0x01DB1020, "PM_FindTextureType", (size_t)&PM_FindTextureType }, - + { 0x01D62A50, "_Z12DispatchSaveP7edict_sP13saverestore_s", (size_t)&DispatchSave }, + { 0x01D62BD0, "_Z15DispatchRestoreP7edict_sP13saverestore_si", (size_t)&DispatchRestore }, + { 0x01D62FF0, "_Z25DispatchObjectCollsionBoxP7edict_s", (size_t)&DispatchObjectCollsionBox }, + { 0x01D63020, "_Z15SaveWriteFieldsP13saverestore_sPKcPvP15TYPEDESCRIPTIONi", (size_t)&SaveWriteFields }, + { 0x01D63060, "_Z14SaveReadFieldsP13saverestore_sPKcPvP15TYPEDESCRIPTIONi", (size_t)&SaveReadFields }, //virtual func //CBaseEntity - //{ 0x01D18590, "_ZN11CBaseEntity5SpawnEv", mfunc_ptr_cast(&CBaseEntity::Spawn) }, + //{ 0x01D18590, "_ZN11CBaseEntity5SpawnEv", mfunc_ptr_cast(&CBaseEntity::Spawn_) }, // pure //{ 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_) }, + { 0x01D635D0, "_ZN11CBaseEntity4SaveER5CSave", mfunc_ptr_cast(&CBaseEntity::Save_) }, + { 0x01D63610, "_ZN11CBaseEntity7RestoreER8CRestore", mfunc_ptr_cast(&CBaseEntity::Restore_) }, //{ 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_) }, + { 0x01D63210, "_ZN11CBaseEntity10TakeDamageEP9entvars_sS1_fi", mfunc_ptr_cast(&CBaseEntity::TakeDamage_) }, { 0x01D63190, "_ZN11CBaseEntity10TakeHealthEfi", mfunc_ptr_cast(&CBaseEntity::TakeHealth_) }, - //{ 0x01D63550, "_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_) }, //{ 0x01D01BF0, "_ZN11CBaseEntity11IsTriggeredEPS_", mfunc_ptr_cast(&CBaseEntity::IsTriggered) }, @@ -407,7 +404,7 @@ FunctionHook g_FunctionHooks[] = { 0x01D01C80, "_ZN11CBaseEntity8GetDelayEv", mfunc_ptr_cast(&CBaseEntity::GetDelay_) }, ////{ 0x01D01C90, "_ZN11CBaseEntity8IsMovingEv", mfunc_ptr_cast(&CBaseEntity::IsMoving) }, //{ 0x01D01CE0, "_ZN11CBaseEntity13OverrideResetEv", mfunc_ptr_cast(&CBaseEntity::OverrideReset) }, - //{ 0x01D63AF0, "_ZN11CBaseEntity11DamageDecalEi", mfunc_ptr_cast(&CBaseEntity::DamageDecal_) }, + { 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) }, @@ -421,7 +418,7 @@ FunctionHook g_FunctionHooks[] = //{ 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_) }, + { 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) }, @@ -443,13 +440,13 @@ FunctionHook g_FunctionHooks[] = { 0x01DBB0A0, "_ZN11CBaseEntity13SUB_DoNothingEv", mfunc_ptr_cast(&CBaseEntity::SUB_DoNothing) }, { 0x01D6FB10, "_ZN11CBaseEntity16SUB_StartFadeOutEv", mfunc_ptr_cast(&CBaseEntity::SUB_StartFadeOut) }, { 0x01D6FB80, "_ZN11CBaseEntity11SUB_FadeOutEv", mfunc_ptr_cast(&CBaseEntity::SUB_FadeOut) }, - //{ 0x0, "_ZN11CBaseEntity17SUB_CallUseToggleEv", mfunc_ptr_cast(&CBaseEntity::SUB_CallUseToggle) }, + { 0x01D01EB0, "_ZN11CBaseEntity17SUB_CallUseToggleEv", mfunc_ptr_cast(&CBaseEntity::SUB_CallUseToggle) }, { 0x01D63AC0, "_ZN11CBaseEntity12ShouldToggleE8USE_TYPEi", mfunc_ptr_cast(&CBaseEntity::ShouldToggle) }, //{ 0x01D71BC0, "_ZN11CBaseEntity11FireBulletsEj6VectorS0_S0_fiiiP9entvars_s", mfunc_ptr_cast(&CBaseEntity::FireBullets) }, //C!@{ 0x01D72480, "_ZN11CBaseEntity12FireBullets3E6VectorS0_ffiiifP9entvars_sbi", mfunc_ptr_cast(&CBaseEntity::FireBullets3) }, { 0x01DBB190, "_ZN11CBaseEntity14SUB_UseTargetsEPS_8USE_TYPEf", mfunc_ptr_cast(&CBaseEntity::SUB_UseTargets) }, { 0x01DBB260, "_Z11FireTargetsPKcP11CBaseEntityS2_8USE_TYPEf", (size_t)&FireTargets }, - //{ 0x0, "_ZN11CBaseEntity10IntersectsEPS_", mfunc_ptr_cast(&CBaseEntity::Intersects) }, + { 0x01D638C0, "_ZN11CBaseEntity10IntersectsEPS_", mfunc_ptr_cast(&CBaseEntity::Intersects) }, //{ 0x01D63950, "_ZN11CBaseEntity11MakeDormantEv", mfunc_ptr_cast(&CBaseEntity::MakeDormant) }, // NOXREF { 0x01D639B0, "_ZN11CBaseEntity9IsDormantEv", mfunc_ptr_cast(&CBaseEntity::IsDormant) }, //{ 0x0, "_ZN11CBaseEntity16IsLockedByMasterEv", mfunc_ptr_cast(&CBaseEntity::IsLockedByMaster) }, // NOXREF @@ -470,29 +467,26 @@ FunctionHook g_FunctionHooks[] = //virtual func { 0x01D59E70, "_ZN14CBaseAnimating4SaveER5CSave", mfunc_ptr_cast(&CBaseAnimating::Save_) }, { 0x01D59EA0, "_ZN14CBaseAnimating7RestoreER8CRestore", mfunc_ptr_cast(&CBaseAnimating::Restore_) }, - //{ 0x01D01FE0, "_ZN14CBaseAnimating15HandleAnimEventEP14MonsterEvent_t", mfunc_ptr_cast(&CBaseAnimating::HandleAnimEvent) }, + //{ 0x01D01FE0, "_ZN14CBaseAnimating15HandleAnimEventEP14MonsterEvent_t", mfunc_ptr_cast(&CBaseAnimating::HandleAnimEvent_) }, // PURE //non-virtual func { 0x01D59ED0, "_ZN14CBaseAnimating18StudioFrameAdvanceEf", mfunc_ptr_cast(&CBaseAnimating::StudioFrameAdvance) }, //{ 0x01D5A130, "_ZN14CBaseAnimating16GetSequenceFlagsEv", mfunc_ptr_cast(&CBaseAnimating::GetSequenceFlags) }, // NOXREF - - //{ 0x0, "_ZN14CBaseAnimating22LookupActivityHeaviestEi", mfunc_ptr_cast(&CBaseAnimating::LookupActivityHeaviest) }, - { 0x01D5A010, "_ZN14CBaseAnimating14LookupActivityEi", mfunc_ptr_cast(&CBaseAnimating::LookupActivity) }, + { 0x01D5A040, "_ZN14CBaseAnimating22LookupActivityHeaviestEi", mfunc_ptr_cast(&CBaseAnimating::LookupActivityHeaviest) }, { 0x01D5A070, "_ZN14CBaseAnimating14LookupSequenceEPKc", mfunc_ptr_cast(&CBaseAnimating::LookupSequence) }, { 0x01D5A0A0, "_ZN14CBaseAnimating17ResetSequenceInfoEv", mfunc_ptr_cast(&CBaseAnimating::ResetSequenceInfo) }, - - //{ 0x0, "_ZN14CBaseAnimating18DispatchAnimEventsEf", mfunc_ptr_cast(&CBaseAnimating::DispatchAnimEvents) }, + { 0x01D5A160, "_ZN14CBaseAnimating18DispatchAnimEventsEf", mfunc_ptr_cast(&CBaseAnimating::DispatchAnimEvents) }, { 0x01D5A280, "_ZN14CBaseAnimating17SetBoneControllerEif", mfunc_ptr_cast(&CBaseAnimating::SetBoneController) }, { 0x01D5A2B0, "_ZN14CBaseAnimating19InitBoneControllersEv", mfunc_ptr_cast(&CBaseAnimating::InitBoneControllers) }, - //{ 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) }, - //{ 0x0, "_ZN14CBaseAnimating13GetAttachmentEiR6VectorS1_", mfunc_ptr_cast(&CBaseAnimating::GetAttachment) }, - //{ 0x0, "_ZN14CBaseAnimating12SetBodygroupEii", mfunc_ptr_cast(&CBaseAnimating::SetBodygroup) }, - //{ 0x0, "_ZN14CBaseAnimating12GetBodygroupEi", mfunc_ptr_cast(&CBaseAnimating::GetBodygroup) }, - //{ 0x0, "_ZN14CBaseAnimating11ExtractBboxEiPfS0_", mfunc_ptr_cast(&CBaseAnimating::ExtractBbox) }, - //{ 0x01D5A4A0, "_ZN14CBaseAnimating14SetSequenceBoxEv", mfunc_ptr_cast(&CBaseAnimating::SetSequenceBox) }, + //{ 0x01D5A310, "_ZN14CBaseAnimating11SetBlendingEif", mfunc_ptr_cast(&CBaseAnimating::SetBlending) }, // NOXREF + //{ 0x01D5A340, "_ZN14CBaseAnimating15GetBonePositionEiR6VectorS1_", mfunc_ptr_cast(&CBaseAnimating::GetBonePosition) }, // NOXREF + //{ 0x01D5A370, "_ZN14CBaseAnimating13GetAttachmentEiR6VectorS1_", mfunc_ptr_cast(&CBaseAnimating::GetAttachment) }, // NOXREF + //{ 0x01D5A3A0, "_ZN14CBaseAnimating14FindTransitionEiiPi", mfunc_ptr_cast(&CBaseAnimating::FindTransition) }, // NOXREF + //{ 0x01D5A400, "_ZN14CBaseAnimating15GetAutomovementER6VectorS1_f", mfunc_ptr_cast(&CBaseAnimating::GetAutomovement) }, // NOXREF + //{ 0x01D5A410, "_ZN14CBaseAnimating12SetBodygroupEii", mfunc_ptr_cast(&CBaseAnimating::SetBodygroup) }, // NOXREF + //{ 0x01D5A440, "_ZN14CBaseAnimating12GetBodygroupEi", mfunc_ptr_cast(&CBaseAnimating::GetBodygroup) }, // NOXREF + //{ 0x01D5A470, "_ZN14CBaseAnimating11ExtractBboxEiPfS0_", mfunc_ptr_cast(&CBaseAnimating::ExtractBbox) }, // NOXREF + { 0x01D5A4A0, "_ZN14CBaseAnimating14SetSequenceBoxEv", mfunc_ptr_cast(&CBaseAnimating::SetSequenceBox) }, //CBaseToggle //virtual func { 0x01DBB7D0, "_ZN11CBaseToggle8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseToggle::KeyValue_) }, @@ -506,17 +500,16 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN11CBaseToggle11AngularMoveE6Vectorf", mfunc_ptr_cast(&CBaseToggle::AngularMove) }, //{ 0x0, "_ZN11CBaseToggle15AngularMoveDoneEv", mfunc_ptr_cast(&CBaseToggle::AngularMoveDone) }, //{ 0x0, "_ZN11CBaseToggle16IsLockedByMasterEv", mfunc_ptr_cast(&CBaseToggle::IsLockedByMaster) }, - //{ 0x0, "_ZN11CBaseToggle9AxisValueEiRK6Vector", mfunc_ptr_cast(&CBaseToggle::AxisValue) }, + //{ 0x01DBBCA0, "_ZN11CBaseToggle9AxisValueEiRK6Vector", mfunc_ptr_cast(&CBaseToggle::AxisValue) }, //{ 0x0, "_ZN11CBaseToggle7AxisDirEP9entvars_s", mfunc_ptr_cast(&CBaseToggle::AxisDir) }, - //{ 0x0, "_ZN11CBaseToggle9AxisDeltaEiRK6VectorS2_", mfunc_ptr_cast(&CBaseToggle::AxisDelta) }, - - //{ 0x0, "_Z13FEntIsVisibleP9entvars_sS0_", (size_t)&FEntIsVisible }, - + //{ 0x01DBBD60, "_ZN11CBaseToggle9AxisDeltaEiRK6VectorS2_", mfunc_ptr_cast(&CBaseToggle::AxisDelta) }, + //{ 0x01DBBDA0, "_Z13FEntIsVisibleP9entvars_sS0_", (size_t)&FEntIsVisible }, // NOXREF //CWorld //virtual func - //{ 0x01DD1EE0, "_ZN6CWorld5SpawnEv", mfunc_ptr_cast(&CWorld::Spawn) }, - //{ 0x01DD2000, "_ZN6CWorld8PrecacheEv", mfunc_ptr_cast(&CWorld::Precache) }, - //{ 0x01DD2440, "_ZN6CWorld8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWorld::KeyValue_) }, + { 0x01DD1EE0, "_ZN6CWorld5SpawnEv", mfunc_ptr_cast(&CWorld::Spawn_) }, + { 0x01DD2000, "_ZN6CWorld8PrecacheEv", mfunc_ptr_cast(&CWorld::Precache_) }, + { 0x01DD2440, "_ZN6CWorld8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWorld::KeyValue_) }, + //CClientFog //virtual func //{ 0x0, "_ZN10CClientFog5SpawnEv", mfunc_ptr_cast(&CClientFog::Spawn) }, @@ -888,22 +881,22 @@ FunctionHook g_FunctionHooks[] = //CSprite //virtual func - //{ 0x0, "_ZN7CSprite5SpawnEv", mfunc_ptr_cast(&CSprite::Spawn_) }, - //{ 0x0, "_ZN7CSprite8PrecacheEv", mfunc_ptr_cast(&CSprite::Precache_) }, - //{ 0x0, "_ZN7CSprite7RestartEv", mfunc_ptr_cast(&CSprite::Restart_) }, - //{ 0x0, "_ZN7CSprite4SaveER5CSave", mfunc_ptr_cast(&CSprite::Save_) }, - //{ 0x0, "_ZN7CSprite7RestoreER8CRestore", mfunc_ptr_cast(&CSprite::Restore_) }, - //{ 0x0, "_ZN7CSprite10ObjectCapsEv", mfunc_ptr_cast(&CSprite::ObjectCaps_) }, - //{ 0x0, "_ZN7CSprite3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CSprite::Use_) }, + { 0x01D792F0, "_ZN7CSprite5SpawnEv", mfunc_ptr_cast(&CSprite::Spawn_) }, + { 0x01D79500, "_ZN7CSprite8PrecacheEv", mfunc_ptr_cast(&CSprite::Precache_) }, + { 0x01D79440, "_ZN7CSprite7RestartEv", mfunc_ptr_cast(&CSprite::Restart_) }, + { 0x01D79290, "_ZN7CSprite4SaveER5CSave", mfunc_ptr_cast(&CSprite::Save_) }, + { 0x01D792C0, "_ZN7CSprite7RestoreER8CRestore", mfunc_ptr_cast(&CSprite::Restore_) }, + { 0x01D78660, "_ZN7CSprite10ObjectCapsEv", mfunc_ptr_cast(&CSprite::ObjectCaps_) }, + { 0x01D79AE0, "_ZN7CSprite3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CSprite::Use_) }, //non-virtual func - //{ 0x0, "_ZN7CSprite12AnimateThinkEv", mfunc_ptr_cast(&CSprite::AnimateThink) }, - //{ 0x0, "_ZN7CSprite11ExpandThinkEv", mfunc_ptr_cast(&CSprite::ExpandThink) }, - //{ 0x0, "_ZN7CSprite12AnimateThinkEv", mfunc_ptr_cast(&CSprite::Animate) }, - //{ 0x0, "_ZN7CSprite6ExpandEff", mfunc_ptr_cast(&CSprite::Expand) }, - //{ 0x0, "_ZN7CSprite10SpriteInitEPKcRK6Vector", mfunc_ptr_cast(&CSprite::SpriteInit) }, + { 0x01D79740, "_ZN7CSprite12AnimateThinkEv", mfunc_ptr_cast(&CSprite::AnimateThink) }, + { 0x01D79930, "_ZN7CSprite11ExpandThinkEv", mfunc_ptr_cast(&CSprite::ExpandThink) }, + //{ 0x01D799C0, "_ZN7CSprite12AnimateThinkEv", mfunc_ptr_cast(&CSprite::Animate) }, // NOXREF + //{ 0x01D798E0, "_ZN7CSprite6ExpandEff", mfunc_ptr_cast(&CSprite::Expand) }, // NOXREF + //{ 0x01D79590, "_ZN7CSprite10SpriteInitEPKcRK6Vector", mfunc_ptr_cast(&CSprite::SpriteInit) }, // NOXREF //{ 0x0, "_ZN7CSprite13SetAttachmentEP7edict_si", mfunc_ptr_cast(&CSprite::SetAttachment) }, // NOXREF - //{ 0x0, "_ZN7CSprite7TurnOffEv", mfunc_ptr_cast(&CSprite::TurnOff) }, - //{ 0x0, "_ZN7CSprite6TurnOnEv", mfunc_ptr_cast(&CSprite::TurnOn) }, + //{ 0x01D79A40, "_ZN7CSprite7TurnOffEv", mfunc_ptr_cast(&CSprite::TurnOff) }, // NOXREF + { 0x01D79A60, "_ZN7CSprite6TurnOnEv", mfunc_ptr_cast(&CSprite::TurnOn) }, //{ 0x0, "_ZN7CSprite6FramesEv", mfunc_ptr_cast(&CSprite::Frames) }, // NOXREF //{ 0x0, "_ZN7CSprite15SetTransparencyEiiiiii", mfunc_ptr_cast(&CSprite::SetTransparency) }, // NOXREF //{ 0x0, "_ZN7CSprite10SetTextureEi", mfunc_ptr_cast(&CSprite::SetTexture) }, // NOXREF @@ -911,24 +904,24 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN7CSprite8SetColorEiii", mfunc_ptr_cast(&CSprite::SetColor) }, // NOXREF //{ 0x0, "_ZN7CSprite13SetBrightnessEi", mfunc_ptr_cast(&CSprite::SetBrightness) }, // NOXREF //{ 0x0, "_ZN7CSprite13AnimateAndDieEf", mfunc_ptr_cast(&CSprite::AnimateAndDie) }, // NOXREF - //{ 0x0, "_ZN7CSprite16AnimateUntilDeadEv", mfunc_ptr_cast(&CSprite::AnimateUntilDead) }, - //{ 0x0, "_ZN7CSprite12SpriteCreateEPKcRK6Vectori", mfunc_ptr_cast(&CSprite::SpriteCreate) }, + { 0x01D79800, "_ZN7CSprite16AnimateUntilDeadEv", mfunc_ptr_cast(&CSprite::AnimateUntilDead) }, + { 0x01D795D0, "_ZN7CSprite12SpriteCreateEPKcRK6Vectori", mfunc_ptr_cast(&CSprite::SpriteCreate) }, //CBeam //virtual func - //{ 0x0, "_ZN5CBeam5SpawnEv", mfunc_ptr_cast(&CBeam::Spawn_) }, - //{ 0x0, "_ZN5CBeam8PrecacheEv", mfunc_ptr_cast(&CBeam::Precache_) }, - //{ 0x0, "_ZN5CBeam10ObjectCapsEv", mfunc_ptr_cast(&CBeam::ObjectCaps_) }, - //{ 0x0, "_ZN5CBeam6CenterEv", mfunc_ptr_cast(&CBeam::Center_) }, + { 0x01D75E00, "_ZN5CBeam5SpawnEv", mfunc_ptr_cast(&CBeam::Spawn_) }, + { 0x01D75E20, "_ZN5CBeam8PrecacheEv", mfunc_ptr_cast(&CBeam::Precache_) }, + { 0x01D788B0, "_ZN5CBeam10ObjectCapsEv", mfunc_ptr_cast(&CBeam::ObjectCaps_) }, + { 0x01D78D20, "_ZN5CBeam6CenterEv", mfunc_ptr_cast(&CBeam::Center_) }, //non-virtual func - //{ 0x0, "_ZN5CBeam12TriggerTouchEP11CBaseEntity", mfunc_ptr_cast(&CBeam::TriggerTouch) }, + { 0x01D76660, "_ZN5CBeam12TriggerTouchEP11CBaseEntity", mfunc_ptr_cast(&CBeam::TriggerTouch) }, //{ 0x0, "_ZN5CBeam7SetTypeEi", mfunc_ptr_cast(&CBeam::SetType) }, // NOXREF //{ 0x0, "_ZN5CBeam8SetFlagsEi", mfunc_ptr_cast(&CBeam::SetFlags) }, // NOXREF //{ 0x0, "_ZN5CBeam11SetStartPosERK6Vector", mfunc_ptr_cast(&CBeam::SetStartPos) }, // NOXREF //{ 0x0, "_ZN5CBeam9SetEndPosERK6Vector", mfunc_ptr_cast(&CBeam::SetEndPos) }, // NOXREF - //{ 0x0, "_ZN5CBeam14SetStartEntityEi", mfunc_ptr_cast(&CBeam::SetStartEntity) }, - //{ 0x0, "_ZN5CBeam12SetEndEntityEi", mfunc_ptr_cast(&CBeam::SetEndEntity) }, - //{ 0x0, "_ZN5CBeam18SetStartAttachmentEi", mfunc_ptr_cast(&CBeam::SetStartAttachment) }, // NOXREF - //{ 0x0, "_ZN5CBeam16SetEndAttachmentEi", mfunc_ptr_cast(&CBeam::SetEndAttachment) }, // NOXREF + //{ 0x01D75EC0, "_ZN5CBeam14SetStartEntityEi", mfunc_ptr_cast(&CBeam::SetStartEntity) }, // NOXREF + //{ 0x01D75F10, "_ZN5CBeam12SetEndEntityEi", mfunc_ptr_cast(&CBeam::SetEndEntity) }, // NOXREF + { 0x01D7A860, "_ZN5CBeam18SetStartAttachmentEi", mfunc_ptr_cast(&CBeam::SetStartAttachment) }, + { 0x01D7A890, "_ZN5CBeam16SetEndAttachmentEi", mfunc_ptr_cast(&CBeam::SetEndAttachment) }, //{ 0x0, "_ZN5CBeam10SetTextureEi", mfunc_ptr_cast(&CBeam::SetTexture) }, // NOXREF //{ 0x0, "_ZN5CBeam8SetWidthEi", mfunc_ptr_cast(&CBeam::SetWidth) }, // NOXREF //{ 0x0, "_ZN5CBeam8SetNoiseEi", mfunc_ptr_cast(&CBeam::SetNoise) }, // NOXREF @@ -940,121 +933,122 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN5CBeam8GetFlagsEv", mfunc_ptr_cast(&CBeam::GetFlags) }, // NOXREF //{ 0x0, "_ZN5CBeam14GetStartEntityEv", mfunc_ptr_cast(&CBeam::GetStartEntity) }, // NOXREF //{ 0x0, "_ZN5CBeam12GetEndEntityEv", mfunc_ptr_cast(&CBeam::GetEndEntity) }, // NOXREF - //{ 0x0, "_ZN5CBeam11GetStartPosEv", mfunc_ptr_cast(&CBeam::GetStartPos) }, - //{ 0x0, "_ZN5CBeam9GetEndPosEv", mfunc_ptr_cast(&CBeam::GetEndPos) }, + //{ 0x01D75F60, "_ZN5CBeam11GetStartPosEv", mfunc_ptr_cast(&CBeam::GetStartPos) }, // NOXREF + //{ 0x01D75FA0, "_ZN5CBeam9GetEndPosEv", mfunc_ptr_cast(&CBeam::GetEndPos) }, // NOXREF //{ 0x0, "_ZN5CBeam10GetTextureEv", mfunc_ptr_cast(&CBeam::GetTexture) }, // NOXREF //{ 0x0, "_ZN5CBeam8GetWidthEv", mfunc_ptr_cast(&CBeam::GetWidth) }, // NOXREF //{ 0x0, "_ZN5CBeam8GetNoiseEv", mfunc_ptr_cast(&CBeam::GetNoise) }, // NOXREF //{ 0x0, "_ZN5CBeam13GetBrightnessEv", mfunc_ptr_cast(&CBeam::GetBrightness) }, // NOXREF //{ 0x0, "_ZN5CBeam8GetFrameEv", mfunc_ptr_cast(&CBeam::GetFrame) }, // NOXREF //{ 0x0, "_ZN5CBeam13GetScrollRateEv", mfunc_ptr_cast(&CBeam::GetScrollRate) }, // NOXREF - //{ 0x01D76480, "_ZN5CBeam10RelinkBeamEv", mfunc_ptr_cast(&CBeam::RelinkBeam) }, - //{ 0x0, "_ZN5CBeam8DoSparksERK6VectorS2_", mfunc_ptr_cast(&CBeam::DoSparks) }, - //{ 0x0, "_ZN5CBeam16RandomTargetnameEPKc", mfunc_ptr_cast(&CBeam::RandomTargetname) }, - //{ 0x01D775B0, "_ZN5CBeam10BeamDamageEP11TraceResult", mfunc_ptr_cast(&CBeam::BeamDamage) }, - //{ 0x0, "_ZN5CBeam8BeamInitEPKci", mfunc_ptr_cast(&CBeam::BeamInit) }, - //{ 0x0, "_ZN5CBeam10PointsInitERK6VectorS2_", mfunc_ptr_cast(&CBeam::PointsInit) }, - //{ 0x0, "_ZN5CBeam12PointEntInitERK6Vectori", mfunc_ptr_cast(&CBeam::PointEntInit) }, - //{ 0x0, "_ZN5CBeam8EntsInitEii", mfunc_ptr_cast(&CBeam::EntsInit) }, - //{ 0x0, "_ZN5CBeam8HoseInitERK6VectorS2_", mfunc_ptr_cast(&CBeam::HoseInit) }, - //{ 0x0, "_ZN5CBeam10BeamCreateEPKci", mfunc_ptr_cast(&CBeam::BeamCreate) }, + { 0x01D76480, "_ZN5CBeam10RelinkBeamEv", mfunc_ptr_cast(&CBeam::RelinkBeam) }, + //{ 0x01D76700, "_ZN5CBeam8DoSparksERK6VectorS2_", mfunc_ptr_cast(&CBeam::DoSparks) }, // NOXREF + //{ 0x01D766B0, "_ZN5CBeam16RandomTargetnameEPKc", mfunc_ptr_cast(&CBeam::RandomTargetname) }, // NOXREF + { 0x01D775B0, "_ZN5CBeam10BeamDamageEP11TraceResult", mfunc_ptr_cast(&CBeam::BeamDamage) }, + { 0x01D76140, "_ZN5CBeam8BeamInitEPKci", mfunc_ptr_cast(&CBeam::BeamInit) }, + //{ 0x01D76200, "_ZN5CBeam10PointsInitERK6VectorS2_", mfunc_ptr_cast(&CBeam::PointsInit) }, // NOXREF + //{ 0x01D76300, "_ZN5CBeam12PointEntInitERK6Vectori", mfunc_ptr_cast(&CBeam::PointEntInit) }, // NOXREF + //{ 0x01D763B0, "_ZN5CBeam8EntsInitEii", mfunc_ptr_cast(&CBeam::EntsInit) }, // NOXREF + //{ 0x01D76280, "_ZN5CBeam8HoseInitERK6VectorS2_", mfunc_ptr_cast(&CBeam::HoseInit) }, // NOXREF + //{ 0x01D75FF0, "_ZN5CBeam10BeamCreateEPKci", mfunc_ptr_cast(&CBeam::BeamCreate) }, // NOXREF //{ 0x0, "_ZN5CBeam11LiveForTimeEf", mfunc_ptr_cast(&CBeam::LiveForTime) }, // NOXREF //{ 0x0, "_ZN5CBeam17BeamDamageInstantEP11TraceResultf", mfunc_ptr_cast(&CBeam::BeamDamageInstant) }, // NOXREF //CLaser //virtual func - //{ 0x0, "_ZN6CLaser5SpawnEv", mfunc_ptr_cast(&CLaser::Spawn_) }, - //{ 0x0, "_ZN6CLaser8PrecacheEv", mfunc_ptr_cast(&CLaser::Precache_) }, - //{ 0x0, "_ZN6CLaser8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CLaser::KeyValue_) }, - //{ 0x0, "_ZN6CLaser4SaveER5CSave", mfunc_ptr_cast(&CLaser::Save_) }, - //{ 0x0, "_ZN6CLaser7RestoreER8CRestore", mfunc_ptr_cast(&CLaser::Restore_) }, - //{ 0x0, "_ZN6CLaser3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLaser::Use_) }, + { 0x01D782A0, "_ZN6CLaser5SpawnEv", mfunc_ptr_cast(&CLaser::Spawn_) }, + { 0x01D78680, "_ZN6CLaser8PrecacheEv", mfunc_ptr_cast(&CLaser::Precache_) }, + { 0x01D786D0, "_ZN6CLaser8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CLaser::KeyValue_) }, + { 0x01D78240, "_ZN6CLaser4SaveER5CSave", mfunc_ptr_cast(&CLaser::Save_) }, + { 0x01D78270, "_ZN6CLaser7RestoreER8CRestore", mfunc_ptr_cast(&CLaser::Restore_) }, + { 0x01D789E0, "_ZN6CLaser3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLaser::Use_) }, //non-virtual func - //{ 0x0, "_ZN6CLaser6TurnOnEv", mfunc_ptr_cast(&CLaser::TurnOn) }, - //{ 0x0, "_ZN6CLaser7TurnOffEv", mfunc_ptr_cast(&CLaser::TurnOff) }, - //{ 0x0, "_ZN6CLaser4IsOnEv", mfunc_ptr_cast(&CLaser::IsOn) }, - //{ 0x0, "_ZN6CLaser11FireAtPointER11TraceResult", mfunc_ptr_cast(&CLaser::FireAtPoint) }, - //{ 0x0, "_ZN6CLaser11StrikeThinkEv", mfunc_ptr_cast(&CLaser::StrikeThink) }, + { 0x01D78930, "_ZN6CLaser6TurnOnEv", mfunc_ptr_cast(&CLaser::TurnOn) }, + { 0x01D788F0, "_ZN6CLaser7TurnOffEv", mfunc_ptr_cast(&CLaser::TurnOff) }, + //{ 0x01D788D0, "_ZN6CLaser4IsOnEv", mfunc_ptr_cast(&CLaser::IsOn) }, // NOXREF + { 0x01D78B00, "_ZN6CLaser11FireAtPointER11TraceResult", mfunc_ptr_cast(&CLaser::FireAtPoint) }, + { 0x01D78BB0, "_ZN6CLaser11StrikeThinkEv", mfunc_ptr_cast(&CLaser::StrikeThink) }, //CBubbling //virtual func - //{ 0x0, "_ZN9CBubbling5SpawnEv", mfunc_ptr_cast(&CBubbling::Spawn_) }, - //{ 0x0, "_ZN9CBubbling8PrecacheEv", mfunc_ptr_cast(&CBubbling::Precache_) }, - //{ 0x0, "_ZN9CBubbling8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBubbling::KeyValue_) }, - //{ 0x0, "_ZN9CBubbling4SaveER5CSave", mfunc_ptr_cast(&CBubbling::Save_) }, - //{ 0x0, "_ZN9CBubbling7RestoreER8CRestore", mfunc_ptr_cast(&CBubbling::Restore_) }, - //{ 0x0, "_ZN9CBubbling10ObjectCapsEv", mfunc_ptr_cast(&CBubbling::ObjectCaps_) }, - //{ 0x0, "_ZN9CBubbling3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CBubbling::Use_) }, + { 0x01D75A90, "_ZN9CBubbling5SpawnEv", mfunc_ptr_cast(&CBubbling::Spawn_) }, + { 0x01D75BA0, "_ZN9CBubbling8PrecacheEv", mfunc_ptr_cast(&CBubbling::Precache_) }, + { 0x01D75C30, "_ZN9CBubbling8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBubbling::KeyValue_) }, + { 0x01D75A30, "_ZN9CBubbling4SaveER5CSave", mfunc_ptr_cast(&CBubbling::Save_) }, + { 0x01D75A60, "_ZN9CBubbling7RestoreER8CRestore", mfunc_ptr_cast(&CBubbling::Restore_) }, + { 0x01D75A20, "_ZN9CBubbling10ObjectCapsEv", mfunc_ptr_cast(&CBubbling::ObjectCaps_) }, + { 0x01D75BC0, "_ZN9CBubbling3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CBubbling::Use_) }, //non-virtual func - //{ 0x0, "_ZN9CBubbling9FizzThinkEv", mfunc_ptr_cast(&CBubbling::FizzThink) }, + { 0x01D75CF0, "_ZN9CBubbling9FizzThinkEv", mfunc_ptr_cast(&CBubbling::FizzThink) }, //CLightning //virtual func - //{ 0x0, "_ZN10CLightning5SpawnEv", mfunc_ptr_cast(&CLightning::Spawn_) }, - //{ 0x0, "_ZN10CLightning8PrecacheEv", mfunc_ptr_cast(&CLightning::Precache_) }, - //{ 0x0, "_ZN10CLightning8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CLightning::KeyValue_) }, - //{ 0x0, "_ZN10CLightning4SaveER5CSave", mfunc_ptr_cast(&CLightning::Save_) }, - //{ 0x0, "_ZN10CLightning7RestoreER8CRestore", mfunc_ptr_cast(&CLightning::Restore_) }, - //{ 0x0, "_ZN10CLightning8ActivateEv", mfunc_ptr_cast(&CLightning::Activate_) }, + { 0x01D76840, "_ZN10CLightning5SpawnEv", mfunc_ptr_cast(&CLightning::Spawn_) }, + { 0x01D76970, "_ZN10CLightning8PrecacheEv", mfunc_ptr_cast(&CLightning::Precache_) }, + { 0x01D76A60, "_ZN10CLightning8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CLightning::KeyValue_) }, + { 0x01D767E0, "_ZN10CLightning4SaveER5CSave", mfunc_ptr_cast(&CLightning::Save_) }, + { 0x01D76810, "_ZN10CLightning7RestoreER8CRestore", mfunc_ptr_cast(&CLightning::Restore_) }, + { 0x01D76A30, "_ZN10CLightning8ActivateEv", mfunc_ptr_cast(&CLightning::Activate_) }, //non-virtual func - //{ 0x0, "_ZN10CLightning11StrikeThinkEv", mfunc_ptr_cast(&CLightning::StrikeThink) }, - //{ 0x0, "_ZN10CLightning11DamageThinkEv", mfunc_ptr_cast(&CLightning::DamageThink) }, - //{ 0x0, "_ZN10CLightning10RandomAreaEv", mfunc_ptr_cast(&CLightning::RandomArea) }, - //{ 0x0, "_ZN10CLightning11RandomPointER6Vector", mfunc_ptr_cast(&CLightning::RandomPoint) }, - //{ 0x0, "_ZN10CLightning3ZapERK6VectorS2_", mfunc_ptr_cast(&CLightning::Zap) }, - //{ 0x0, "_ZN10CLightning9StrikeUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLightning::StrikeUse) }, - //{ 0x0, "_ZN10CLightning9ToggleUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLightning::ToggleUse) }, - //{ 0x0, "_ZN10CLightning10ServerSideEv", mfunc_ptr_cast(&CLightning::ServerSide) }, - //{ 0x0, "_ZN10CLightning14BeamUpdateVarsEv", mfunc_ptr_cast(&CLightning::BeamUpdateVars) }, + { 0x01D76EE0, "_ZN10CLightning11StrikeThinkEv", mfunc_ptr_cast(&CLightning::StrikeThink) }, + { 0x01D776A0, "_ZN10CLightning11DamageThinkEv", mfunc_ptr_cast(&CLightning::DamageThink) }, + { 0x01D778C0, "_ZN10CLightning10RandomAreaEv", mfunc_ptr_cast(&CLightning::RandomArea) }, + { 0x01D77CC0, "_ZN10CLightning11RandomPointER6Vector", mfunc_ptr_cast(&CLightning::RandomPoint) }, + { 0x01D77760, "_ZN10CLightning3ZapERK6VectorS2_", mfunc_ptr_cast(&CLightning::Zap) }, + { 0x01D76E00, "_ZN10CLightning9StrikeUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLightning::StrikeUse) }, + { 0x01D76CB0, "_ZN10CLightning9ToggleUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CLightning::ToggleUse) }, + //{ 0x0, "_ZN10CLightning10ServerSideEv", mfunc_ptr_cast(&CLightning::ServerSide) }, // NOXREF + { 0x01D77E60, "_ZN10CLightning14BeamUpdateVarsEv", mfunc_ptr_cast(&CLightning::BeamUpdateVars) }, + //{ 0x1D76E70, "_Z13IsPointEntityP11CBaseEntity", (size_t)&IsPointEntity }, // NOXREF //CGlow //virtual func - //{ 0x0, "_ZN5CGlow5SpawnEv", mfunc_ptr_cast(&CGlow::Spawn_) }, - //{ 0x0, "_ZN5CGlow4SaveER5CSave", mfunc_ptr_cast(&CGlow::Save_) }, - //{ 0x0, "_ZN5CGlow7RestoreER8CRestore", mfunc_ptr_cast(&CGlow::Restore_) }, - //{ 0x0, "_ZN5CGlow5ThinkEv", mfunc_ptr_cast(&CGlow::Think_) }, + { 0x01D78E90, "_ZN5CGlow5SpawnEv", mfunc_ptr_cast(&CGlow::Spawn_) }, + { 0x01D78E30, "_ZN5CGlow4SaveER5CSave", mfunc_ptr_cast(&CGlow::Save_) }, + { 0x01D78E60, "_ZN5CGlow7RestoreER8CRestore", mfunc_ptr_cast(&CGlow::Restore_) }, + { 0x01D78FA0, "_ZN5CGlow5ThinkEv", mfunc_ptr_cast(&CGlow::Think_) }, //non-virtual func - //{ 0x0, "_ZN5CGlow7AnimateEf", mfunc_ptr_cast(&CGlow::Animate) }, + //{ 0x01D79010, "_ZN5CGlow7AnimateEf", mfunc_ptr_cast(&CGlow::Animate) }, // NOXREF //CBombGlow //virtual func - //{ 0x0, "_ZN9CBombGlow5SpawnEv", mfunc_ptr_cast(&CBombGlow::Spawn_) }, - //{ 0x0, "_ZN9CBombGlow5ThinkEv", mfunc_ptr_cast(&CBombGlow::Think_) }, + { 0x01D790A0, "_ZN9CBombGlow5SpawnEv", mfunc_ptr_cast(&CBombGlow::Spawn_) }, + { 0x01D79150, "_ZN9CBombGlow5ThinkEv", mfunc_ptr_cast(&CBombGlow::Think_) }, //CGibShooter //virtual func - //{ 0x0, "_ZN11CGibShooter5SpawnEv", mfunc_ptr_cast(&CGibShooter::Spawn_) }, - //{ 0x0, "_ZN11CGibShooter8PrecacheEv", mfunc_ptr_cast(&CGibShooter::Precache_) }, - //{ 0x0, "_ZN11CGibShooter8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CGibShooter::KeyValue_) }, - //{ 0x0, "_ZN11CGibShooter4SaveER5CSave", mfunc_ptr_cast(&CGibShooter::Save_) }, - //{ 0x0, "_ZN11CGibShooter7RestoreER8CRestore", mfunc_ptr_cast(&CGibShooter::Restore_) }, - //{ 0x0, "_ZN11CGibShooter3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGibShooter::Use_) }, - //{ 0x01D79E20, "_ZN11CGibShooter9CreateGibEv", mfunc_ptr_cast(&CGibShooter::CreateGib_) }, + { 0x01D79DA0, "_ZN11CGibShooter5SpawnEv", mfunc_ptr_cast(&CGibShooter::Spawn_) }, + { 0x01D79C50, "_ZN11CGibShooter8PrecacheEv", mfunc_ptr_cast(&CGibShooter::Precache_) }, + { 0x01D79C90, "_ZN11CGibShooter8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CGibShooter::KeyValue_) }, + { 0x01D79BA0, "_ZN11CGibShooter4SaveER5CSave", mfunc_ptr_cast(&CGibShooter::Save_) }, + { 0x01D79BD0, "_ZN11CGibShooter7RestoreER8CRestore", mfunc_ptr_cast(&CGibShooter::Restore_) }, + { 0x01D79D80, "_ZN11CGibShooter3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CGibShooter::Use_) }, + { 0x01D79E20, "_ZN11CGibShooter9CreateGibEv", mfunc_ptr_cast(&CGibShooter::CreateGib_) }, //non-virtual func - //{ 0x0, "_ZN11CGibShooter10ShootThinkEv", mfunc_ptr_cast(&CGibShooter::ShootThink) }, + { 0x01D79EF0, "_ZN11CGibShooter10ShootThinkEv", mfunc_ptr_cast(&CGibShooter::ShootThink) }, //CEnvShooter //virtual func - //{ 0x0, "_ZN11CEnvShooter8PrecacheEv", mfunc_ptr_cast(&CEnvShooter::Precache_) }, - //{ 0x0, "_ZN11CEnvShooter8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CEnvShooter::KeyValue_) }, - //{ 0x0, "_ZN11CEnvShooter9CreateGibEv", mfunc_ptr_cast(&CEnvShooter::CreateGib_) }, + { 0x01D7A370, "_ZN11CEnvShooter8PrecacheEv", mfunc_ptr_cast(&CEnvShooter::Precache_) }, + { 0x01D7A270, "_ZN11CEnvShooter8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CEnvShooter::KeyValue_) }, + { 0x01D7A3B0, "_ZN11CEnvShooter9CreateGibEv", mfunc_ptr_cast(&CEnvShooter::CreateGib_) }, //CTestEffect //virtual func - //{ 0x0, "_ZN11CTestEffect5SpawnEv", mfunc_ptr_cast(&CTestEffect::Spawn_) }, - //{ 0x0, "_ZN11CTestEffect8PrecacheEv", mfunc_ptr_cast(&CTestEffect::Precache_) }, - //{ 0x0, "_ZN11CTestEffect3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CTestEffect::Use_) }, + { 0x01D7A530, "_ZN11CTestEffect5SpawnEv", mfunc_ptr_cast(&CTestEffect::Spawn_) }, + { 0x01D7A540, "_ZN11CTestEffect8PrecacheEv", mfunc_ptr_cast(&CTestEffect::Precache_) }, + { 0x01D7A8C0, "_ZN11CTestEffect3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CTestEffect::Use_) }, //non-virtual func - //{ 0x0, "_ZN11CTestEffect9TestThinkEv", mfunc_ptr_cast(&CTestEffect::TestThink) }, + { 0x01D7A550, "_ZN11CTestEffect9TestThinkEv", mfunc_ptr_cast(&CTestEffect::TestThink) }, //CBlood //virtual func - //{ 0x0, "_ZN6CBlood5SpawnEv", mfunc_ptr_cast(&CBlood::Spawn_) }, - //{ 0x0, "_ZN6CBlood8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBlood::KeyValue_) }, - //{ 0x0, "_ZN6CBlood3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CBlood::Use_) }, + { 0x01D7A940, "_ZN6CBlood5SpawnEv", mfunc_ptr_cast(&CBlood::Spawn_) }, + { 0x01D7A980, "_ZN6CBlood8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBlood::KeyValue_) }, + { 0x01D7AB70, "_ZN6CBlood3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CBlood::Use_) }, //non-virtual func //{ 0x0, "_ZN6CBlood5ColorEv", mfunc_ptr_cast(&CBlood::Color) }, // NOXREF //{ 0x0, "_ZN6CBlood11BloodAmountEv", mfunc_ptr_cast(&CBlood::BloodAmount) }, // NOXREF //{ 0x0, "_ZN6CBlood8SetColorEi", mfunc_ptr_cast(&CBlood::SetColor) }, // NOXREF //{ 0x0, "_ZN6CBlood14SetBloodAmountEf", mfunc_ptr_cast(&CBlood::SetBloodAmount) }, // NOXREF - //{ 0x0, "_ZN6CBlood9DirectionEv", mfunc_ptr_cast(&CBlood::Direction) }, - //{ 0x0, "_ZN6CBlood13BloodPositionEP11CBaseEntity", mfunc_ptr_cast(&CBlood::BloodPosition) }, + //{ 0x01D7AA30, "_ZN6CBlood9DirectionEv", mfunc_ptr_cast(&CBlood::Direction) }, // NOXREF + { 0x01D7AA70, "_ZN6CBlood13BloodPositionEP11CBaseEntity", mfunc_ptr_cast(&CBlood::BloodPosition) }, //CShake //virtual func - //{ 0x0, "_ZN6CShake5SpawnEv", mfunc_ptr_cast(&CShake::Spawn_) }, - //{ 0x0, "_ZN6CShake8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CShake::KeyValue_) }, - //{ 0x0, "_ZN6CShake3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CShake::Use_) }, + { 0x01D7ADB0, "_ZN6CShake5SpawnEv", mfunc_ptr_cast(&CShake::Spawn_) }, + { 0x01D7ADF0, "_ZN6CShake8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CShake::KeyValue_) }, + { 0x01D7AEE0, "_ZN6CShake3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CShake::Use_) }, //non-virtual func //{ 0x0, "_ZN6CShake9AmplitudeEv", mfunc_ptr_cast(&CShake::Amplitude) }, // NOXREF //{ 0x0, "_ZN6CShake9FrequencyEv", mfunc_ptr_cast(&CShake::Frequency) }, // NOXREF @@ -1066,9 +1060,9 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN6CShake9SetRadiusEf", mfunc_ptr_cast(&CShake::SetRadius) }, // NOXREF //CFade //virtual func - //{ 0x0, "_ZN5CFade5SpawnEv", mfunc_ptr_cast(&CFade::Spawn_) }, - //{ 0x0, "_ZN5CFade8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFade::KeyValue_) }, - //{ 0x0, "_ZN5CFade3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CFade::Use_) }, + { 0x01D7AF70, "_ZN5CFade5SpawnEv", mfunc_ptr_cast(&CFade::Spawn_) }, + { 0x01D7AFA0, "_ZN5CFade8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFade::KeyValue_) }, + { 0x01D7B030, "_ZN5CFade3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CFade::Use_) }, //non-virtual func //{ 0x0, "_ZN5CFade8DurationEv", mfunc_ptr_cast(&CFade::Duration) }, // NOXREF //{ 0x0, "_ZN5CFade8HoldTimeEv", mfunc_ptr_cast(&CFade::HoldTime) }, // NOXREF @@ -1076,27 +1070,48 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN5CFade11SetHoldTimeEf", mfunc_ptr_cast(&CFade::SetHoldTime) }, // NOXREF //CMessage //virtual func - //{ 0x0, "_ZN8CMessage5SpawnEv", mfunc_ptr_cast(&CMessage::Spawn_) }, - //{ 0x0, "_ZN8CMessage8PrecacheEv", mfunc_ptr_cast(&CMessage::Precache_) }, - //{ 0x0, "_ZN8CMessage8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CMessage::KeyValue_) }, - //{ 0x0, "_ZN8CMessage3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CMessage::Use_) }, + { 0x01D7B150, "_ZN8CMessage5SpawnEv", mfunc_ptr_cast(&CMessage::Spawn_) }, + { 0x01D7B1E0, "_ZN8CMessage8PrecacheEv", mfunc_ptr_cast(&CMessage::Precache_) }, + { 0x01D7B210, "_ZN8CMessage8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CMessage::KeyValue_) }, + { 0x01D7B2E0, "_ZN8CMessage3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CMessage::Use_) }, //CEnvFunnel //virtual func - //{ 0x0, "_ZN10CEnvFunnel5SpawnEv", mfunc_ptr_cast(&CEnvFunnel::Spawn_) }, - //{ 0x0, "_ZN10CEnvFunnel8PrecacheEv", mfunc_ptr_cast(&CEnvFunnel::Precache_) }, - //{ 0x0, "_ZN10CEnvFunnel3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvFunnel::Use_) }, + { 0x01D7B4E0, "_ZN10CEnvFunnel5SpawnEv", mfunc_ptr_cast(&CEnvFunnel::Spawn_) }, + { 0x01D7B3E0, "_ZN10CEnvFunnel8PrecacheEv", mfunc_ptr_cast(&CEnvFunnel::Precache_) }, + { 0x01D7B450, "_ZN10CEnvFunnel3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvFunnel::Use_) }, //CEnvBeverage //virtual func - //{ 0x0, "_ZN12CEnvBeverage5SpawnEv", mfunc_ptr_cast(&CEnvBeverage::Spawn_) }, - //{ 0x0, "_ZN12CEnvBeverage8PrecacheEv", mfunc_ptr_cast(&CEnvBeverage::Precache_) }, - //{ 0x0, "_ZN12CEnvBeverage3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvBeverage::Use_) }, + { 0x01D7B630, "_ZN12CEnvBeverage5SpawnEv", mfunc_ptr_cast(&CEnvBeverage::Spawn_) }, + { 0x01D7B510, "_ZN12CEnvBeverage8PrecacheEv", mfunc_ptr_cast(&CEnvBeverage::Precache_) }, + { 0x01D7B580, "_ZN12CEnvBeverage3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvBeverage::Use_) }, //CItemSoda //virtual func - //{ 0x0, "_ZN9CItemSoda5SpawnEv", mfunc_ptr_cast(&CItemSoda::Spawn_) }, - //{ 0x0, "_ZN9CItemSoda8PrecacheEv", mfunc_ptr_cast(&CItemSoda::Precache_) }, + { 0x01D7B6E0, "_ZN9CItemSoda5SpawnEv", mfunc_ptr_cast(&CItemSoda::Spawn_) }, + //{ 0x01D7B680, "_ZN9CItemSoda8PrecacheEv", mfunc_ptr_cast(&CItemSoda::Precache_) }, // pure //non-virtual func - //{ 0x0, "_ZN9CItemSoda8CanThinkEv", mfunc_ptr_cast(&CItemSoda::CanThink) }, - //{ 0x0, "_ZN9CItemSoda8CanTouchEP11CBaseEntity", mfunc_ptr_cast(&CItemSoda::CanTouch) }, + { 0x01D7B790, "_ZN9CItemSoda8CanThinkEv", mfunc_ptr_cast(&CItemSoda::CanThink) }, + { 0x01D7B820, "_ZN9CItemSoda8CanTouchEP11CBaseEntity", mfunc_ptr_cast(&CItemSoda::CanTouch) }, + +//linked objects + { 0x01D75980, "info_target", (size_t)&info_target }, + { 0x01D759D0, "env_bubbles", (size_t)&env_bubbles }, + { 0x01D75DB0, "beam", (size_t)&beam }, + { 0x01D76740, "env_lightning", (size_t)&env_lightning }, + { 0x01D76790, "env_beam", (size_t)&env_beam }, + { 0x01D781F0, "env_laser", (size_t)&env_laser }, + { 0x01D78DE0, "env_glow", (size_t)&env_glow }, + { 0x01D79050, "env_bombglow", (size_t)&env_bombglow }, + { 0x01D79240, "env_sprite", (size_t)&env_sprite }, + { 0x01D79C00, "gibshooter", (size_t)&gibshooter }, + { 0x01D7A220, "env_shooter", (size_t)&env_shooter }, + { 0x01D7A4E0, "test_effect", (size_t)&test_effect }, + { 0x01D7A8F0, "env_blood", (size_t)&env_blood }, + { 0x01D7AD60, "env_shake", (size_t)&env_shake }, + { 0x01D7AF20, "env_fade", (size_t)&env_fade }, + { 0x01D7B100, "env_message", (size_t)&env_message }, + { 0x01D7B400, "env_funnel", (size_t)&env_funnel }, + { 0x01D7B530, "env_beverage", (size_t)&env_beverage }, + { 0x01D7B690, "item_sodacan", (size_t)&item_sodacan }, #endif // Effects_Region @@ -1232,6 +1247,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN10CGunTarget5StartEv", mfunc_ptr_cast(&CGunTarget::Start) }, //{ 0x0, "_ZN10CGunTarget4WaitEv", mfunc_ptr_cast(&CGunTarget::Wait) }, //{ 0x0, "_ZN10CGunTarget4StopEv", mfunc_ptr_cast(&CGunTarget::Stop) }, +//CPlane + //{ 0x01D952F0, "_ZN6CPlaneC2Ev", mfunc_ptr_cast(&CPlane::CPlane) }, // NOXREF + //{ 0x01D95300, "_ZN6CPlane15InitializePlaneERK6VectorS2_", mfunc_ptr_cast(&CPlane::InitializePlane) }, // NOXREF + //{ 0x01D95340, "_ZN6CPlane12PointInFrontERK6Vector", mfunc_ptr_cast(&CPlane::PointInFront) }, // NOXREF #endif // Plats_Region @@ -1246,10 +1265,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN10CPathTrack8ActivateEv", mfunc_ptr_cast(&CPathTrack::Activate_) }, //{ 0x0, "_ZN10CPathTrack3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CPathTrack::Use_) }, //non-virtual func - //{ 0x0, "_ZN10CPathTrack11SetPreviousEPS_", mfunc_ptr_cast(&CPathTrack::SetPrevious) }, + //{ 0x01D94B90, "_ZN10CPathTrack11SetPreviousEPS_", mfunc_ptr_cast(&CPathTrack::SetPrevious) }, // NOXREF //{ 0x0, "_ZN10CPathTrack4LinkEv", mfunc_ptr_cast(&CPathTrack::Link) }, - //{ 0x0, "_ZN10CPathTrack9ValidPathEPS_i", mfunc_ptr_cast(&CPathTrack::ValidPath) }, - //{ 0x0, "_ZN10CPathTrack7ProjectEPS_S0_P6Vectorf", mfunc_ptr_cast(&CPathTrack::Project) }, + //{ 0x01D94A10, "_ZN10CPathTrack9ValidPathEPS_i", mfunc_ptr_cast(&CPathTrack::ValidPath) }, + //{ 0x01D94A40, "_ZN10CPathTrack7ProjectEPS_S0_P6Vectorf", mfunc_ptr_cast(&CPathTrack::Project) }, // NOXREF //{ 0x0, "_ZN10CPathTrack8InstanceEP7edict_s", mfunc_ptr_cast(&CPathTrack::Instance) }, //{ 0x0, "_ZN10CPathTrack9LookAheadEP6Vectorfi", mfunc_ptr_cast(&CPathTrack::LookAhead) }, //{ 0x0, "_ZN10CPathTrack7NearestE6Vector", mfunc_ptr_cast(&CPathTrack::Nearest) }, @@ -1392,7 +1411,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN10CBreakable10ExplodableEv", mfunc_ptr_cast(&CBreakable::Explodable) }, // NOXREF //{ 0x0, "_ZN10CBreakable18ExplosionMagnitudeEv", mfunc_ptr_cast(&CBreakable::ExplosionMagnitude) }, // NOXREF //{ 0x0, "_ZN10CBreakable21ExplosionSetMagnitudeEi", mfunc_ptr_cast(&CBreakable::ExplosionSetMagnitude) }, // NOXREF - //{ 0x0, "_ZN10CBreakable21MaterialSoundPrecacheE9Materials", mfunc_ptr_cast(&CBreakable::MaterialSoundPrecache) }, + { 0x01D7C670, "_ZN10CBreakable21MaterialSoundPrecacheE9Materials", mfunc_ptr_cast(&CBreakable::MaterialSoundPrecache) }, { 0x01D7C710, "_ZN10CBreakable19MaterialSoundRandomEP7edict_s9Materialsf", mfunc_ptr_cast(&CBreakable::MaterialSoundRandom) }, //{ 0x01D7C5D0, "_ZN10CBreakable17MaterialSoundListE9MaterialsRi", mfunc_ptr_cast(&CBreakable::MaterialSoundList) }, // NOXREF //CPushable @@ -1601,20 +1620,24 @@ FunctionHook g_FunctionHooks[] = //CShower //virtual func - //{ 0x0, "_ZN7CShower5SpawnEv", mfunc_ptr_cast(&CShower::Spawn_) }, - //{ 0x0, "_ZN7CShower10ObjectCapsEv", mfunc_ptr_cast(&CShower::ObjectCaps_) }, - //{ 0x0, "_ZN7CShower5ThinkEv", mfunc_ptr_cast(&CShower::Think_) }, - //{ 0x0, "_ZN7CShower5TouchEP11CBaseEntity", mfunc_ptr_cast(&CShower::Touch_) }, + { 0x01D7B960, "_ZN7CShower5SpawnEv", mfunc_ptr_cast(&CShower::Spawn_) }, + { 0x01D7B950, "_ZN7CShower10ObjectCapsEv", mfunc_ptr_cast(&CShower::ObjectCaps_) }, + { 0x01D7BAD0, "_ZN7CShower5ThinkEv", mfunc_ptr_cast(&CShower::Think_) }, + { 0x01D7BB60, "_ZN7CShower5TouchEP11CBaseEntity", mfunc_ptr_cast(&CShower::Touch_) }, + //linked objects + { 0x01D7B900, "spark_shower", (size_t)&spark_shower }, //CEnvExplosion //virtual func - //{ 0x0, "_ZN13CEnvExplosion5SpawnEv", mfunc_ptr_cast(&CEnvExplosion::Spawn_) }, - //{ 0x0, "_ZN13CEnvExplosion8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CEnvExplosion::KeyValue_) }, - //{ 0x0, "_ZN13CEnvExplosion4SaveER5CSave", mfunc_ptr_cast(&CEnvExplosion::Save_) }, - //{ 0x0, "_ZN13CEnvExplosion7RestoreER8CRestore", mfunc_ptr_cast(&CEnvExplosion::Restore_) }, - //{ 0x0, "_ZN13CEnvExplosion3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvExplosion::Use_) }, + { 0x01D7BD10, "_ZN13CEnvExplosion5SpawnEv", mfunc_ptr_cast(&CEnvExplosion::Spawn_) }, + { 0x01D7BCC0, "_ZN13CEnvExplosion8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CEnvExplosion::KeyValue_) }, + { 0x01D7BC10, "_ZN13CEnvExplosion4SaveER5CSave", mfunc_ptr_cast(&CEnvExplosion::Save_) }, + { 0x01D7BC40, "_ZN13CEnvExplosion7RestoreER8CRestore", mfunc_ptr_cast(&CEnvExplosion::Restore_) }, + { 0x01D7BD70, "_ZN13CEnvExplosion3UseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CEnvExplosion::Use_) }, //non-virtual func - //{ 0x0, "_ZN13CEnvExplosion5SmokeEv", mfunc_ptr_cast(&CEnvExplosion::Smoke) }, - //{ 0x0, "_Z15ExplosionCreateRK6VectorS1_P7edict_sii", (size_t)&ExplosionCreate }, + { 0x01D7C040, "_ZN13CEnvExplosion5SmokeEv", mfunc_ptr_cast(&CEnvExplosion::Smoke) }, + { 0x01D7C0E0, "_Z15ExplosionCreateRK6VectorS1_P7edict_sii", (size_t)&ExplosionCreate }, + //linked objects + { 0x01D7BC70, "env_explosion", (size_t)&env_explosion }, #endif // Explode_Region @@ -1622,20 +1645,24 @@ FunctionHook g_FunctionHooks[] = //CFuncMortarField //virtual func - //{ 0x0, "_ZN16CFuncMortarField5SpawnEv", mfunc_ptr_cast(&CFuncMortarField::Spawn_) }, - //{ 0x0, "_ZN16CFuncMortarField8PrecacheEv", mfunc_ptr_cast(&CFuncMortarField::Precache_) }, - //{ 0x0, "_ZN16CFuncMortarField8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFuncMortarField::KeyValue_) }, - //{ 0x0, "_ZN16CFuncMortarField4SaveER5CSave", mfunc_ptr_cast(&CFuncMortarField::Save_) }, - //{ 0x0, "_ZN16CFuncMortarField7RestoreER8CRestore", mfunc_ptr_cast(&CFuncMortarField::Restore_) }, - //{ 0x0, "_ZN16CFuncMortarField10ObjectCapsEv", mfunc_ptr_cast(&CFuncMortarField::ObjectCaps_) }, + { 0x01D8A610, "_ZN16CFuncMortarField5SpawnEv", mfunc_ptr_cast(&CFuncMortarField::Spawn_) }, + { 0x01D8A680, "_ZN16CFuncMortarField8PrecacheEv", mfunc_ptr_cast(&CFuncMortarField::Precache_) }, + { 0x01D8A500, "_ZN16CFuncMortarField8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFuncMortarField::KeyValue_) }, + { 0x01D8A4A0, "_ZN16CFuncMortarField4SaveER5CSave", mfunc_ptr_cast(&CFuncMortarField::Save_) }, + { 0x01D8A4D0, "_ZN16CFuncMortarField7RestoreER8CRestore", mfunc_ptr_cast(&CFuncMortarField::Restore_) }, + { 0x01D8A490, "_ZN16CFuncMortarField10ObjectCapsEv", mfunc_ptr_cast(&CFuncMortarField::ObjectCaps_) }, //non-virtual func - //{ 0x0, "_ZN16CFuncMortarField8FieldUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CFuncMortarField::FieldUse) }, + { 0x01D8A6B0, "_ZN16CFuncMortarField8FieldUseEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CFuncMortarField::FieldUse) }, + //linked objects + { 0x01D8A440, "func_mortar_field", (size_t)&func_mortar_field }, //CMortar //virtual func - //{ 0x0, "_ZN7CMortar5SpawnEv", mfunc_ptr_cast(&CMortar::Spawn_) }, - //{ 0x0, "_ZN7CMortar8PrecacheEv", mfunc_ptr_cast(&CMortar::Precache_) }, + { 0x01D8A990, "_ZN7CMortar5SpawnEv", mfunc_ptr_cast(&CMortar::Spawn_) }, + { 0x01D8A9D0, "_ZN7CMortar8PrecacheEv", mfunc_ptr_cast(&CMortar::Precache_) }, //non-virtual func - //{ 0x0, "_ZN7CMortar13MortarExplodeEv", mfunc_ptr_cast(&CMortar::MortarExplode) }, + { 0x01D8A9F0, "_ZN7CMortar13MortarExplodeEv", mfunc_ptr_cast(&CMortar::MortarExplode) }, + //linked objects + { 0x01D8A940, "monster_mortar", (size_t)&monster_mortar }, #endif // Mortar_Region @@ -1991,7 +2018,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN12CChangeLevel7RestoreER8CRestore", mfunc_ptr_cast(&CChangeLevel::Restore_) }, //non-virtual func //{ 0x01DBF5F0, "trigger_changelevel", (size_t)&trigger_changelevel }, - //{ 0x01DBFD80, "_Z15BuildChangeListP9LEVELLISTi", (size_t)&BuildChangeList }, + { 0x01DBFD80, "_Z15BuildChangeListP9LEVELLISTi", (size_t)&BuildChangeList }, //{ 0x0, "_Z9NextLevelv", (size_t)&NextLevel }, //{ 0x0, "_ZN12CChangeLevel14UseChangeLevelEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CChangeLevel::UseChangeLevel) }, //{ 0x0, "_ZN12CChangeLevel18TriggerChangeLevelEv", mfunc_ptr_cast(&CChangeLevel::TriggerChangeLevel) }, // NOXREF @@ -1999,9 +2026,9 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN12CChangeLevel16TouchChangeLevelEP11CBaseEntity", mfunc_ptr_cast(&CChangeLevel::TouchChangeLevel) }, //{ 0x0, "_ZN12CChangeLevel14ChangeLevelNowEP11CBaseEntity", mfunc_ptr_cast(&CChangeLevel::ChangeLevelNow) }, //{ 0x01DBF990, "_ZN12CChangeLevel12FindLandmarkEPKc", mfunc_ptr_cast(&CChangeLevel::FindLandmark) }, // NOXREF - //{ 0x01DBFE50, "_ZN12CChangeLevel10ChangeListEP9LEVELLISTi", mfunc_ptr_cast(&CChangeLevel::ChangeList) }, - //{ 0x01DBFCA0, "_ZN12CChangeLevel19AddTransitionToListEP9LEVELLISTiPKcS3_P7edict_s", mfunc_ptr_cast(&CChangeLevel::AddTransitionToList) }, - //{ 0x01DBFD90, "_ZN12CChangeLevel18InTransitionVolumeEP11CBaseEntityPc", mfunc_ptr_cast(&CChangeLevel::InTransitionVolume) }, + { 0x01DBFE50, "_ZN12CChangeLevel10ChangeListEP9LEVELLISTi", mfunc_ptr_cast(&CChangeLevel::ChangeList) }, + { 0x01DBFCA0, "_ZN12CChangeLevel19AddTransitionToListEP9LEVELLISTiPKcS3_P7edict_s", mfunc_ptr_cast(&CChangeLevel::AddTransitionToList) }, + { 0x01DBFD90, "_ZN12CChangeLevel18InTransitionVolumeEP11CBaseEntityPc", mfunc_ptr_cast(&CChangeLevel::InTransitionVolume) }, //CLadder //virtual func //{ 0x0, "_ZN7CLadder5SpawnEv", mfunc_ptr_cast(&CLadder::Spawn_) }, @@ -2132,53 +2159,48 @@ FunctionHook g_FunctionHooks[] = #endif // SharedUtil_Region #ifndef World_Region - - //{ 0x01DD13D0, "infodecal", (size_t)&infodecal }, - //{ 0x01DD1700, "bodyque", (size_t)&bodyque }, - //{ 0x01DD1E90, "worldspawn", (size_t)&worldspawn }, - - //{ 0x0, "_ZN7CCorpse10ObjectCapsEv", mfunc_ptr_cast(&CCorpse::ObjectCaps) }, - - //{ 0x0, "_ZN6CDecal5SpawnEv", mfunc_ptr_cast(&CDecal::Spawn) }, - //{ 0x0, "_ZN6CDecal11StaticDecalEv", mfunc_ptr_cast(&CDecal::StaticDecal) }, - //{ 0x0, "_ZN6CDecal12TriggerDecalEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CDecal::TriggerDecal) }, - //{ 0x0, "_ZN6CDecal8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CDecal::KeyValue) }, - - //{ 0x0, "_Z13CopyToBodyQueP9entvars_s", (size_t)&CopyToBodyQue }, - //{ 0x0, "_Z12ClearBodyQuev", (size_t)&ClearBodyQue }, - - //{ 0x0, "_ZN12CGlobalState5ResetEv", mfunc_ptr_cast(&CGlobalState::Reset) }, + //virtual func + { 0x01DD1750, "_ZN7CCorpse10ObjectCapsEv", mfunc_ptr_cast(&CCorpse::ObjectCaps_) }, + //non-virtual func + { 0x01DD1420, "_ZN6CDecal5SpawnEv", mfunc_ptr_cast(&CDecal::Spawn_) }, + { 0x01DD15C0, "_ZN6CDecal11StaticDecalEv", mfunc_ptr_cast(&CDecal::StaticDecal) }, + { 0x01DD1490, "_ZN6CDecal12TriggerDecalEP11CBaseEntityS1_8USE_TYPEf", mfunc_ptr_cast(&CDecal::TriggerDecal) }, + { 0x01DD1690, "_ZN6CDecal8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CDecal::KeyValue_) }, + //{ 0x01DD1760, "_Z13CopyToBodyQueP9entvars_s", (size_t)&CopyToBodyQue }, // PURE + //{ 0x01DD1770, "_Z12ClearBodyQuev", (size_t)&ClearBodyQue }, // NOXREF + //{ 0x01DD1780, "_ZN12CGlobalStateC2Ev", mfunc_ptr_cast(&CGlobalState__CGlobalState) }, + //{ 0x01DD1790, "_ZN12CGlobalState5ResetEv", mfunc_ptr_cast(&CGlobalState::Reset) }, // NOXREF { 0x01DD17A0, "_ZN12CGlobalState4FindEj", mfunc_ptr_cast(&CGlobalState::Find) }, { 0x01DD1810, "_ZN12CGlobalState11DumpGlobalsEv", mfunc_ptr_cast(&CGlobalState::DumpGlobals) }, - //{ 0x01DD1860, "_ZN12CGlobalState9EntityAddEjj12GLOBALESTATE", mfunc_ptr_cast(&CGlobalState::EntityAdd) }, + { 0x01DD1860, "_ZN12CGlobalState9EntityAddEjj12GLOBALESTATE", mfunc_ptr_cast(&CGlobalState::EntityAdd) }, { 0x01DD18D0, "_ZN12CGlobalState14EntitySetStateEj12GLOBALESTATE", mfunc_ptr_cast(&CGlobalState::EntitySetState) }, - //{ 0x01DD1950, "_ZN12CGlobalState15EntityFromTableEj", mfunc_ptr_cast(&CGlobalState::EntityFromTable) }, - //{ 0x0, "_ZN12CGlobalState14EntityGetStateEj", mfunc_ptr_cast(&CGlobalState::EntityGetState) }, - //{ 0x0, "_ZN12CGlobalState4SaveER5CSave", mfunc_ptr_cast(&CGlobalState::Save) }, - //{ 0x0, "_ZN12CGlobalState7RestoreER8CRestore", mfunc_ptr_cast(&CGlobalState::Restore) }, - //{ 0x01DD1BD0, "_ZN12CGlobalState12EntityUpdateEjj", mfunc_ptr_cast(&CGlobalState::EntityUpdate) }, - //{ 0x0, "_ZN12CGlobalState11ClearStatesEv", mfunc_ptr_cast(&CGlobalState::ClearStates) }, + { 0x01DD1950, "_ZN12CGlobalState15EntityFromTableEj", mfunc_ptr_cast(&CGlobalState::EntityFromTable) }, + { 0x01DD19C0, "_ZN12CGlobalState14EntityGetStateEj", mfunc_ptr_cast(&CGlobalState::EntityGetState) }, + //{ 0x01DD1A40, "_ZN12CGlobalState4SaveER5CSave", mfunc_ptr_cast(&CGlobalState::Save) }, // NOXREF + //{ 0x01DD1AB0, "_ZN12CGlobalState7RestoreER8CRestore", mfunc_ptr_cast(&CGlobalState::Restore) }, // NOXREF + { 0x01DD1BD0, "_ZN12CGlobalState12EntityUpdateEjj", mfunc_ptr_cast(&CGlobalState::EntityUpdate) }, + //{ 0x01DD1C50, "_ZN12CGlobalState11ClearStatesEv", mfunc_ptr_cast(&CGlobalState::ClearStates) }, // NOXREF - ////{ 0x0, "_Z15SaveGlobalStateP13saverestore_s", (size_t)&SaveGlobalState }, - ////{ 0x0, "_Z18RestoreGlobalStateP13saverestore_s", (size_t)&RestoreGlobalState }, - ////{ 0x0, "_Z16ResetGlobalStatev", (size_t)&ResetGlobalState }, - - //{ 0x0, "_ZN6CWorld5SpawnEv", mfunc_ptr_cast(&CWorld::Spawn) }, - //{ 0x0, "_ZN6CWorld8PrecacheEv", mfunc_ptr_cast(&CWorld::Precache) }, - //{ 0x0, "_ZN6CWorld8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWorld::KeyValue) }, + { 0x01DD1C80, "_Z15SaveGlobalStateP13saverestore_s", (size_t)&SaveGlobalState }, + { 0x01DD1D00, "_Z18RestoreGlobalStateP13saverestore_s", (size_t)&RestoreGlobalState }, + { 0x01DD1E50, "_Z16ResetGlobalStatev", (size_t)&ResetGlobalState }, +//linked objects + { 0x01DD13D0, "infodecal", (size_t)&infodecal }, + { 0x01DD1700, "bodyque", (size_t)&bodyque }, + { 0x01DD1E90, "worldspawn", (size_t)&worldspawn }, #endif // World_Region #ifndef Graph_Region - //{ 0x0, "_ZN6CGraph9InitGraphEv", mfunc_ptr_cast(&CGraph::InitGraph) }, - //{ 0x0, "_ZN6CGraph10AllocNodesEv", mfunc_ptr_cast(&CGraph::AllocNodes) }, - //{ 0x0, "_ZN6CGraph12CheckNODFileEPc", mfunc_ptr_cast(&CGraph::CheckNODFile) }, - //{ 0x0, "_ZN6CGraph10FLoadGraphEPc", mfunc_ptr_cast(&CGraph::FLoadGraph) }, - //{ 0x01D8ABB0, "_ZN6CGraph17FSetGraphPointersEv", mfunc_ptr_cast(&CGraph::FSetGraphPointers) }, - //{ 0x01D8ABC0, "_ZN6CGraph19ShowNodeConnectionsEi", mfunc_ptr_cast(&CGraph::ShowNodeConnections) }, // NOXREF - //{ 0x0, "_ZN6CGraph15FindNearestNodeERK6VectorP11CBaseEntity", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // NOXREF - //{ 0x01D8ABD0, "_ZN6CGraph15FindNearestNodeERK6Vectori", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // PURE + //{ 0x01D8AB70, "_ZN6CGraph9InitGraphEv", mfunc_ptr_cast(&CGraph::InitGraph) }, // pure + //{ 0x01D8AB90, "_ZN6CGraph10AllocNodesEv", mfunc_ptr_cast(&CGraph::AllocNodes) }, // pure + //{ 0x01D8ABA0, "_ZN6CGraph12CheckNODFileEPc", mfunc_ptr_cast(&CGraph::CheckNODFile) }, // pure + //{ 0x01D8AB80, "_ZN6CGraph10FLoadGraphEPc", mfunc_ptr_cast(&CGraph::FLoadGraph) }, // pure + //{ 0x01D8ABB0, "_ZN6CGraph17FSetGraphPointersEv", mfunc_ptr_cast(&CGraph::FSetGraphPointers) }, // pure + //{ 0x01D8ABC0, "_ZN6CGraph19ShowNodeConnectionsEi", mfunc_ptr_cast(&CGraph::ShowNodeConnections) }, // pure + //{ 0x0, "_ZN6CGraph15FindNearestNodeERK6VectorP11CBaseEntity", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // pure + //{ 0x01D8ABD0, "_ZN6CGraph15FindNearestNodeERK6Vectori", mfunc_ptr_cast(&CGraph::FindNearestNode) }, // pure #endif // Graph_Region @@ -2429,56 +2451,76 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D80C90, "_Z16InstallGameRulesv", (size_t)&InstallGameRules }, { 0x01D80C00, "_ZN10CGameRules16RefreshSkillDataEv", mfunc_ptr_cast(&CGameRules::RefreshSkillData_) }, - //{ 0x0, "_ZN10CGameRules18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CGameRules::GetPlayerSpawnSpot_) }, - //{ 0x0, "_ZN10CGameRules17CanHavePlayerItemEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CGameRules::CanHavePlayerItem_) }, + { 0x01D8EBB0, "_ZN10CGameRules10IsTeamplayEv", mfunc_ptr_cast(&CGameRules::IsTeamplay_) }, + { 0x01D8EBC0, "_ZN10CGameRules18GetGameDescriptionEv", mfunc_ptr_cast(&CGameRules::GetGameDescription_) }, + //{ 0x01D8EBD0, "_ZN10CGameRules14UpdateGameModeEP11CBasePlayer", mfunc_ptr_cast(&CGameRules::UpdateGameMode_) }, // PURE + { 0x01D8EBE0, "_ZN10CGameRules20FPlayerCanTakeDamageEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CGameRules::FPlayerCanTakeDamage_) }, + { 0x01D8EBF0, "_ZN10CGameRules13ShouldAutoAimEP11CBasePlayerP7edict_s", mfunc_ptr_cast(&CGameRules::ShouldAutoAim_) }, + { 0x01D80A60, "_ZN10CGameRules18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CGameRules::GetPlayerSpawnSpot_) }, + { 0x01D8EC00, "_ZN10CGameRules24AllowAutoTargetCrosshairEv", mfunc_ptr_cast(&CGameRules::AllowAutoTargetCrosshair_) }, + { 0x01D8EC10, "_ZN10CGameRules25ClientCommand_DeadOrAliveEP11CBasePlayerPKc", mfunc_ptr_cast(&CGameRules::ClientCommand_DeadOrAlive_) }, + { 0x01D8EC60, "_ZN10CGameRules13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CGameRules::ClientCommand_) }, + //{ 0x01D8EC70, "_ZN10CGameRules21ClientUserInfoChangedEP11CBasePlayerPc", mfunc_ptr_cast(&CGameRules::ClientUserInfoChanged_) }, // PURE + { 0x01D80B60, "_ZN10CGameRules17CanHavePlayerItemEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CGameRules::CanHavePlayerItem_) }, { 0x01D80A20, "_ZN10CGameRules11CanHaveAmmoEP11CBasePlayerPKci", mfunc_ptr_cast(&CGameRules::CanHaveAmmo_) }, - + { 0x01D8EC80, "_ZN10CGameRules24FlHEVChargerRechargeTimeEv", mfunc_ptr_cast(&CGameRules::FlHEVChargerRechargeTime_) }, + { 0x01D8EC90, "_ZN10CGameRules12GetTeamIndexEPKc", mfunc_ptr_cast(&CGameRules::GetTeamIndex_) }, + { 0x01D8ED40, "_ZN10CGameRules18GetIndexedTeamNameEi", mfunc_ptr_cast(&CGameRules::GetIndexedTeamName_) }, + { 0x01D8ED50, "_ZN10CGameRules11IsValidTeamEPKc", mfunc_ptr_cast(&CGameRules::IsValidTeam_) }, + //{ 0x01D8ED60, "_ZN10CGameRules16ChangePlayerTeamEP11CBasePlayerPKcii", mfunc_ptr_cast(&CGameRules::ChangePlayerTeam_) }, // PURE + { 0x01D8ED70, "_ZN10CGameRules20SetDefaultPlayerTeamEP11CBasePlayer", mfunc_ptr_cast(&CGameRules::SetDefaultPlayerTeam_) }, + { 0x01D8ED80, "_ZN10CGameRules17PlayTextureSoundsEv", mfunc_ptr_cast(&CGameRules::PlayTextureSounds_) }, + //{ 0x01D8ED90, "_ZN10CGameRules18EndMultiplayerGameEv", mfunc_ptr_cast(&CGameRules::EndMultiplayerGame_) }, // PURE + { 0x01D8EDA0, "_ZN10CGameRules14IsFreezePeriodEv", mfunc_ptr_cast(&CGameRules::IsFreezePeriod_) }, + //{ 0x01D8EDB0, "_ZN10CGameRules16ServerDeactivateEv", mfunc_ptr_cast(&CGameRules::ServerDeactivate_) }, // PURE + //{ 0x01D8EDC0, "_ZN10CGameRules18CheckMapConditionsEv", mfunc_ptr_cast(&CGameRules::CheckMapConditions_) }, // PURE + #endif // GameRules_Region #ifndef Singleplay_GameRules_Region - //{ 0x0, "", mfunc_ptr_cast(&CHalfLifeRules::CHalfLifeRules) }, - //{ 0x0, "_ZN14CHalfLifeRules5ThinkEv", mfunc_ptr_cast(&CHalfLifeRules::Think) }, - //{ 0x0, "_ZN14CHalfLifeRules16IsAllowedToSpawnEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::IsAllowedToSpawn) }, - //{ 0x0, "_ZN14CHalfLifeRules16FAllowFlashlightEv", mfunc_ptr_cast(&CHalfLifeRules::FAllowFlashlight) }, - //{ 0x01DB6790, "_ZN14CHalfLifeRules19FShouldSwitchWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FShouldSwitchWeapon) }, - //{ 0x0, "_ZN14CHalfLifeRules17GetNextBestWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::GetNextBestWeapon) }, - //{ 0x0, "_ZN14CHalfLifeRules13IsMultiplayerEv", mfunc_ptr_cast(&CHalfLifeRules::IsMultiplayer) }, - //{ 0x0, "_ZN14CHalfLifeRules12IsDeathmatchEv", mfunc_ptr_cast(&CHalfLifeRules::IsDeathmatch) }, - //{ 0x0, "_ZN14CHalfLifeRules6IsCoOpEv", mfunc_ptr_cast(&CHalfLifeRules::IsCoOp) }, - //{ 0x0, "_ZN14CHalfLifeRules15ClientConnectedEP7edict_sPKcS3_Pc", mfunc_ptr_cast(&CHalfLifeRules::ClientConnected) }, - //{ 0x0, "_ZN14CHalfLifeRules7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::InitHUD) }, - //{ 0x0, "_ZN14CHalfLifeRules18ClientDisconnectedEP7edict_s", mfunc_ptr_cast(&CHalfLifeRules::ClientDisconnected) }, - //{ 0x01DB6800, "_ZN14CHalfLifeRules18FlPlayerFallDamageEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FlPlayerFallDamage) }, - { 0x01DB6820, "_ZN14CHalfLifeRules11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::PlayerSpawn) }, - //{ 0x0, "_ZN14CHalfLifeRules11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::PlayerThink) }, - //{ 0x0, "_ZN14CHalfLifeRules17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FPlayerCanRespawn) }, - //{ 0x0, "_ZN14CHalfLifeRules17FlPlayerSpawnTimeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FlPlayerSpawnTime) }, - //{ 0x01DB6960, "_ZN14CHalfLifeRules18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::GetPlayerSpawnSpot) }, - //{ 0x0, "_ZN14CHalfLifeRules24AllowAutoTargetCrosshairEv", mfunc_ptr_cast(&CHalfLifeRules::AllowAutoTargetCrosshair) }, - //{ 0x0, "_ZN14CHalfLifeRules14IPointsForKillEP11CBasePlayerS1_", mfunc_ptr_cast(&CHalfLifeRules::IPointsForKill) }, - //{ 0x0, "_ZN14CHalfLifeRules12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeRules::PlayerKilled) }, - //{ 0x0, "_ZN14CHalfLifeRules11DeathNoticeEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeRules::DeathNotice) }, - //{ 0x0, "_ZN14CHalfLifeRules15PlayerGotWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotWeapon) }, - //{ 0x0, "_ZN14CHalfLifeRules19WeaponShouldRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::WeaponShouldRespawn) }, - //{ 0x0, "_ZN14CHalfLifeRules19FlWeaponRespawnTimeEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FlWeaponRespawnTime) }, - //{ 0x0, "_ZN14CHalfLifeRules18FlWeaponTryRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FlWeaponTryRespawn) }, - //{ 0x0, "_ZN14CHalfLifeRules20VecWeaponRespawnSpotEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::VecWeaponRespawnSpot) }, - //{ 0x0, "_ZN14CHalfLifeRules11CanHaveItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeRules::CanHaveItem) }, - //{ 0x0, "_ZN14CHalfLifeRules13PlayerGotItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotItem) }, - //{ 0x0, "_ZN14CHalfLifeRules17ItemShouldRespawnEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::ItemShouldRespawn) }, - //{ 0x0, "_ZN14CHalfLifeRules17FlItemRespawnTimeEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::FlItemRespawnTime) }, - //{ 0x0, "_ZN14CHalfLifeRules18VecItemRespawnSpotEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::VecItemRespawnSpot) }, - //{ 0x0, "_ZN14CHalfLifeRules13PlayerGotAmmoEP11CBasePlayerPci", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotAmmo) }, - //{ 0x0, "_ZN14CHalfLifeRules17AmmoShouldRespawnEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::AmmoShouldRespawn) }, - //{ 0x0, "_ZN14CHalfLifeRules17FlAmmoRespawnTimeEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::FlAmmoRespawnTime) }, - //{ 0x0, "_ZN14CHalfLifeRules18VecAmmoRespawnSpotEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::VecAmmoRespawnSpot) }, - //{ 0x0, "_ZN14CHalfLifeRules27FlHealthChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeRules::FlHealthChargerRechargeTime) }, - //{ 0x0, "_ZN14CHalfLifeRules17DeadPlayerWeaponsEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::DeadPlayerWeapons) }, - //{ 0x0, "_ZN14CHalfLifeRules14DeadPlayerAmmoEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::DeadPlayerAmmo) }, - //{ 0x0, "_ZN14CHalfLifeRules9GetTeamIDEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::GetTeamID) }, - //{ 0x0, "_ZN14CHalfLifeRules18PlayerRelationshipEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::PlayerRelationship) }, - //{ 0x0, "_ZN14CHalfLifeRules14FAllowMonstersEv", mfunc_ptr_cast(&CHalfLifeRules::FAllowMonsters) }, + //{ 0x01DB6730, "", mfunc_ptr_cast(&CHalfLifeRules::CHalfLifeRules) }, + { 0x01DB6750, "_ZN14CHalfLifeRules5ThinkEv", mfunc_ptr_cast(&CHalfLifeRules::Think_) }, // PURE + { 0x01DB6AF0, "_ZN14CHalfLifeRules16IsAllowedToSpawnEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::IsAllowedToSpawn_) }, + { 0x01DB6BB0, "_ZN14CHalfLifeRules16FAllowFlashlightEv", mfunc_ptr_cast(&CHalfLifeRules::FAllowFlashlight_) }, + { 0x01DB6790, "_ZN14CHalfLifeRules19FShouldSwitchWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FShouldSwitchWeapon_) }, + { 0x01DB67C0, "_ZN14CHalfLifeRules17GetNextBestWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::GetNextBestWeapon_) }, + { 0x01DB6760, "_ZN14CHalfLifeRules13IsMultiplayerEv", mfunc_ptr_cast(&CHalfLifeRules::IsMultiplayer_) }, + { 0x01DB6770, "_ZN14CHalfLifeRules12IsDeathmatchEv", mfunc_ptr_cast(&CHalfLifeRules::IsDeathmatch_) }, + { 0x01DB6780, "_ZN14CHalfLifeRules6IsCoOpEv", mfunc_ptr_cast(&CHalfLifeRules::IsCoOp_) }, + { 0x01DB67D0, "_ZN14CHalfLifeRules15ClientConnectedEP7edict_sPKcS3_Pc", mfunc_ptr_cast(&CHalfLifeRules::ClientConnected_) }, + { 0x01DB67E0, "_ZN14CHalfLifeRules7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::InitHUD_) }, // PURE + { 0x01DB67F0, "_ZN14CHalfLifeRules18ClientDisconnectedEP7edict_s", mfunc_ptr_cast(&CHalfLifeRules::ClientDisconnected_) }, // PURE + { 0x01DB6800, "_ZN14CHalfLifeRules18FlPlayerFallDamageEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FlPlayerFallDamage_) }, + { 0x01DB6820, "_ZN14CHalfLifeRules11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::PlayerSpawn_) }, + { 0x01DB68A0, "_ZN14CHalfLifeRules11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::PlayerThink_) }, // PURE + { 0x01DB68B0, "_ZN14CHalfLifeRules17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FPlayerCanRespawn_) }, + { 0x01DB68C0, "_ZN14CHalfLifeRules17FlPlayerSpawnTimeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::FlPlayerSpawnTime_) }, + { 0x01DB6960, "_ZN14CHalfLifeRules18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::GetPlayerSpawnSpot_) }, + { 0x01DB6890, "_ZN14CHalfLifeRules24AllowAutoTargetCrosshairEv", mfunc_ptr_cast(&CHalfLifeRules::AllowAutoTargetCrosshair_) }, + { 0x01DB68D0, "_ZN14CHalfLifeRules14IPointsForKillEP11CBasePlayerS1_", mfunc_ptr_cast(&CHalfLifeRules::IPointsForKill_) }, + { 0x01DB68E0, "_ZN14CHalfLifeRules12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeRules::PlayerKilled_) }, // PURE + { 0x01DB68F0, "_ZN14CHalfLifeRules11DeathNoticeEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeRules::DeathNotice_) }, // PURE + { 0x01DB6900, "_ZN14CHalfLifeRules15PlayerGotWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotWeapon_) }, // PURE + { 0x01DB6A70, "_ZN14CHalfLifeRules19WeaponShouldRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::WeaponShouldRespawn_) }, + { 0x01DB6910, "_ZN14CHalfLifeRules19FlWeaponRespawnTimeEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FlWeaponRespawnTime_) }, + { 0x01DB6920, "_ZN14CHalfLifeRules18FlWeaponTryRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::FlWeaponTryRespawn_) }, + { 0x01DB6930, "_ZN14CHalfLifeRules20VecWeaponRespawnSpotEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeRules::VecWeaponRespawnSpot_) }, + { 0x01DB6A80, "_ZN14CHalfLifeRules11CanHaveItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeRules::CanHaveItem_) }, + { 0x01DB6A90, "_ZN14CHalfLifeRules13PlayerGotItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotItem_) }, // PURE + { 0x01DB6AA0, "_ZN14CHalfLifeRules17ItemShouldRespawnEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::ItemShouldRespawn_) }, + { 0x01DB6AB0, "_ZN14CHalfLifeRules17FlItemRespawnTimeEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::FlItemRespawnTime_) }, + { 0x01DB6AC0, "_ZN14CHalfLifeRules18VecItemRespawnSpotEP5CItem", mfunc_ptr_cast(&CHalfLifeRules::VecItemRespawnSpot_) }, + { 0x01DB6B00, "_ZN14CHalfLifeRules13PlayerGotAmmoEP11CBasePlayerPci", mfunc_ptr_cast(&CHalfLifeRules::PlayerGotAmmo_) }, // PURE + { 0x01DB6B10, "_ZN14CHalfLifeRules17AmmoShouldRespawnEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::AmmoShouldRespawn_) }, + { 0x01DB6B20, "_ZN14CHalfLifeRules17FlAmmoRespawnTimeEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::FlAmmoRespawnTime_) }, + { 0x01DB6B30, "_ZN14CHalfLifeRules18VecAmmoRespawnSpotEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeRules::VecAmmoRespawnSpot_) }, + { 0x01DB6B60, "_ZN14CHalfLifeRules27FlHealthChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeRules::FlHealthChargerRechargeTime_) }, + { 0x01DB6B70, "_ZN14CHalfLifeRules17DeadPlayerWeaponsEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::DeadPlayerWeapons_) }, + { 0x01DB6B80, "_ZN14CHalfLifeRules14DeadPlayerAmmoEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeRules::DeadPlayerAmmo_) }, + { 0x01DB6BC0, "_ZN14CHalfLifeRules9GetTeamIDEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::GetTeamID_) }, + { 0x01DB6B90, "_ZN14CHalfLifeRules18PlayerRelationshipEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeRules::PlayerRelationship_) }, + { 0x01DB6BA0, "_ZN14CHalfLifeRules14FAllowMonstersEv", mfunc_ptr_cast(&CHalfLifeRules::FAllowMonsters_) }, #endif // Singleplay_GameRules_Region @@ -2488,116 +2530,121 @@ FunctionHook g_FunctionHooks[] = //virtual func //{ 0x01D8B8A0, "_ZN18CHalfLifeMultiplayC2Ev", mfunc_ptr_cast(&CHalfLifeMultiplay::CHalfLifeMultiplay) }, // constuctor { 0x01D8BF00, "_ZN18CHalfLifeMultiplay16RefreshSkillDataEv", mfunc_ptr_cast(&CHalfLifeMultiplay::RefreshSkillData_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay5ThinkEv", mfunc_ptr_cast(&CHalfLifeMultiplay::Think_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16IsAllowedToSpawnEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::IsAllowedToSpawn_) }, + { 0x01D8F420, "_ZN18CHalfLifeMultiplay5ThinkEv", mfunc_ptr_cast(&CHalfLifeMultiplay::Think_) }, + { 0x01D921D0, "_ZN18CHalfLifeMultiplay16IsAllowedToSpawnEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::IsAllowedToSpawn_) }, { 0x01D92410, "_ZN18CHalfLifeMultiplay16FAllowFlashlightEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FAllowFlashlight_) }, { 0x01D909E0, "_ZN18CHalfLifeMultiplay19FShouldSwitchWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FShouldSwitchWeapon_) }, { 0x01D90A70, "_ZN18CHalfLifeMultiplay17GetNextBestWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::GetNextBestWeapon_) }, { 0x01D909B0, "_ZN18CHalfLifeMultiplay13IsMultiplayerEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsMultiplayer_) }, { 0x01D909C0, "_ZN18CHalfLifeMultiplay12IsDeathmatchEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsDeathmatch_) }, { 0x01D909D0, "_ZN18CHalfLifeMultiplay6IsCoOpEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsCoOp_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay15ClientConnectedEP7edict_sPKcS3_Pc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientConnected_) }, - //{ 0x01D90BC0, "_ZN18CHalfLifeMultiplay7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::InitHUD_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18ClientDisconnectedEP7edict_s", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientDisconnected_) }, - //{ 0x01D90B80, "_ZN18CHalfLifeMultiplay14UpdateGameModeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::UpdateGameMode_) }, + { 0x01D90B60, "_ZN18CHalfLifeMultiplay15ClientConnectedEP7edict_sPKcS3_Pc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientConnected_) }, + { 0x01D90BC0, "_ZN18CHalfLifeMultiplay7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::InitHUD_) }, + { 0x01D910E0, "_ZN18CHalfLifeMultiplay18ClientDisconnectedEP7edict_s", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientDisconnected_) }, + { 0x01D90B80, "_ZN18CHalfLifeMultiplay14UpdateGameModeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::UpdateGameMode_) }, { 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_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FPlayerCanRespawn_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay17FlPlayerSpawnTimeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FlPlayerSpawnTime_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::GetPlayerSpawnSpot_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay24AllowAutoTargetCrosshairEv", mfunc_ptr_cast(&CHalfLifeMultiplay::AllowAutoTargetCrosshair_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay25ClientCommand_DeadOrAliveEP11CBasePlayerPKc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientCommand_DeadOrAlive_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientCommand_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay21ClientUserInfoChangedEP11CBasePlayerPc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientUserInfoChanged_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay14IPointsForKillEP11CBasePlayerS1_", mfunc_ptr_cast(&CHalfLifeMultiplay::IPointsForKill_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerKilled_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay11DeathNoticeEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeMultiplay::DeathNotice_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay17CanHavePlayerItemEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::CanHavePlayerItem_) }, - //{ 0x01D92060, "_ZN18CHalfLifeMultiplay15PlayerGotWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerGotWeapon_) }, // NOXREF + { 0x01D91390, "_ZN18CHalfLifeMultiplay20FPlayerCanTakeDamageEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::FPlayerCanTakeDamage_) }, + { 0x01D91560, "_ZN18CHalfLifeMultiplay11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerSpawn_) }, + { 0x01D913E0, "_ZN18CHalfLifeMultiplay11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerThink_) }, + { 0x01D915F0, "_ZN18CHalfLifeMultiplay17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FPlayerCanRespawn_) }, + { 0x01D916C0, "_ZN18CHalfLifeMultiplay17FlPlayerSpawnTimeEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::FlPlayerSpawnTime_) }, + { 0x01D92280, "_ZN18CHalfLifeMultiplay18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::GetPlayerSpawnSpot_) }, + { 0x01D916D0, "_ZN18CHalfLifeMultiplay24AllowAutoTargetCrosshairEv", mfunc_ptr_cast(&CHalfLifeMultiplay::AllowAutoTargetCrosshair_) }, + { 0x01D90B30, "_ZN18CHalfLifeMultiplay25ClientCommand_DeadOrAliveEP11CBasePlayerPKc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientCommand_DeadOrAlive_) }, + { 0x01D90B50, "_ZN18CHalfLifeMultiplay13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientCommand_) }, + { 0x01D93660, "_ZN18CHalfLifeMultiplay21ClientUserInfoChangedEP11CBasePlayerPc", mfunc_ptr_cast(&CHalfLifeMultiplay::ClientUserInfoChanged_) }, + { 0x01D916E0, "_ZN18CHalfLifeMultiplay14IPointsForKillEP11CBasePlayerS1_", mfunc_ptr_cast(&CHalfLifeMultiplay::IPointsForKill_) }, + { 0x01D916F0, "_ZN18CHalfLifeMultiplay12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerKilled_) }, + { 0x01D91BE0, "_ZN18CHalfLifeMultiplay11DeathNoticeEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeMultiplay::DeathNotice_) }, + { 0x01D92130, "_ZN18CHalfLifeMultiplay17CanHavePlayerItemEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::CanHavePlayerItem_) }, + //{ 0x01D92060, "_ZN18CHalfLifeMultiplay15PlayerGotWeaponEP11CBasePlayerP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerGotWeapon_) }, // PURE { 0x01D92110, "_ZN18CHalfLifeMultiplay19WeaponShouldRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::WeaponShouldRespawn_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay19FlWeaponRespawnTimeEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FlWeaponRespawnTime_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18FlWeaponTryRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FlWeaponTryRespawn_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay20VecWeaponRespawnSpotEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::VecWeaponRespawnSpot_) }, + { 0x01D92070, "_ZN18CHalfLifeMultiplay19FlWeaponRespawnTimeEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FlWeaponRespawnTime_) }, + { 0x01D92080, "_ZN18CHalfLifeMultiplay18FlWeaponTryRespawnEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FlWeaponTryRespawn_) }, + { 0x01D920E0, "_ZN18CHalfLifeMultiplay20VecWeaponRespawnSpotEP15CBasePlayerItem", mfunc_ptr_cast(&CHalfLifeMultiplay::VecWeaponRespawnSpot_) }, { 0x01D92140, "_ZN18CHalfLifeMultiplay11CanHaveItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeMultiplay::CanHaveItem_) }, { 0x01D92150, "_ZN18CHalfLifeMultiplay13PlayerGotItemEP11CBasePlayerP5CItem", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerGotItem_) }, // PURE { 0x01D92160, "_ZN18CHalfLifeMultiplay17ItemShouldRespawnEP5CItem", mfunc_ptr_cast(&CHalfLifeMultiplay::ItemShouldRespawn_) }, { 0x01D92180, "_ZN18CHalfLifeMultiplay17FlItemRespawnTimeEP5CItem", mfunc_ptr_cast(&CHalfLifeMultiplay::FlItemRespawnTime_) }, { 0x01D92190, "_ZN18CHalfLifeMultiplay18VecItemRespawnSpotEP5CItem", mfunc_ptr_cast(&CHalfLifeMultiplay::VecItemRespawnSpot_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay13PlayerGotAmmoEP11CBasePlayerPci", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerGotAmmo_) }, + { 0x01D921C0, "_ZN18CHalfLifeMultiplay13PlayerGotAmmoEP11CBasePlayerPci", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerGotAmmo_) }, { 0x01D921E0, "_ZN18CHalfLifeMultiplay17AmmoShouldRespawnEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeMultiplay::AmmoShouldRespawn_) }, { 0x01D92200, "_ZN18CHalfLifeMultiplay17FlAmmoRespawnTimeEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeMultiplay::FlAmmoRespawnTime_) }, { 0x01D92210, "_ZN18CHalfLifeMultiplay18VecAmmoRespawnSpotEP15CBasePlayerAmmo", mfunc_ptr_cast(&CHalfLifeMultiplay::VecAmmoRespawnSpot_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay27FlHealthChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FlHealthChargerRechargeTime_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay24FlHEVChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FlHEVChargerRechargeTime_) }, + { 0x01D92240, "_ZN18CHalfLifeMultiplay27FlHealthChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FlHealthChargerRechargeTime_) }, + { 0x01D92250, "_ZN18CHalfLifeMultiplay24FlHEVChargerRechargeTimeEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FlHEVChargerRechargeTime_) }, { 0x01D92260, "_ZN18CHalfLifeMultiplay17DeadPlayerWeaponsEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::DeadPlayerWeapons_) }, { 0x01D92270, "_ZN18CHalfLifeMultiplay14DeadPlayerAmmoEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::DeadPlayerAmmo_) }, - ////{ 0x0, "_ZN18CHalfLifeMultiplay9GetTeamIDEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::GetTeamID_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18PlayerRelationshipEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerRelationship_) }, - ////{ 0x0, "_ZN18CHalfLifeMultiplay17PlayTextureSoundsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayTextureSounds_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay14FAllowMonstersEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FAllowMonsters_) }, - ////{ 0x0, "_ZN18CHalfLifeMultiplay18EndMultiplayerGameEv", mfunc_ptr_cast(&CHalfLifeMultiplay::EndMultiplayerGame_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16ServerDeactivateEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ServerDeactivate_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18CheckMapConditionsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CheckMapConditions_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay10CleanUpMapEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CleanUpMap_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay12RestartRoundEv", mfunc_ptr_cast(&CHalfLifeMultiplay::RestartRound_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay18CheckWinConditionsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CheckWinConditions_) }, + { 0x01D8EDD0, "_ZN18CHalfLifeMultiplay9GetTeamIDEP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::GetTeamID_) }, + { 0x01D922D0, "_ZN18CHalfLifeMultiplay18PlayerRelationshipEP11CBasePlayerP11CBaseEntity", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerRelationship_) }, + { 0x01D8EDE0, "_ZN18CHalfLifeMultiplay17PlayTextureSoundsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayTextureSounds_) }, + { 0x01D92450, "_ZN18CHalfLifeMultiplay14FAllowMonstersEv", mfunc_ptr_cast(&CHalfLifeMultiplay::FAllowMonsters_) }, + { 0x01D8EE20, "_ZN18CHalfLifeMultiplay18EndMultiplayerGameEv", mfunc_ptr_cast(&CHalfLifeMultiplay::EndMultiplayerGame_) }, + { 0x01D8B4B0, "_ZN18CHalfLifeMultiplay16ServerDeactivateEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ServerDeactivate_) }, + { 0x01D8DFD0, "_ZN18CHalfLifeMultiplay18CheckMapConditionsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CheckMapConditions_) }, + { 0x01D8C050, "_ZN18CHalfLifeMultiplay10CleanUpMapEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CleanUpMap_) }, + { 0x01D8E0A0, "_ZN18CHalfLifeMultiplay12RestartRoundEv", mfunc_ptr_cast(&CHalfLifeMultiplay::RestartRound_) }, + { 0x01D8CAF0, "_ZN18CHalfLifeMultiplay18CheckWinConditionsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CheckWinConditions_) }, { 0x01D8BF60, "_ZN18CHalfLifeMultiplay10RemoveGunsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::RemoveGuns_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay6GiveC4Ev", mfunc_ptr_cast(&CHalfLifeMultiplay::GiveC4_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay11ChangeLevelEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ChangeLevel_) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16GoToIntermissionEv", mfunc_ptr_cast(&CHalfLifeMultiplay::GoToIntermission_) }, + { 0x01D8C340, "_ZN18CHalfLifeMultiplay6GiveC4Ev", mfunc_ptr_cast(&CHalfLifeMultiplay::GiveC4_) }, + { 0x01D93270, "_ZN18CHalfLifeMultiplay11ChangeLevelEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ChangeLevel_) }, + { 0x01D92480, "_ZN18CHalfLifeMultiplay16GoToIntermissionEv", mfunc_ptr_cast(&CHalfLifeMultiplay::GoToIntermission_) }, //non-virtual func { 0x01D8B4A0, "_ZN18CHalfLifeMultiplay8IsCareerEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsCareer) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay23QueueCareerRoundEndMenuEfi", mfunc_ptr_cast(&CHalfLifeMultiplay::QueueCareerRoundEndMenu) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay19SetCareerMatchLimitEii", mfunc_ptr_cast(&CHalfLifeMultiplay::SetCareerMatchLimit) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay15IsInCareerRoundEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsInCareerRound) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay13CareerRestartEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CareerRestart) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16PlayerJoinedTeamEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerJoinedTeam) }, + { 0x01D8C800, "_ZN18CHalfLifeMultiplay23QueueCareerRoundEndMenuEfi", mfunc_ptr_cast(&CHalfLifeMultiplay::QueueCareerRoundEndMenu) }, + //{ 0x01D8B470, "_ZN18CHalfLifeMultiplay19SetCareerMatchLimitEii", mfunc_ptr_cast(&CHalfLifeMultiplay::SetCareerMatchLimit) }, // NOXREF + //{ 0x01D8B310, "_ZN18CHalfLifeMultiplay15IsInCareerRoundEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsInCareerRound) }, // NOXREF + //{ 0x01D908F0, "_ZN18CHalfLifeMultiplay13CareerRestartEv", mfunc_ptr_cast(&CHalfLifeMultiplay::CareerRestart) }, // NOXREF + //{ 0x0, "_ZN18CHalfLifeMultiplay16PlayerJoinedTeamEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::PlayerJoinedTeam) }, // NOXREF { 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) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay13StackVIPQueueEv", mfunc_ptr_cast(&CHalfLifeMultiplay::StackVIPQueue) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay15ResetCurrentVIPEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ResetCurrentVIP) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay12BalanceTeamsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::BalanceTeams) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay14SwapAllPlayersEv", mfunc_ptr_cast(&CHalfLifeMultiplay::SwapAllPlayers) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16UpdateTeamScoresEv", mfunc_ptr_cast(&CHalfLifeMultiplay::UpdateTeamScores) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay11DisplayMapsEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::DisplayMaps) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay16ResetAllMapVotesEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ResetAllMapVotes) }, - //{ 0x0, "_ZN18CHalfLifeMultiplay14ProcessMapVoteEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::ProcessMapVote) }, + { 0x01D8EE30, "_ZN18CHalfLifeMultiplay15IsVIPQueueEmptyEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsVIPQueueEmpty) }, + { 0x01D8EEA0, "_ZN18CHalfLifeMultiplay13AddToVIPQueueEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeMultiplay::AddToVIPQueue) }, + { 0x01D8F0D0, "_ZN18CHalfLifeMultiplay11PickNextVIPEv", mfunc_ptr_cast(&CHalfLifeMultiplay::PickNextVIP) }, + //{ 0x01D90790, "_ZN18CHalfLifeMultiplay19HasRoundTimeExpiredEv", mfunc_ptr_cast(&CHalfLifeMultiplay::HasRoundTimeExpired) }, // NOXREF + //{ 0x01D90820, "_ZN18CHalfLifeMultiplay13IsBombPlantedEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsBombPlanted) }, // NOXREF + //{ 0x01D90860, "_ZN18CHalfLifeMultiplay51MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRoundEi", mfunc_ptr_cast(&CHalfLifeMultiplay::MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound) }, // NOXREF + { 0x01D8EDF0, "_ZN18CHalfLifeMultiplay13StackVIPQueueEv", mfunc_ptr_cast(&CHalfLifeMultiplay::StackVIPQueue) }, + { 0x01D8EFA0, "_ZN18CHalfLifeMultiplay15ResetCurrentVIPEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ResetCurrentVIP) }, + { 0x01D8DDB0, "_ZN18CHalfLifeMultiplay12BalanceTeamsEv", mfunc_ptr_cast(&CHalfLifeMultiplay::BalanceTeams) }, + //{ 0x01D8DC40, "_ZN18CHalfLifeMultiplay14SwapAllPlayersEv", mfunc_ptr_cast(&CHalfLifeMultiplay::SwapAllPlayers) }, // NOXREF + //{ 0x01D8BFE0, "_ZN18CHalfLifeMultiplay16UpdateTeamScoresEv", mfunc_ptr_cast(&CHalfLifeMultiplay::UpdateTeamScores) }, // NOXREF + { 0x01D92DB0, "_ZN18CHalfLifeMultiplay11DisplayMapsEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::DisplayMaps) }, + //{ 0x01D92BF0, "_ZN18CHalfLifeMultiplay16ResetAllMapVotesEv", mfunc_ptr_cast(&CHalfLifeMultiplay::ResetAllMapVotes) }, // NOXREF + { 0x01D93080, "_ZN18CHalfLifeMultiplay14ProcessMapVoteEP11CBasePlayeri", mfunc_ptr_cast(&CHalfLifeMultiplay::ProcessMapVote) }, { 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) }, + //{ 0x0, "_ZN18CHalfLifeMultiplay14IsMatchStartedEv", mfunc_ptr_cast(&CHalfLifeMultiplay::IsMatchStarted) }, // NOXREF + { 0x01D93530, "_ZN18CHalfLifeMultiplay16SendMOTDToClientEP7edict_s", mfunc_ptr_cast(&CHalfLifeMultiplay::SendMOTDToClient) }, //non class func //{ 0x0, "", (size_t)&IsBotSpeaking }, // NOXREF - //{ 0x0, "_Z13SV_Continue_fv", (size_t)&SV_Continue_f }, - //{ 0x0, "_Z17SV_Tutor_Toggle_fv", (size_t)&SV_Tutor_Toggle_f }, - //{ 0x0, "_Z19SV_Career_Restart_fv", (size_t)&SV_Career_Restart_f }, - //{ 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 }, + { 0x01D8B010, "_Z13SV_Continue_fv", (size_t)&SV_Continue_f }, + { 0x01D8B0C0, "_Z17SV_Tutor_Toggle_fv", (size_t)&SV_Tutor_Toggle_f }, + { 0x01D8B110, "_Z19SV_Career_Restart_fv", (size_t)&SV_Career_Restart_f }, + { 0x01D8B1F0, "_Z20SV_Career_EndRound_fv", (size_t)&SV_Career_EndRound_f }, + { 0x01D8B350, "_Z18SV_CareerAddTask_fv", (size_t)&SV_CareerAddTask_f }, + { 0x01D8B400, "_Z21SV_CareerMatchLimit_fv", (size_t)&SV_CareerMatchLimit_f }, { 0x01D8B6E0, "_Z9BroadcastPKc", (size_t)&Broadcast }, { 0x01D8B780, "_Z7GetTeami", (size_t)&GetTeam }, - //{ 0x0, "_Z15EndRoundMessagePKci", (size_t)&EndRoundMessage }, - //{ 0x01D8BD80, "_ZL18ReadMultiplayCvarsP18CHalfLifeMultiplay", (size_t)&ReadMultiplayCvars }, - //{ 0x0, "_Z15DestroyMapCycleP10mapcycle_s", (size_t)&DestroyMapCycle }, + { 0x01D8B7B0, "_Z15EndRoundMessagePKci", (size_t)&EndRoundMessage }, + { 0x01D8BD80, "_ZL18ReadMultiplayCvarsP18CHalfLifeMultiplay", (size_t)&ReadMultiplayCvars }, + //{ 0x01D92670, "_Z15DestroyMapCycleP10mapcycle_s", (size_t)&DestroyMapCycle }, // NOXREF { 0x01D926B0, "_Z15MP_COM_GetTokenv", (size_t)&MP_COM_GetToken }, { 0x01D926C0, "_Z12MP_COM_ParsePc", (size_t)&MP_COM_Parse }, //{ 0x01D927A0, "_Z19MP_COM_TokenWaitingPc", (size_t)&MP_COM_TokenWaiting }, // NOXREF - //{ 0x0, "_Z18ReloadMapCycleFilePcP10mapcycle_s", (size_t)&ReloadMapCycleFile }, - //{ 0x0, "_Z12CountPlayersv", (size_t)&CountPlayers }, - //{ 0x0, "_Z20ExtractCommandStringPcS_", (size_t)&ExtractCommandString }, - //{ 0x0, "_Z11GetMapCountv", (size_t)&GetMapCount }, + { 0x01D927F0, "_Z18ReloadMapCycleFilePcP10mapcycle_s", (size_t)&ReloadMapCycleFile }, + //{ 0x01D92AB0, "_Z12CountPlayersv", (size_t)&CountPlayers }, // NOXREF + { 0x01D92AF0, "_Z20ExtractCommandStringPcS_", (size_t)&ExtractCommandString }, + { 0x01D92D10, "_Z11GetMapCountv", (size_t)&GetMapCount }, //CCStrikeGameMgrHelper //virtual func { 0x01D8B630, "_ZN21CCStrikeGameMgrHelper19CanPlayerHearPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CCStrikeGameMgrHelper::CanPlayerHearPlayer_) }, //CMapInfo //virtual func - //{ 0x0, "_ZN21CCStrikeGameMgrHelper19CanPlayerHearPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CMapInfo::Spawn_) }, - //{ 0x0, "_ZN21CCStrikeGameMgrHelper19CanPlayerHearPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CMapInfo::KeyValue_) }, + { 0x01D8B5E0, "_ZN21CCStrikeGameMgrHelper19CanPlayerHearPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CMapInfo::Spawn_) }, + { 0x01D8B540, "_ZN21CCStrikeGameMgrHelper19CanPlayerHearPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CMapInfo::KeyValue_) }, +// linked objects + { 0x01D8B4F0, "info_map_parameters", (size_t)&info_map_parameters }, #endif // Multiplay_GameRules_Region @@ -2605,35 +2652,40 @@ FunctionHook g_FunctionHooks[] = //CHalfLifeTraining //virtual func - //{ 0x0, "_ZN17CHalfLifeTraining13IsMultiplayerEv", mfunc_ptr_cast(&CHalfLifeTraining::IsMultiplayer) }, - //{ 0x0, "_ZN17CHalfLifeTraining12IsDeathmatchEv", mfunc_ptr_cast(&CHalfLifeTraining::IsDeathmatch) }, - //{ 0x01DBBEA0, "_ZN17CHalfLifeTraining7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::InitHUD) }, // NOXREF - { 0x01DBC3E0, "_ZN17CHalfLifeTraining11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerSpawn) }, - //{ 0x0, "_ZN17CHalfLifeTraining11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerThink) }, - //{ 0x0, "_ZN17CHalfLifeTraining17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::FPlayerCanRespawn) }, + //{ 0x01DBBE50, "_ZN17CHalfLifeTrainingC2Ev", mfunc_ptr_cast(&CHalfLifeTraining::CHalfLifeTraining) } + { 0x01DBBE70, "_ZN17CHalfLifeTraining13IsMultiplayerEv", mfunc_ptr_cast(&CHalfLifeTraining::IsMultiplayer_) }, + { 0x01DBBE90, "_ZN17CHalfLifeTraining12IsDeathmatchEv", mfunc_ptr_cast(&CHalfLifeTraining::IsDeathmatch_) }, + { 0x01DBBEA0, "_ZN17CHalfLifeTraining7InitHUDEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::InitHUD_) }, // PURE + { 0x01DBC3E0, "_ZN17CHalfLifeTraining11PlayerSpawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerSpawn_) }, + { 0x01DBC010, "_ZN17CHalfLifeTraining11PlayerThinkEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerThink_) }, + { 0x01DBC4C0, "_ZN17CHalfLifeTraining17FPlayerCanRespawnEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::FPlayerCanRespawn_) }, { 0x01DBBEE0, "_ZN17CHalfLifeTraining18GetPlayerSpawnSpotEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::GetPlayerSpawnSpot_) }, - //{ 0x0, "_ZN17CHalfLifeTraining12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeTraining::PlayerKilled) }, - //{ 0x0, "_ZN17CHalfLifeTraining17ItemShouldRespawnEP5CItem", mfunc_ptr_cast(&CHalfLifeTraining::ItemShouldRespawn) }, - //{ 0x0, "_ZN17CHalfLifeTraining18CheckMapConditionsEv", mfunc_ptr_cast(&CHalfLifeTraining::CheckMapConditions) }, - //{ 0x0, "_ZN17CHalfLifeTraining18CheckWinConditionsEv", mfunc_ptr_cast(&CHalfLifeTraining::CheckWinConditions) }, + { 0x01DBC4E0, "_ZN17CHalfLifeTraining12PlayerKilledEP11CBasePlayerP9entvars_sS3_", mfunc_ptr_cast(&CHalfLifeTraining::PlayerKilled_) }, + { 0x01DBC4B0, "_ZN17CHalfLifeTraining17ItemShouldRespawnEP5CItem", mfunc_ptr_cast(&CHalfLifeTraining::ItemShouldRespawn_) }, + //{ 0x01DBBE80, "_ZN17CHalfLifeTraining18CheckMapConditionsEv", mfunc_ptr_cast(&CHalfLifeTraining::CheckMapConditions_) }, // PURE + { 0x01DBC510, "_ZN17CHalfLifeTraining18CheckWinConditionsEv", mfunc_ptr_cast(&CHalfLifeTraining::CheckWinConditions_) }, //non-virtual func { 0x01DBBEB0, "_ZN17CHalfLifeTraining11HostageDiedEv", mfunc_ptr_cast(&CHalfLifeTraining::HostageDied) }, { 0x01DBC4D0, "_ZN17CHalfLifeTraining12PlayerCanBuyEP11CBasePlayer", mfunc_ptr_cast(&CHalfLifeTraining::PlayerCanBuy) }, //CBaseGrenCatch //virtual func - //{ 0x0, "_ZN14CBaseGrenCatch5SpawnEv", mfunc_ptr_cast(&CBaseGrenCatch::Spawn) }, - //{ 0x0, "_ZN14CBaseGrenCatch8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseGrenCatch::KeyValue) }, - //{ 0x0, "_ZN14CBaseGrenCatch4SaveER5CSave", mfunc_ptr_cast(&CBaseGrenCatch::Save) }, - //{ 0x0, "_ZN14CBaseGrenCatch7RestoreER8CRestore", mfunc_ptr_cast(&CBaseGrenCatch::Restore) }, - //{ 0x0, "_ZN14CBaseGrenCatch10ObjectCapsEv", mfunc_ptr_cast(&CBaseGrenCatch::ObjectCaps) }, - //{ 0x0, "_ZN14CBaseGrenCatch5ThinkEv", mfunc_ptr_cast(&CBaseGrenCatch::Think) }, - //{ 0x0, "_ZN14CBaseGrenCatch5TouchEP11CBaseEntity", mfunc_ptr_cast(&CBaseGrenCatch::Touch) }, + { 0x01DBC8B0, "_ZN14CBaseGrenCatch5SpawnEv", mfunc_ptr_cast(&CBaseGrenCatch::Spawn_) }, + { 0x01DBCC00, "_ZN14CBaseGrenCatch8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CBaseGrenCatch::KeyValue_) }, + { 0x01DBC7F0, "_ZN14CBaseGrenCatch4SaveER5CSave", mfunc_ptr_cast(&CBaseGrenCatch::Save_) }, + { 0x01DBC820, "_ZN14CBaseGrenCatch7RestoreER8CRestore", mfunc_ptr_cast(&CBaseGrenCatch::Restore_) }, + { 0x01DBC8A0, "_ZN14CBaseGrenCatch10ObjectCapsEv", mfunc_ptr_cast(&CBaseGrenCatch::ObjectCaps_) }, + { 0x01DBC970, "_ZN14CBaseGrenCatch5ThinkEv", mfunc_ptr_cast(&CBaseGrenCatch::Think_) }, + { 0x01DBC930, "_ZN14CBaseGrenCatch5TouchEP11CBaseEntity", mfunc_ptr_cast(&CBaseGrenCatch::Touch_) }, //CFuncWeaponCheck - //{ 0x0, "_ZN16CFuncWeaponCheck5SpawnEv", mfunc_ptr_cast(&CFuncWeaponCheck::Spawn) }, - //{ 0x0, "_ZN16CFuncWeaponCheck8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFuncWeaponCheck::KeyValue) }, - //{ 0x0, "_ZN16CFuncWeaponCheck4SaveER5CSave", mfunc_ptr_cast(&CFuncWeaponCheck::Save) }, - //{ 0x0, "_ZN16CFuncWeaponCheck7RestoreER8CRestore", mfunc_ptr_cast(&CFuncWeaponCheck::Restore) }, - //{ 0x0, "_ZN16CFuncWeaponCheck5TouchEP11CBaseEntity", mfunc_ptr_cast(&CFuncWeaponCheck::Touch) }, + //virtual func + { 0x01DBCCE0, "_ZN16CFuncWeaponCheck5SpawnEv", mfunc_ptr_cast(&CFuncWeaponCheck::Spawn_) }, + { 0x01DBCF70, "_ZN16CFuncWeaponCheck8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CFuncWeaponCheck::KeyValue_) }, + { 0x01DBCD50, "_ZN16CFuncWeaponCheck4SaveER5CSave", mfunc_ptr_cast(&CFuncWeaponCheck::Save_) }, + { 0x01DBCD80, "_ZN16CFuncWeaponCheck7RestoreER8CRestore", mfunc_ptr_cast(&CFuncWeaponCheck::Restore_) }, + { 0x01DBCE00, "_ZN16CFuncWeaponCheck5TouchEP11CBaseEntity", mfunc_ptr_cast(&CFuncWeaponCheck::Touch_) }, +// linked objects + { 0x01DBC850, "func_grencatch", (size_t)&func_grencatch }, + { 0x01DBCDB0, "func_weaponcheck", (size_t)&func_weaponcheck }, #endif // Training_Gamerules_Region @@ -2726,10 +2778,8 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN15CBasePlayerItem14UpdateItemInfoEv", mfunc_ptr_cast(&CBasePlayerItem::UpdateItemInfo) }, // NOXREF //{ 0x0, "_ZN15CBasePlayerItem12ItemPreFrameEv", mfunc_ptr_cast(&CBasePlayerItem::ItemPreFrame) }, //{ 0x0, "_ZN15CBasePlayerItem13ItemPostFrameEv", mfunc_ptr_cast(&CBasePlayerItem::ItemPostFrame) }, - { 0x01DCECB0, "_ZN15CBasePlayerItem4DropEv", mfunc_ptr_cast(&CBasePlayerItem::Drop_) }, { 0x01DCECE0, "_ZN15CBasePlayerItem4KillEv", mfunc_ptr_cast(&CBasePlayerItem::Kill_) }, - { 0x01DCED40, "_ZN15CBasePlayerItem14AttachToPlayerEP11CBasePlayer", mfunc_ptr_cast(&CBasePlayerItem::AttachToPlayer_) }, //{ 0x0, "_ZN15CBasePlayerItem16PrimaryAmmoIndexEv", mfunc_ptr_cast(&CBasePlayerItem::PrimaryAmmoIndex) }, //{ 0x0, "_ZN15CBasePlayerItem18SecondaryAmmoIndexEv", mfunc_ptr_cast(&CBasePlayerItem::SecondaryAmmoIndex) }, @@ -2809,56 +2859,76 @@ FunctionHook g_FunctionHooks[] = { 0x01DCF6C0, "_ZN15CBasePlayerAmmo11MaterializeEv", mfunc_ptr_cast(&CBasePlayerAmmo::Materialize) }, { 0x01DCF730, "_ZN15CBasePlayerAmmo12DefaultTouchEP11CBaseEntity", mfunc_ptr_cast(&CBasePlayerAmmo::DefaultTouch) }, //C9MMAmmo - //{ 0x0, "_ZN8C9MMAmmo5SpawnEv", mfunc_ptr_cast(&C9MMAmmo::Spawn_) }, - //{ 0x0, "_ZN8C9MMAmmo8PrecacheEv", mfunc_ptr_cast(&C9MMAmmo::Precache_) }, - //{ 0x0, "_ZN8C9MMAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C9MMAmmo::AddAmmo_) }, + { 0x01D59550, "_ZN8C9MMAmmo5SpawnEv", mfunc_ptr_cast(&C9MMAmmo::Spawn_) }, + { 0x01D59580, "_ZN8C9MMAmmo8PrecacheEv", mfunc_ptr_cast(&C9MMAmmo::Precache_) }, + { 0x01D595A0, "_ZN8C9MMAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C9MMAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D59500, "ammo_9mm", (size_t)&ammo_9mm }, //CBuckShotAmmo - //{ 0x0, "_ZN13CBuckShotAmmo5SpawnEv", mfunc_ptr_cast(&CBuckShotAmmo::Spawn_) }, - //{ 0x0, "_ZN13CBuckShotAmmo8PrecacheEv", mfunc_ptr_cast(&CBuckShotAmmo::Precache_) }, - //{ 0x0, "_ZN13CBuckShotAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&CBuckShotAmmo::AddAmmo_) }, + { 0x01D59640, "_ZN13CBuckShotAmmo5SpawnEv", mfunc_ptr_cast(&CBuckShotAmmo::Spawn_) }, + { 0x01D59670, "_ZN13CBuckShotAmmo8PrecacheEv", mfunc_ptr_cast(&CBuckShotAmmo::Precache_) }, + { 0x01D59690, "_ZN13CBuckShotAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&CBuckShotAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D595F0, "ammo_buckshot", (size_t)&ammo_buckshot }, //C556NatoAmmo - //{ 0x0, "_ZN12C556NatoAmmo5SpawnEv", mfunc_ptr_cast(&C556NatoAmmo::Spawn_) }, - //{ 0x0, "_ZN12C556NatoAmmo8PrecacheEv", mfunc_ptr_cast(&C556NatoAmmo::Precache_) }, - //{ 0x0, "_ZN12C556NatoAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C556NatoAmmo::AddAmmo_) }, + { 0x01D59730, "_ZN12C556NatoAmmo5SpawnEv", mfunc_ptr_cast(&C556NatoAmmo::Spawn_) }, + { 0x01D59760, "_ZN12C556NatoAmmo8PrecacheEv", mfunc_ptr_cast(&C556NatoAmmo::Precache_) }, + { 0x01D59780, "_ZN12C556NatoAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C556NatoAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D596E0, "ammo_556nato", (size_t)&ammo_556nato }, //C556NatoBoxAmmo - //{ 0x0, "_ZN15C556NatoBoxAmmo5SpawnEv", mfunc_ptr_cast(&C556NatoBoxAmmo::Spawn_) }, - //{ 0x0, "_ZN15C556NatoBoxAmmo8PrecacheEv", mfunc_ptr_cast(&C556NatoBoxAmmo::Precache_) }, - //{ 0x0, "_ZN15C556NatoBoxAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C556NatoBoxAmmo::AddAmmo_) }, + { 0x01D59820, "_ZN15C556NatoBoxAmmo5SpawnEv", mfunc_ptr_cast(&C556NatoBoxAmmo::Spawn_) }, + { 0x01D59850, "_ZN15C556NatoBoxAmmo8PrecacheEv", mfunc_ptr_cast(&C556NatoBoxAmmo::Precache_) }, + { 0x01D59870, "_ZN15C556NatoBoxAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C556NatoBoxAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D597D0, "ammo_556natobox", (size_t)&ammo_556natobox }, //C762NatoAmmo - //{ 0x0, "_ZN12C762NatoAmmo5SpawnEv", mfunc_ptr_cast(&C762NatoAmmo::Spawn_) }, - //{ 0x0, "_ZN12C762NatoAmmo8PrecacheEv", mfunc_ptr_cast(&C762NatoAmmo::Precache_) }, - //{ 0x0, "_ZN12C762NatoAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C762NatoAmmo::AddAmmo_) }, + { 0x01D59920, "_ZN12C762NatoAmmo5SpawnEv", mfunc_ptr_cast(&C762NatoAmmo::Spawn_) }, + { 0x01D59950, "_ZN12C762NatoAmmo8PrecacheEv", mfunc_ptr_cast(&C762NatoAmmo::Precache_) }, + { 0x01D59970, "_ZN12C762NatoAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C762NatoAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D598D0, "ammo_762nato", (size_t)&ammo_762nato }, //C45ACPAmmo - //{ 0x0, "_ZN10C45ACPAmmo5SpawnEv", mfunc_ptr_cast(&C45ACPAmmo::Spawn_) }, - //{ 0x0, "_ZN10C45ACPAmmo8PrecacheEv", mfunc_ptr_cast(&C45ACPAmmo::Precache_) }, - //{ 0x0, "_ZN10C45ACPAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C45ACPAmmo::AddAmmo_) }, + { 0x01D59A10, "_ZN10C45ACPAmmo5SpawnEv", mfunc_ptr_cast(&C45ACPAmmo::Spawn_) }, + { 0x01D59A40, "_ZN10C45ACPAmmo8PrecacheEv", mfunc_ptr_cast(&C45ACPAmmo::Precache_) }, + { 0x01D59A60, "_ZN10C45ACPAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C45ACPAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D599C0, "ammo_45acp", (size_t)&ammo_45acp }, //C50AEAmmo - //{ 0x0, "_ZN9C50AEAmmo5SpawnEv", mfunc_ptr_cast(&C50AEAmmo::Spawn_) }, - //{ 0x0, "_ZN9C50AEAmmo8PrecacheEv", mfunc_ptr_cast(&C50AEAmmo::Precache_) }, - //{ 0x0, "_ZN9C50AEAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C50AEAmmo::AddAmmo_) }, + { 0x01D59B00, "_ZN9C50AEAmmo5SpawnEv", mfunc_ptr_cast(&C50AEAmmo::Spawn_) }, + { 0x01D59B30, "_ZN9C50AEAmmo8PrecacheEv", mfunc_ptr_cast(&C50AEAmmo::Precache_) }, + { 0x01D59B50, "_ZN9C50AEAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C50AEAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D59AB0, "ammo_50ae", (size_t)&ammo_50ae }, //C338MagnumAmmo - //{ 0x0, "_ZN14C338MagnumAmmo5SpawnEv", mfunc_ptr_cast(&C338MagnumAmmo::Spawn_) }, - //{ 0x0, "_ZN14C338MagnumAmmo8PrecacheEv", mfunc_ptr_cast(&C338MagnumAmmo::Precache_) }, - //{ 0x0, "_ZN14C338MagnumAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C338MagnumAmmo::AddAmmo_) }, + { 0x01D59BF0, "_ZN14C338MagnumAmmo5SpawnEv", mfunc_ptr_cast(&C338MagnumAmmo::Spawn_) }, + { 0x01D59C20, "_ZN14C338MagnumAmmo8PrecacheEv", mfunc_ptr_cast(&C338MagnumAmmo::Precache_) }, + { 0x01D59C40, "_ZN14C338MagnumAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C338MagnumAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D59BA0, "ammo_338magnum", (size_t)&ammo_338magnum }, //C57MMAmmo - //{ 0x0, "_ZN9C57MMAmmo5SpawnEv", mfunc_ptr_cast(&C57MMAmmo::Spawn_) }, - //{ 0x0, "_ZN9C57MMAmmo8PrecacheEv", mfunc_ptr_cast(&C57MMAmmo::Precache_) }, - //{ 0x0, "_ZN9C57MMAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C57MMAmmo::AddAmmo_) }, + { 0x01D59CE0, "_ZN9C57MMAmmo5SpawnEv", mfunc_ptr_cast(&C57MMAmmo::Spawn_) }, + { 0x01D59D10, "_ZN9C57MMAmmo8PrecacheEv", mfunc_ptr_cast(&C57MMAmmo::Precache_) }, + { 0x01D59D30, "_ZN9C57MMAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C57MMAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D59C90, "ammo_57mm", (size_t)&ammo_57mm }, //C357SIGAmmo - //{ 0x0, "_ZN11C357SIGAmmo5SpawnEv", mfunc_ptr_cast(&C357SIGAmmo::Spawn_) }, - //{ 0x0, "_ZN11C357SIGAmmo8PrecacheEv", mfunc_ptr_cast(&C357SIGAmmo::Precache_) }, - //{ 0x0, "_ZN11C357SIGAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C357SIGAmmo::AddAmmo_) }, + { 0x01D59DD0, "_ZN11C357SIGAmmo5SpawnEv", mfunc_ptr_cast(&C357SIGAmmo::Spawn_) }, + { 0x01D59E00, "_ZN11C357SIGAmmo8PrecacheEv", mfunc_ptr_cast(&C357SIGAmmo::Precache_) }, + { 0x01D59E20, "_ZN11C357SIGAmmo7AddAmmoEP11CBaseEntity", mfunc_ptr_cast(&C357SIGAmmo::AddAmmo_) }, + //non-virtual func + { 0x01D59D80, "ammo_357sig", (size_t)&ammo_357sig }, //CWeaponBox //virtual func - //{ 0x01DCFD80, "_ZN10CWeaponBox5SpawnEv", mfunc_ptr_cast(&CWeaponBox::Spawn) }, - //{ 0x01DCFA40, "_ZN10CWeaponBox8PrecacheEv", mfunc_ptr_cast(&CWeaponBox::Precache) }, - //{ 0x01DCFA50, "_ZN10CWeaponBox8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWeaponBox::KeyValue) }, - //{ 0x0, "_ZN10CWeaponBox4SaveER5CSave", mfunc_ptr_cast(&CWeaponBox::Save) }, - //{ 0x0, "_ZN10CWeaponBox7RestoreER8CRestore", mfunc_ptr_cast(&CWeaponBox::Restore) }, - //{ 0x01DD0970, "_ZN10CWeaponBox21SetObjectCollisionBoxEv", mfunc_ptr_cast(&CWeaponBox::SetObjectCollisionBox) }, - //{ 0x01DCFE30, "_ZN10CWeaponBox5TouchEP11CBaseEntity", mfunc_ptr_cast(&CWeaponBox::Touch) }, + //{ 0x01DCFD80, "_ZN10CWeaponBox5SpawnEv", mfunc_ptr_cast(&CWeaponBox::Spawn_) }, + //{ 0x01DCFA40, "_ZN10CWeaponBox8PrecacheEv", mfunc_ptr_cast(&CWeaponBox::Precache_) }, + //{ 0x01DCFA50, "_ZN10CWeaponBox8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWeaponBox::KeyValue_) }, + //{ 0x01DCF9E0, "_ZN10CWeaponBox4SaveER5CSave", mfunc_ptr_cast(&CWeaponBox::Save_) }, + //{ 0x01DCFA10, "_ZN10CWeaponBox7RestoreER8CRestore", mfunc_ptr_cast(&CWeaponBox::Restore_) }, + //{ 0x01DD0970, "_ZN10CWeaponBox21SetObjectCollisionBoxEv", mfunc_ptr_cast(&CWeaponBox::SetObjectCollisionBox_) }, + //{ 0x01DCFE30, "_ZN10CWeaponBox5TouchEP11CBaseEntity", mfunc_ptr_cast(&CWeaponBox::Touch_) }, //non-virtual func - //{ 0x0, "weaponbox", (size_t)&weaponbox }, + //{ 0x01DCF990, "weaponbox", (size_t)&weaponbox }, //{ 0x01DD0930, "_ZN10CWeaponBox7IsEmptyEv", mfunc_ptr_cast(&CWeaponBox::IsEmpty) }, // NOXREF { 0x01DD07C0, "_ZN10CWeaponBox8GiveAmmoEiPciPi", mfunc_ptr_cast(&CWeaponBox::GiveAmmo) }, { 0x01DCFDE0, "_ZN10CWeaponBox4KillEv", mfunc_ptr_cast(&CWeaponBox::Kill) }, @@ -3414,20 +3484,20 @@ FunctionHook g_FunctionHooks[] = #ifndef Animation_Region - //{ 0x0, "_Z11ExtractBboxPviPfS0_", (size_t)&ExtractBbox }, + { 0x01D5A650, "_Z11ExtractBboxPviPfS0_", (size_t)&ExtractBbox }, { 0x01D5A6B0, "_Z14LookupActivityPvP9entvars_si", (size_t)&LookupActivity }, - //{ 0x0, "_Z22LookupActivityHeaviestPvP9entvars_si", (size_t)&LookupActivityHeaviest }, - //{ 0x0, "_Z14GetEyePositionPvPf", (size_t)&GetEyePosition }, + { 0x01D5A780, "_Z22LookupActivityHeaviestPvP9entvars_si", (size_t)&LookupActivityHeaviest }, + //{ 0x01D5A7D0, "_Z14GetEyePositionPvPf", (size_t)&GetEyePosition }, // NOXREF { 0x01D5A810, "_Z14LookupSequencePvPKc", (size_t)&LookupSequence }, - //{ 0x0, "_Z12IsSoundEventi", (size_t)&IsSoundEvent }, - //{ 0x0, "_Z16SequencePrecachePvPKc", (size_t)&SequencePrecache }, + //{ 0x01D5A870, "_Z12IsSoundEventi", (size_t)&IsSoundEvent }, // NOXREF + //{ 0x01D5A890, "_Z16SequencePrecachePvPKc", (size_t)&SequencePrecache }, // NOXREF { 0x01D5A9A0, "_Z15GetSequenceInfoPvP9entvars_sPfS2_", (size_t)&GetSequenceInfo }, { 0x01D5AA60, "_Z16GetSequenceFlagsPvP9entvars_s", (size_t)&GetSequenceFlags }, - //{ 0x0, "_Z17GetAnimationEventPvP9entvars_sP14MonsterEvent_tffi", (size_t)&GetAnimationEvent }, - //{ 0x01D5ABF0, "_Z13SetControllerPvP9entvars_sif", (size_t)&SetController }, - //{ 0x01D5AD60, "_Z11SetBlendingPvP9entvars_sif", (size_t)&SetBlending }, - //{ 0x0, "_Z14FindTransitionPviiPi", (size_t)&FindTransition }, - //{ 0x0, "_Z12SetBodygroupPvP9entvars_sii", (size_t)&SetBodygroup }, + { 0x01D5AAA0, "_Z17GetAnimationEventPvP9entvars_sP14MonsterEvent_tffi", (size_t)&GetAnimationEvent }, + { 0x01D5ABF0, "_Z13SetControllerPvP9entvars_sif", (size_t)&SetController }, + { 0x01D5AD60, "_Z11SetBlendingPvP9entvars_sif", (size_t)&SetBlending }, + { 0x01D5AEB0, "_Z14FindTransitionPviiPi", (size_t)&FindTransition }, + { 0x01D5AFC0, "_Z12SetBodygroupPvP9entvars_sii", (size_t)&SetBodygroup }, { 0x01D5B020, "_Z12GetBodygroupPvP9entvars_si", (size_t)&GetBodygroup }, { 0x01D5B080, "Server_GetBlendingInterface", (size_t)&Server_GetBlendingInterface }, { 0x01D5B0E0, "_Z15AngleQuaternionPfS_", (size_t)&AngleQuaternion }, @@ -3457,31 +3527,35 @@ FunctionHook g_FunctionHooks[] = #ifndef Unicode_StrTools_Region //{ 0x0, "_Z16Q_IsValidUChar32w", (size_t)&Q_IsValidUChar32 }, - //{ 0x0, "", (size_t)&Q_UTF32ToUChar32 }, // NOXREF - //{ 0x0, "", (size_t)&Q_UChar32ToUTF32Len }, // NOXREF - //{ 0x0, "", (size_t)&Q_UChar32ToUTF32 }, // NOXREF - //{ 0x0, "", (size_t)&Q_UChar32ToUTF8Len }, // NOXREF + +#ifdef _WIN32 + { 0x01DDE010, "", (size_t)&Q_UTF32ToUChar32 }, +#endif // _WIN32 + + //{ 0x0, "", (size_t)&Q_UChar32ToUTF32Len }, + //{ 0x0, "", (size_t)&Q_UChar32ToUTF32 }, + //{ 0x01DDDEE0, "", (size_t)&Q_UChar32ToUTF8Len }, // NOXREF //{ 0x0, "_Z19Q_UChar32ToUTF16Lenw", (size_t)&Q_UChar32ToUTF16Len }, // NOXREF //{ 0x0, "_Z16Q_UChar32ToUTF16wPt", (size_t)&Q_UChar32ToUTF16 }, // NOXREF - //{ 0x0, "_Z15Q_UChar32ToUTF8wPc", (size_t)&Q_UChar32ToUTF8 }, // NOXREF + //{ 0x01DDDF70, "_Z15Q_UChar32ToUTF8wPc", (size_t)&Q_UChar32ToUTF8 }, // NOXREF //{ 0x0, "_Z16Q_UTF16ToUChar32PKtRwRb", (size_t)&Q_UTF16ToUChar32 }, // NOXREF //{ 0x0, "_Z13Q_UTF8ToUTF16PKcPti25EStringConvertErrorPolicy", (size_t)&Q_UTF8ToUTF16 }, // NOXREF - //{ 0x0, "_Z13Q_UTF8ToUTF32PKcPwi25EStringConvertErrorPolicy", (size_t)&Q_UTF8ToUTF32 }, // NOXREF + //{ 0x01DDFA30, "_Z13Q_UTF8ToUTF32PKcPwi25EStringConvertErrorPolicy", (size_t)&Q_UTF8ToUTF32 }, //{ 0x0, "_Z13Q_UTF16ToUTF8PKtPci25EStringConvertErrorPolicy", (size_t)&Q_UTF16ToUTF8 }, // NOXREF //{ 0x0, "_Z14Q_UTF16ToUTF32PKtPwi25EStringConvertErrorPolicy", (size_t)&Q_UTF16ToUTF32 }, // NOXREF //{ 0x0, "_Z13Q_UTF32ToUTF8PKwPci25EStringConvertErrorPolicy", (size_t)&Q_UTF32ToUTF8 }, // NOXREF - //{ 0x0, "_Z14Q_UTF32ToUTF16PKwPti25EStringConvertErrorPolicy", (size_t)&Q_UTF32ToUTF16 }, // NOXREF - //{ 0x0, "_Z15Q_UTF8ToUChar32PKcRwRb", (size_t)&Q_UTF8ToUChar32 }, - //{ 0x0, "Q_UnicodeValidate", (size_t)&Q_UnicodeValidate }, - //{ 0x0, "Q_UnicodeLength", (size_t)&Q_UnicodeLength }, // NOXREF - //{ 0x0, "Q_UnicodeAdvance", (size_t)&Q_UnicodeAdvance }, - //{ 0x0, "_Z14Q_IsMeanSpaceWw", (size_t)&Q_IsMeanSpaceW }, // NOXREF - //{ 0x0, "_Z15Q_IsDeprecatedWw", (size_t)&Q_IsDeprecatedW }, // NOXREF + //{ 0x01DDEB00, "_Z14Q_UTF32ToUTF16PKwPti25EStringConvertErrorPolicy", (size_t)&Q_UTF32ToUTF16 }, // NOXREF + //{ 0x01DDECA0, "_Z15Q_UTF8ToUChar32PKcRwRb", (size_t)&Q_UTF8ToUChar32 }, + { 0x01DDEE00, "Q_UnicodeValidate", (size_t)&Q_UnicodeValidate }, + //{ 0x01DDEE50, "Q_UnicodeLength", (size_t)&Q_UnicodeLength }, // NOXREF + //{ 0x01DDEE80, "Q_UnicodeAdvance", (size_t)&Q_UnicodeAdvance }, + //{ 0x01DDEEC0, "_Z14Q_IsMeanSpaceWw", (size_t)&Q_IsMeanSpaceW }, // NOXREF + //{ 0x01DDF150, "_Z15Q_IsDeprecatedWw", (size_t)&Q_IsDeprecatedW }, // NOXREF //{ 0x0, "", (size_t)&StripWhitespaceWorker }, // NOXREF //{ 0x0, "", (size_t)&StripUnprintableWorker }, // NOXREF - //{ 0x0, "Q_StripUnprintableAndSpace", (size_t)&Q_StripUnprintableAndSpace }, - //{ 0x0, "V_UTF8ToUChar32", (size_t)&V_UTF8ToUChar32 }, - //{ 0x0, "Q_UnicodeRepair", (size_t)&Q_UnicodeRepair }, + { 0x01DDF1D0, "Q_StripUnprintableAndSpace", (size_t)&Q_StripUnprintableAndSpace }, + //{ 0x01DDF8A0, "V_UTF8ToUChar32", (size_t)&V_UTF8ToUChar32 }, // NOXREF + //{ 0x01DDF8D0, "Q_UnicodeRepair", (size_t)&Q_UnicodeRepair }, // NOXREF #endif // Unicode_StrTools_Region @@ -3505,17 +3579,17 @@ FunctionHook g_FunctionHooks[] = #ifndef Debug_Region //{ 0x0, "", (size_t)&IsDeveloper }, // NOXREF - //{ 0x0, "_Z12UTIL_DPrintf15DebugOutputTypePcz", mfunc_ptr_cast(&UTIL_DPrintf) }, // NOXREF + //{ 0x01D732D0, "_Z12UTIL_DPrintf15DebugOutputTypePcz", mfunc_ptr_cast(&UTIL_DPrintf) }, // NOXREF { 0x01D73320, "_Z12UTIL_DPrintfPcz", mfunc_ptr_cast(&UTIL_DPrintf) }, - //{ 0x0, "_Z20UTIL_SetDprintfFlagsPKc", (size_t)&PrintDebugFlags }, // NOXREF - //{ 0x0, "_ZL12SetDebugFlagPKcb", (size_t)&SetDebugFlag }, - //{ 0x0, "_Z14PrintDebugFlagPKc", (size_t)&PrintDebugFlag }, - //{ 0x01D73410, "_Z20UTIL_SetDprintfFlagsPKc", (size_t)&UTIL_SetDprintfFlags }, - //{ 0x0, "_Z15UTIL_BotDPrintfPcz", (size_t)&UTIL_BotDPrintf }, - //{ 0x0, "_Z18UTIL_CareerDPrintfPcz", (size_t)&UTIL_CareerDPrintf }, - //{ 0x0, "_Z17UTIL_TutorDPrintfPcz", (size_t)&UTIL_TutorDPrintf }, - //{ 0x0, "_Z17UTIL_StatsDPrintfPcz", (size_t)&UTIL_StatsDPrintf }, - //{ 0x0, "_Z19UTIL_HostageDPrintfPcz", (size_t)&UTIL_HostageDPrintf }, + //{ 0x01D73360, "_Z20UTIL_SetDprintfFlagsPKc", (size_t)&PrintDebugFlags }, // NOXREF + //{ 0x0, "_ZL12SetDebugFlagPKcb", (size_t)&SetDebugFlag }, // NOXREF + //{ 0x0, "_Z14PrintDebugFlagPKc", (size_t)&PrintDebugFlag }, // NOXREF + { 0x01D73410, "_Z20UTIL_SetDprintfFlagsPKc", (size_t)&UTIL_SetDprintfFlags }, + //{ 0x01D73690, "_Z15UTIL_BotDPrintfPcz", (size_t)&UTIL_BotDPrintf }, // NOXREF + { 0x01D736E0, "_Z18UTIL_CareerDPrintfPcz", (size_t)&UTIL_CareerDPrintf }, + //{ 0x01D73730, "_Z17UTIL_TutorDPrintfPcz", (size_t)&UTIL_TutorDPrintf }, // NOXREF + //{ 0x01D73780, "_Z17UTIL_StatsDPrintfPcz", (size_t)&UTIL_StatsDPrintf }, // NOXREF + //{ 0x01D737D0, "_Z19UTIL_HostageDPrintfPcz", (size_t)&UTIL_HostageDPrintf }, // NOXREF #endif // Debug_Region @@ -3539,10 +3613,10 @@ FunctionHook g_FunctionHooks[] = //CCSBotManager //virtual func { 0x01D23770, "_ZN13CCSBotManager16ClientDisconnectEP11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::ClientDisconnect_) }, - //{ 0x0, "_ZN13CCSBotManager13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CCSBotManager::ClientCommand) }, + { 0x01D24880, "_ZN13CCSBotManager13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CCSBotManager::ClientCommand_) }, { 0x01D234D0, "_ZN13CCSBotManager14ServerActivateEv", mfunc_ptr_cast(&CCSBotManager::ServerActivate_) }, { 0x01D23760, "_ZN13CCSBotManager16ServerDeactivateEv", mfunc_ptr_cast(&CCSBotManager::ServerDeactivate_) }, - //5@@{ 0x01D23900, "_ZN13CCSBotManager13ServerCommandEPKc", mfunc_ptr_cast(&CCSBotManager::ServerCommand_) }, + //{ 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_) }, @@ -3593,7 +3667,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK13CCSBotManager12AllowSnipersEv", mfunc_ptr_cast(&CCSBotManager::AllowSnipers) }, //{ 0x0, "_ZNK13CCSBotManager19AllowTacticalShieldEv", mfunc_ptr_cast(&CCSBotManager::AllowTacticalShield) }, //{ 0x0, "_ZNK13CCSBotManager23AllowFriendlyFireDamageEv", mfunc_ptr_cast(&CCSBotManager::AllowFriendlyFireDamage) }, - //{ 0x01D232D0, "_ZN13CCSBotManager15IsWeaponUseableEP15CBasePlayerItem", mfunc_ptr_cast(&CCSBotManager::IsWeaponUseable) }, + { 0x01D232D0, "_ZN13CCSBotManager15IsWeaponUseableEP15CBasePlayerItem", mfunc_ptr_cast(&CCSBotManager::IsWeaponUseable) }, //{ 0x0, "_ZNK13CCSBotManager16IsDefenseRushingEv", mfunc_ptr_cast(&CCSBotManager::IsDefenseRushing) }, //{ 0x0, "_ZNK13CCSBotManager11IsOnDefenseEPK11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::IsOnDefense) }, //{ 0x0, "_ZNK13CCSBotManager11IsOnOffenseEPK11CBasePlayer", mfunc_ptr_cast(&CCSBotManager::IsOnOffense) }, @@ -3905,7 +3979,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN11CSGameState21InitializeHostageInfoEv", mfunc_ptr_cast(&CSGameState::InitializeHostageInfo) }, //{ 0x0, "_Z17GetBotFollowCountP11CBasePlayer", (size_t)&GetBotFollowCount }, - //{ 0x0, "_Z21FindNearbyRetreatSpotP6CCSBotf", (size_t)&FindNearbyRetreatSpot }, + //{ 0x01D187B0, "_Z21FindNearbyRetreatSpotP6CCSBotf", (size_t)&FindNearbyRetreatSpot }, //{ 0x0, "", (size_t)&drawProgressMeter }, // NOXREF //{ 0x0, "", (size_t)&startProgressMeter }, // NOXREF @@ -4103,7 +4177,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK4CBot4SaveER5CSave", mfunc_ptr_cast(&CBot::Save) }, //{ 0x0, "_ZNK4CBot7RestoreER8CRestore", mfunc_ptr_cast(&CBot::Restore) }, //{ 0x0, "_ZNK4CBot10GetProfileEv", mfunc_ptr_cast(&CBot::GetProfile) }, - //{ 0x0, "_ZN4CBot13ClientCommandEPKcS1_S1_S1_", mfunc_ptr_cast(&CBot::ClientCommand) }, + { 0x01D33BA0, "_ZN4CBot13ClientCommandEPKcS1_S1_S1_", mfunc_ptr_cast(&CBot::ClientCommand) }, //{ 0x01D33B50, "_ZN4CBot12ResetCommandEv", mfunc_ptr_cast(&CBot::ResetCommand) }, // NOXREF //{ 0x01D33B70, "_ZNK4CBot13ThrottledMsecEv", mfunc_ptr_cast(&CBot::ThrottledMsec) }, // NOXREF //{ 0x0, "_ZN4CBot12GetMoveSpeedEv", mfunc_ptr_cast(&CBot::GetMoveSpeed) }, @@ -4252,11 +4326,11 @@ FunctionHook g_FunctionHooks[] = { 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 }, + { 0x01D36690, "_Z24UTIL_ActivePlayersInGamev", (size_t)&UTIL_ActivePlayersInGame }, + { 0x01D36760, "_Z17UTIL_HumansInGameb", (size_t)&UTIL_HumansInGame }, //{ 0x0, "_Z17UTIL_HumansOnTeamib", (size_t)&UTIL_HumansOnTeam }, //{ 0x0, "_Z15UTIL_BotsInGamev", (size_t)&UTIL_BotsInGame }, - //{ 0x0, "_Z20UTIL_KickBotFromTeam8TeamName", (size_t)&UTIL_KickBotFromTeam }, + { 0x01D36A00, "_Z20UTIL_KickBotFromTeam8TeamName", (size_t)&UTIL_KickBotFromTeam }, //{ 0x0, "_Z18UTIL_IsTeamAllBotsi", (size_t)&UTIL_IsTeamAllBots }, //{ 0x0, "_Z21UTIL_GetClosestPlayerPK6VectorPf", mfunc_ptr_cast(&UTIL_GetClosestPlayer) }, //{ 0x0, "_Z21UTIL_GetClosestPlayerPK6VectoriPf", mfunc_ptr_cast(&UTIL_GetClosestPlayer) }, @@ -4370,207 +4444,215 @@ FunctionHook g_FunctionHooks[] = #ifndef Tutor_CS_Region - //{ 0x01DD26D0, "_Z12InstallTutorb", (size_t)&InstallTutor }, + { 0x01DD26D0, "_Z12InstallTutorb", (size_t)&InstallTutor }, { 0x01DD2740, "_Z19Tutor_RegisterCVarsv", (size_t)&Tutor_RegisterCVars }, - //{ 0x0, "_Z18MonitorTutorStatusv", (size_t)&MonitorTutorStatus }, - + { 0x01DD27C0, "_Z18MonitorTutorStatusv", (size_t)&MonitorTutorStatus }, //CBaseTutor + //{ 0x01DD2BF0, "_ZN10CBaseTutorC2Ev", mfunc_ptr_cast(&CBaseTutor::CBaseTutor) }, + //{ 0x01DD2C10, "_ZN10CBaseTutorD0Ev", mfunc_ptr_cast(&CBaseTutor::~CBaseTutor) }, //virtual func - //{ 0x0, "_ZN10CBaseTutor10TutorThinkEf", mfunc_ptr_cast(&CBaseTutor::TutorThink) }, - //{ 0x0, "_ZN10CBaseTutor13PurgeMessagesEv", mfunc_ptr_cast(&CBaseTutor::PurgeMessages) }, - //{ 0x0, "_ZN10CBaseTutor16CallEventHandlerE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutor::CallEventHandler) }, - //{ 0x0, "_ZN10CBaseTutor16ShowTutorMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CBaseTutor::ShowTutorMessage) }, - //{ 0x0, "_ZN10CBaseTutor22IsEntityInViewOfPlayerEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsEntityInViewOfPlayer) }, - //{ 0x0, "_ZN10CBaseTutor24IsBombsiteInViewOfPlayerEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsBombsiteInViewOfPlayer) }, - //{ 0x0, "_ZN10CBaseTutor18IsEntityInBombsiteEP11CBaseEntityS1_", mfunc_ptr_cast(&CBaseTutor::IsEntityInBombsite) }, - //{ 0x0, "_ZN10CBaseTutor25IsPlayerLookingAtPositionEP6VectorP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsPlayerLookingAtPosition) }, - //{ 0x0, "_ZN10CBaseTutor23IsPlayerLookingAtEntityEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsPlayerLookingAtEntity) }, - //{ 0x0, "_ZN10CBaseTutor15HandleShotFiredE6VectorS0_", mfunc_ptr_cast(&CBaseTutor::HandleShotFired) }, - //{ 0x0, "_ZN10CBaseTutor25GetTutorMessageDefinitionEi", mfunc_ptr_cast(&CBaseTutor::GetTutorMessageDefinition) }, + //{ 0x0, "_ZN10CBaseTutor10TutorThinkEf", mfunc_ptr_cast(&CBaseTutor::TutorThink_) }, // PURE virt + //{ 0x0, "_ZN10CBaseTutor13PurgeMessagesEv", mfunc_ptr_cast(&CBaseTutor::PurgeMessages_) }, // PURE virt + //{ 0x0, "_ZN10CBaseTutor16CallEventHandlerE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutor::CallEventHandler_) }, // PURE virt + //{ 0x0, "_ZN10CBaseTutor16ShowTutorMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CBaseTutor::ShowTutorMessage_) }, // PURE virt + { 0x01DD3070, "_ZN10CBaseTutor22IsEntityInViewOfPlayerEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsEntityInViewOfPlayer_) }, + { 0x01DD3350, "_ZN10CBaseTutor24IsBombsiteInViewOfPlayerEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsBombsiteInViewOfPlayer_) }, + { 0x01DD3480, "_ZN10CBaseTutor18IsEntityInBombsiteEP11CBaseEntityS1_", mfunc_ptr_cast(&CBaseTutor::IsEntityInBombsite_) }, + { 0x01DD3160, "_ZN10CBaseTutor25IsPlayerLookingAtPositionEP6VectorP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsPlayerLookingAtPosition_) }, + { 0x01DD3240, "_ZN10CBaseTutor23IsPlayerLookingAtEntityEP11CBaseEntityP11CBasePlayer", mfunc_ptr_cast(&CBaseTutor::IsPlayerLookingAtEntity_) }, + //{ 0x0, "_ZN10CBaseTutor15HandleShotFiredE6VectorS0_", mfunc_ptr_cast(&CBaseTutor::HandleShotFired_) }, // PURE virt + //{ 0x0, "_ZN10CBaseTutor25GetTutorMessageDefinitionEi", mfunc_ptr_cast(&CBaseTutor::GetTutorMessageDefinition_) }, // PURE virt //non-virtual func - //{ 0x01DD2DA0, "_ZN10CBaseTutor10StartFrameEf", mfunc_ptr_cast(&CBaseTutor::StartFrame) }, + { 0x01DD2DA0, "_ZN10CBaseTutor10StartFrameEf", mfunc_ptr_cast(&CBaseTutor::StartFrame) }, { 0x01DD2C70, "_ZN10CBaseTutor7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutor::OnEvent) }, //{ 0x01DD2CF0, "_ZN10CBaseTutor9ShotFiredE6VectorS0_", mfunc_ptr_cast(&CBaseTutor::ShotFired) }, // NOXREF - //{ 0x0, "_ZN10CBaseTutor22DisplayMessageToPlayerEP11CBasePlayeriPKcP17TutorMessageEvent", mfunc_ptr_cast(&CBaseTutor::DisplayMessageToPlayer) }, + { 0x01DD2DB0, "_ZN10CBaseTutor22DisplayMessageToPlayerEP11CBasePlayeriPKcP17TutorMessageEvent", mfunc_ptr_cast(&CBaseTutor::DisplayMessageToPlayer) }, //{ 0x01DD2F80, "_ZN10CBaseTutor16DrawLineToEntityEP11CBasePlayerii", mfunc_ptr_cast(&CBaseTutor::DrawLineToEntity) }, // NOXREF //{ 0x01DD2FD0, "_ZN10CBaseTutor34DisplayNewStateDescriptionToPlayerEv", mfunc_ptr_cast(&CBaseTutor::DisplayNewStateDescriptionToPlayer) }, // NOXREF { 0x01DD3020, "_ZN10CBaseTutor18CloseCurrentWindowEv", mfunc_ptr_cast(&CBaseTutor::CloseCurrentWindow) }, //{ 0x01DD2D30, "_ZN10CBaseTutor23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutor::CheckForStateTransition) }, // NOXREF - //{ 0x0, "_ZN10CBaseTutor25CalculatePathForObjectiveEP11CBaseEntity", mfunc_ptr_cast(&CBaseTutor::CalculatePathForObjective) }, - //{ 0x0, "_ZN10CBaseTutor20DoMessagesHaveSameIDEii", mfunc_ptr_cast(&CBaseTutor::DoMessagesHaveSameID) }, + //{ 0x01DD3060, "_ZN10CBaseTutor25CalculatePathForObjectiveEP11CBaseEntity", mfunc_ptr_cast(&CBaseTutor::CalculatePathForObjective) }, // PURE + { 0x01DD3510, "_ZN10CBaseTutor20DoMessagesHaveSameIDEii", mfunc_ptr_cast(&CBaseTutor::DoMessagesHaveSameID) }, //CCSTutor //{ 0x01DD3A30, "_ZN8CCSTutorC2Ev", mfunc_ptr_cast(&CCSTutor::CCSTutor) }, + //{ 0x01DD3B90, "_ZN8CCSTutorC2Ev", mfunc_ptr_cast(&CCSTutor::~CCSTutor) }, //virtual func - //{ 0x01DD46C0, "_ZN8CCSTutor10TutorThinkEf", mfunc_ptr_cast(&CCSTutor::TutorThink_) }, - //{ 0x0, "_ZN8CCSTutor13PurgeMessagesEv", mfunc_ptr_cast(&CCSTutor::PurgeMessages) }, - //{ 0x0, "_ZN8CCSTutor16ShowTutorMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ShowTutorMessage) }, - //{ 0x0, "_ZN8CCSTutor16CallEventHandlerE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CallEventHandler) }, - //{ 0x0, "_ZN8CCSTutor15HandleShotFiredE6VectorS0_", mfunc_ptr_cast(&CCSTutor::HandleShotFired) }, - //{ 0x0, "_ZN8CCSTutor25GetTutorMessageDefinitionEi", mfunc_ptr_cast(&CCSTutor::GetTutorMessageDefinition) }, + { 0x01DD46C0, "_ZN8CCSTutor10TutorThinkEf", mfunc_ptr_cast(&CCSTutor::TutorThink_) }, + { 0x01DD56C0, "_ZN8CCSTutor13PurgeMessagesEv", mfunc_ptr_cast(&CCSTutor::PurgeMessages_) }, + { 0x01DD5960, "_ZN8CCSTutor16ShowTutorMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ShowTutorMessage_) }, + { 0x01DD5A20, "_ZN8CCSTutor16CallEventHandlerE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CallEventHandler_) }, + { 0x01DD9830, "_ZN8CCSTutor15HandleShotFiredE6VectorS0_", mfunc_ptr_cast(&CCSTutor::HandleShotFired_) }, + { 0x01DDA8B0, "_ZN8CCSTutor25GetTutorMessageDefinitionEi", mfunc_ptr_cast(&CCSTutor::GetTutorMessageDefinition_) }, //non-virtual func - //{ 0x0, "_ZN8CCSTutor23CreateAndAddEventToListE14TutorMessageIDP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CreateAndAddEventToList) }, - //{ 0x0, "_ZN8CCSTutor23CreateTutorMessageEventE14TutorMessageIDP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CreateTutorMessageEvent) }, - //{ 0x0, "_ZN8CCSTutor14AddToEventListEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::AddToEventList) }, - //{ 0x0, "_ZN8CCSTutor24DeleteEventFromEventListEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::DeleteEventFromEventList) }, - //{ 0x0, "_ZN8CCSTutor14ClearEventListEv", mfunc_ptr_cast(&CCSTutor::ClearEventList) }, - //{ 0x0, "_ZN8CCSTutor17ClearCurrentEventEbb", mfunc_ptr_cast(&CCSTutor::ClearCurrentEvent) }, - //{ 0x0, "_ZN8CCSTutor11DeleteEventEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::DeleteEvent) }, - //{ 0x0, "_ZN8CCSTutor22ShouldShowMessageEventEP17TutorMessageEventf", mfunc_ptr_cast(&CCSTutor::ShouldShowMessageEvent) }, - //{ 0x0, "_ZN8CCSTutor26ShouldUpdateCurrentMessageE14TutorMessageID", mfunc_ptr_cast(&CCSTutor::ShouldUpdateCurrentMessage) }, - //{ 0x0, "_ZN8CCSTutor29ComputeDisplayTimesForMessageEv", mfunc_ptr_cast(&CCSTutor::ComputeDisplayTimesForMessage) }, - //{ 0x0, "_ZN8CCSTutor20UpdateCurrentMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::UpdateCurrentMessage) }, - //{ 0x0, "_ZN8CCSTutor26ConstructMessageAndDisplayEv", mfunc_ptr_cast(&CCSTutor::ConstructMessageAndDisplay) }, - //{ 0x0, "_ZN8CCSTutor12LookupHotKeyE14TutorMessageIDiPwi", mfunc_ptr_cast(&CCSTutor::LookupHotKey) }, - //{ 0x0, "_ZN8CCSTutor19CheckForWindowCloseEf", mfunc_ptr_cast(&CCSTutor::CheckForWindowClose) }, - //{ 0x0, "_ZN8CCSTutor21CheckForContentUpdateEv", mfunc_ptr_cast(&CCSTutor::CheckForContentUpdate) }, - //{ 0x0, "_ZN8CCSTutor36HasCurrentWindowBeenActiveLongEnoughEf", mfunc_ptr_cast(&CCSTutor::HasCurrentWindowBeenActiveLongEnough) }, - //{ 0x0, "_ZN8CCSTutor32CheckForInterruptingMessageEventEf", mfunc_ptr_cast(&CCSTutor::CheckForInterruptingMessageEvent) }, - //{ 0x0, "_ZN8CCSTutor22CheckForInactiveEventsEf", mfunc_ptr_cast(&CCSTutor::CheckForInactiveEvents) }, - //{ 0x0, "_ZN8CCSTutor11CancelEventE14TutorMessageID", mfunc_ptr_cast(&CCSTutor::CancelEvent) }, - //{ 0x0, "_ZN8CCSTutor26ProcessShownDeathsForEventEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ProcessShownDeathsForEvent) }, - //{ 0x0, "_ZN8CCSTutor19TransferDeathEventsEP17TutorMessageEventS1_", mfunc_ptr_cast(&CCSTutor::TransferDeathEvents) }, - //{ 0x0, "_ZN8CCSTutor26GetTutorMessageUpdateEventEv", mfunc_ptr_cast(&CCSTutor::GetTutorMessageUpdateEvent) }, - //{ 0x0, "_ZN8CCSTutor33GetDuplicateMessagesFromEventListERP17TutorMessageEventS2_", mfunc_ptr_cast(&CCSTutor::GetDuplicateMessagesFromEventList) }, - //{ 0x0, "_ZN8CCSTutor9IsBombMapEv", mfunc_ptr_cast(&CCSTutor::IsBombMap) }, - //{ 0x0, "_ZN8CCSTutor12IsHostageMapEv", mfunc_ptr_cast(&CCSTutor::IsHostageMap) }, - //{ 0x0, "_ZN8CCSTutor17HandleWeaponFiredEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponFired) }, - //{ 0x0, "_ZN8CCSTutor24HandleWeaponFiredOnEmptyEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponFiredOnEmpty) }, - //{ 0x0, "_ZN8CCSTutor20HandleWeaponReloadedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponReloaded) }, - //{ 0x0, "_ZN8CCSTutor16HandlePlayerDiedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerDied) }, - //{ 0x0, "_ZN8CCSTutor19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerSpawned) }, - //{ 0x0, "_ZN8CCSTutor25HandleClientCorpseSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleClientCorpseSpawned) }, - //{ 0x0, "_ZN8CCSTutor22HandlePlayerTookDamageEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerTookDamage) }, - //{ 0x0, "_ZN8CCSTutor30HandlePlayerBlindedByFlashbangEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerBlindedByFlashbang) }, - //{ 0x0, "_ZN8CCSTutor18HandleBuyTimeStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBuyTimeStart) }, - //{ 0x0, "_ZN8CCSTutor23HandlePlayerLeftBuyZoneEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerLeftBuyZone) }, - //{ 0x0, "_ZN8CCSTutor17HandleBombPlantedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombPlanted) }, - //{ 0x0, "_ZN8CCSTutor16HandleRoundStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRoundStart) }, - //{ 0x0, "_ZN8CCSTutor17HandleBombDefusedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombDefused) }, - //{ 0x0, "_ZN8CCSTutor18HandleBombExplodedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombExploded) }, - //{ 0x0, "_ZN8CCSTutor17HandleHostageUsedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageUsed) }, - //{ 0x0, "_ZN8CCSTutor20HandleHostageRescuedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageRescued) }, - //{ 0x0, "_ZN8CCSTutor20HandleHostageDamagedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageDamaged) }, - //{ 0x0, "_ZN8CCSTutor19HandleHostageKilledEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageKilled) }, - //{ 0x0, "_ZN8CCSTutor24HandleAllHostagesRescuedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleAllHostagesRescued) }, - //{ 0x0, "_ZN8CCSTutor17HandleBeingShotAtEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBeingShotAt) }, - //{ 0x0, "_ZN8CCSTutor15HandleRoundDrawEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRoundDraw) }, - //{ 0x0, "_ZN8CCSTutor11HandleCTWinEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleCTWin) }, - //{ 0x0, "_ZN8CCSTutor10HandleTWinEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleTWin) }, - //{ 0x0, "_ZN8CCSTutor22HandleDeathCameraStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleDeathCameraStart) }, - //{ 0x0, "_ZN8CCSTutor18HandleBombDefusingEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombDefusing) }, - //{ 0x0, "_ZN8CCSTutor18HandleRadioCoverMeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioCoverMe) }, - //{ 0x0, "_ZN8CCSTutor26HandleRadioYouTakeThePointEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioYouTakeThePoint) }, - //{ 0x0, "_ZN8CCSTutor27HandleRadioHoldThisPositionEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioHoldThisPosition) }, - //{ 0x0, "_ZN8CCSTutor22HandleRadioRegroupTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioRegroupTeam) }, - //{ 0x0, "_ZN8CCSTutor19HandleRadioFollowMeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioFollowMe) }, - //{ 0x0, "_ZN8CCSTutor21HandleRadioTakingFireEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioTakingFire) }, - //{ 0x0, "_ZN8CCSTutor17HandleRadioGoGoGoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGoGoGo) }, - //{ 0x0, "_ZN8CCSTutor23HandleRadioTeamFallBackEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioTeamFallBack) }, - //{ 0x0, "_ZN8CCSTutor28HandleRadioStickTogetherTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioStickTogetherTeam) }, - //{ 0x0, "_ZN8CCSTutor31HandleRadioGetInPositionAndWaitEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGetInPositionAndWait) }, - //{ 0x0, "_ZN8CCSTutor24HandleRadioStormTheFrontEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioStormTheFront) }, - //{ 0x0, "_ZN8CCSTutor23HandleRadioReportInTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioReportInTeam) }, - //{ 0x0, "_ZN8CCSTutor22HandleRadioAffirmativeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioAffirmative) }, - //{ 0x0, "_ZN8CCSTutor23HandleRadioEnemySpottedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioEnemySpotted) }, - //{ 0x0, "_ZN8CCSTutor21HandleRadioNeedBackupEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioNeedBackup) }, - //{ 0x0, "_ZN8CCSTutor22HandleRadioSectorClearEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioSectorClear) }, - //{ 0x0, "_ZN8CCSTutor21HandleRadioInPositionEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioInPosition) }, - //{ 0x0, "_ZN8CCSTutor22HandleRadioReportingInEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioReportingIn) }, - //{ 0x0, "_ZN8CCSTutor24HandleRadioGetOutOfThereEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGetOutOfThere) }, - //{ 0x0, "_ZN8CCSTutor19HandleRadioNegativeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioNegative) }, - //{ 0x0, "_ZN8CCSTutor20HandleRadioEnemyDownEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioEnemyDown) }, - //{ 0x0, "_ZN8CCSTutor20HandleBuyMenuOpennedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBuyMenuOpenned) }, - //{ 0x0, "_ZN8CCSTutor13HandleAutoBuyEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleAutoBuy) }, - //{ 0x0, "_ZN8CCSTutor23HandleNotBuyingAnythingEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNotBuyingAnything) }, - //{ 0x0, "_ZN8CCSTutor28HandleNeedToBuyPrimaryWeaponEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyPrimaryWeapon) }, - //{ 0x0, "_ZN8CCSTutor26HandleNeedToBuyPrimaryAmmoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyPrimaryAmmo) }, - //{ 0x0, "_ZN8CCSTutor28HandleNeedToBuySecondaryAmmoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuySecondaryAmmo) }, - //{ 0x0, "_ZN8CCSTutor20HandleNeedToBuyArmorEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyArmor) }, - //{ 0x0, "_ZN8CCSTutor24HandleNeedToBuyDefuseKitEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyDefuseKit) }, - //{ 0x0, "_ZN8CCSTutor22HandleNeedToBuyGrenadeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyGrenade) }, - //{ 0x0, "_ZN8CCSTutor20HandleCareerTaskDoneEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleCareerTaskDone) }, - //{ 0x0, "_ZN8CCSTutor25GetNumPlayersAliveOnTeamsERiS0_", mfunc_ptr_cast(&CCSTutor::GetNumPlayersAliveOnTeams) }, - //{ 0x0, "_ZN8CCSTutor20CheckForBombViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForBombViewable) }, - //{ 0x0, "_ZN8CCSTutor27CheckForLooseWeaponViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForLooseWeaponViewable) }, - //{ 0x0, "_ZN8CCSTutor28CheckForLooseDefuserViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForLooseDefuserViewable) }, - //{ 0x0, "_ZN8CCSTutor24CheckForBombsiteViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForBombsiteViewable) }, - //{ 0x0, "_ZN8CCSTutor18CheckForInBombZoneEv", mfunc_ptr_cast(&CCSTutor::CheckForInBombZone) }, - //{ 0x0, "_ZN8CCSTutor23CheckForHostageViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForHostageViewable) }, - //{ 0x0, "_ZN8CCSTutor22CheckForTimeRunningOutEv", mfunc_ptr_cast(&CCSTutor::CheckForTimeRunningOut) }, - //{ 0x0, "_ZN8CCSTutor23CheckForAllHostagesDeadEv", mfunc_ptr_cast(&CCSTutor::CheckForAllHostagesDead) }, - //{ 0x0, "_ZN8CCSTutor35CheckForAllHostagesFollowingSomeoneEv", mfunc_ptr_cast(&CCSTutor::CheckForAllHostagesFollowingSomeone) }, - //{ 0x0, "_ZN8CCSTutor17CheckHintMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckHintMessages) }, - //{ 0x0, "_ZN8CCSTutor23CheckInGameHintMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckInGameHintMessages) }, - //{ 0x0, "_ZN8CCSTutor20CheckExamineMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckExamineMessages) }, - //{ 0x0, "_ZN8CCSTutor20CheckForNeedToReloadEb", mfunc_ptr_cast(&CCSTutor::CheckForNeedToReload) }, - //{ 0x0, "_ZN8CCSTutor22CanLocalPlayerBuyStuffEv", mfunc_ptr_cast(&CCSTutor::CanLocalPlayerBuyStuff) }, - //{ 0x01DDB230, "_ZN8CCSTutor20CheckBuyZoneMessagesEv", mfunc_ptr_cast(&CCSTutor::CheckBuyZoneMessages) }, - //{ 0x0, "_ZN8CCSTutor23IsBombPlantedInBombsiteEP11CBaseEntity", mfunc_ptr_cast(&CCSTutor::IsBombPlantedInBombsite) }, - //{ 0x0, "_ZN8CCSTutor20ReadTutorMessageFileEv", mfunc_ptr_cast(&CCSTutor::ReadTutorMessageFile) }, - //{ 0x0, "_ZN8CCSTutor20ApplyPersistentDecayEv", mfunc_ptr_cast(&CCSTutor::ApplyPersistentDecay) }, - //{ 0x0, "_ZN8CCSTutor21GetEntityForMessageIDEiP11CBaseEntity", mfunc_ptr_cast(&CCSTutor::GetEntityForMessageID) }, - //{ 0x0, "_ZN8CCSTutor20ResetPlayerDeathInfoEv", mfunc_ptr_cast(&CCSTutor::ResetPlayerDeathInfo) }, - //{ 0x0, "_ZN8CCSTutor25ConstructRecentDeathsListE8TeamNamePciP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ConstructRecentDeathsList) }, + { 0x01DD5510, "_ZN8CCSTutor14AddToEventListEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::AddToEventList) }, + { 0x01DD5530, "_ZN8CCSTutor23CreateAndAddEventToListE14TutorMessageIDP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CreateAndAddEventToList) }, + { 0x01DD51B0, "_ZN8CCSTutor23CreateTutorMessageEventE14TutorMessageIDP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutor::CreateTutorMessageEvent) }, + { 0x01DD55C0, "_ZN8CCSTutor24DeleteEventFromEventListEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::DeleteEventFromEventList) }, + { 0x01DD5640, "_ZN8CCSTutor14ClearEventListEv", mfunc_ptr_cast(&CCSTutor::ClearEventList) }, + { 0x01DD4BE0, "_ZN8CCSTutor17ClearCurrentEventEbb", mfunc_ptr_cast(&CCSTutor::ClearCurrentEvent) }, + { 0x01DD5690, "_ZN8CCSTutor11DeleteEventEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::DeleteEvent) }, + { 0x01DD4410, "_ZN8CCSTutor22ShouldShowMessageEventEP17TutorMessageEventf", mfunc_ptr_cast(&CCSTutor::ShouldShowMessageEvent) }, + //{ 0x01DD5870, "_ZN8CCSTutor26ShouldUpdateCurrentMessageE14TutorMessageID", mfunc_ptr_cast(&CCSTutor::ShouldUpdateCurrentMessage) }, // NOXREF + { 0x01DD57B0, "_ZN8CCSTutor29ComputeDisplayTimesForMessageEv", mfunc_ptr_cast(&CCSTutor::ComputeDisplayTimesForMessage) }, + { 0x01DD58A0, "_ZN8CCSTutor20UpdateCurrentMessageEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::UpdateCurrentMessage) }, + //{ 0x01DD59B0, "_ZN8CCSTutor26ConstructMessageAndDisplayEv", mfunc_ptr_cast(&CCSTutor::ConstructMessageAndDisplay) }, // NOXREF + //{ 0x01DD5190, "_ZN8CCSTutor12LookupHotKeyE14TutorMessageIDiPwi", mfunc_ptr_cast(&CCSTutor::LookupHotKey) }, // NOXREF + //{ 0x01DD4970, "_ZN8CCSTutor19CheckForWindowCloseEf", mfunc_ptr_cast(&CCSTutor::CheckForWindowClose) }, // NOXREF + //{ 0x01DD4AF0, "_ZN8CCSTutor21CheckForContentUpdateEv", mfunc_ptr_cast(&CCSTutor::CheckForContentUpdate) }, // NOXREF + //{ 0x01DD43E0, "_ZN8CCSTutor36HasCurrentWindowBeenActiveLongEnoughEf", mfunc_ptr_cast(&CCSTutor::HasCurrentWindowBeenActiveLongEnough) }, // NOXREF + { 0x01DD4540, "_ZN8CCSTutor32CheckForInterruptingMessageEventEf", mfunc_ptr_cast(&CCSTutor::CheckForInterruptingMessageEvent) }, + { 0x01DD4D80, "_ZN8CCSTutor22CheckForInactiveEventsEf", mfunc_ptr_cast(&CCSTutor::CheckForInactiveEvents) }, + { 0x01DD5020, "_ZN8CCSTutor11CancelEventE14TutorMessageID", mfunc_ptr_cast(&CCSTutor::CancelEvent) }, + //{ 0x01DD4C90, "_ZN8CCSTutor26ProcessShownDeathsForEventEP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ProcessShownDeathsForEvent) }, // NOXREF + //{ 0x01DDB520, "_ZN8CCSTutor19TransferDeathEventsEP17TutorMessageEventS1_", mfunc_ptr_cast(&CCSTutor::TransferDeathEvents) }, // NOXREF + { 0x01DD4CC0, "_ZN8CCSTutor26GetTutorMessageUpdateEventEv", mfunc_ptr_cast(&CCSTutor::GetTutorMessageUpdateEvent) }, + { 0x01DD4D10, "_ZN8CCSTutor33GetDuplicateMessagesFromEventListERP17TutorMessageEventS2_", mfunc_ptr_cast(&CCSTutor::GetDuplicateMessagesFromEventList) }, + //{ 0x01DDB390, "_ZN8CCSTutor9IsBombMapEv", mfunc_ptr_cast(&CCSTutor::IsBombMap) }, // NOXREF + //{ 0x01DDB370, "_ZN8CCSTutor12IsHostageMapEv", mfunc_ptr_cast(&CCSTutor::IsHostageMap) }, // NOXREF + //{ 0x01DD6460, "_ZN8CCSTutor17HandleWeaponFiredEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponFired) }, // NOXREF + { 0x01DD64A0, "_ZN8CCSTutor24HandleWeaponFiredOnEmptyEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponFiredOnEmpty) }, + //{ 0x01DD65A0, "_ZN8CCSTutor20HandleWeaponReloadedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleWeaponReloaded) }, // NOXREF + { 0x01DD65E0, "_ZN8CCSTutor16HandlePlayerDiedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerDied) }, + //{ 0x01DD6F90, "_ZN8CCSTutor19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerSpawned) }, // NOXREF + //{ 0x01DD7040, "_ZN8CCSTutor25HandleClientCorpseSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleClientCorpseSpawned) }, // NOXREF + { 0x01DD6D60, "_ZN8CCSTutor22HandlePlayerTookDamageEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerTookDamage) }, + //{ 0x01DD6EE0, "_ZN8CCSTutor30HandlePlayerBlindedByFlashbangEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerBlindedByFlashbang) }, // NOXREF + //{ 0x01DD7380, "_ZN8CCSTutor18HandleBuyTimeStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBuyTimeStart) }, // NOXREF + //{ 0x01DD7390, "_ZN8CCSTutor23HandlePlayerLeftBuyZoneEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandlePlayerLeftBuyZone) }, // NOXREF + //{ 0x01DD7490, "_ZN8CCSTutor17HandleBombPlantedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombPlanted) }, // NOXREF + { 0x01DD75B0, "_ZN8CCSTutor17HandleBombDefusedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombDefused) }, + //{ 0x01DD7740, "_ZN8CCSTutor18HandleBombDefusingEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombDefusing) }, // NOXREF + //{ 0x01DD7800, "_ZN8CCSTutor18HandleBombExplodedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBombExploded) }, // NOXREF + { 0x01DD7920, "_ZN8CCSTutor16HandleRoundStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRoundStart) }, + //{ 0x01DD7B30, "_ZN8CCSTutor17HandleBeingShotAtEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBeingShotAt) }, // NOXREF + { 0x01DD7C00, "_ZN8CCSTutor17HandleHostageUsedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageUsed) }, + //{ 0x01DD7E30, "_ZN8CCSTutor20HandleHostageRescuedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageRescued) }, // NOXREF + //{ 0x01DD7FD0, "_ZN8CCSTutor24HandleAllHostagesRescuedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleAllHostagesRescued) }, // NOXREF + //{ 0x01DD80F0, "_ZN8CCSTutor20HandleHostageDamagedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageDamaged) }, // NOXREF + { 0x01DD81B0, "_ZN8CCSTutor19HandleHostageKilledEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleHostageKilled) }, + //{ 0x01DD8430, "_ZN8CCSTutor15HandleRoundDrawEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRoundDraw) }, // NOXREF + //{ 0x01DD84E0, "_ZN8CCSTutor11HandleCTWinEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleCTWin) }, // NOXREF + //{ 0x01DD8580, "_ZN8CCSTutor10HandleTWinEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleTWin) }, // NOXREF + //{ 0x01DD8620, "_ZN8CCSTutor22HandleDeathCameraStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleDeathCameraStart) }, // NOXREF + //{ 0x01DD86E0, "_ZN8CCSTutor18HandleRadioCoverMeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioCoverMe) }, // NOXREF + //{ 0x01DD8770, "_ZN8CCSTutor26HandleRadioYouTakeThePointEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioYouTakeThePoint) }, // NOXREF + //{ 0x01DD8800, "_ZN8CCSTutor27HandleRadioHoldThisPositionEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioHoldThisPosition) }, // NOXREF + //{ 0x01DD8890, "_ZN8CCSTutor22HandleRadioRegroupTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioRegroupTeam) }, // NOXREF + //{ 0x01DD8920, "_ZN8CCSTutor19HandleRadioFollowMeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioFollowMe) }, // NOXREF + //{ 0x01DD89B0, "_ZN8CCSTutor21HandleRadioTakingFireEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioTakingFire) }, // NOXREF + //{ 0x01DD8A40, "_ZN8CCSTutor17HandleRadioGoGoGoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGoGoGo) }, // NOXREF + //{ 0x01DD8AD0, "_ZN8CCSTutor23HandleRadioTeamFallBackEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioTeamFallBack) }, // NOXREF + //{ 0x01DD8B60, "_ZN8CCSTutor28HandleRadioStickTogetherTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioStickTogetherTeam) }, // NOXREF + //{ 0x01DD8BF0, "_ZN8CCSTutor31HandleRadioGetInPositionAndWaitEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGetInPositionAndWait) }, // NOXREF + //{ 0x01DD8C80, "_ZN8CCSTutor24HandleRadioStormTheFrontEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioStormTheFront) }, // NOXREF + //{ 0x01DD8D10, "_ZN8CCSTutor23HandleRadioReportInTeamEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioReportInTeam) }, // NOXREF + //{ 0x01DD8DA0, "_ZN8CCSTutor22HandleRadioAffirmativeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioAffirmative) }, // NOXREF + //{ 0x01DD8E30, "_ZN8CCSTutor23HandleRadioEnemySpottedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioEnemySpotted) }, // NOXREF + //{ 0x01DD8EC0, "_ZN8CCSTutor21HandleRadioNeedBackupEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioNeedBackup) }, // NOXREF + //{ 0x01DD8F50, "_ZN8CCSTutor22HandleRadioSectorClearEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioSectorClear) }, // NOXREF + //{ 0x01DD8FE0, "_ZN8CCSTutor21HandleRadioInPositionEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioInPosition) }, // NOXREF + //{ 0x01DD9070, "_ZN8CCSTutor22HandleRadioReportingInEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioReportingIn) }, // NOXREF + //{ 0x01DD9100, "_ZN8CCSTutor24HandleRadioGetOutOfThereEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioGetOutOfThere) }, // NOXREF + //{ 0x01DD9190, "_ZN8CCSTutor19HandleRadioNegativeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioNegative) }, // NOXREF + //{ 0x01DD9220, "_ZN8CCSTutor20HandleRadioEnemyDownEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleRadioEnemyDown) }, // NOXREF + //{ 0x01DD7240, "_ZN8CCSTutor20HandleBuyMenuOpennedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleBuyMenuOpenned) }, // NOXREF + //{ 0x01DD72E0, "_ZN8CCSTutor13HandleAutoBuyEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleAutoBuy) }, // NOXREF + //{ 0x01DD92B0, "_ZN8CCSTutor23HandleNotBuyingAnythingEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNotBuyingAnything) }, // NOXREF + //{ 0x01DD9340, "_ZN8CCSTutor28HandleNeedToBuyPrimaryWeaponEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyPrimaryWeapon) }, // NOXREF + //{ 0x01DD93D0, "_ZN8CCSTutor26HandleNeedToBuyPrimaryAmmoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyPrimaryAmmo) }, // NOXREF + //{ 0x01DD9460, "_ZN8CCSTutor28HandleNeedToBuySecondaryAmmoEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuySecondaryAmmo) }, // NOXREF + //{ 0x01DD94F0, "_ZN8CCSTutor20HandleNeedToBuyArmorEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyArmor) }, // NOXREF + //{ 0x01DD9580, "_ZN8CCSTutor24HandleNeedToBuyDefuseKitEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyDefuseKit) }, // NOXREF + //{ 0x01DD9610, "_ZN8CCSTutor22HandleNeedToBuyGrenadeEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleNeedToBuyGrenade) }, // NOXREF + //{ 0x01DD96A0, "_ZN8CCSTutor20HandleCareerTaskDoneEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutor::HandleCareerTaskDone) }, // NOXREF + //{ 0x01DD98F0, "_ZN8CCSTutor25GetNumPlayersAliveOnTeamsERiS0_", mfunc_ptr_cast(&CCSTutor::GetNumPlayersAliveOnTeams) }, // NOXREF + { 0x01DD9BA0, "_ZN8CCSTutor20CheckForBombViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForBombViewable) }, + //{ 0x01DD9970, "_ZN8CCSTutor27CheckForLooseWeaponViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForLooseWeaponViewable) }, // NOXREF + { 0x01DD9A80, "_ZN8CCSTutor28CheckForLooseDefuserViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForLooseDefuserViewable) }, + { 0x01DD9F30, "_ZN8CCSTutor24CheckForBombsiteViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForBombsiteViewable) }, + { 0x01DDA1D0, "_ZN8CCSTutor18CheckForInBombZoneEv", mfunc_ptr_cast(&CCSTutor::CheckForInBombZone) }, + { 0x01DDA340, "_ZN8CCSTutor23CheckForHostageViewableEv", mfunc_ptr_cast(&CCSTutor::CheckForHostageViewable) }, + { 0x01DDA550, "_ZN8CCSTutor22CheckForTimeRunningOutEv", mfunc_ptr_cast(&CCSTutor::CheckForTimeRunningOut) }, + //{ 0x01DDA740, "_ZN8CCSTutor23CheckForAllHostagesDeadEv", mfunc_ptr_cast(&CCSTutor::CheckForAllHostagesDead) }, // NOXREF + //{ 0x01DDA810, "_ZN8CCSTutor35CheckForAllHostagesFollowingSomeoneEv", mfunc_ptr_cast(&CCSTutor::CheckForAllHostagesFollowingSomeone) }, // NOXREF + { 0x01DDAB10, "_ZN8CCSTutor17CheckHintMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckHintMessages) }, + //{ 0x01DDAC40, "_ZN8CCSTutor23CheckInGameHintMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckInGameHintMessages) }, // NOXREF + { 0x01DDAF80, "_ZN8CCSTutor20CheckExamineMessagesEf", mfunc_ptr_cast(&CCSTutor::CheckExamineMessages) }, + { 0x01DDAD20, "_ZN8CCSTutor20CheckForNeedToReloadEb", mfunc_ptr_cast(&CCSTutor::CheckForNeedToReload) }, + //{ 0x01DDB210, "_ZN8CCSTutor22CanLocalPlayerBuyStuffEv", mfunc_ptr_cast(&CCSTutor::CanLocalPlayerBuyStuff) }, // NOXREF + { 0x01DDB230, "_ZN8CCSTutor20CheckBuyZoneMessagesEv", mfunc_ptr_cast(&CCSTutor::CheckBuyZoneMessages) }, + //{ 0x01DDA2F0, "_ZN8CCSTutor23IsBombPlantedInBombsiteEP11CBaseEntity", mfunc_ptr_cast(&CCSTutor::IsBombPlantedInBombsite) }, // NOXREF + { 0x01DD3D30, "_ZN8CCSTutor20ReadTutorMessageFileEv", mfunc_ptr_cast(&CCSTutor::ReadTutorMessageFile) }, + //{ 0x01DD43A0, "_ZN8CCSTutor20ApplyPersistentDecayEv", mfunc_ptr_cast(&CCSTutor::ApplyPersistentDecay) }, // NOXREF + { 0x01DDA9A0, "_ZN8CCSTutor21GetEntityForMessageIDEiP11CBaseEntity", mfunc_ptr_cast(&CCSTutor::GetEntityForMessageID) }, + { 0x01DDB3A0, "_ZN8CCSTutor20ResetPlayerDeathInfoEv", mfunc_ptr_cast(&CCSTutor::ResetPlayerDeathInfo) }, + { 0x01DDB3C0, "_ZN8CCSTutor25ConstructRecentDeathsListE8TeamNamePciP17TutorMessageEvent", mfunc_ptr_cast(&CCSTutor::ConstructRecentDeathsList) }, //TutorMessageEvent + //virtual func + //{ 0x01DD2A10, "_ZN17TutorMessageEventC2Eiiffi", mfunc_ptr_cast(&TutorMessageEvent::TutorMessageEvent) }, + //{ 0x01DD2A50, "_ZN17TutorMessageEventD0Ev", mfunc_ptr_cast(&TutorMessageEvent::~TutorMessageEvent) }, //non-virtual func - //{ 0x0, "_ZN17TutorMessageEvent8IsActiveEf", mfunc_ptr_cast(&TutorMessageEvent::IsActive) }, - //{ 0x0, "_ZN17TutorMessageEvent11GetPriorityEv", mfunc_ptr_cast(&TutorMessageEvent::GetPriority) }, - //{ 0x0, "_ZN17TutorMessageEvent13GetTimeActiveEf", mfunc_ptr_cast(&TutorMessageEvent::GetTimeActive) }, - //{ 0x0, "_ZN17TutorMessageEvent17SetActivationTimeEf", mfunc_ptr_cast(&TutorMessageEvent::SetActivationTime) }, - //{ 0x0, "_ZN17TutorMessageEvent5GetIDEv", mfunc_ptr_cast(&TutorMessageEvent::GetID) }, - //{ 0x0, "_ZN17TutorMessageEvent14GetDuplicateIDEv", mfunc_ptr_cast(&TutorMessageEvent::GetDuplicateID) }, - //{ 0x0, "_ZN17TutorMessageEvent12AddParameterEPc", mfunc_ptr_cast(&TutorMessageEvent::AddParameter) }, - //{ 0x0, "_ZN17TutorMessageEvent16GetNextParameterEPci", mfunc_ptr_cast(&TutorMessageEvent::GetNextParameter) }, - //{ 0x0, "_ZN17TutorMessageEvent16GetNumParametersEv", mfunc_ptr_cast(&TutorMessageEvent::GetNumParameters) }, - //{ 0x0, "_ZN17TutorMessageEvent7SetNextEPS_", mfunc_ptr_cast(&TutorMessageEvent::SetNext) }, - //{ 0x0, "_ZN17TutorMessageEvent7GetNextEv", mfunc_ptr_cast(&TutorMessageEvent::GetNext) }, + { 0x01DD2A80, "_ZN17TutorMessageEvent8IsActiveEf", mfunc_ptr_cast(&TutorMessageEvent::IsActive) }, + //{ 0x01DD2AA0, "_ZN17TutorMessageEvent11GetPriorityEv", mfunc_ptr_cast(&TutorMessageEvent::GetPriority) }, // NOXREF + { 0x01DD2AB0, "_ZN17TutorMessageEvent13GetTimeActiveEf", mfunc_ptr_cast(&TutorMessageEvent::GetTimeActive) }, + { 0x01DD2AC0, "_ZN17TutorMessageEvent17SetActivationTimeEf", mfunc_ptr_cast(&TutorMessageEvent::SetActivationTime) }, + { 0x01DD2AD0, "_ZN17TutorMessageEvent5GetIDEv", mfunc_ptr_cast(&TutorMessageEvent::GetID) }, + //{ 0x01DD2AE0, "_ZN17TutorMessageEvent14GetDuplicateIDEv", mfunc_ptr_cast(&TutorMessageEvent::GetDuplicateID) }, // NOXREF + { 0x01DD2AF0, "_ZN17TutorMessageEvent7SetNextEPS_", mfunc_ptr_cast(&TutorMessageEvent::SetNext) }, + { 0x01DD2B00, "_ZN17TutorMessageEvent7GetNextEv", mfunc_ptr_cast(&TutorMessageEvent::GetNext) }, + { 0x01DD2B10, "_ZN17TutorMessageEvent12AddParameterEPc", mfunc_ptr_cast(&TutorMessageEvent::AddParameter) }, + //{ 0x01DD2BA0, "_ZN17TutorMessageEvent16GetNextParameterEPci", mfunc_ptr_cast(&TutorMessageEvent::GetNextParameter) }, // NOXREF + //{ 0x01DD2BE0, "_ZN17TutorMessageEvent16GetNumParametersEv", mfunc_ptr_cast(&TutorMessageEvent::GetNumParameters) }, // NOXREF //CBaseTutorStateSystem //virtual func + //{ 0x01DD2970, "_ZN21CBaseTutorStateSystemC2Ev", mfunc_ptr_cast(&CBaseTutorStateSystem::CBaseTutorStateSystem) }, + //{ 0x01DD2980, "_ZN21CBaseTutorStateSystemD0Ev", mfunc_ptr_cast(&CBaseTutorStateSystem::~CBaseTutorStateSystem) }, //{ 0x0, "_ZN21CBaseTutorStateSystem11UpdateStateE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutorStateSystem::UpdateState) }, //{ 0x0, "_ZN21CBaseTutorStateSystem21GetCurrentStateStringEv", mfunc_ptr_cast(&CBaseTutorStateSystem::GetCurrentStateString) }, //{ 0x0, "_ZN21CBaseTutorStateSystem17ConstructNewStateEi", mfunc_ptr_cast(&CBaseTutorStateSystem::ConstructNewState) }, //non-virtual func - //{ 0x0, "_ZN21CBaseTutorStateSystem19GetCurrentStateTypeEv", mfunc_ptr_cast(&CBaseTutorStateSystem::GetCurrentStateType) }, + //{ 0x01DD29B0, "_ZN21CBaseTutorStateSystem19GetCurrentStateTypeEv", mfunc_ptr_cast(&CBaseTutorStateSystem::GetCurrentStateType) }, // NOXREF //CBaseTutorState //virtual func - //{ 0x0, "_ZN15CBaseTutorState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutorState::CheckForStateTransition) }, - //{ 0x0, "_ZN15CBaseTutorState14GetStateStringEv", mfunc_ptr_cast(&CBaseTutorState::GetStateString) }, + //{ 0x01DD29C0, "_ZN15CBaseTutorStateC2Ev", mfunc_ptr_cast(&CBaseTutorState::CBaseTutorState) }, + //{ 0x01DD29D0, "_ZN15CBaseTutorStateD0Ev", mfunc_ptr_cast(&CBaseTutorState::~CBaseTutorState) }, + //{ 0x0, "_ZN15CBaseTutorState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CBaseTutorState::CheckForStateTransition_) }, // PURE virt + //{ 0x0, "_ZN15CBaseTutorState14GetStateStringEv", mfunc_ptr_cast(&CBaseTutorState::GetStateString_) }, // PURE virt //non-virtual func - //{ 0x0, "_ZN15CBaseTutorState7GetTypeEv", mfunc_ptr_cast(&CBaseTutorState::GetType) }, + //{ 0x01DD2A00, "_ZN15CBaseTutorState7GetTypeEv", mfunc_ptr_cast(&CBaseTutorState::GetType) }, // NOXREF //CCSTutorStateSystem - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorStateSystem::CCSTutorStateSystem) }, + //{ 0x01DD3560, "_ZN19CCSTutorStateSystemC2Ev", mfunc_ptr_cast(&CCSTutorStateSystem::CCSTutorStateSystem) }, //virtual func - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorStateSystem::~CCSTutorStateSystem) }, - //{ 0x0, "_ZN19CCSTutorStateSystem11UpdateStateE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorStateSystem::UpdateState) }, - //{ 0x0, "_ZN19CCSTutorStateSystem21GetCurrentStateStringEv", mfunc_ptr_cast(&CCSTutorStateSystem::GetCurrentStateString) }, - //{ 0x0, "_ZN19CCSTutorStateSystem17ConstructNewStateEi", mfunc_ptr_cast(&CCSTutorStateSystem::ConstructNewState) }, + //{ 0x01DD35B0, "_ZN19CCSTutorStateSystemD0Ev", mfunc_ptr_cast(&CCSTutorStateSystem::~CCSTutorStateSystem) }, + { 0x01DD3620, "_ZN19CCSTutorStateSystem11UpdateStateE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorStateSystem::UpdateState_) }, + { 0x01DD36B0, "_ZN19CCSTutorStateSystem21GetCurrentStateStringEv", mfunc_ptr_cast(&CCSTutorStateSystem::GetCurrentStateString_) }, + { 0x01DD36C0, "_ZN19CCSTutorStateSystem17ConstructNewStateEi", mfunc_ptr_cast(&CCSTutorStateSystem::ConstructNewState_) }, //CCSTutorUndefinedState - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorUndefinedState::CCSTutorUndefinedState) }, + //{ 0x01DD3760, "_ZN22CCSTutorUndefinedStateC2Ev", mfunc_ptr_cast(&CCSTutorUndefinedState::CCSTutorUndefinedState) }, + //{ 0x01DD3780, "_ZN22CCSTutorUndefinedStateD0Ev", mfunc_ptr_cast(&CCSTutorUndefinedState::~CCSTutorUndefinedState) }, //virtual func - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorUndefinedState::~CCSTutorUndefinedState) }, - //{ 0x0, "_ZN22CCSTutorUndefinedState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorUndefinedState::CheckForStateTransition) }, - //{ 0x0, "_ZN22CCSTutorUndefinedState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorUndefinedState::GetStateString) }, + { 0x01DD37C0, "_ZN22CCSTutorUndefinedState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorUndefinedState::CheckForStateTransition_) }, + { 0x01DD3850, "_ZN22CCSTutorUndefinedState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorUndefinedState::GetStateString_) }, //non-virtual func - //{ 0x0, "_ZN22CCSTutorUndefinedState19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorUndefinedState::HandlePlayerSpawned) }, + //{ 0x01DD3810, "_ZN22CCSTutorUndefinedState19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorUndefinedState::HandlePlayerSpawned) }, // NOXREF //CCSTutorWaitingForStartState - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorWaitingForStartState::CCSTutorWaitingForStartState) }, + //{ 0x01DD3860, "_ZN28CCSTutorWaitingForStartStateC2Ev", mfunc_ptr_cast(&CCSTutorWaitingForStartState::CCSTutorWaitingForStartState) }, //virtual func - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorWaitingForStartState::~CCSTutorWaitingForStartState) }, - //{ 0x0, "_ZN28CCSTutorWaitingForStartState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::CheckForStateTransition) }, - //{ 0x0, "_ZN28CCSTutorWaitingForStartState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorWaitingForStartState::GetStateString) }, + //{ 0x01DD3880, "_ZN28CCSTutorWaitingForStartStateD0Ev", mfunc_ptr_cast(&CCSTutorWaitingForStartState::~CCSTutorWaitingForStartState) }, + { 0x01DD38C0, "_ZN28CCSTutorWaitingForStartState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::CheckForStateTransition_) }, + { 0x01DD3910, "_ZN28CCSTutorWaitingForStartState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorWaitingForStartState::GetStateString_) }, //non-virtual func - //{ 0x0, "_ZN28CCSTutorWaitingForStartState19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::HandlePlayerSpawned) }, - //{ 0x0, "_ZN28CCSTutorWaitingForStartState18HandleBuyTimeStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::HandleBuyTimeStart) }, + //{ 0x01DD3920, "_ZN28CCSTutorWaitingForStartState19HandlePlayerSpawnedEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::HandlePlayerSpawned) }, // NOXREF + //{ 0x01DD3960, "_ZN28CCSTutorWaitingForStartState18HandleBuyTimeStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorWaitingForStartState::HandleBuyTimeStart) }, // NOXREF //CCSTutorBuyMenuState - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorBuyMenuState::CCSTutorBuyMenuState) }, + //{ 0x01DD3970, "_ZN20CCSTutorBuyMenuStateC2Ev", mfunc_ptr_cast(&CCSTutorBuyMenuState::CCSTutorBuyMenuState) }, //virtual func - //{ 0x0, "", mfunc_ptr_cast(&CCSTutorBuyMenuState::~CCSTutorBuyMenuState) }, - //{ 0x0, "_ZN20CCSTutorBuyMenuState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorBuyMenuState::CheckForStateTransition) }, - //{ 0x0, "_ZN20CCSTutorBuyMenuState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorBuyMenuState::GetStateString) }, + //{ 0x01DD3990, "_ZN20CCSTutorBuyMenuStateD0Ev", mfunc_ptr_cast(&CCSTutorBuyMenuState::~CCSTutorBuyMenuState) }, + { 0x01DD39D0, "_ZN20CCSTutorBuyMenuState23CheckForStateTransitionE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSTutorBuyMenuState::CheckForStateTransition_) }, + { 0x01DD39F0, "_ZN20CCSTutorBuyMenuState14GetStateStringEv", mfunc_ptr_cast(&CCSTutorBuyMenuState::GetStateString_) }, //non-virtual func - //{ 0x0, "_ZN20CCSTutorBuyMenuState16HandleRoundStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorBuyMenuState::HandleRoundStart) }, - - //{ 0x0, "_ZL22ParseMessageParametersRPcP12TutorMessage", (size_t)&ParseMessageParameters }, + //{ 0x01DD3A00, "_ZN20CCSTutorBuyMenuState16HandleRoundStartEP11CBaseEntityS1_", mfunc_ptr_cast(&CCSTutorBuyMenuState::HandleRoundStart) }, // NOXREF + { 0x01DD3FB0, "_ZL22ParseMessageParametersRPcP12TutorMessage", (size_t)&ParseMessageParameters }, //{ 0x0, "", (size_t)&ConstructTutorMessage }, // NOXREF //{ 0x0, "", (size_t)&ReadDefaultValues }, // NOXREF @@ -4610,7 +4692,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZNK17BotProfileManager10GetProfileEPKc18BotProfileTeamType", mfunc_ptr_cast(&BotProfileManager::GetProfile) }, // NOXREF //{ 0x0, "_ZNK17BotProfileManager14GetProfileListEv", mfunc_ptr_cast(&BotProfileManager::GetProfileList) }, // NOXREF { 0x01D36070, "_ZNK17BotProfileManager16GetRandomProfileE17BotDifficultyType18BotProfileTeamType", mfunc_ptr_cast(&BotProfileManager::GetRandomProfile) }, - //{ 0x0, "_ZN17BotProfileManager13GetCustomSkinEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkin) }, + { 0x01D35D90, "_ZN17BotProfileManager13GetCustomSkinEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkin) }, { 0x01D35DD0, "_ZN17BotProfileManager22GetCustomSkinModelnameEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkinModelname) }, { 0x01D35DB0, "_ZN17BotProfileManager18GetCustomSkinFnameEi", mfunc_ptr_cast(&BotProfileManager::GetCustomSkinFname) }, //{ 0x01D35DF0, "_ZN17BotProfileManager18GetCustomSkinIndexEPKcS1_", mfunc_ptr_cast(&BotProfileManager::GetCustomSkinIndex) }, // NOXREF @@ -4622,7 +4704,7 @@ FunctionHook g_FunctionHooks[] = #ifndef VoiceManager_Region //CVoiceGameMgr - //virtual func + //constructor/destructor func //{ 0x0, "_ZN13CVoiceGameMgrD0Ev", mfunc_ptr_cast(&CVoiceGameMgr::~CVoiceGameMgr) }, //non-virtual func //{ 0x01DCC6F0, "_ZN13CVoiceGameMgrC2Ev", mfunc_ptr_cast(&CVoiceGameMgr::CVoiceGameMgr) }, @@ -4633,7 +4715,7 @@ FunctionHook g_FunctionHooks[] = { 0x01DCC910, "_ZN13CVoiceGameMgr13ClientCommandEP11CBasePlayerPKc", mfunc_ptr_cast(&CVoiceGameMgr::ClientCommand) }, { 0x01DCC890, "_ZN13CVoiceGameMgr22PlayerHasBlockedPlayerEP11CBasePlayerS1_", mfunc_ptr_cast(&CVoiceGameMgr::PlayerHasBlockedPlayer) }, { 0x01DCCB10, "_ZN13CVoiceGameMgr11UpdateMasksEv", mfunc_ptr_cast(&CVoiceGameMgr::UpdateMasks) }, - { 0x01DCCAB0, "_Z14GetBspFilenamePKc", (size_t)&VoiceServerDebug }, + { 0x01DCCAB0, "_ZL16VoiceServerDebugPKcz", (size_t)&VoiceServerDebug }, #endif // VoiceManager_Region @@ -4641,7 +4723,10 @@ FunctionHook g_FunctionHooks[] = { 0x01D71160, "_ZN8Vector2D16NormalizeInPlaceEv", mfunc_ptr_cast(&Vector2D::NormalizeInPlace) }, #ifdef _WIN32 + { 0x01D12570, "", mfunc_ptr_cast(&Vector::Length) }, + { 0x01D4EA30, "", mfunc_ptr_cast(&Vector::Normalize) }, + #endif // _WIN32 #endif // Vector_Region @@ -4651,9 +4736,9 @@ FunctionHook g_FunctionHooks[] = //Nav_File //{ 0x0, "_Z14GetBspFilenamePKc", (size_t)&GetBspFilename }, //{ 0x0, "", (size_t)&COM_FixSlashes }, // NOXREF - //{ 0x0, "_Z17SaveNavigationMapPKc", (size_t)&SaveNavigationMap }, - //{ 0x0, "_Z16LoadLocationFilePKc", (size_t)&LoadLocationFile }, - //{ 0x0, "_Z24SanityCheckNavigationMapPKc", (size_t)&SanityCheckNavigationMap }, + //{ 0x01D45CF0, "_Z17SaveNavigationMapPKc", (size_t)&SaveNavigationMap }, + //{ 0x01D45F80, "_Z16LoadLocationFilePKc", (size_t)&LoadLocationFile }, + //{ 0x01D46170, "_Z24SanityCheckNavigationMapPKc", (size_t)&SanityCheckNavigationMap }, //{ 0x01D46310, "_Z17LoadNavigationMapv", (size_t)&LoadNavigationMap }, //IImprovEvent //virtual func @@ -4865,12 +4950,10 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_Z20IsCrossingLineOfFireRK6VectorS1_P11CBaseEntityi", (size_t)&IsCrossingLineOfFire }, //{ 0x0, "_Z20FindRandomHidingSpotP11CBaseEntityjb", (size_t)&FindRandomHidingSpot }, //{ 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 }, //{ 0x01D3A010, "_Z14DestroyLaddersv", (size_t)&DestroyLadders }, // NOXREF - { 0x01D3A060, "_Z20DestroyNavigationMapv", (size_t)&DestroyNavigationMap }, + //{ 0x01D3A060, "_Z20DestroyNavigationMapv", (size_t)&DestroyNavigationMap }, //!@{ 0x01D3A210, "_Z20StripNavigationAreasv", (size_t)&StripNavigationAreas }, //{ 0x0, "", (size_t)&FindFirstAreaInDirection }, // NOXREF //{ 0x0, "", (size_t)&testJumpDown }, // NOXREF @@ -4892,63 +4975,63 @@ FunctionHook g_FunctionHooks[] = #ifndef Hostage_Region //HostageState - //{ 0x0, "", mfunc_ptr_cast(&CHostageImprov::CHostageImprov) }, + //{ 0x01D50DA0, "", mfunc_ptr_cast(&CHostageImprov::CHostageImprov) }, //virtual func - //{ 0x0, "_ZN14CHostageImprov15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&CHostageImprov::OnMoveToSuccess) }, - //{ 0x0, "_ZN14CHostageImprov15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&CHostageImprov::OnMoveToFailure) }, - //{ 0x0, "_ZN14CHostageImprov8OnInjuryEf", mfunc_ptr_cast(&CHostageImprov::OnInjury) }, - //{ 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) }, - //{ 0x0, "_ZN14CHostageImprov6FaceToERK6Vector", mfunc_ptr_cast(&CHostageImprov::FaceTo) }, - //{ 0x0, "_ZN14CHostageImprov11ClearFaceToEv", mfunc_ptr_cast(&CHostageImprov::ClearFaceTo) }, - //{ 0x0, "_ZNK14CHostageImprov12IsAtMoveGoalEf", mfunc_ptr_cast(&CHostageImprov::IsAtMoveGoal) }, - //{ 0x0, "_ZNK14CHostageImprov9HasLookAtEv", mfunc_ptr_cast(&CHostageImprov::HasLookAt) }, - //{ 0x0, "_ZNK14CHostageImprov9HasFaceToEv", mfunc_ptr_cast(&CHostageImprov::HasFaceTo) }, - //{ 0x0, "_ZNK14CHostageImprov12IsAtFaceGoalEv", mfunc_ptr_cast(&CHostageImprov::IsAtFaceGoal) }, - //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayERK6Vector", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay) }, - //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayEP11CBaseEntityRK6Vector", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay) }, - //{ 0x0, "_ZN14CHostageImprov11MoveForwardEv", mfunc_ptr_cast(&CHostageImprov::MoveForward) }, - //{ 0x0, "_ZN14CHostageImprov12MoveBackwardEv", mfunc_ptr_cast(&CHostageImprov::MoveBackward) }, - //{ 0x0, "_ZN14CHostageImprov10StrafeLeftEv", mfunc_ptr_cast(&CHostageImprov::StrafeLeft) }, - //{ 0x0, "_ZN14CHostageImprov11StrafeRightEv", mfunc_ptr_cast(&CHostageImprov::StrafeRight) }, - //{ 0x0, "_ZN14CHostageImprov4JumpEv", mfunc_ptr_cast(&CHostageImprov::Jump) }, - //{ 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) }, - //{ 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::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) }, - //{ 0x0, "_ZNK14CHostageImprov11IsCrouchingEv", mfunc_ptr_cast(&CHostageImprov::IsCrouching) }, - //{ 0x0, "_ZNK14CHostageImprov9IsJumpingEv", mfunc_ptr_cast(&CHostageImprov::IsJumping) }, - //{ 0x0, "_ZNK14CHostageImprov13IsUsingLadderEv", mfunc_ptr_cast(&CHostageImprov::IsUsingLadder) }, - //{ 0x0, "_ZNK14CHostageImprov10IsOnGroundEv", mfunc_ptr_cast(&CHostageImprov::IsOnGround) }, - //{ 0x0, "_ZNK14CHostageImprov8IsMovingEv", mfunc_ptr_cast(&CHostageImprov::IsMoving) }, - //{ 0x0, "_ZNK14CHostageImprov6CanRunEv", mfunc_ptr_cast(&CHostageImprov::CanRun) }, - //{ 0x0, "_ZNK14CHostageImprov9CanCrouchEv", mfunc_ptr_cast(&CHostageImprov::CanCrouch) }, - //{ 0x0, "_ZNK14CHostageImprov7CanJumpEv", mfunc_ptr_cast(&CHostageImprov::CanJump) }, - //{ 0x0, "_ZNK14CHostageImprov9IsVisibleERK6Vectorb", mfunc_ptr_cast(&CHostageImprov::IsVisible) }, - //{ 0x0, "_ZNK14CHostageImprov19IsPlayerLookingAtMeEP11CBasePlayerf", mfunc_ptr_cast(&CHostageImprov::IsPlayerLookingAtMe) }, - //{ 0x0, "_ZNK14CHostageImprov22IsAnyPlayerLookingAtMeEif", mfunc_ptr_cast(&CHostageImprov::IsAnyPlayerLookingAtMe) }, - //{ 0x0, "_ZNK14CHostageImprov32GetClosestPlayerByTravelDistanceEiPf", mfunc_ptr_cast(&CHostageImprov::GetClosestPlayerByTravelDistance) }, - //{ 0x01D56D60, "_ZNK14CHostageImprov16GetLastKnownAreaEv", mfunc_ptr_cast(&CHostageImprov::GetLastKnownArea) }, - //{ 0x0, "_ZN14CHostageImprov8OnUpdateEf", mfunc_ptr_cast(&CHostageImprov::OnUpdate) }, - //{ 0x0, "_ZN14CHostageImprov8OnUpkeepEf", mfunc_ptr_cast(&CHostageImprov::OnUpkeep) }, - //{ 0x01D52A60, "_ZN14CHostageImprov7OnResetEv", mfunc_ptr_cast(&CHostageImprov::OnReset) }, - //{ 0x0, "_ZN14CHostageImprov11OnGameEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CHostageImprov::OnGameEvent) }, - //{ 0x0, "_ZN14CHostageImprov7OnTouchEP11CBaseEntity", mfunc_ptr_cast(&CHostageImprov::OnTouch) }, + //{ 0x0, "_ZN14CHostageImprov15OnMoveToSuccessERK6Vector", mfunc_ptr_cast(&CHostageImprov::OnMoveToSuccess_) }, + //{ 0x0, "_ZN14CHostageImprov15OnMoveToFailureERK6VectorN12IImprovEvent17MoveToFailureTypeE", mfunc_ptr_cast(&CHostageImprov::OnMoveToFailure_) }, + //{ 0x0, "_ZN14CHostageImprov8OnInjuryEf", mfunc_ptr_cast(&CHostageImprov::OnInjury_) }, + //{ 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_) }, + //{ 0x0, "_ZN14CHostageImprov6FaceToERK6Vector", mfunc_ptr_cast(&CHostageImprov::FaceTo_) }, + //{ 0x0, "_ZN14CHostageImprov11ClearFaceToEv", mfunc_ptr_cast(&CHostageImprov::ClearFaceTo_) }, + //{ 0x0, "_ZNK14CHostageImprov12IsAtMoveGoalEf", mfunc_ptr_cast(&CHostageImprov::IsAtMoveGoal_) }, + //{ 0x0, "_ZNK14CHostageImprov9HasLookAtEv", mfunc_ptr_cast(&CHostageImprov::HasLookAt_) }, + //{ 0x0, "_ZNK14CHostageImprov9HasFaceToEv", mfunc_ptr_cast(&CHostageImprov::HasFaceTo_) }, + //{ 0x0, "_ZNK14CHostageImprov12IsAtFaceGoalEv", mfunc_ptr_cast(&CHostageImprov::IsAtFaceGoal_) }, + //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayERK6Vector", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay_) }, + //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayEP11CBaseEntityRK6Vector", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay_) }, + //{ 0x0, "_ZN14CHostageImprov11MoveForwardEv", mfunc_ptr_cast(&CHostageImprov::MoveForward_) }, + //{ 0x0, "_ZN14CHostageImprov12MoveBackwardEv", mfunc_ptr_cast(&CHostageImprov::MoveBackward_) }, + //{ 0x0, "_ZN14CHostageImprov10StrafeLeftEv", mfunc_ptr_cast(&CHostageImprov::StrafeLeft_) }, + //{ 0x0, "_ZN14CHostageImprov11StrafeRightEv", mfunc_ptr_cast(&CHostageImprov::StrafeRight_) }, + //{ 0x0, "_ZN14CHostageImprov4JumpEv", mfunc_ptr_cast(&CHostageImprov::Jump_) }, + //{ 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_) }, + //{ 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_) }, + { 0x01D523F0, "_ZNK14CHostageImprov7GetFeetEv", mfunc_ptr_cast(&CHostageImprov::GetFeet_) }, + //{ 0x01D52400, "_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_) }, + //{ 0x0, "_ZNK14CHostageImprov11IsCrouchingEv", mfunc_ptr_cast(&CHostageImprov::IsCrouching_) }, + //{ 0x0, "_ZNK14CHostageImprov9IsJumpingEv", mfunc_ptr_cast(&CHostageImprov::IsJumping_) }, + //{ 0x0, "_ZNK14CHostageImprov13IsUsingLadderEv", mfunc_ptr_cast(&CHostageImprov::IsUsingLadder_) }, + //{ 0x0, "_ZNK14CHostageImprov10IsOnGroundEv", mfunc_ptr_cast(&CHostageImprov::IsOnGround_) }, + //{ 0x0, "_ZNK14CHostageImprov8IsMovingEv", mfunc_ptr_cast(&CHostageImprov::IsMoving_) }, + //{ 0x0, "_ZNK14CHostageImprov6CanRunEv", mfunc_ptr_cast(&CHostageImprov::CanRun_) }, + //{ 0x0, "_ZNK14CHostageImprov9CanCrouchEv", mfunc_ptr_cast(&CHostageImprov::CanCrouch_) }, + //{ 0x0, "_ZNK14CHostageImprov7CanJumpEv", mfunc_ptr_cast(&CHostageImprov::CanJump_) }, + //{ 0x0, "_ZNK14CHostageImprov9IsVisibleERK6Vectorb", mfunc_ptr_cast(&CHostageImprov::IsVisible_) }, + //{ 0x0, "_ZNK14CHostageImprov19IsPlayerLookingAtMeEP11CBasePlayerf", mfunc_ptr_cast(&CHostageImprov::IsPlayerLookingAtMe_) }, + //{ 0x0, "_ZNK14CHostageImprov22IsAnyPlayerLookingAtMeEif", mfunc_ptr_cast(&CHostageImprov::IsAnyPlayerLookingAtMe_) }, + //{ 0x0, "_ZNK14CHostageImprov32GetClosestPlayerByTravelDistanceEiPf", mfunc_ptr_cast(&CHostageImprov::GetClosestPlayerByTravelDistance_) }, + //{ 0x01D56D60, "_ZNK14CHostageImprov16GetLastKnownAreaEv", mfunc_ptr_cast(&CHostageImprov::GetLastKnownArea_) }, + //{ 0x0, "_ZN14CHostageImprov8OnUpdateEf", mfunc_ptr_cast(&CHostageImprov::OnUpdate_) }, + //{ 0x0, "_ZN14CHostageImprov8OnUpkeepEf", mfunc_ptr_cast(&CHostageImprov::OnUpkeep_) }, + { 0x01D52A60, "_ZN14CHostageImprov7OnResetEv", mfunc_ptr_cast(&CHostageImprov::OnReset_) }, + //{ 0x0, "_ZN14CHostageImprov11OnGameEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CHostageImprov::OnGameEvent_) }, + //{ 0x0, "_ZN14CHostageImprov7OnTouchEP11CBaseEntity", mfunc_ptr_cast(&CHostageImprov::OnTouch_) }, //non-virtual func //{ 0x0, "_ZN14CHostageImprov12FaceOutwardsEv", mfunc_ptr_cast(&CHostageImprov::FaceOutwards) }, //{ 0x0, "_ZNK14CHostageImprov16IsFriendInTheWayEv", mfunc_ptr_cast(&CHostageImprov::IsFriendInTheWay) }, @@ -5077,7 +5160,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN19HostageAnimateState6OnExitEP14CHostageImprov", mfunc_ptr_cast(&HostageAnimateState::OnExit) }, //{ 0x0, "_ZNK19HostageAnimateState7GetNameEv", mfunc_ptr_cast(&HostageAnimateState::GetName) }, //non-virtual func - //{ 0x01D49D60, "_ZN19HostageAnimateState5ResetEv", mfunc_ptr_cast(&HostageAnimateState::Reset) }, + { 0x01D49D60, "_ZN19HostageAnimateState5ResetEv", mfunc_ptr_cast(&HostageAnimateState::Reset) }, //{ 0x0, "_ZN19HostageAnimateState11AddSequenceEP14CHostageImprovPKcff", mfunc_ptr_cast(&HostageAnimateState::AddSequence) }, //{ 0x01D49F00, "_ZN19HostageAnimateState11AddSequenceEP14CHostageImproviff", mfunc_ptr_cast(&HostageAnimateState::AddSequence) }, //{ 0x0, "_ZNK19HostageAnimateState6IsBusyEv", mfunc_ptr_cast(&HostageAnimateState::IsBusy) }, @@ -5100,8 +5183,8 @@ FunctionHook g_FunctionHooks[] = //non-virtual func //{ 0x01D4C450, "_ZN8CHostage9IdleThinkEv", mfunc_ptr_cast(&CHostage::IdleThink) }, // export func //{ 0x0, "_ZN8CHostage6RemoveEv", mfunc_ptr_cast(&CHostage::Remove) }, - //{ 0x0, "_ZN8CHostage10RePositionEv", mfunc_ptr_cast(&CHostage::RePosition) }, - //{ 0x0, "_ZN8CHostage11SetActivityEi", mfunc_ptr_cast(&CHostage::SetActivity) }, + { 0x01D4CC20, "_ZN8CHostage10RePositionEv", mfunc_ptr_cast(&CHostage::RePosition) }, + { 0x01D4C3E0, "_ZN8CHostage11SetActivityEi", mfunc_ptr_cast(&CHostage::SetActivity) }, //{ 0x0, "_ZN8CHostage11GetActivityEv", mfunc_ptr_cast(&CHostage::GetActivity) }, //{ 0x0, "_ZN8CHostage17GetModifiedDamageEfi", mfunc_ptr_cast(&CHostage::GetModifiedDamage) }, //{ 0x01D4D390, "_ZN8CHostage17SetFlinchActivityEv", mfunc_ptr_cast(&CHostage::SetFlinchActivity) }, // NOXREF @@ -5111,15 +5194,15 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN8CHostage13AnnounceDeathEP11CBasePlayer", mfunc_ptr_cast(&CHostage::AnnounceDeath) }, //{ 0x01D4D6A0, "_ZN8CHostage19ApplyHostagePenaltyEP11CBasePlayer", mfunc_ptr_cast(&CHostage::ApplyHostagePenalty) }, // NOXREF //{ 0x01D4DA80, "_ZN8CHostage16GiveCTTouchBonusEP11CBasePlayer", mfunc_ptr_cast(&CHostage::GiveCTTouchBonus) }, // NOXREF - //{ 0x0, "_ZN8CHostage22SendHostagePositionMsgEv", mfunc_ptr_cast(&CHostage::SendHostagePositionMsg) }, + //{ 0x01D4E580, "_ZN8CHostage22SendHostagePositionMsgEv", mfunc_ptr_cast(&CHostage::SendHostagePositionMsg) }, //{ 0x0, "_ZN8CHostage19SendHostageEventMsgEv", mfunc_ptr_cast(&CHostage::SendHostageEventMsg) }, //{ 0x01D4DC10, "_ZN8CHostage8DoFollowEv", mfunc_ptr_cast(&CHostage::DoFollow) }, //{ 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) }, + { 0x01D4E3A0, "_ZN8CHostage8NavReadyEv", mfunc_ptr_cast(&CHostage::NavReady) }, //{ 0x01D4E850, "_ZN8CHostage6WiggleEv", mfunc_ptr_cast(&CHostage::Wiggle) }, - //@@{ 0x01D4EAB0, "_ZN8CHostage8PreThinkEv", mfunc_ptr_cast(&CHostage::PreThink) }, + { 0x01D4EAB0, "_ZN8CHostage8PreThinkEv", mfunc_ptr_cast(&CHostage::PreThink) }, //{ 0x0, "_ZN8CHostage18IsFollowingSomeoneEv", mfunc_ptr_cast(&CHostage::IsFollowingSomeone) }, //{ 0x0, "_ZN8CHostage9GetLeaderEv", mfunc_ptr_cast(&CHostage::GetLeader) }, //{ 0x0, "_ZN8CHostage11IsFollowingEPK11CBaseEntity", mfunc_ptr_cast(&CHostage::IsFollowing) }, @@ -5132,7 +5215,7 @@ FunctionHook g_FunctionHooks[] = //{ 0x01D4EE40, "_Z21InstallHostageManagerv", (size_t)&InstallHostageManager }, { 0x01D4EF10, "_ZN15CHostageManager14ServerActivateEv", mfunc_ptr_cast(&CHostageManager::ServerActivate) }, //{ 0x0, "_ZN15CHostageManager16ServerDeactivateEv", mfunc_ptr_cast(&CHostageManager::ServerDeactivate) }, - //{ 0x01D50670, "_ZN15CHostageManager12RestartRoundEv", mfunc_ptr_cast(&CHostageManager::RestartRound) }, + { 0x01D50670, "_ZN15CHostageManager12RestartRoundEv", mfunc_ptr_cast(&CHostageManager::RestartRound) }, //{ 0x01D506A0, "_ZN15CHostageManager10AddHostageEP8CHostage", mfunc_ptr_cast(&CHostageManager::AddHostage) }, // NOXREF //{ 0x0, "_ZN15CHostageManager10GetChatterEv", mfunc_ptr_cast(&CHostageManager::GetChatter) }, //{ 0x0, "_ZNK15CHostageManager22IsNearbyHostageTalkingEP14CHostageImprov", mfunc_ptr_cast(&CHostageManager::IsNearbyHostageTalking) }, @@ -5148,13 +5231,13 @@ FunctionHook g_FunctionHooks[] = //{ 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) }, - //{ 0x01D57380, "_ZN9CLocalNav14SetupPathNodesEiP6Vectori", mfunc_ptr_cast(&CLocalNav::SetupPathNodes) }, + { 0x01D57420, "_ZN9CLocalNav8FindPathER6VectorS1_fi", mfunc_ptr_cast(&CLocalNav::FindPath) }, + { 0x01D57380, "_ZN9CLocalNav14SetupPathNodesEiP6Vectori", mfunc_ptr_cast(&CLocalNav::SetupPathNodes) }, //{ 0x01D573D0, "_ZN9CLocalNav26GetFurthestTraversableNodeER6VectorPS0_ii", mfunc_ptr_cast(&CLocalNav::GetFurthestTraversableNode) }, { 0x01D57AC0, "_ZN9CLocalNav15PathTraversableER6VectorS1_i", mfunc_ptr_cast(&CLocalNav::PathTraversable) }, //{ 0x01D57A50, "_ZN9CLocalNav9PathClearER6VectorS1_iR11TraceResult", mfunc_ptr_cast(&CLocalNav::PathClear) }, // NOXREF //{ 0x0, "_ZN9CLocalNav9PathClearER6VectorS1_i", mfunc_ptr_cast(&CLocalNav::PathClear) }, // NOXREF - //{ 0x01D58AC0, "_ZN9CLocalNav5ThinkEv", mfunc_ptr_cast(&CLocalNav::Think) }, + { 0x01D58AC0, "_ZN9CLocalNav5ThinkEv", mfunc_ptr_cast(&CLocalNav::Think) }, //{ 0x01D58D50, "_ZN9CLocalNav10RequestNavEP8CHostage", mfunc_ptr_cast(&CLocalNav::RequestNav) }, { 0x01D58E20, "_ZN9CLocalNav5ResetEv", mfunc_ptr_cast(&CLocalNav::Reset) }, //{ 0x01D58E50, "_ZN9CLocalNav15HostagePrethinkEv", mfunc_ptr_cast(&CLocalNav::HostagePrethink) }, // NOXREF @@ -5162,13 +5245,13 @@ FunctionHook g_FunctionHooks[] = //{ 0x0, "_ZN9CLocalNav7GetNodeEi", mfunc_ptr_cast(&CLocalNav::GetNode) }, // NOXREF //{ 0x01D56F80, "_ZN9CLocalNav10NodeExistsEii", mfunc_ptr_cast(&CLocalNav::NodeExists) }, // NOXREF //{ 0x01D56FC0, "_ZN9CLocalNav12AddPathNodesEii", mfunc_ptr_cast(&CLocalNav::AddPathNodes) }, // NOXREF - //{ 0x01D57040, "_ZN9CLocalNav11AddPathNodeEiiii", mfunc_ptr_cast(&CLocalNav::AddPathNode) }, - //{ 0x01D57290, "_ZN9CLocalNav11GetBestNodeER6VectorS1_", mfunc_ptr_cast(&CLocalNav::GetBestNode) }, + { 0x01D57040, "_ZN9CLocalNav11AddPathNodeEiiii", mfunc_ptr_cast(&CLocalNav::AddPathNode) }, + { 0x01D57290, "_ZN9CLocalNav11GetBestNodeER6VectorS1_", mfunc_ptr_cast(&CLocalNav::GetBestNode) }, { 0x01D57EB0, "_ZN9CLocalNav16SlopeTraversableER6VectorS1_iR11TraceResult", mfunc_ptr_cast(&CLocalNav::SlopeTraversable) }, //{ 0x01D580A0, "_ZN9CLocalNav17LadderTraversableER6VectorS1_iR11TraceResult", mfunc_ptr_cast(&CLocalNav::LadderTraversable) }, { 0x01D581D0, "_ZN9CLocalNav15StepTraversableER6VectorS1_iR11TraceResult", mfunc_ptr_cast(&CLocalNav::StepTraversable) }, { 0x01D583C0, "_ZN9CLocalNav12StepJumpableER6VectorS1_iR11TraceResult", mfunc_ptr_cast(&CLocalNav::StepJumpable) }, - //{ 0x01D57810, "_ZN9CLocalNav14FindDirectPathER6VectorS1_fi", mfunc_ptr_cast(&CLocalNav::FindDirectPath) }, + { 0x01D57810, "_ZN9CLocalNav14FindDirectPathER6VectorS1_fi", mfunc_ptr_cast(&CLocalNav::FindDirectPath) }, //{ 0x01D585C0, "_ZN9CLocalNav9LadderHitER6VectorS1_R11TraceResult", mfunc_ptr_cast(&CLocalNav::LadderHit) }, #endif // Hostage_Region @@ -5187,8 +5270,6 @@ VirtualTableRef g_TableRefs[] = { 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 }, @@ -5198,6 +5279,68 @@ VirtualTableRef g_TableRefs[] = { 0x01DF69B4, "CBot", 116 }, { 0x01DF61DC, "CCSBot", 116 }, { 0x01DF64F0, "CCSBotManager", 12 }, + { 0x01DF6C9C, "CHostage", 76 }, + { 0x01DFE4E4, "CSoundEnt", CBASE_VIRTUAL_COUNT }, + { 0x01E00D9C, "CCorpse", CBASE_VIRTUAL_COUNT }, + { 0x01E00CAC, "CDecal", CBASE_VIRTUAL_COUNT }, + { 0x01E00E8C, "CWorld", CBASE_VIRTUAL_COUNT }, + { 0x01DFE8D4, "CBaseGrenCatch", CBASE_VIRTUAL_COUNT }, + { 0x01DFE9C4, "CFuncWeaponCheck", CBASE_VIRTUAL_COUNT }, + { 0x01E00ACC, "CWeaponBox", CBASE_VIRTUAL_COUNT }, + { 0x01DF9F94, "CShower", CBASE_VIRTUAL_COUNT }, + { 0x01DFA084, "CEnvExplosion", 76 }, + { 0x01DFC79C, "CFuncMortarField", 59 }, + { 0x01DF7204, "CAirtank", 77 }, + { 0x01DFC88C, "CMortar", 77 }, + + { 0x01DF7344, "C9MMAmmo", 59 }, + { 0x01DF7434, "CBuckShotAmmo", 59 }, + { 0x01DF7524, "C556NatoAmmo", 59 }, + { 0x01DF7614, "C556NatoBoxAmmo", 59 }, + { 0x01DF7704, "C762NatoAmmo", 59 }, + { 0x01DF77F4, "C45ACPAmmo", 59 }, + { 0x01DF78E4, "C50AEAmmo", 59 }, + { 0x01DF79D4, "C338MagnumAmmo", 59 }, + { 0x01DF7AC4, "C57MMAmmo", 59 }, + { 0x01DF7BB4, "C357SIGAmmo", 59 }, + + // rules + { 0x01DFCBFC, "CGameRules", 63 }, + { 0x01DFE10C, "CHalfLifeRules", 63 }, + { 0x01DFCADC, "CHalfLifeMultiplay", 70 }, + { 0x01DFE7B4, "CHalfLifeTraining", 70 }, + { 0x01DFC9D4, "CMapInfo", 0 }, + + // effects + { 0x01DF8EAC, "CPointEntity", CBASE_VIRTUAL_COUNT }, + { 0x01DF8F9C, "CBubbling", CBASE_VIRTUAL_COUNT }, + { 0x01DF908C, "CBeam", CBASE_VIRTUAL_COUNT }, + { 0x01DF917C, "CLightning", CBASE_VIRTUAL_COUNT }, + { 0x01DF926C, "CLaser", CBASE_VIRTUAL_COUNT }, + { 0x01DF944C, "CGlow", CBASE_VIRTUAL_COUNT }, + { 0x01DF953C, "CBombGlow", CBASE_VIRTUAL_COUNT }, + { 0x01DF935C, "CSprite", CBASE_VIRTUAL_COUNT }, + { 0x01DF9634, "CGibShooter", 59 }, + { 0x01DF9724, "CEnvShooter", 59 }, + { 0x01DF9814, "CTestEffect", CBASE_VIRTUAL_COUNT }, + { 0x01DF9904, "CBlood", CBASE_VIRTUAL_COUNT }, + { 0x01DF99F4, "CShake", CBASE_VIRTUAL_COUNT }, + { 0x01DF9AE4, "CFade", CBASE_VIRTUAL_COUNT }, + { 0x01DF9BD4, "CMessage", CBASE_VIRTUAL_COUNT }, + { 0x01DF9CC4, "CEnvFunnel", CBASE_VIRTUAL_COUNT }, + { 0x01DF9DB4, "CEnvBeverage", CBASE_VIRTUAL_COUNT }, + { 0x01DF9EA4, "CItemSoda", CBASE_VIRTUAL_COUNT }, + + // tutor + { 0x01E00FA4, "CBaseTutor", 12 }, + { 0x01E00F9C, "TutorMessageEvent", 1 }, + { 0x01E01024, "CCSTutor", 12 }, + { 0x01E00FEC, "CCSTutorStateSystem", 4 }, + { 0x01E00F78, "CBaseTutorStateSystem", 4 }, + { 0x01E00F8C, "CBaseTutorState", 3 }, + { 0x01E00FDC, "CCSTutorUndefinedState", 3 }, + { 0x01E01000, "CCSTutorBuyMenuState", 3 }, + { 0x01E01010, "CCSTutorWaitingForStartState", 3 }, // Weapons vtable { 0x01DF5C6C, "CUSP", 95 }, @@ -5211,14 +5354,12 @@ 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 }, { 0x01D2EDD0, "_ZN6CCSBot16UpdateLookAnglesEv", (size_t)&pCCSBot__UpdateLookAngles }, { 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", (size_t)&pCCSBot__Update }, - { 0x01D68840, "_Z13ClientCommandP7edict_s", (size_t)&pClientCommand }, { 0x01D5B350, "_Z16QuaternionMatrixPfPA4_f", (size_t)&pQuaternionMatrix }, { 0x01DAD590, "_ZN11CBasePlayer27PickPrimaryCareerTaskWeaponEv", (size_t)&pCBasePlayer__PickPrimaryCareerTaskWeapon }, @@ -5226,10 +5367,11 @@ AddressRef g_FunctionRefs[] = { 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 }, + { 0x01D3A060, "_Z20DestroyNavigationMapv", (size_t)&pDestroyNavigationMap }, + { 0x01D80C90, "_Z16InstallGameRulesv", (size_t)&pInstallGameRules }, + { 0x01D4C450, "_ZN8CHostage9IdleThinkEv", (size_t)&pCHostage__IdleThink }, #endif // Function_References_Region @@ -5277,11 +5419,17 @@ AddressRef g_DataRefs[] = { 0x01E75EB8, "gMultiDamage", (size_t)&pgMultiDamage }, { 0x01E29880, "_ZL13s_iBeamSprite", (size_t)&ps_iBeamSprite }, { 0x01E29480, "_ZL8cosTable", (size_t)&pcosTable }, + + { 0x01E23AA8, "TutorIdentifierList", (size_t)&pTutorIdentifierList }, + { 0x01E23678, "_ZL19g_TutorStateStrings", (size_t)&pg_TutorStateStrings }, { 0x01E61E4C, "WorldGraph", (size_t)&pWorldGraph }, { 0x01E61B98, "g_pGameRules", (size_t)&pg_pGameRules }, { 0x01E62560, "g_pMPGameRules", (size_t)&pg_pMPGameRules }, { 0x01E61E70, "_ZL12mp_com_token", (size_t)&pmp_com_token }, + + { 0x01E636F0, "vec3_origin", (size_t)&pvec3_origin }, + { 0x01E1F420, "nanmask", (size_t)&pnanmask }, { 0x01E0B0B0, "_ZL15weaponAliasInfo", (size_t)&pweaponAliasInfo }, { 0x01E0B1E8, "_ZL18weaponBuyAliasInfo", (size_t)&pweaponBuyAliasInfo }, @@ -5305,6 +5453,8 @@ AddressRef g_DataRefs[] = { 0x01E67F88, "grgchTextureType", (size_t)&ppm_grgchTextureType }, { 0x01E68388, "pm_shared_initialized", (size_t)&ppm_shared_initialized }, { 0x01E63700, "rgv3tStuckTable", (size_t)&prgv3tStuckTable }, + { 0x01E63A88, "rgStuckLast", (size_t)&prgStuckLast }, + { 0x01E68394, "g_onladder", (size_t)&pg_onladder }, { 0x01E68390, "gcTextures", (size_t)&ppm_gcTextures }, @@ -5321,7 +5471,7 @@ AddressRef g_DataRefs[] = { 0x01E75CF8, "_ZL6glSeed", (size_t)&pglSeed }, { 0x01E21598, "seed_table", (size_t)&pseed_table }, { 0x01E21998, "gEntvarsDescription", (size_t)&pgEntvarsDescription }, - //{ 0x0, "gGlobalEntitySaveData", (size_t)&pgGlobalEntitySaveData }, + { 0x01E22DBC, "gGlobalEntitySaveData", (size_t)&pgGlobalEntitySaveData }, { 0x01E7656C, "g_pBodyQueueHead", (size_t)&pg_pBodyQueueHead }, { 0x01E76570, "gGlobalState", (size_t)&pgGlobalState }, { 0x01E22C50, "gDecals", (size_t)&pgDecals }, @@ -5571,18 +5721,20 @@ AddressRef g_DataRefs[] = { 0x01E2A3DC, "_ZN9CLocalNav4qptrE", mfunc_ptr_cast(&CLocalNav::pqptr) }, { 0x01E2A338, "_ZN9CLocalNav5queueE", mfunc_ptr_cast(&CLocalNav::pqueue) }, + { 0x01E287F8, "_ZL12navAreaCount", (size_t)&pnavAreaCount }, + { 0x01E287FC, "_ZL12currentIndex", (size_t)&pcurrentIndex }, + //{ 0x0, "_ZN10CBreakable13pSpawnObjectsE", mfunc_ptr_cast(&CBreakable::ppSpawnObjects) }, //{ 0x0, "_ZN10CBreakable11pSoundsWoodE", mfunc_ptr_cast(&CBreakable::ppSoundsWood) }, //{ 0x0, "_ZN10CBreakable12pSoundsFleshE", mfunc_ptr_cast(&CBreakable::ppSoundsFlesh) }, - //{ 0x0, "_ZN10CBreakable12pSoundsMetalE", mfunc_ptr_cast(&CBreakable::ppSoundsMetal) }, + //{ 0x0, "_ZN10CBreakable12pSoundsMetalE", mfunCBaseEntity::Savec_ptr_cast(&CBreakable::ppSoundsMetal) }, //{ 0x0, "_ZN10CBreakable15pSoundsConcreteE", mfunc_ptr_cast(&CBreakable::ppSoundsConcrete) }, //{ 0x0, "_ZN10CBreakable12pSoundsGlassE", mfunc_ptr_cast(&CBreakable::ppSoundsGlass) }, //{ 0x0, "_ZN9CPushable12m_soundNamesE", mfunc_ptr_cast(&CPushable::pm_soundNames) }, - { 0x01E1E00C, "_ZN8CDeadHEV9m_szPosesE", mfunc_ptr_cast(&CDeadHEV::pm_szPoses) }, { 0x01E1DD88, "_ZN11CBasePlayer16m_playerSaveDataE", mfunc_ptr_cast(&CBasePlayer::pm_playerSaveData) }, - //{ 0x01E14A68, "_ZN11CBaseEntity10m_SaveDataE", mfunc_ptr_cast(&CBaseEntity::pm_SaveData) }, - //{ 0x0, "_ZN12CGlobalState10m_SaveDataE", mfunc_ptr_cast(&CGlobalState::pm_SaveData) }, + { 0x01E14A68, "_ZN11CBaseEntity10m_SaveDataE", mfunc_ptr_cast(&CBaseEntity::pm_SaveData) }, + { 0x01E22DAC, "_ZN12CGlobalState10m_SaveDataE", mfunc_ptr_cast(&CGlobalState::pm_SaveData) }, //{ 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) }, @@ -5593,8 +5745,8 @@ AddressRef g_DataRefs[] = { 0x01E1BE38, "_ZN6CLight10m_SaveDataE", mfunc_ptr_cast(&CLight::pm_SaveData) }, { 0x01E1BB00, "_ZN11CWallHealth10m_SaveDataE", mfunc_ptr_cast(&CWallHealth::pm_SaveData) }, { 0x01E1B850, "_ZN9CRecharge10m_SaveDataE", mfunc_ptr_cast(&CRecharge::pm_SaveData) }, - //{ 0x0, "_ZN16CFuncMortarField10m_SaveDataE", mfunc_ptr_cast(&CFuncMortarField::pm_SaveData) }, - //{ 0x0, "_ZN13CEnvExplosion10m_SaveDataE", mfunc_ptr_cast(&CEnvExplosion::pm_SaveData) }, + { 0x01E1C248, "_ZN16CFuncMortarField10m_SaveDataE", mfunc_ptr_cast(&CFuncMortarField::pm_SaveData) }, + { 0x01E17A08, "_ZN13CEnvExplosion10m_SaveDataE", mfunc_ptr_cast(&CEnvExplosion::pm_SaveData) }, //{ 0x0, "_ZN13CFuncRotating10m_SaveDataE", mfunc_ptr_cast(&CFuncRotating::pm_SaveData) }, //{ 0x0, "_ZN9CPendulum10m_SaveDataE", mfunc_ptr_cast(&CPendulum::pm_SaveData) }, //{ 0x0, "_ZN9CBaseDoor10m_SaveDataE", mfunc_ptr_cast(&CBaseDoor::pm_SaveData) }, @@ -5618,9 +5770,9 @@ AddressRef g_DataRefs[] = //{ 0x0, "_ZN12CChangeLevel10m_SaveDataE", mfunc_ptr_cast(&CChangeLevel::pm_SaveData) }, //{ 0x0, "_ZN20CTriggerChangeTarget10m_SaveDataE", mfunc_ptr_cast(&CTriggerChangeTarget::pm_SaveData) }, //{ 0x0, "_ZN14CTriggerCamera10m_SaveDataE", mfunc_ptr_cast(&CTriggerCamera::pm_SaveData) }, - //{ 0x0, "_ZN16CFuncWeaponCheck10m_SaveDataE", mfunc_ptr_cast(&CFuncWeaponCheck::pm_SaveData) }, - //{ 0x0, "_ZN14CBaseGrenCatch10m_SaveDataE", mfunc_ptr_cast(&CBaseGrenCatch::pm_SaveData) }, - //{ 0x0, "_ZN8CAirtank10m_SaveDataE", mfunc_ptr_cast(&CAirtank::pm_SaveData) }, + { 0x01E208D8, "_ZN16CFuncWeaponCheck10m_SaveDataE", mfunc_ptr_cast(&CFuncWeaponCheck::pm_SaveData) }, + { 0x01E20888, "_ZN14CBaseGrenCatch10m_SaveDataE", mfunc_ptr_cast(&CBaseGrenCatch::pm_SaveData) }, + { 0x01E13228, "_ZN8CAirtank10m_SaveDataE", mfunc_ptr_cast(&CAirtank::pm_SaveData) }, //{ 0x0, "_ZN12CMultiSource10m_SaveDataE", mfunc_ptr_cast(&CMultiSource::pm_SaveData) }, { 0x01E20538, "_ZN10CBaseDelay10m_SaveDataE", mfunc_ptr_cast(&CBaseDelay::pm_SaveData) }, { 0x01E13438, "_ZN14CBaseAnimating10m_SaveDataE", mfunc_ptr_cast(&CBaseAnimating::pm_SaveData) }, @@ -5629,29 +5781,26 @@ AddressRef g_DataRefs[] = //{ 0x0, "_ZN15CAmbientGeneric10m_SaveDataE", mfunc_ptr_cast(&CAmbientGeneric::pm_SaveData) }, //{ 0x0, "_ZN9CEnvSound10m_SaveDataE", mfunc_ptr_cast(&CEnvSound::pm_SaveData) }, //{ 0x0, "_ZN8CSpeaker10m_SaveDataE", mfunc_ptr_cast(&CSpeaker::pm_SaveData) }, - //{ 0x0, "_ZN9CBubbling10m_SaveDataE", mfunc_ptr_cast(&CBubbling::pm_SaveData) }, - //{ 0x0, "_ZN10CLightning10m_SaveDataE", mfunc_ptr_cast(&CLightning::pm_SaveData) }, - //{ 0x0, "_ZN6CLaser10m_SaveDataE", mfunc_ptr_cast(&CLaser::pm_SaveData) }, - //{ 0x0, "_ZN5CGlow10m_SaveDataE", mfunc_ptr_cast(&CGlow::pm_SaveData) }, - //{ 0x0, "_ZN7CSprite10m_SaveDataE", mfunc_ptr_cast(&CSprite::pm_SaveData) }, - //{ 0x0, "_ZN11CGibShooter10m_SaveDataE", mfunc_ptr_cast(&CGibShooter::pm_SaveData) }, - //{ 0x01E227AC, "_ZN15CBasePlayerItem10m_SaveDataE", mfunc_ptr_cast(&CBasePlayerItem::pm_SaveData) }, - //{ 0x01E227E0, "_ZN17CBasePlayerWeapon10m_SaveDataE", mfunc_ptr_cast(&CBasePlayerWeapon::pm_SaveData) }, - //{ 0x0, "_ZN10CWeaponBox10m_SaveDataE", mfunc_ptr_cast(&CWeaponBox::pm_SaveData) }, + { 0x01E17258, "_ZN9CBubbling10m_SaveDataE", mfunc_ptr_cast(&CBubbling::pm_SaveData) }, + { 0x01E17288, "_ZN10CLightning10m_SaveDataE", mfunc_ptr_cast(&CLightning::pm_SaveData) }, + { 0x01E17358, "_ZN6CLaser10m_SaveDataE", mfunc_ptr_cast(&CLaser::pm_SaveData) }, + { 0x01E17388, "_ZN5CGlow10m_SaveDataE", mfunc_ptr_cast(&CGlow::pm_SaveData) }, + { 0x01E173A8, "_ZN7CSprite10m_SaveDataE", mfunc_ptr_cast(&CSprite::pm_SaveData) }, + { 0x01E173C8, "_ZN11CGibShooter10m_SaveDataE", mfunc_ptr_cast(&CGibShooter::pm_SaveData) }, + { 0x01E227AC, "_ZN15CBasePlayerItem10m_SaveDataE", mfunc_ptr_cast(&CBasePlayerItem::pm_SaveData) }, + { 0x01E227E0, "_ZN17CBasePlayerWeapon10m_SaveDataE", mfunc_ptr_cast(&CBasePlayerWeapon::pm_SaveData) }, + { 0x01E22850, "_ZN10CWeaponBox10m_SaveDataE", mfunc_ptr_cast(&CWeaponBox::pm_SaveData) }, //{ 0x0, "_ZN14CBasePlatTrain10m_SaveDataE", mfunc_ptr_cast(&CBasePlatTrain::pm_SaveData) }, //{ 0x0, "_ZN12CFuncPlatRot10m_SaveDataE", mfunc_ptr_cast(&CFuncPlatRot::pm_SaveData) }, //{ 0x0, "_ZN10CFuncTrain10m_SaveDataE", mfunc_ptr_cast(&CFuncTrain::pm_SaveData) }, //{ 0x0, "_ZN15CFuncTrackTrain10m_SaveDataE", mfunc_ptr_cast(&CFuncTrackTrain::pm_SaveData) }, //{ 0x0, "_ZN16CFuncTrackChange10m_SaveDataE", mfunc_ptr_cast(&CFuncTrackChange::pm_SaveData) }, //{ 0x0, "_ZN10CGunTarget10m_SaveDataE", mfunc_ptr_cast(&CGunTarget::pm_SaveData) }, - { 0x01E75FE0, "_ZN15CBasePlayerItem13ItemInfoArrayE", mfunc_ptr_cast(&CBasePlayerItem::pItemInfoArray) }, { 0x01E75ED8, "_ZN15CBasePlayerItem13AmmoInfoArrayE", mfunc_ptr_cast(&CBasePlayerItem::pAmmoInfoArray) }, - { 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) }, { 0x01E28815, "_ZN13CCSBotManager21m_isAnalysisRequestedE", mfunc_ptr_cast(&CCSBotManager::pm_isAnalysisRequested) }, @@ -5669,11 +5818,12 @@ AddressRef g_DataRefs[] = { 0x01E11EE4, "cv_hostage_debug", (size_t)&pcv_hostage_debug }, { 0x01E11EF8, "cv_hostage_stop", (size_t)&pcv_hostage_stop }, + //{ 0x0, "_ZL14placeDirectory", (size_t)&pplaceDirectory }, { 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 }, + { 0x01E5D6F0, "g_flTimeLimit", (size_t)&pg_flTimeLimit }, + { 0x01E5D6F4, "g_flResetTime", (size_t)&pg_flResetTime }, { 0x01E14C58, "g_bClientPrintEnable", (size_t)&pg_bClientPrintEnable }, { 0x01E5D6F8, "g_skipCareerInitialSpawn", (size_t)&pg_skipCareerInitialSpawn }, { 0x01E31768, "m_usResetDecals", (size_t)&pm_usResetDecals }, diff --git a/regamedll/hookers/memory.cpp b/regamedll/hookers/memory.cpp index 12846d23..43cad5e0 100644 --- a/regamedll/hookers/memory.cpp +++ b/regamedll/hookers/memory.cpp @@ -725,7 +725,7 @@ bool HIDDEN HookFunction(Module *module, FunctionHook *hook) *(size_t *)&patch[1] = hook->handlerFunc - hook->originalAddress - 5; patch[0] = 0xE9; -#if 1 +#if 0 if (strcmp(hook->symbolName,"_ZNK9BotPhrase12GetSpeakableEiPf")==0) { addr_orig = (void *)hook->originalAddress; @@ -856,25 +856,38 @@ void VirtualTableInit(void *ptr, const char *baseClass) } } -void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset) +void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset, bool bCreate) { - edict_t *pObject = CREATE_ENTITY(); + void *vtable; - void *addr = GetFunctionEntity(szClassName); + if (bCreate) + { + edict_t *pObject = CREATE_ENTITY(); + + void *addr = GetFunctionEntity(szClassName); - if (addr == NULL) - { - REMOVE_ENTITY(pObject); - return; + if (addr == NULL) + { + //can't create object. + printf2(__FUNCTION__ ":: Not found export function of binaries. Presumably looks '__declspec(dllexport) void %s(entvars_t *pev)'", szClassName); + REMOVE_ENTITY(pObject); + return; + } + + // call link to class GetClassPtr(pev); + reinterpret_cast(addr)(&pObject->v); + + vtable = *(void **)pObject->pvPrivateData; + } + else + { + VirtualTableRef *refsVtbl = GetVirtualTableRefAddr(szClassName); + vtable = (void *)refsVtbl->originalAddress; } - // 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 +#endif // _WIN32 && REGAMEDLL_UNIT_TESTS diff --git a/regamedll/hookers/memory.h b/regamedll/hookers/memory.h index 4d07df27..dfe45492 100644 --- a/regamedll/hookers/memory.h +++ b/regamedll/hookers/memory.h @@ -148,7 +148,7 @@ void FindAllCalls(Section* section, CFuncAddr** calls, uint32_t findRefsTo); const char *stripClass(const char *str); void VirtualTableInit(void *ptr, const char *baseClass = NULL); -void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset = 0); +void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset = 0, bool bCreate = true); #endif // _WIN32 && REGAMEDLL_UNIT_TESTS diff --git a/regamedll/msvc/ReGameDLL.vcxproj b/regamedll/msvc/ReGameDLL.vcxproj index 9c6f69af..fbf6b4fe 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj +++ b/regamedll/msvc/ReGameDLL.vcxproj @@ -593,6 +593,7 @@ + @@ -612,6 +613,7 @@ + diff --git a/regamedll/msvc/ReGameDLL.vcxproj.filters b/regamedll/msvc/ReGameDLL.vcxproj.filters index 34b10cda..be82d34a 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj.filters +++ b/regamedll/msvc/ReGameDLL.vcxproj.filters @@ -1112,6 +1112,12 @@ dlls + + dlls + + + dlls + diff --git a/regamedll/pm_shared/pm_defs.h b/regamedll/pm_shared/pm_defs.h index 82b196be..ace98ac9 100644 --- a/regamedll/pm_shared/pm_defs.h +++ b/regamedll/pm_shared/pm_defs.h @@ -131,7 +131,7 @@ typedef struct playermove_s int deadflag; int spectator; // Should we use spectator physics model? int movetype; // Our movement type, NOCLIP, WALK, FLY - int onground; + int onground; // -1 = in air, else pmove entity number int waterlevel; int watertype; int oldwaterlevel; diff --git a/regamedll/pm_shared/pm_math.cpp b/regamedll/pm_shared/pm_math.cpp index 4dfec297..c437337d 100644 --- a/regamedll/pm_shared/pm_math.cpp +++ b/regamedll/pm_shared/pm_math.cpp @@ -1,5 +1,20 @@ #include "precompiled.h" +/* +* Globals initialization +*/ +#ifndef HOOK_GAMEDLL + +vec3_t vec3_origin = {0, 0, 0}; +int nanmask = 255<<23; + +#else + +vec3_t vec3_origin; +int nanmask; + +#endif // HOOK_GAMEDLL + /* <2ce436> ../cstrike/pm_shared/pm_math.c:35 */ NOBODY float anglemod(float a) { @@ -152,18 +167,21 @@ int VectorCompare(const vec_t *v1, const vec_t *v2) } /* <2ce9de> ../cstrike/pm_shared/pm_math.c:270 */ -NOBODY void VectorMA(const vec_t *veca, float scale, const vec_t *vecb, vec_t *vecc) +void VectorMA(const vec_t *veca, float scale, const vec_t *vecb, vec_t *vecc) { + vecc[0] = veca[0] + scale * vecb[0]; + vecc[1] = veca[1] + scale * vecb[1]; + vecc[2] = veca[2] + scale * vecb[2]; } /* <2cea34> ../cstrike/pm_shared/pm_math.c:278 */ -NOXREF vec_t _DotProduct(vec_t *v1, vec_t *v2) +float_precision _DotProduct(vec_t *v1, vec_t *v2) { return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; } /* <2cea6e> ../cstrike/pm_shared/pm_math.c:283 */ -NOXREF void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out) +void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out) { out[0] = veca[0] - vecb[0]; out[1] = veca[1] - vecb[1]; @@ -171,7 +189,7 @@ NOXREF void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out) } /* <2ceab5> ../cstrike/pm_shared/pm_math.c:290 */ -NOXREF void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out) +void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out) { out[0] = veca[0] + vecb[0]; out[1] = veca[1] + vecb[1]; @@ -179,7 +197,7 @@ NOXREF void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out) } /* <2ceafc> ../cstrike/pm_shared/pm_math.c:297 */ -NOXREF void _VectorCopy(vec_t *in, vec_t *out) +void _VectorCopy(vec_t *in, vec_t *out) { out[0] = in[0]; out[1] = in[1]; @@ -187,7 +205,7 @@ NOXREF void _VectorCopy(vec_t *in, vec_t *out) } /* <2ceb8d> ../cstrike/pm_shared/pm_math.c:307 */ -NOXREF void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross) +void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross) { cross[0] = v1[1] * v2[2] - v1[2] * v2[1]; cross[1] = v1[2] * v2[0] - v1[0] * v2[2]; @@ -195,10 +213,10 @@ NOXREF void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross) } /* <2ce85f> ../cstrike/pm_shared/pm_math.c:313 */ -float Length(const vec_t *v) +float_precision Length(const vec_t *v) { int i; - float length = 0.0f; + float_precision length = 0.0f; for (i = 0; i < 3; i++) length += v[i] * v[i]; diff --git a/regamedll/pm_shared/pm_math.h b/regamedll/pm_shared/pm_math.h index c4dc2c2b..63d4be33 100644 --- a/regamedll/pm_shared/pm_math.h +++ b/regamedll/pm_shared/pm_math.h @@ -36,11 +36,20 @@ #define YAW 1 // left/right #define ROLL 2 // fall over +#ifdef HOOK_GAMEDLL + +#define vec3_origin (*pvec3_origin) +#define nanmask (*pnanmask) + +#endif // HOOK_GAMEDLL + +extern vec3_t vec3_origin; +extern int nanmask; + +#define IS_NAN(x) ((*reinterpret_cast(&(x)) & nanmask) == nanmask) + NOBODY float anglemod(float a); -void AngleVectors3(const vec_t *angles, vec_t *forward, vec_t *right, vec_t *up); void AngleVectors(const vec_t *angles, vec_t *forward, vec_t *right, vec_t *up); - - NOBODY void AngleVectorsTranspose(const vec_t *angles, vec_t *forward, vec_t *right, vec_t *up); void AngleMatrix(const vec_t *angles, float (*matrix)[4]); NOBODY void AngleIMatrix(const vec_t *angles, float (*matrix)[4]); @@ -49,15 +58,15 @@ NOBODY void InterpolateAngles(float *start, float *end, float *output, float fra NOBODY float AngleBetweenVectors(const vec_t *v1, const vec_t *v2); NOBODY void VectorTransform(const vec_t *in1, float *in2, vec_t *out); int VectorCompare(const vec_t *v1, const vec_t *v2); -NOBODY void VectorMA(const vec_t *veca, float scale, const vec_t *vecb, vec_t *vecc); +void VectorMA(const vec_t *veca, float scale, const vec_t *vecb, vec_t *vecc); -NOXREF vec_t _DotProduct(vec_t *v1, vec_t *v2); -NOXREF void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out); -NOXREF void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out); -NOXREF void _VectorCopy(vec_t *in, vec_t *out); -NOXREF void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross); +float_precision _DotProduct(vec_t *v1, vec_t *v2); +void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out); +void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out); +void _VectorCopy(vec_t *in, vec_t *out); +void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross); -float Length(const vec_t *v); +float_precision Length(const vec_t *v); NOBODY float Distance(const vec_t *v1, const vec_t *v2); float_precision VectorNormalize(vec_t *v); diff --git a/regamedll/pm_shared/pm_shared.cpp b/regamedll/pm_shared/pm_shared.cpp index ea4753b3..e3337da6 100644 --- a/regamedll/pm_shared/pm_shared.cpp +++ b/regamedll/pm_shared/pm_shared.cpp @@ -1,40 +1,62 @@ #include "precompiled.h" +#define WJ_HEIGHT 8 +#define STOP_EPSILON 0.1 +#define MAX_CLIMB_SPEED 200 +#define PLAYER_DUCKING_MULTIPLIER 0.333 +#define PM_CHECKSTUCK_MINTIME 0.05 // Don't check again too quickly. + +// Ducking time +#define TIME_TO_DUCK 0.4 +#define STUCK_MOVEUP 1 + +#define PM_VEC_DUCK_HULL_MIN -18 +#define PM_VEC_HULL_MIN -36 +#define PM_VEC_DUCK_VIEW 12 +#define PM_VEC_VIEW 17 + +#define PM_PLAYER_MAX_SAFE_FALL_SPEED 580 // approx 20 feet +#define PM_PLAYER_MIN_BOUNCE_SPEED 350 +#define PM_PLAYER_FALL_PUNCH_THRESHHOLD 250 // won't punch player's screen/make scrape noise unless player falling at least this fast. + +// Only allow bunny jumping up to 1.2x server / player maxspeed setting +#define BUNNYJUMP_MAX_SPEED_FACTOR 1.2f + /* * Globals initialization */ #ifndef HOOK_GAMEDLL -//static int pm_shared_initialized = 0; +static int pm_shared_initialized = 0; -//static vec_t rgv3tStuckTable[54][3]; -//static int rgStuckLast[32][2]; +static vec_t rgv3tStuckTable[54][3]; +static int rgStuckLast[MAX_CLIENTS][2]; -//static int pm_gcTextures = 0; // TODO: var names without pm_* -//static char pm_grgszTextureName[1024][17]; -//static char pm_grgchTextureType[1024]; +static int pm_gcTextures = 0; +static char pm_grgszTextureName[1024][17]; +static char pm_grgchTextureType[1024]; -//playermove_t *pmove = NULL; -//int g_onladder = 0; +playermove_t *pmove = NULL; +int g_onladder = 0; #else // HOOK_GAMEDLL int pm_shared_initialized; vec3_t rgv3tStuckTable[54]; -//int rgStuckLast[32][2]; +int rgStuckLast[MAX_CLIENTS][2]; int pm_gcTextures; -char pm_grgszTextureName[ CTEXTURESMAX ][ CBTEXTURENAMEMAX ]; -char pm_grgchTextureType[ CTEXTURESMAX ]; +char pm_grgszTextureName[CTEXTURESMAX][CBTEXTURENAMEMAX]; +char pm_grgchTextureType[CTEXTURESMAX]; playermove_t *pmove; -//int g_onladder; +int g_onladder; #endif // HOOK_GAMEDLL /* <2cc613> ../cstrike/pm_shared/pm_shared.c:165 */ -NOXREF void PM_SwapTextures(int i, int j) +void PM_SwapTextures(int i, int j) { char chTemp; char szTemp[CBTEXTURENAMEMAX]; @@ -59,20 +81,25 @@ NOXREF int PM_IsThereGrassTexture(void) if (pm_grgchTextureType[i] == CHAR_TEX_GRASS) return 1; } + return 0; } /* <2cc6bb> ../cstrike/pm_shared/pm_shared.c:193 */ -NOXREF void PM_SortTextures(void) +void PM_SortTextures(void) { + // Bubble sort, yuck, but this only occurs at startup and it's only 512 elements... int i, j; - for (i = 0 ; i < pm_gcTextures; i++) + for (i = 0; i < pm_gcTextures; i++) { for (j = i + 1; j < pm_gcTextures; j++) { if (Q_stricmp(pm_grgszTextureName[i], pm_grgszTextureName[j]) > 0) + { + // Swap PM_SwapTextures(i, j); + } } } } @@ -102,57 +129,63 @@ void PM_InitTextureTypes(void) return; filePos = 0; - - while (pmove->memfgets(pMemFile, fileSize, &filePos, buffer, 511) != NULL && (pm_gcTextures < CTEXTURESMAX)) + // for each line in the file... + while (pmove->memfgets(pMemFile, fileSize, &filePos, buffer, sizeof(buffer) - 1) != NULL && (pm_gcTextures < CTEXTURESMAX)) { + // skip whitespace i = 0; - while (buffer[i] && isspace(buffer[i])) i++; if (!buffer[i]) continue; + // skip comment lines if (buffer[i] == '/' || !isalpha(buffer[i])) continue; + // get texture type pm_grgchTextureType[pm_gcTextures] = toupper(buffer[i++]); + // skip whitespace while (buffer[i] && isspace(buffer[i])) i++; if (!buffer[i]) continue; + // get sentence name j = i; - while (buffer[j] && !isspace(buffer[j])) j++; if (!buffer[j]) continue; - j = min (j, CBTEXTURENAMEMAX - 1 + i); - buffer[j] = 0; + // null-terminate name and save in sentences array + j = _min(j, CBTEXTURENAMEMAX - 1 + i); + buffer[j] = '\0'; + Q_strcpy(&(pm_grgszTextureName[pm_gcTextures++][0]), &(buffer[i])); } + // Must use engine to free since we are in a .dll pmove->COM_FreeFile(pMemFile); PM_SortTextures(); - bTextureTypeInit = true; } /* <2cc7c5> ../cstrike/pm_shared/pm_shared.c:283 */ char PM_FindTextureType(char *name) { - int left = 0; - int right = pm_gcTextures - 1; - int pivot; + int left, right, pivot; int val; - assert( pm_shared_initialized ); + assert(pm_shared_initialized); + + left = 0; + right = gcTextures - 1; while (left <= right) { @@ -161,13 +194,17 @@ char PM_FindTextureType(char *name) val = Q_strnicmp(name, pm_grgszTextureName[pivot], CBTEXTURENAMEMAX - 1); if (val == 0) + { return pm_grgchTextureType[pivot]; - + } else if (val > 0) + { left = pivot + 1; - + } else if (val < 0) + { right = pivot - 1; + } } return CHAR_TEX_CONCRETE; @@ -178,251 +215,169 @@ void PM_PlayStepSound(int step, float fvol) { static int iSkipStep = 0; int irand; - //vec3_t hvel;//unused? - pmove->iStepLeft = pmove->iStepLeft == 0; + pmove->iStepLeft = !pmove->iStepLeft; if (!pmove->runfuncs) - return; + { + return; + } irand = pmove->RandomLong(0, 1) + (pmove->iStepLeft * 2); + // FIXME mp_footsteps needs to be a movevar if (pmove->multiplayer && !pmove->movevars->footsteps) return; + // irand - 0,1 for right foot, 2,3 for left foot + // used to alternate left and right foot + // FIXME, move to player state switch (step) { - default: - case STEP_CONCRETE: + default: + case STEP_CONCRETE: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_step1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_step3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_step2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_step4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_step1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_step3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_step2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_step4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_METAL: + break; + case STEP_METAL: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_metal4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_DIRT: + break; + case STEP_DIRT: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_dirt4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_VENT: - { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + break; + case STEP_VENT: + switch (irand) + { + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_GRATE: + break; + case STEP_GRATE: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_grate4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_TILE: - { - if (!pmove->RandomLong(0, 4)) - irand = 4; + break; + case STEP_TILE: + if (!pmove->RandomLong(0, 4)) + irand = 4; - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 4: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile5.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; - } - case STEP_SLOSH: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 4: pmove->PM_PlaySound(CHAN_BODY, "player/pl_tile5.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_WADE: + break; + case STEP_SLOSH: + switch (irand) { - if (iSkipStep) - { - if (iSkipStep++ == 3) - iSkipStep = 0; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_slosh4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + } + break; + case STEP_WADE: + if (iSkipStep == 0) + { + iSkipStep++; + break; + } - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - } - else - iSkipStep++; + if (iSkipStep++ == 3) + { + iSkipStep = 0; + } - break; - } - case STEP_LADDER: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } - case STEP_SNOW: + + break; + case STEP_LADDER: + switch (irand) { - switch (irand) - { - case 0: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 1: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 2: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - case 3: - pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); - break; - } - break; + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_ladder4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; } + break; + case STEP_SNOW: + switch (irand) + { + // right foot + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow1.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow3.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + // left foot + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow2.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_snow4.wav", fvol, ATTN_NORM, 0, PITCH_NORM); break; + } + break; } } /* <2cc462> ../cstrike/pm_shared/pm_shared.c:489 */ -NOXREF int PM_MapTextureTypeStepType(char chTextureType) +int PM_MapTextureTypeStepType(char chTextureType) { switch (chTextureType) { - default: - case CHAR_TEX_CONCRETE: - return STEP_CONCRETE; - case CHAR_TEX_METAL: - return STEP_METAL; - case CHAR_TEX_DIRT: - return STEP_DIRT; - case CHAR_TEX_VENT: - return STEP_VENT; - case CHAR_TEX_GRATE: - return STEP_GRATE; - case CHAR_TEX_TILE: - return STEP_TILE; - case CHAR_TEX_SLOSH: - return STEP_SLOSH; - case CHAR_TEX_SNOW: - return STEP_SNOW; + default: + case CHAR_TEX_CONCRETE: return STEP_CONCRETE; + case CHAR_TEX_METAL: return STEP_METAL; + case CHAR_TEX_DIRT: return STEP_DIRT; + case CHAR_TEX_VENT: return STEP_VENT; + case CHAR_TEX_GRATE: return STEP_GRATE; + case CHAR_TEX_TILE: return STEP_TILE; + case CHAR_TEX_SLOSH: return STEP_SLOSH; + case CHAR_TEX_SNOW: return STEP_SNOW; } } @@ -435,8 +390,10 @@ void PM_CatagorizeTextureType(void) VectorCopy(pmove->origin, start); VectorCopy(pmove->origin, end); + // Straight down end[2] -= 64.0f; + // Fill in default values, just in case. pmove->sztexturename[0] = '\0'; pmove->chtexturetype = CHAR_TEX_CONCRETE; @@ -445,6 +402,7 @@ void PM_CatagorizeTextureType(void) if (!pTextureName) return; + // strip leading '-0' or '+0~' or '{' or '!' if (*pTextureName == '-' || *pTextureName == '+') pTextureName += 2; @@ -454,6 +412,7 @@ void PM_CatagorizeTextureType(void) Q_strcpy(pmove->sztexturename, pTextureName); pmove->sztexturename[CBTEXTURENAMEMAX - 1] = 0; + // get texture type pmove->chtexturetype = PM_FindTextureType(pmove->sztexturename); } @@ -468,6 +427,7 @@ void PM_UpdateStepSound(void) float speed; int fLadder; int step; + int onground; if (pmove->flTimeStepSound > 0) return; @@ -483,9 +443,14 @@ void PM_UpdateStepSound(void) return; } + // determine if we are on a ladder fLadder = (pmove->movetype == MOVETYPE_FLY); - if (fLadder || pmove->onground != -1) + // determine if we are not in air + onground = (pmove->onground != -1); + + // If we're on a ladder or on the ground play step sound. + if (fLadder || onground) { PM_CatagorizeTextureType(); @@ -498,6 +463,7 @@ void PM_UpdateStepSound(void) knee[2] = pmove->origin[2] - 0.3 * height; feet[2] = pmove->origin[2] - 0.5 * height; + // find out what we're stepping in or on... if (fLadder) { step = STEP_LADDER; @@ -518,546 +484,2253 @@ void PM_UpdateStepSound(void) } else { + // find texture under player, if different from current texture, + // get material type step = PM_MapTextureTypeStepType(pmove->chtexturetype); + switch (pmove->chtexturetype) { - case CHAR_TEX_DIRT: - { - fvol = 0.55; - break; - } - case CHAR_TEX_VENT: - { - fvol = 0.7; - break; - } - default: - { - fvol = 0.5; - break; - } + default: + case CHAR_TEX_CONCRETE: + fvol = 0.5; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_METAL: + fvol = 0.5; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_DIRT: + fvol = 0.55; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_VENT: + fvol = 0.7; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_GRATE: + fvol = 0.5; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_TILE: + fvol = 0.5; + pmove->flTimeStepSound = 300; + break; + + case CHAR_TEX_SLOSH: + fvol = 0.5; + pmove->flTimeStepSound = 300; + break; } - pmove->flTimeStepSound = 300; } + if (pmove->flags & FL_DUCKING || fLadder) { - pmove->flTimeStepSound += 100; + pmove->flTimeStepSound += 100; // slower step time if ducking + // play the sound + // 35% volume if ducking if (pmove->flags & FL_DUCKING && pmove->flDuckTime < 950.0) + { fvol *= 0.35; + } } + PM_PlayStepSound(step, fvol); } } +// Add's the trace result to touch list, if contact is not already in list. + /* <2cca3d> ../cstrike/pm_shared/pm_shared.c:679 */ -NOBODY qboolean PM_AddToTouched(pmtrace_t tr, vec3_t impactvelocity) +qboolean PM_AddToTouched(pmtrace_t tr, vec_t *impactvelocity) { -// int i; // 681 + int i; + for (i = 0; i < pmove->numtouch; i++) + { + if (pmove->touchindex[i].ent == tr.ent) + break; + } + + // Already in list. + if (i != pmove->numtouch) + { + return false; + } + + VectorCopy(impactvelocity, tr.deltavelocity); + + if (pmove->numtouch >= MAX_PHYSENTS) + { + pmove->Con_DPrintf("Too many entities were touched!\n"); + } + + pmove->touchindex[pmove->numtouch++] = tr; + return true; } /* <2cca88> ../cstrike/pm_shared/pm_shared.c:707 */ -NOBODY void PM_CheckVelocity(void) +void PM_CheckVelocity(void) { -// int i; // 709 + int i; + + // bound velocity + for (i = 0; i < 3; i++) + { + // See if it's bogus. + if (IS_NAN(pmove->velocity[i])) + { + pmove->Con_Printf("PM Got a NaN velocity %i\n", i); + pmove->velocity[i] = 0; + } + + if (IS_NAN(pmove->origin[i])) + { + pmove->Con_Printf("PM Got a NaN origin on %i\n", i); + pmove->origin[i] = 0; + } + + // Bound it. + if (pmove->velocity[i] > pmove->movevars->maxvelocity) + { + pmove->Con_DPrintf("PM Got a velocity too high on %i\n", i); + pmove->velocity[i] = pmove->movevars->maxvelocity; + } + else if (pmove->velocity[i] < -pmove->movevars->maxvelocity) + { + pmove->Con_DPrintf("PM Got a velocity too low on %i\n", i); + pmove->velocity[i] = -pmove->movevars->maxvelocity; + } + } } +// Slide off of the impacting object +// returns the blocked flags: +// 0x01 == floor +// 0x02 == step / wall + /* <2ccbe9> ../cstrike/pm_shared/pm_shared.c:752 */ -NOBODY int PM_ClipVelocity(vec3_t in, vec3_t normal, vec3_t out, float overbounce) -{ -// float backoff; // 754 -// float change; // 755 -// float angle; // 756 -// int i; // 757 -// int blocked; // 757 +int PM_ClipVelocity(vec_t *in, vec_t *normal, vec_t *out, float overbounce) +{ + float change; + float_precision angle; + float_precision backoff; + int i, blocked; + + angle = normal[2]; + + // Assume unblocked. + blocked = 0x00; + + // If the plane that is blocking us has a positive z component, then assume it's a floor. + if (angle > 0) + { + blocked |= 0x01; + } + + // If the plane has no Z, it is vertical (wall/step) + if (!angle) + { + blocked |= 0x02; + } + + // Determine how far along plane to slide based on incoming direction. + // Scale by overbounce factor. + backoff = DotProduct(in, normal) * overbounce; + + for (i = 0; i < 3; i++) + { + change = in[i] - normal[i] * backoff; + out[i] = change; + + // If out velocity is too small, zero it out. + if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON) + { + out[i] = 0; + } + } + + // Return blocking flags. + return blocked; } /* <2ccc93> ../cstrike/pm_shared/pm_shared.c:784 */ -NOBODY void PM_AddCorrectGravity(void) +void PM_AddCorrectGravity(void) { -// float ent_gravity; // 786 + float_precision ent_gravity; + + if (pmove->waterjumptime) + return; + + if (pmove->gravity != 0.0f) + ent_gravity = pmove->gravity; + else + ent_gravity = 1.0f; + + // Add gravity so they'll be in the correct position during movement + // yes, this 0.5 looks wrong, but it's not. + pmove->velocity[2] -= (ent_gravity * pmove->movevars->gravity * 0.5f * pmove->frametime); + pmove->velocity[2] += pmove->basevelocity[2] * pmove->frametime; + + pmove->basevelocity[2] = 0; + + PM_CheckVelocity(); } /* <2cc482> ../cstrike/pm_shared/pm_shared.c:806 */ -NOBODY void PM_FixupGravityVelocity(void) +void PM_FixupGravityVelocity(void) { -// float ent_gravity; // 808 + float_precision ent_gravity; + + if (pmove->waterjumptime) + return; + + if (pmove->gravity != 0.0) + ent_gravity = pmove->gravity; + else + ent_gravity = 1.0; + + // Get the correct velocity for the end of the dt + pmove->velocity[2] -= (pmove->movevars->gravity * pmove->frametime * ent_gravity * 0.5); + PM_CheckVelocity(); } /* <2ccd08> ../cstrike/pm_shared/pm_shared.c:831 */ -NOBODY int PM_FlyMove(void) +int PM_FlyMove(void) { -// int bumpcount; // 833 -// int numbumps; // 833 -// vec3_t dir; // 834 -// float d; // 835 -// int numplanes; // 836 -// vec_t planes; // 837 -// vec3_t primal_velocity; // 838 -// vec3_t original_velocity; // 838 -// vec3_t new_velocity; // 839 -// int i; // 840 -// int j; // 840 -// pmtrace_t trace; // 841 -// vec3_t end; // 842 -// float time_left; // 843 -// float allFraction; // 843 -// int blocked; // 844 + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[MAX_CLIP_PLANES]; + vec3_t primal_velocity, original_velocity; + vec3_t new_velocity; + int i, j; + pmtrace_t trace; + vec3_t end; + float time_left, allFraction; + int blocked; + + numbumps = 4; // Bump up to four times + blocked = 0x00; // Assume not blocked + numplanes = 0; // and not sliding along any planes + + VectorCopy(pmove->velocity, original_velocity); // Store original velocity + VectorCopy(pmove->velocity, primal_velocity); + + allFraction = 0; + time_left = pmove->frametime; // Total time for this movement operation. + + for (bumpcount = 0; bumpcount < numbumps; bumpcount++) + { + if (!pmove->velocity[0] && !pmove->velocity[1] && !pmove->velocity[2]) + break; + + // Assume we can move all the way from the current origin to the + // end point. + for (i = 0; i < 3; i++) + { + float_precision flScale = time_left * pmove->velocity[i]; + + end[i] = pmove->origin[i] + flScale; + } + + // See if we can make it from origin to end point. + trace = pmove->PM_PlayerTrace(pmove->origin, end, PM_NORMAL, -1); + + allFraction += trace.fraction; + + // If we started in a solid object, or we were in solid space + // the whole way, zero out our velocity and return that we + // are blocked by floor and wall. + if (trace.allsolid) + { + // entity is trapped in another solid + VectorCopy(vec3_origin, pmove->velocity); + return 4; + } + + // If we moved some portion of the total distance, then + // copy the end position into the pmove->origin and + // zero the plane counter. + if (trace.fraction > 0.0f) + { + // actually covered some distance + VectorCopy(trace.endpos, pmove->origin); + VectorCopy(pmove->velocity, original_velocity); + + numplanes = 0; + } + + // If we covered the entire distance, we are done + // and can return. + if (trace.fraction == 1.0f) + { + // moved the entire distance + break; + } + + // Save entity that blocked us (since fraction was < 1.0) + // for contact + // Add it if it's not already in the list!!! + PM_AddToTouched(trace, pmove->velocity); + + // If the plane we hit has a high z component in the normal, then + // it's probably a floor + if (trace.plane.normal[2] > 0.7f) + { + // floor + blocked |= 0x01; + } + + // If the plane has a zero z component in the normal, then it's a + // step or wall + if (!trace.plane.normal[2]) + { + // step / wall + blocked |= 0x02; + } + + // Reduce amount of pmove->frametime left by total time left * fraction + // that we covered. + time_left -= time_left * trace.fraction; + + // Did we run out of planes to clip against? + if (numplanes >= MAX_CLIP_PLANES) + { + // this shouldn't really happen + // Stop our movement if so. + VectorCopy(vec3_origin, pmove->velocity); + break; + } + + // Set up next clipping plane + VectorCopy(trace.plane.normal, planes[numplanes]); + numplanes++; + + // modify original_velocity so it parallels all of the clip planes + // relfect player velocity + if (numplanes == 1 && pmove->movetype == MOVETYPE_WALK && (pmove->onground == -1 || pmove->friction != 1)) + { + for (i = 0; i < numplanes; i++) + { + if (planes[i][2] > 0.7f) + { + // floor or slope + PM_ClipVelocity(original_velocity, planes[i], new_velocity, 1); + VectorCopy(new_velocity, original_velocity); + } + else + PM_ClipVelocity(original_velocity, planes[i], new_velocity, 1.0 + pmove->movevars->bounce * (1.0 - pmove->friction)); + } + + VectorCopy(new_velocity, pmove->velocity); + VectorCopy(new_velocity, original_velocity); + } + else + { + for (i = 0; i < numplanes; i++) + { + PM_ClipVelocity(original_velocity, planes[i], pmove->velocity, 1); + + for (j = 0; j < numplanes; j++) + { + if (j != i && DotProduct(pmove->velocity, planes[j]) < 0) + { + break; + } + } + + if (j == numplanes) + break; + } + + if (i == numplanes) + { + if (numplanes != 2) + { + VectorCopy(vec3_origin, pmove->velocity); + break; + } + + _CrossProduct(planes[0], planes[1], dir); + d = DotProduct(dir, pmove->velocity); + VectorScale(dir, d, pmove->velocity); + } + + if (DotProduct(pmove->velocity, primal_velocity) <= 0) + { + VectorCopy(vec3_origin, pmove->velocity); + break; + } + } + } + + if (allFraction == 0.0f) + { + VectorCopy(vec3_origin, pmove->velocity); + } + + return blocked; } /* <2cce2e> ../cstrike/pm_shared/pm_shared.c:1027 */ -NOBODY void PM_Accelerate(vec3_t wishdir, float wishspeed, float accel) +void PM_Accelerate(vec_t *wishdir, float_precision wishspeed, float accel) { -// int i; // 1029 -// float addspeed; // 1030 -// float accelspeed; // 1030 -// float currentspeed; // 1030 + int i; + float addspeed; + + float_precision currentspeed; + float_precision accelspeed; + + // Dead player's don't accelerate + if (pmove->dead) + return; + + // If waterjumping, don't accelerate + if (pmove->waterjumptime) + return; + + // See if we are changing direction a bit + currentspeed = DotProduct(pmove->velocity, wishdir); + + // Reduce wishspeed by the amount of veer. + addspeed = wishspeed - currentspeed; + + // If not going to add any speed, done. + if (addspeed <= 0) + return; + + // Determine amount of accleration. + accelspeed = accel * pmove->frametime * wishspeed * pmove->friction; + + // Cap at addspeed + if (accelspeed > addspeed) + accelspeed = addspeed; + + // Adjust velocity. + for (i = 0; i < 3; i++) + { + pmove->velocity[i] += accelspeed * wishdir[i]; + } } +// Only used by players. Moves along the ground when player is a MOVETYPE_WALK. + /* <2cceaf> ../cstrike/pm_shared/pm_shared.c:1071 */ -NOBODY void PM_WalkMove(void) +void PM_WalkMove(void) { -// int clip; // 1073 -// int oldonground; // 1074 -// int i; // 1075 -// vec3_t wishvel; // 1077 -// float spd; // 1078 -// float fmove; // 1079 -// float smove; // 1079 -// vec3_t wishdir; // 1080 -// float wishspeed; // 1081 -// vec3_t dest; // 1083 -// vec3_t start; // 1083 -// vec3_t original; // 1084 -// vec3_t originalvel; // 1084 -// vec3_t down; // 1085 -// vec3_t downvel; // 1085 -// float downdist; // 1086 -// float updist; // 1086 -// pmtrace_t trace; // 1088 -// -//usedown: // 1234 -// { -// float flRatio; // 1092 -// } + int clip; + int oldonground; + int i; + + vec3_t wishvel; + float_precision spd; + float fmove, smove; + vec3_t wishdir; + float_precision wishspeed; + + //vec3_t start; // TODO: unused + vec3_t dest; + vec3_t original, originalvel; + vec3_t down, downvel; + float downdist, updist; + + pmtrace_t trace; + + if (pmove->fuser2 > 0.0) + { + float_precision flRatio = (100 - pmove->fuser2 * 0.001 * 19) * 0.01; + + pmove->velocity[0] *= flRatio; + pmove->velocity[1] *= flRatio; + } + + // Copy movement amounts + fmove = pmove->cmd.forwardmove; + smove = pmove->cmd.sidemove; + + // Zero out z components of movement vectors + pmove->forward[2] = 0; + pmove->right[2] = 0; + + // Normalize remainder of vectors. + VectorNormalize(pmove->forward); + VectorNormalize(pmove->right); + + // Determine x and y parts of velocity + for (i = 0; i < 2; i++) + { + wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove; + } + + // Zero out z part of velocity + wishvel[2] = 0; + + // Determine maginitude of speed of move + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + // Clamp to server defined max speed + if (wishspeed > pmove->maxspeed) + { + VectorScale(wishvel, pmove->maxspeed / wishspeed, wishvel); + wishspeed = pmove->maxspeed; + } + + // Set pmove velocity + pmove->velocity[2] = 0; + PM_Accelerate(wishdir, wishspeed, pmove->movevars->accelerate); + pmove->velocity[2] = 0; + + // Add in any base velocity to the current velocity. + VectorAdd(pmove->velocity, pmove->basevelocity, pmove->velocity); + + spd = Length(pmove->velocity); + + if (spd < 1.0) + { + VectorClear(pmove->velocity); + return; + } + + // If we are not moving, do nothing + //if (!pmove->velocity[0] && !pmove->velocity[1] && !pmove->velocity[2]) + // return; + + oldonground = pmove->onground; + + // first try just moving to the destination + dest[0] = pmove->origin[0] + pmove->velocity[0] * pmove->frametime; + dest[1] = pmove->origin[1] + pmove->velocity[1] * pmove->frametime; + dest[2] = pmove->origin[2]; + + // first try moving directly to the next spot + // VectorCopy(dest, start); + + trace = pmove->PM_PlayerTrace(pmove->origin, dest, PM_NORMAL, -1); + + // If we made it all the way, then copy trace end + // as new player position. + if (trace.fraction == 1.0f) + { + VectorCopy(trace.endpos, pmove->origin); + return; + } + + // Don't walk up stairs if not on ground. + if (oldonground == -1 && pmove->waterlevel == 0) + { + return; + } + + // If we are jumping out of water, don't do anything more. + if (pmove->waterjumptime) + return; + + // Try sliding forward both on ground and up 16 pixels + // take the move that goes farthest + + // Save out original pos & + VectorCopy(pmove->origin, original); + + // velocity. + VectorCopy(pmove->velocity, originalvel); + + // Slide move + clip = PM_FlyMove(); + + // Copy the results out + VectorCopy(pmove->origin, down); + VectorCopy(pmove->velocity, downvel); + + // Reset original values. + VectorCopy(original, pmove->origin); + VectorCopy(originalvel, pmove->velocity); + + // Start out up one stair height + VectorCopy(pmove->origin, dest); + + dest[2] += pmove->movevars->stepsize; + + trace = pmove->PM_PlayerTrace(pmove->origin, dest, PM_NORMAL, -1); + + // If we started okay and made it part of the way at least, + // copy the results to the movement start position and then + // run another move try. + if (!trace.startsolid && !trace.allsolid) + { + VectorCopy(trace.endpos, pmove->origin); + } + + // slide move the rest of the way. + clip = PM_FlyMove(); + + // Now try going back down from the end point + // press down the stepheight + VectorCopy(pmove->origin, dest); + dest[2] -= pmove->movevars->stepsize; + + trace = pmove->PM_PlayerTrace(pmove->origin, dest, PM_NORMAL, -1); + + // If we are not on the ground any more then + // use the original movement attempt + if (trace.plane.normal[2] < 0.7f) + goto usedown; + + // If the trace ended up in empty space, copy the end + // over to the origin. + if (!trace.startsolid && !trace.allsolid) + { + VectorCopy(trace.endpos, pmove->origin); + } + + // Copy this origion to up. + VectorCopy(pmove->origin, pmove->up); + + // decide which one went farther + downdist = (down[0] - original[0]) * (down[0] - original[0]) + (down[1] - original[1]) * (down[1] - original[1]); + updist = (pmove->up[0] - original[0]) * (pmove->up[0] - original[0]) + (pmove->up[1] - original[1]) * (pmove->up[1] - original[1]); + + if (downdist > updist) + { +usedown: + VectorCopy(down, pmove->origin); + VectorCopy(downvel, pmove->velocity); + } + else + { + // copy z value from slide move + pmove->velocity[2] = downvel[2]; + } } +// Handles both ground friction and water friction + /* <2ccffb> ../cstrike/pm_shared/pm_shared.c:1249 */ -NOBODY void PM_Friction(void) +void PM_Friction(void) { -// float *vel; // 1251 -// float speed; // 1252 -// float newspeed; // 1252 -// float control; // 1252 -// float friction; // 1253 -// float drop; // 1254 -// vec3_t newvel; // 1255 -// { -// vec3_t start; // 1278 -// vec3_t stop; // 1278 -// pmtrace_t trace; // 1279 -// } + float *vel; + float speed; + float_precision newspeed, control, friction, drop; + vec3_t newvel; + + // If we are in water jump cycle, don't apply friction + if (pmove->waterjumptime) + return; + + // Get velocity + vel = pmove->velocity; + + // Calculate speed + speed = sqrt((float_precision)(vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2])); + + // If too slow, return + if (speed < 0.1f) + { + return; + } + + drop = 0; + + // apply ground friction + // On an entity that is the ground + if (pmove->onground != -1) + { + vec3_t start, stop; + pmtrace_t trace; + + start[0] = stop[0] = pmove->origin[0] + vel[0] / speed * 16; + start[1] = stop[1] = pmove->origin[1] + vel[1] / speed * 16; + start[2] = pmove->origin[2] + pmove->_player_mins[pmove->usehull][2]; + stop[2] = start[2] - 34; + + trace = pmove->PM_PlayerTrace(start, stop, PM_NORMAL, -1); + + if (trace.fraction == 1.0f) + friction = pmove->movevars->friction * pmove->movevars->edgefriction; + else + friction = pmove->movevars->friction; + + // Grab friction value. + //friction = pmove->movevars->friction; + + // player friction? + friction *= pmove->friction; + + // Bleed off some speed, but if we have less than the bleed + // threshhold, bleed the theshold amount. + control = (speed < pmove->movevars->stopspeed) ? pmove->movevars->stopspeed : speed; + + // Add the amount to t'he drop amount. + drop += friction * (control * pmove->frametime); + } + + // apply water friction + //if (pmove->waterlevel) + //{ + // drop += speed * pmove->movevars->waterfriction * waterlevel * pmove->frametime; + //} + + // scale the velocity + newspeed = speed - drop; + + if (newspeed < 0) + { + newspeed = 0; + } + + // Determine proportion of old speed we are using. + newspeed /= speed; + + // Adjust velocity according to proportion. + newvel[0] = vel[0] * newspeed; + newvel[1] = vel[1] * (float)newspeed; + newvel[2] = vel[2] * (float)newspeed; + + VectorCopy(newvel, pmove->velocity); } /* <2cd0ba> ../cstrike/pm_shared/pm_shared.c:1326 */ -NOBODY void PM_AirAccelerate(vec3_t wishdir, float wishspeed, float accel) +void PM_AirAccelerate(vec_t *wishdir, float wishspeed, float accel) { -// int i; // 1328 -// float addspeed; // 1329 -// float accelspeed; // 1329 -// float currentspeed; // 1329 -// float wishspd; // 1329 + int i; + float addspeed; + float wishspd = wishspeed; + + float_precision currentspeed; + float_precision accelspeed; + + if (pmove->dead || pmove->waterjumptime) + return; + + // Cap speed + if (wishspd > 30) + wishspd = 30; + + // Determine veer amount + currentspeed = DotProduct(pmove->velocity, wishdir); + + // See how much to add + addspeed = wishspd - currentspeed; + + // If not adding any, done. + if (addspeed <= 0) + return; + + // Determine acceleration speed after acceleration + accelspeed = accel * wishspeed * pmove->frametime * pmove->friction; + + // Cap it + if (accelspeed > addspeed) + accelspeed = addspeed; + + // Adjust pmove vel. + for (i = 0; i < 3; i++) + { + pmove->velocity[i] += accelspeed * wishdir[i]; + } } /* <2cd14b> ../cstrike/pm_shared/pm_shared.c:1368 */ -NOBODY void PM_WaterMove(void) -{ -// int i; // 1370 -// vec3_t wishvel; // 1371 -// float wishspeed; // 1372 -// vec3_t wishdir; // 1373 -// vec3_t start; // 1374 -// vec3_t dest; // 1374 -// vec3_t temp; // 1375 -// pmtrace_t trace; // 1376 -// float speed; // 1378 -// float newspeed; // 1378 -// float addspeed; // 1378 -// float accelspeed; // 1378 +void PM_WaterMove(void) +{ + int i; + vec3_t wishvel; + vec3_t wishdir; + vec3_t start, dest; + vec3_t temp; + pmtrace_t trace; + + float_precision speed, accelspeed, wishspeed; + float newspeed, addspeed; + + // user intentions + for (i = 0; i < 3; i++) + { + wishvel[i] = (pmove->forward[i] * pmove->cmd.forwardmove) + (pmove->cmd.sidemove * pmove->right[i]); + } + + // Sinking after no other movement occurs + if (!pmove->cmd.forwardmove && !pmove->cmd.sidemove && !pmove->cmd.upmove) + { + // drift towards bottom + wishvel[2] -= 60.0f; + } + else + { + // Go straight up by upmove amount. + wishvel[2] += pmove->cmd.upmove; + } + + // Copy it over and determine speed + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + // Cap speed. + if (wishspeed > pmove->maxspeed) + { + VectorScale(wishvel, pmove->maxspeed / wishspeed, wishvel); + wishspeed = pmove->maxspeed; + } + + // Slow us down a bit. + wishspeed *= 0.8; + VectorAdd(pmove->velocity, pmove->basevelocity, pmove->velocity); + + // Water friction + VectorCopy(pmove->velocity, temp); + speed = VectorNormalize(temp); + + if (speed) + { + newspeed = speed - pmove->movevars->friction * pmove->friction * pmove->frametime * speed; + + if (newspeed < 0.0f) + { + newspeed = 0.0f; + } + + VectorScale(pmove->velocity, newspeed / speed, pmove->velocity); + } + else + newspeed = 0; + + // water acceleration + if ((float)wishspeed < 0.1f) + { + return; + } + + addspeed = (float)wishspeed - newspeed; + + if (addspeed > 0.0f) + { + VectorNormalize(wishvel); + accelspeed = pmove->movevars->accelerate * pmove->friction * pmove->frametime * (float)wishspeed; + + if (accelspeed > addspeed) + { + accelspeed = addspeed; + } + + for (i = 0; i < 3; i++) + { + pmove->velocity[i] += accelspeed * wishvel[i]; + } + } + + // Now move + // assume it is a stair or a slope, so press down from stepheight above + VectorMA(pmove->origin, pmove->frametime, pmove->velocity, dest); + VectorCopy(dest, start); + + start[2] += pmove->movevars->stepsize + 1; + trace = pmove->PM_PlayerTrace(start, dest, PM_NORMAL, -1); + + // FIXME: check steep slope? + if (!trace.startsolid && !trace.allsolid) + { + // walked up the step, so just keep result and exit + VectorCopy(trace.endpos, pmove->origin); + return; + } + + // Try moving straight along out normal path. + PM_FlyMove(); } /* <2cd220> ../cstrike/pm_shared/pm_shared.c:1464 */ -NOBODY void PM_AirMove(void) +void PM_AirMove(void) { -// int i; // 1466 -// vec3_t wishvel; // 1467 -// float fmove; // 1468 -// float smove; // 1468 -// vec3_t wishdir; // 1469 -// float wishspeed; // 1470 + int i; + vec3_t wishvel; + float fmove, smove; + vec3_t wishdir; + float wishspeed; + + // Copy movement amounts + fmove = pmove->cmd.forwardmove; + smove = pmove->cmd.sidemove; + + // Zero out z components of movement vectors + pmove->forward[2] = 0; + pmove->right[2] = 0; + + // Renormalize + VectorNormalize(pmove->forward); + VectorNormalize(pmove->right); + + // Determine x and y parts of velocity + for (i = 0; i < 2; i++) + { + wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove; + } + + // Zero out z part of velocity + wishvel[2] = 0; + + // Determine maginitude of speed of move + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + // Clamp to server defined max speed + if (wishspeed > pmove->maxspeed) + { + VectorScale(wishvel, pmove->maxspeed/wishspeed, wishvel); + wishspeed = pmove->maxspeed; + } + + PM_AirAccelerate(wishdir, wishspeed, pmove->movevars->airaccelerate); + + // Add in any base velocity to the current velocity. + VectorAdd(pmove->velocity, pmove->basevelocity, pmove->velocity); + + PM_FlyMove(); } /* <2cc586> ../cstrike/pm_shared/pm_shared.c:1510 */ -NOBODY qboolean PM_InWater(void) +qboolean PM_InWater(void) { + return (pmove->waterlevel > 1); } +// Sets pmove->waterlevel and pmove->watertype values. + /* <2cd2a7> ../cstrike/pm_shared/pm_shared.c:1522 */ -NOBODY qboolean PM_CheckWater(void) +qboolean PM_CheckWater(void) { -// vec3_t point; // 1524 -// int cont; // 1525 -// int truecont; // 1526 -// float height; // 1527 -// float heightover2; // 1528 -// { -// vec_t current_table; // 1575 -// } + vec3_t point; + int cont; + int truecont; + float height; + float heightover2; + + // Pick a spot just above the players feet. + point[0] = pmove->origin[0] + (pmove->_player_mins[pmove->usehull][0] + pmove->_player_maxs[pmove->usehull][0]) * 0.5; + point[1] = pmove->origin[1] + (pmove->_player_mins[pmove->usehull][1] + pmove->_player_maxs[pmove->usehull][1]) * 0.5; + point[2] = pmove->origin[2] + pmove->_player_mins[pmove->usehull][2] + 1; + + // Assume that we are not in water at all. + pmove->waterlevel = 0; + pmove->watertype = CONTENTS_EMPTY; + + // Grab point contents. + cont = pmove->PM_PointContents(point, &truecont); + + // Are we under water? (not solid and not empty?) + if (cont <= CONTENTS_WATER && cont > CONTENTS_TRANSLUCENT) + { + // Set water type + pmove->watertype = cont; + + // We are at least at level one + pmove->waterlevel = 1; + + height = (pmove->_player_mins[pmove->usehull][2] + pmove->_player_maxs[pmove->usehull][2]); + heightover2 = height * 0.5; + + // Now check a point that is at the player hull midpoint. + point[2] = pmove->origin[2] + heightover2; + cont = pmove->PM_PointContents(point, NULL); + + // If that point is also under water... + if (cont <= CONTENTS_WATER && cont > CONTENTS_TRANSLUCENT) + { + // Set a higher water level. + pmove->waterlevel = 2; + + // Now check the eye position. (view_ofs is relative to the origin) + point[2] = pmove->origin[2] + pmove->view_ofs[2]; + + cont = pmove->PM_PointContents(point, NULL); + if (cont <= CONTENTS_WATER && cont > CONTENTS_TRANSLUCENT) + { + // In over our eyes + pmove->waterlevel = 3; + } + } + + // Adjust velocity based on water current, if any. + if ((truecont <= CONTENTS_CURRENT_0) && (truecont >= CONTENTS_CURRENT_DOWN)) + { + // The deeper we are, the stronger the current. + static vec_t current_table[][3] = + { + {1, 0, 0}, {0, 1, 0}, {-1, 0, 0}, + {0, -1, 0}, {0, 0, 1}, {0, 0, -1} + }; + + VectorMA(pmove->basevelocity, 50.0 * pmove->waterlevel, current_table[CONTENTS_CURRENT_0 - truecont], pmove->basevelocity); + } + } + + return pmove->waterlevel > 1; } /* <2cd33a> ../cstrike/pm_shared/pm_shared.c:1593 */ -NOBODY void PM_CatagorizePosition(void) +void PM_CatagorizePosition(void) { -// vec3_t point; // 1595 -// pmtrace_t tr; // 1596 + vec3_t point; + pmtrace_t tr; + + // if the player hull point one unit down is solid, the player + // is on ground + + // see if standing on something solid + + // Doing this before we move may introduce a potential latency in water detection, but + // doing it after can get us stuck on the bottom in water if the amount we move up + // is less than the 1 pixel 'threshold' we're about to snap to. Also, we'll call + // this several times per frame, so we really need to avoid sticking to the bottom of + // water on each call, and the converse case will correct itself if called twice. + PM_CheckWater(); + + point[0] = pmove->origin[0]; + point[1] = pmove->origin[1]; + point[2] = pmove->origin[2] - 2; + + // Shooting up really fast. Definitely not on ground. + if (pmove->velocity[2] > 180) + { + pmove->onground = -1; + } + else + { + // Try and move down. + tr = pmove->PM_PlayerTrace(pmove->origin, point, PM_NORMAL, -1); + + // If we hit a steep plane, we are not on ground + if (tr.plane.normal[2] < 0.7f) + { + // too steep + pmove->onground = -1; + } + else + { + // Otherwise, point to index of ent under us. + pmove->onground = tr.ent; + } + + // If we are on something... + if (pmove->onground != -1) + { + // Then we are not in water jump sequence + pmove->waterjumptime = 0; + + // If we could make the move, drop us down that 1 pixel + if (pmove->waterlevel < 2 && !tr.startsolid && !tr.allsolid) + { + VectorCopy(tr.endpos, pmove->origin); + } + } + + // Standing on an entity other than the world + // So signal that we are touching something. + if (tr.ent > 0) + { + PM_AddToTouched(tr, pmove->velocity); + } + } } +// When a player is stuck, it's costly to try and unstick them +// Grab a test offset for the player based on a passed in index + /* <2cc4c5> ../cstrike/pm_shared/pm_shared.c:1654 */ -NOBODY int PM_GetRandomStuckOffsets(int nIndex, int server, vec3_t offset) +int PM_GetRandomStuckOffsets(int nIndex, int server, vec_t *offset) { -// int idx; // 1657 + // Last time we did a full + int idx; + idx = rgStuckLast[nIndex][server]++; + + VectorCopy(rgv3tStuckTable[idx % 54], offset); + + return (idx % 54); } /* <2cc49d> ../cstrike/pm_shared/pm_shared.c:1665 */ -NOBODY void PM_ResetStuckOffsets(int nIndex, int server) +void PM_ResetStuckOffsets(int nIndex, int server) { + rgStuckLast[nIndex][server] = 0; } +// If pmove->origin is in a solid position, +// try nudging slightly on all axis to +// allow for the cut precision of the net coordinates + /* <2cd3cf> ../cstrike/pm_shared/pm_shared.c:1681 */ -NOBODY int PM_CheckStuck(void) +int PM_CheckStuck(void) { -// vec3_t base; // 1683 -// vec3_t offset; // 1684 -// vec3_t test; // 1685 -// int hitent; // 1686 -// int idx; // 1687 -// float fTime; // 1688 -// int i; // 1689 -// pmtrace_t traceresult; // 1690 -// float rgStuckCheckTime; // 1692 -// { -// int nReps; // 1713 -// PM_ResetStuckOffsets(int nIndex, -// int server); // 1714 -// PM_GetRandomStuckOffsets(int nIndex, -// int server, -// vec3_t offset); // 1717 -// PM_ResetStuckOffsets(int nIndex, -// int server); // 1722 -// } -// { -// float x; // 1769 -// float y; // 1769 -// float z; // 1769 -// float xystep; // 1770 -// float zstep; // 1771 -// float xyminmax; // 1772 -// float zminmax; // 1773 -// } -// PM_GetRandomStuckOffsets(int nIndex, -// int server, -// vec3_t offset); // 1750 -// PM_ResetStuckOffsets(int nIndex, -// int server); // 1757 -// PM_ResetStuckOffsets(int nIndex, -// int server); // 1698 + vec3_t base; + vec3_t offset; + vec3_t test; + int hitent; + int idx; + float_precision fTime; + int i; + pmtrace_t traceresult; + + // Last time we did a full + static float rgStuckCheckTime[MAX_CLIENTS][2]; + + // If position is okay, exit + hitent = pmove->PM_TestPlayerPosition(pmove->origin, &traceresult); + if (hitent == -1) + { + PM_ResetStuckOffsets(pmove->player_index, pmove->server); + return 0; + } + + VectorCopy(pmove->origin, base); + + // Deal with precision error in network. + if (!pmove->server) + { + // World or BSP model + if (hitent == 0 || pmove->physents[hitent].model != NULL) + { + int nReps = 0; + PM_ResetStuckOffsets(pmove->player_index, pmove->server); + do + { + i = PM_GetRandomStuckOffsets(pmove->player_index, pmove->server, offset); + + VectorAdd(base, offset, test); + if (pmove->PM_TestPlayerPosition(test, &traceresult) == -1) + { + PM_ResetStuckOffsets(pmove->player_index, pmove->server); + VectorCopy(test, pmove->origin); + return 0; + } + + nReps++; + } + while (nReps < 54); + } + } + + // Only an issue on the client. + + if (pmove->server) + idx = 0; + else + idx = 1; + + fTime = pmove->Sys_FloatTime(); + + // Too soon? + if (rgStuckCheckTime[pmove->player_index][idx] >= (fTime - PM_CHECKSTUCK_MINTIME)) + { + return 1; + } + + rgStuckCheckTime[pmove->player_index][idx] = fTime; + + pmove->PM_StuckTouch(hitent, &traceresult); + + i = PM_GetRandomStuckOffsets(pmove->player_index, pmove->server, offset); + + VectorAdd(base, offset, test); + if ((hitent = pmove->PM_TestPlayerPosition(test, NULL)) == -1) + { + PM_ResetStuckOffsets(pmove->player_index, pmove->server); + + if (i >= 27) + { + VectorCopy(test, pmove->origin); + } + + return 0; + } + + // If player is flailing while stuck in another player (should never happen), then see + // if we can't "unstick" them forceably. + if ((pmove->cmd.buttons & (IN_JUMP | IN_DUCK | IN_ATTACK)) && pmove->physents[hitent].player != 0) + { + float x, y, z; + float xystep = 8.0; + float zstep = 18.0; + float xyminmax = xystep; + float zminmax = 4 * zstep; + + for (z = 0; z <= zminmax; z += zstep) + { + for (x = -xyminmax; x <= xyminmax; x += xystep) + { + for (y = -xyminmax; y <= xyminmax; y += xystep) + { + VectorCopy(base, test); + + test[0] += x; + test[1] += y; + test[2] += z; + + if (pmove->PM_TestPlayerPosition(test, NULL) == -1) + { + VectorCopy(test, pmove->origin); + return 0; + } + } + } + } + } + + return 1; } /* <2cd61f> ../cstrike/pm_shared/pm_shared.c:1807 */ -NOBODY void PM_SpectatorMove(void) +void PM_SpectatorMove(void) { -// float speed; // 1809 -// float drop; // 1809 -// float friction; // 1809 -// float control; // 1809 -// float newspeed; // 1809 -// float currentspeed; // 1811 -// float addspeed; // 1811 -// float accelspeed; // 1811 -// int i; // 1812 -// vec3_t wishvel; // 1813 -// float fmove; // 1814 -// float smove; // 1814 -// vec3_t wishdir; // 1815 -// float wishspeed; // 1816 -// { -// int target; // 1905 -// } + float_precision speed, drop, friction; + float_precision control, newspeed; + float currentspeed, addspeed; + float_precision accelspeed; + int i; + vec3_t wishvel; + float fmove, smove; + vec3_t wishdir; + float_precision wishspeed; + + // this routine keeps track of the spectators psoition + // there a two different main move types : track player or moce freely (OBS_ROAMING) + // doesn't need excate track position, only to generate PVS, so just copy + // targets position and real view position is calculated on client (saves server CPU) + if (pmove->iuser1 == OBS_ROAMING) + { + // Move around in normal spectator method + speed = Length (pmove->velocity); + + if (speed >= 1.0) + { + drop = 0; + + // extra friction + friction = pmove->movevars->friction * 1.5; + control = speed < pmove->movevars->stopspeed ? pmove->movevars->stopspeed : speed; + drop += friction * (control * pmove->frametime); + + // scale the velocity + newspeed = speed - drop; + + if (newspeed < 0) + { + newspeed = 0; + } + newspeed /= speed; + + VectorScale(pmove->velocity, newspeed, pmove->velocity); + } + else + { + VectorCopy(vec3_origin, pmove->velocity) + } + + // accelerate + fmove = pmove->cmd.forwardmove; + smove = pmove->cmd.sidemove; + + VectorNormalize(pmove->forward); + VectorNormalize(pmove->right); + + for (i = 0; i < 3; i++) + { + wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove; + } + + wishvel[2] += pmove->cmd.upmove; + + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + // clamp to server defined max speed + if (wishspeed > pmove->movevars->spectatormaxspeed) + { + VectorScale(wishvel, pmove->movevars->spectatormaxspeed / wishspeed, wishvel); + wishspeed = pmove->movevars->spectatormaxspeed; + } + + currentspeed = DotProduct(pmove->velocity, wishdir); + + addspeed = wishspeed - currentspeed; + if (addspeed <= 0) + { + return; + } + + accelspeed = pmove->movevars->accelerate * pmove->frametime * wishspeed; + if (accelspeed > addspeed) + { + accelspeed = addspeed; + } + + for (i = 0; i < 3; i++) + { + pmove->velocity[i] += accelspeed * wishdir[i]; + } + + // move + VectorMA(pmove->origin, pmove->frametime, pmove->velocity, pmove->origin); + } + else + { + // all other modes just track some kind of target, so spectator PVS = target PVS + int target; + + // no valid target ? + if (pmove->iuser2 <= 0) + return; + + // Find the client this player's targeting + for (target = 0; target < pmove->numphysent; target++) + { + if (pmove->physents[target].info == pmove->iuser2) + break; + } + + if (target == pmove->numphysent) + return; + + // use targets position as own origin for PVS + VectorCopy(pmove->physents[target].angles, pmove->angles); + VectorCopy(pmove->physents[target].origin, pmove->origin); + + // no velocity + VectorCopy(vec3_origin, pmove->velocity); + } } +// Use for ease-in, ease-out style interpolation (accel/decel) +// Used by ducking code. + /* <2cc509> ../cstrike/pm_shared/pm_shared.c:1941 */ -NOBODY float PM_SplineFraction(float value, float scale) +float PM_SplineFraction(float value, float scale) { -// float valueSquared; // 1943 + float_precision valueSquared; + + value = scale * value; + valueSquared = value * value; + + // Nice little ease-in, ease-out spline-like curve + return 3 * valueSquared - 2 * valueSquared * value; } /* <2cd757> ../cstrike/pm_shared/pm_shared.c:1952 */ -NOBODY float PM_SimpleSpline(float value) +NOXREF float PM_SimpleSpline(float value) { -// float valueSquared; // 1954 + float valueSquared; + + valueSquared = value * value; + + return 3 * valueSquared - 2 * valueSquared * value; } /* <2cc595> ../cstrike/pm_shared/pm_shared.c:1959 */ -NOBODY void PM_FixPlayerCrouchStuck(int direction) +void PM_FixPlayerCrouchStuck(int direction) { -// int hitent; // 1961 -// int i; // 1962 -// vec3_t test; // 1963 + int hitent; + int i; + vec3_t test; + + hitent = pmove->PM_TestPlayerPosition (pmove->origin, NULL); + + if (hitent == -1) + { + return; + } + + VectorCopy(pmove->origin, test); + + for (i = 0; i < 36; i++) + { + pmove->origin[2] += direction; + hitent = pmove->PM_TestPlayerPosition(pmove->origin, NULL); + + if (hitent == -1) + { + return; + } + } + + // Failed + VectorCopy(test, pmove->origin); } /* <2cd7cd> ../cstrike/pm_shared/pm_shared.c:1983 */ -NOBODY void PM_Duck(void) -{ -// float duckFraction; // 1986 -// int buttonsChanged; // 1988 -// int nButtonPressed; // 1989 -// int duckchange; // 1991 -// int duckpressed; // 1992 -// { -// float fMore; // 2063 -// float time; // 2064 -// } -// { -// pmtrace_t trace; // 2074 -// vec3_t newOrigin; // 2075 -// } -// PM_FixPlayerCrouchStuck(int direction); // 2055 +void PM_Duck(void) +{ + float_precision duckFraction; + + int buttonsChanged = (pmove->oldbuttons ^ pmove->cmd.buttons); // These buttons have changed this frame + int nButtonPressed = buttonsChanged & pmove->cmd.buttons; // The changed ones still down are "pressed" + + int duckchange = buttonsChanged & IN_DUCK ? 1 : 0; + int duckpressed = nButtonPressed & IN_DUCK ? 1 : 0; + + if (pmove->cmd.buttons & IN_DUCK) + { + pmove->oldbuttons |= IN_DUCK; + } + else + { + pmove->oldbuttons &= ~IN_DUCK; + } + + if (pmove->dead || (!(pmove->cmd.buttons & IN_DUCK) && !pmove->bInDuck && !(pmove->flags & FL_DUCKING))) + { + return; + } + + pmove->cmd.forwardmove *= PLAYER_DUCKING_MULTIPLIER; + pmove->cmd.sidemove *= PLAYER_DUCKING_MULTIPLIER; + pmove->cmd.upmove *= PLAYER_DUCKING_MULTIPLIER; + + if (pmove->cmd.buttons & IN_DUCK) + { + if ((nButtonPressed & IN_DUCK) && !(pmove->flags & FL_DUCKING)) + { + // Use 1 second so super long jump will work + pmove->flDuckTime = 1000; + pmove->bInDuck = true; + } + + float_precision time = _max(0.0, (1.0 - pmove->flDuckTime / 1000.0)); + + if (pmove->bInDuck) + { + // Finish ducking immediately if duck time is over or not on ground + if (((pmove->flDuckTime / 1000.0) <= (1.0 - TIME_TO_DUCK)) || pmove->onground == -1) + { + pmove->usehull = 1; + pmove->view_ofs[2] = PM_VEC_DUCK_VIEW; + pmove->flags |= FL_DUCKING; + pmove->bInDuck = FALSE; + + // HACKHACK - Fudge for collision bug - no time to fix this properly + if (pmove->onground != -1) + { + pmove->origin[2] = pmove->origin[2] - 18.0; + + // See if we are stuck? + PM_FixPlayerCrouchStuck(STUCK_MOVEUP); + + // Recatagorize position since ducking can change origin + PM_CatagorizePosition(); + } + } + else + { + float fMore = (PM_VEC_DUCK_HULL_MIN - PM_VEC_HULL_MIN); + + // Calc parametric time + duckFraction = PM_SplineFraction(time, (1.0 / TIME_TO_DUCK)); + pmove->view_ofs[2] = ((PM_VEC_DUCK_VIEW - fMore) * duckFraction) + (PM_VEC_VIEW * (1 - duckFraction)); + } + } + + } + else // Try to unduck + { + pmtrace_t trace; + vec3_t newOrigin; + + VectorCopy(pmove->origin, newOrigin); + + if (pmove->onground != -1) + { + newOrigin[2] += 18.0; + } + + trace = pmove->PM_PlayerTrace(newOrigin, newOrigin, PM_NORMAL, -1); + + if (!trace.startsolid) + { + pmove->usehull = 0; + + // Oh, no, changing hulls stuck us into something, try unsticking downward first. + trace = pmove->PM_PlayerTrace(newOrigin, newOrigin, PM_NORMAL, -1); + + if (trace.startsolid) + { + // See if we are stuck? If so, stay ducked with the duck hull until we have a clear spot + // Con_Printf("unstick got stuck\n"); + pmove->usehull = 1; + return; + } + + pmove->flags &= ~FL_DUCKING; + pmove->bInDuck = FALSE; + pmove->view_ofs[2] = PM_VEC_VIEW; + pmove->flDuckTime = 0; + + pmove->flTimeStepSound -= 100; + + if (pmove->flTimeStepSound < 0) + { + pmove->flTimeStepSound = 0; + } + + VectorCopy(newOrigin, pmove->origin); + + // Recatagorize position since ducking can change origin + PM_CatagorizePosition(); + } + } } /* <2cd8c2> ../cstrike/pm_shared/pm_shared.c:2332 */ -NOBODY void PM_LadderMove(physent_t *pLadder) +void PM_LadderMove(physent_t *pLadder) { -// vec3_t ladderCenter; // 2334 -// trace_t trace; // 2335 -// qboolean onFloor; // 2336 -// vec3_t floor; // 2337 -// vec3_t modelmins; // 2338 -// vec3_t modelmaxs; // 2338 -// { -// float forward; // 2364 -// float right; // 2364 -// vec3_t vpn; // 2365 -// vec3_t v_right; // 2365 -// float flSpeed; // 2366 -// { -// vec3_t velocity; // 2407 -// vec3_t perp; // 2407 -// vec3_t cross; // 2407 -// vec3_t lateral; // 2407 -// vec3_t tmp; // 2407 -// float normal; // 2408 -// } -// } + vec3_t ladderCenter; + trace_t trace; + qboolean onFloor; + vec3_t floor; + vec3_t modelmins, modelmaxs; + + if (pmove->movetype == MOVETYPE_NOCLIP) + return; + + pmove->PM_GetModelBounds(pLadder->model, modelmins, modelmaxs); + + VectorAdd(modelmins, modelmaxs, ladderCenter); + VectorScale(ladderCenter, 0.5, ladderCenter); + + pmove->movetype = MOVETYPE_FLY; + + // On ladder, convert movement to be relative to the ladder + VectorCopy(pmove->origin, floor); + floor[2] += pmove->_player_mins[pmove->usehull][2] - 1; + + if (pmove->PM_PointContents(floor, NULL) == CONTENTS_SOLID) + onFloor = true; + else + onFloor = false; + + pmove->gravity = 0; + pmove->PM_TraceModel(pLadder, pmove->origin, ladderCenter, &trace); + + if (trace.fraction != 1.0f) + { + float forward = 0, right = 0; + vec3_t vpn, v_right; + float flSpeed = MAX_CLIMB_SPEED; + + // they shouldn't be able to move faster than their maxspeed + if (flSpeed > pmove->maxspeed) + { + flSpeed = pmove->maxspeed; + } + + AngleVectors(pmove->angles, vpn, v_right, NULL); + + if (pmove->flags & FL_DUCKING) + { + flSpeed *= PLAYER_DUCKING_MULTIPLIER; + } + + if (pmove->cmd.buttons & IN_BACK) + { + forward -= flSpeed; + } + if (pmove->cmd.buttons & IN_FORWARD) + { + forward += flSpeed; + } + if (pmove->cmd.buttons & IN_MOVELEFT) + { + right -= flSpeed; + } + if (pmove->cmd.buttons & IN_MOVERIGHT) + { + right += flSpeed; + } + + if (pmove->cmd.buttons & IN_JUMP) + { + pmove->movetype = MOVETYPE_WALK; + VectorScale(trace.plane.normal, 270, pmove->velocity); + } + else + { + if (forward != 0 || right != 0) + { + vec3_t velocity, perp, cross, lateral, tmp; + float normal; + + VectorScale(vpn, forward, velocity); + VectorMA(velocity, right, v_right, velocity); + + VectorClear(tmp); + tmp[2] = 1; + + _CrossProduct(tmp, trace.plane.normal, perp); + VectorNormalize(perp); + + // decompose velocity into ladder plane + normal = DotProduct(velocity, trace.plane.normal); + // This is the velocity into the face of the ladder + VectorScale(trace.plane.normal, normal, cross); + + // This is the player's additional velocity + VectorSubtract(velocity, cross, lateral); + + // This turns the velocity into the face of the ladder into velocity that + // is roughly vertically perpendicular to the face of the ladder. + // NOTE: It IS possible to face up and move down or face down and move up + // because the velocity is a sum of the directional velocity and the converted + // velocity through the face of the ladder -- by design. + _CrossProduct(trace.plane.normal, perp, tmp); + VectorMA(lateral, -normal, tmp, pmove->velocity); + + // On ground moving away from the ladder + if (onFloor && normal > 0) + { + VectorMA(pmove->velocity, MAX_CLIMB_SPEED, trace.plane.normal, pmove->velocity); + } + } + else + { + VectorClear(pmove->velocity); + } + } + } } /* <2cda06> ../cstrike/pm_shared/pm_shared.c:2457 */ -NOBODY physent_t *PM_Ladder(void) +physent_t *PM_Ladder(void) { -// int i; // 2459 -// physent_t *pe; // 2460 -// hull_t *hull; // 2461 -// int num; // 2462 -// vec3_t test; // 2463 + int i; + physent_t *pe; + hull_t *hull; + int num; + vec3_t test; + + for (i = 0; i < pmove->nummoveent; i++) + { + pe = &pmove->moveents[i]; + + if (pe->model && (modtype_t)pmove->PM_GetModelType(pe->model) == mod_brush && pe->skin == CONTENTS_LADDER) + { + hull = (hull_t *)pmove->PM_HullForBsp(pe, test); + num = hull->firstclipnode; + + // Offset the test point appropriately for this hull. + VectorSubtract(pmove->origin, test, test); + + // Test the player's hull for intersection with this model + if (pmove->PM_HullPointContents(hull, num, test) == CONTENTS_EMPTY) + { + continue; + } + + return pe; + } + } + + return NULL; } /* <2cda77> ../cstrike/pm_shared/pm_shared.c:2491 */ -NOBODY void PM_WaterJump(void) +void PM_WaterJump(void) { + if (pmove->waterjumptime > 10000) + { + pmove->waterjumptime = 10000; + } + + if (!pmove->waterjumptime) + { + return; + } + + pmove->waterjumptime -= pmove->cmd.msec; + + if (pmove->waterjumptime < 0 || !pmove->waterlevel) + { + pmove->waterjumptime = 0; + pmove->flags &= ~FL_WATERJUMP; + } + + pmove->velocity[0] = pmove->movedir[0]; + pmove->velocity[1] = pmove->movedir[1]; } /* <2cda8d> ../cstrike/pm_shared/pm_shared.c:2519 */ -NOBODY void PM_AddGravity(void) +void PM_AddGravity(void) { -// float ent_gravity; // 2521 + float ent_gravity; + + if (pmove->gravity != 0.0f) + ent_gravity = pmove->gravity; + else + ent_gravity = 1.0f; + + pmove->velocity[2] -= (ent_gravity * pmove->movevars->gravity * pmove->frametime); + pmove->velocity[2] += pmove->basevelocity[2] * pmove->frametime; + + pmove->basevelocity[2] = 0; + PM_CheckVelocity(); } +// Does not change the entities velocity at all + /* <2cdac6> ../cstrike/pm_shared/pm_shared.c:2541 */ -NOBODY pmtrace_t PM_PushEntity(vec3_t push) +pmtrace_t PM_PushEntity(vec_t *push) { -// pmtrace_t trace; // 2543 -// vec3_t end; // 2544 + pmtrace_t trace; + vec3_t end; + + VectorAdd(pmove->origin, push, end); + + trace = pmove->PM_PlayerTrace(pmove->origin, end, PM_NORMAL, -1); + + VectorCopy(trace.endpos, pmove->origin); + + // So we can run impact function afterwards. + if (trace.fraction < 1.0f && !trace.allsolid) + { + PM_AddToTouched(trace, pmove->velocity); + } + + return trace; } /* <2cdb13> ../cstrike/pm_shared/pm_shared.c:2569 */ -NOBODY void PM_Physics_Toss(void) +void PM_Physics_Toss(void) { -// pmtrace_t trace; // 2571 -// vec3_t move; // 2572 -// float backoff; // 2573 -// PM_AddGravity(void); // 2594 -// { -// float vel; // 2636 -// vec3_t base; // 2637 -// } + pmtrace_t trace; + vec3_t move; + float backoff; + + PM_CheckWater(); + + if (pmove->velocity[2] > 0) + { + pmove->onground = -1; + } + + // If on ground and not moving, return. + if (pmove->onground != -1) + { + if (VectorCompare(pmove->basevelocity, vec3_origin) && VectorCompare(pmove->velocity, vec3_origin)) + { + return; + } + } + + PM_CheckVelocity(); + + // add gravity + if (pmove->movetype != MOVETYPE_FLY && pmove->movetype != MOVETYPE_BOUNCEMISSILE && pmove->movetype != MOVETYPE_FLYMISSILE) + { + PM_AddGravity(); + } + + // move origin + // Base velocity is not properly accounted for since this entity will move again after the bounce without + // taking it into account + VectorAdd(pmove->velocity, pmove->basevelocity, pmove->velocity); + + PM_CheckVelocity(); + VectorScale(pmove->velocity, pmove->frametime, move); + VectorSubtract(pmove->velocity, pmove->basevelocity, pmove->velocity); + + // Should this clear basevelocity + trace = PM_PushEntity(move); + + PM_CheckVelocity(); + + if (trace.allsolid) + { + // entity is trapped in another solid + pmove->onground = trace.ent; + VectorCopy(vec3_origin, pmove->velocity); + return; + } + + if (trace.fraction == 1.0f) + { + PM_CheckWater(); + return; + } + + if (pmove->movetype == MOVETYPE_BOUNCE) + { + backoff = 2.0f - pmove->friction; + } + else if (pmove->movetype == MOVETYPE_BOUNCEMISSILE) + { + backoff = 2.0f; + } + else + backoff = 1.0f; + + PM_ClipVelocity(pmove->velocity, trace.plane.normal, pmove->velocity, backoff); + + // stop if on ground + if (trace.plane.normal[2] > 0.7f) + { + float vel; + vec3_t base; + + VectorClear(base); + if (pmove->velocity[2] < pmove->movevars->gravity * pmove->frametime) + { + // we're rolling on the ground, add static friction. + pmove->onground = trace.ent; + pmove->velocity[2] = 0; + } + + vel = DotProduct(pmove->velocity, pmove->velocity); + + if (vel < (30 * 30) || (pmove->movetype != MOVETYPE_BOUNCE && pmove->movetype != MOVETYPE_BOUNCEMISSILE)) + { + pmove->onground = trace.ent; + VectorCopy(vec3_origin, pmove->velocity); + } + else + { + VectorScale(pmove->velocity, (1.0f - trace.fraction) * pmove->frametime * 0.9f, move); + trace = PM_PushEntity(move); + } + + VectorSubtract(pmove->velocity, base, pmove->velocity) + } + + // check for in water + PM_CheckWater(); } /* <2cdba2> ../cstrike/pm_shared/pm_shared.c:2674 */ -NOBODY void PM_NoClip(void) +void PM_NoClip(void) { -// int i; // 2676 -// vec3_t wishvel; // 2677 -// float fmove; // 2678 -// float smove; // 2678 + int i; + vec3_t wishvel; + float fmove, smove; + + // Copy movement amounts + fmove = pmove->cmd.forwardmove; + smove = pmove->cmd.sidemove; + + VectorNormalize(pmove->forward); + VectorNormalize(pmove->right); + + // Determine x and y parts of velocity + for (i = 0; i < 3; i++) + { + wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove; + } + + wishvel[2] += pmove->cmd.upmove; + + VectorMA(pmove->origin, pmove->frametime, wishvel, pmove->origin); + + // Zero out the velocity so that we don't accumulate a huge downward velocity from + // gravity, etc. + VectorClear(pmove->velocity); } +// Purpose: Corrects bunny jumping (where player initiates a bunny jump before other +// movement logic runs, thus making onground == -1 thus making PM_Friction get skipped and +// running PM_AirMove, which doesn't crop velocity to maxspeed like the ground / other +// movement logic does. + /* <2ccab0> ../cstrike/pm_shared/pm_shared.c:2711 */ -NOBODY void PM_PreventMegaBunnyJumping(void) +void PM_PreventMegaBunnyJumping(void) { -// float spd; // 2714 -// float fraction; // 2716 -// float maxscaledspeed; // 2718 + // Current player speed + float_precision spd; + // If we have to crop, apply this cropping fraction to velocity + float fraction; + // Speed at which bunny jumping is limited + float maxscaledspeed; + + maxscaledspeed = BUNNYJUMP_MAX_SPEED_FACTOR * pmove->maxspeed; + + // Don't divide by zero + if (maxscaledspeed <= 0.0f) + return; + + spd = Length(pmove->velocity); + + if (spd <= maxscaledspeed) + return; + + // Returns the modifier for the velocity + fraction = (maxscaledspeed / spd) * 0.8; + + // Crop it down!. + VectorScale(pmove->velocity, fraction, pmove->velocity); } /* <2cc541> ../cstrike/pm_shared/pm_shared.c:2741 */ -NOBODY void PM_Jump(void) +void PM_Jump(void) { -// float fvol; // 2743 -// float fvel; // 2744 -// { -// float flRatio; // 2847 -// } + if (pmove->dead) + { + // don't jump again until released + pmove->oldbuttons |= IN_JUMP; + return; + } + + // See if we are waterjumping. If so, decrement count and return. + if (pmove->waterjumptime != 0.0f) + { + pmove->waterjumptime -= pmove->cmd.msec; + + if (pmove->waterjumptime < 0) + { + pmove->waterjumptime = 0; + } + + return; + } + + // If we are in the water most of the way... + if (pmove->waterlevel >= 2) + { + // swimming, not jumping + pmove->onground = -1; + + // We move up a certain amount + if (pmove->watertype == CONTENTS_WATER) + { + pmove->velocity[2] = 100; + } + else if (pmove->watertype == CONTENTS_SLIME) + { + pmove->velocity[2] = 80; + } + else // LAVA + pmove->velocity[2] = 50; + + // play swiming sound + if (pmove->flSwimTime <= 0) + { + // Don't play sound again for 1 second + pmove->flSwimTime = 1000.0f; + + switch (pmove->RandomLong(0, 3)) + { + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade3.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade4.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + } + } + + return; + } + + // No more effect + // in air, so no effect + if (pmove->onground == -1) + { + // Flag that we jumped. + // don't jump again until released + pmove->oldbuttons |= IN_JUMP; + return; + } + + // don't pogo stick + if (pmove->oldbuttons & IN_JUMP) + { + return; + } + + if (pmove->bInDuck && (pmove->flags & FL_DUCKING)) + { + return; + } + + PM_CatagorizeTextureType(); + + // In the air now. + pmove->onground = -1; + + PM_PreventMegaBunnyJumping(); + + float_precision fvel = Length(pmove->velocity); + float fvol = 1.0f; + + if (fvel >= 150.0f) + { + PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol); + } + + pmove->velocity[2] = sqrt((float_precision)(2 * 800 * 45)); + + if (pmove->fuser2 > 0.0f) + { + float_precision flRatio = (100 - pmove->fuser2 * 0.001 * 19) * 0.01; + pmove->velocity[2] *= flRatio; + } + + pmove->fuser2 = 1315.789429; + + // Decay it for simulation + PM_FixupGravityVelocity(); + + // Flag that we jumped. + // don't jump again until released + pmove->oldbuttons |= IN_JUMP; } /* <2cdc4b> ../cstrike/pm_shared/pm_shared.c:2869 */ -NOBODY void PM_CheckWaterJump(void) +void PM_CheckWaterJump(void) { -// vec3_t vecStart; // 2871 -// vec3_t vecEnd; // 2871 -// vec3_t flatforward; // 2872 -// vec3_t flatvelocity; // 2873 -// float curspeed; // 2874 -// pmtrace_t tr; // 2875 -// int savehull; // 2876 + vec3_t vecStart, vecEnd; + vec3_t flatforward; + vec3_t flatvelocity; + float curspeed; + pmtrace_t tr; + int savehull; + + // Already water jumping. + if (pmove->waterjumptime) + return; + + // Don't hop out if we just jumped in + if (pmove->velocity[2] < -180) + { + // only hop out if we are moving up + return; + } + + // See if we are backing up + flatvelocity[0] = pmove->velocity[0]; + flatvelocity[1] = pmove->velocity[1]; + flatvelocity[2] = 0; + + // Must be moving + curspeed = VectorNormalize(flatvelocity); + + // see if near an edge + flatforward[0] = pmove->forward[0]; + flatforward[1] = pmove->forward[1]; + flatforward[2] = 0; + VectorNormalize(flatforward); + + // Are we backing into water from steps or something? If so, don't pop forward + if (curspeed != 0.0 && (DotProduct(flatvelocity, flatforward) < 0.0)) + { + return; + } + + VectorCopy(pmove->origin, vecStart); + vecStart[2] += WJ_HEIGHT; + + VectorMA(vecStart, 24, flatforward, vecEnd); + + // Trace, this trace should use the point sized collision hull + savehull = pmove->usehull; + pmove->usehull = 2; + + tr = pmove->PM_PlayerTrace(vecStart, vecEnd, PM_NORMAL, -1); + + // Facing a near vertical wall? + if (tr.fraction < 1.0 && fabs((float_precision)(tr.plane.normal[2])) < 0.1f) + { + vecStart[2] += pmove->_player_maxs[savehull][2] - WJ_HEIGHT; + + VectorMA(vecStart, 24, flatforward, vecEnd); + VectorMA(vec3_origin, -50, tr.plane.normal, pmove->movedir); + + tr = pmove->PM_PlayerTrace(vecStart, vecEnd, PM_NORMAL, -1); + + if (tr.fraction == 1.0f) + { + pmove->waterjumptime = 2000.0f; + pmove->velocity[2] = 225.0f; + + pmove->oldbuttons |= IN_JUMP; + pmove->flags |= FL_WATERJUMP; + } + } + + // Reset the collision hull + pmove->usehull = savehull; } /* <2cdcd3> ../cstrike/pm_shared/pm_shared.c:2933 */ -NOBODY void PM_CheckFalling(void) +void PM_CheckFalling(void) { -// { -// float fvol; // 2939 -// PM_MapTextureTypeStepType(char chTextureType); // 2963 -// PM_PlayStepSound(int step, -// float fvol); // 2963 -// } + if (pmove->onground != -1 && !pmove->dead && pmove->flFallVelocity >= PM_PLAYER_FALL_PUNCH_THRESHHOLD) + { + float fvol = 0.5f; + + if (pmove->waterlevel <= 0) + { + if (pmove->flFallVelocity > PM_PLAYER_MAX_SAFE_FALL_SPEED) + { + fvol = 1.0f; + } + else if (pmove->flFallVelocity > PM_PLAYER_MAX_SAFE_FALL_SPEED / 2) + { + fvol = 0.85f; + } + else if (pmove->flFallVelocity < PM_PLAYER_MIN_BOUNCE_SPEED) + { + fvol = 0.0f; + } + } + + if (fvol > 0.0f) + { + PM_CatagorizeTextureType(); + + // play step sound for current texture + PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol); + + pmove->flTimeStepSound = 300; + + // Knock the screen around a little bit, temporary effect + // punch z axis + pmove->punchangle[2] = pmove->flFallVelocity * 0.013; + + if (pmove->punchangle[0] > 8.0f) + { + pmove->punchangle[0] = 8.0f; + } + } + } + + if (pmove->onground != -1) + { + pmove->flFallVelocity = 0; + } } /* <2cdd60> ../cstrike/pm_shared/pm_shared.c:2988 */ -NOBODY void PM_PlayWaterSounds(void) +void PM_PlayWaterSounds(void) { + // Did we enter or leave water? + if (pmove->oldwaterlevel != 0) + { + if (pmove->waterlevel != 0) + return; + } + else + { + if (pmove->waterlevel == 0) + return; + } + + switch (pmove->RandomLong(0, 3)) + { + case 0: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 1: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 2: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade3.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + case 3: pmove->PM_PlaySound(CHAN_BODY, "player/pl_wade4.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM); break; + } } /* <2cdd76> ../cstrike/pm_shared/pm_shared.c:3018 */ -NOXREF float PM_CalcRoll(vec_t *angles, vec_t *velocity, float rollangle, float rollspeed) +float PM_CalcRoll(vec_t *angles, vec_t *velocity, float rollangle, float rollspeed) { - long double sign; - long double side; - long double value; + float sign; + float_precision side; + float value; + vec3_t forward, right, up; + + AngleVectors(angles, forward, right, up); + + side = DotProduct(velocity, right); + + sign = side < 0 ? -1 : 1; + + side = fabs(side); + + value = rollangle; + + if (side < rollspeed) + { + side = side * value / rollspeed; + } + else + { + side = value; + } - vec3_t forward; - vec3_t right; - vec3_t up; - - AngleVectors(angles, forward, right, up); - - side = velocity[0] * right[0] + velocity[1] * right[1] + velocity[2] * right[2]; - - sign = side < 0 ? -1 : 1; - - side = fabs(side); - - value = rollangle; - - if (side < rollspeed) - side = side * value / rollspeed; - else - side = value; - return side * sign; } /* <2cde69> ../cstrike/pm_shared/pm_shared.c:3053 */ -NOXREF void PM_DropPunchAngle(vec_t *punchangle) +void PM_DropPunchAngle(vec_t *punchangle) { - long double len = VectorNormalize(punchangle); - - len -= (len * 0.5f + 10.0f) * pmove->frametime; - len = max(len, 0.0f); - + float_precision len; + + len = VectorNormalize(punchangle); + len -= (10.0 + len * 0.5) * pmove->frametime; + len = _max(len, 0.0); VectorScale(punchangle, len, punchangle); } /* <2cdeb8> ../cstrike/pm_shared/pm_shared.c:3069 */ void PM_CheckParamters(void) -{ - long double spd; - float maxspeed; - vec3_t v_angle; - - spd = sqrt((long double)(pmove->cmd.sidemove * pmove->cmd.sidemove + pmove->cmd.forwardmove * pmove->cmd.forwardmove + pmove->cmd.upmove * pmove->cmd.upmove)); - - maxspeed = pmove->clientmaxspeed; - - if (maxspeed) - { - if (maxspeed <= pmove->clientmaxspeed) - maxspeed = pmove->maxspeed; - - pmove->maxspeed = maxspeed; - } - - if (spd) - { - if (spd > pmove->maxspeed) - { - long double fRatio = pmove->maxspeed / spd; - - pmove->cmd.forwardmove *= fRatio; - pmove->cmd.sidemove *= fRatio; - pmove->cmd.upmove *= fRatio; - } - } - - if ((pmove->flags & (FL_FROZEN | FL_ONTRAIN)) || pmove->dead) - { - pmove->cmd.forwardmove = 0.0f; - pmove->cmd.sidemove = 0.0f; - pmove->cmd.upmove = 0.0f; - } - - PM_DropPunchAngle(pmove->punchangle); - - if (pmove->dead) - { - pmove->angles[0] = pmove->oldangles[0]; - pmove->angles[1] = pmove->oldangles[1]; - pmove->angles[2] = pmove->oldangles[2]; - } - else +{ + float spd; + float_precision maxspeed; + vec3_t v_angle; + + spd = sqrt((float_precision)(pmove->cmd.sidemove * pmove->cmd.sidemove + pmove->cmd.forwardmove * pmove->cmd.forwardmove + pmove->cmd.upmove * pmove->cmd.upmove)); + + maxspeed = pmove->clientmaxspeed; + + if (maxspeed != 0.0f) { - v_angle[0] = pmove->cmd.viewangles[0] + pmove->punchangle[0]; - v_angle[1] = pmove->cmd.viewangles[1] + pmove->punchangle[1]; - v_angle[2] = pmove->cmd.viewangles[2] + pmove->punchangle[2]; - - pmove->angles[2] = PM_CalcRoll(v_angle, pmove->velocity, pmove->movevars->rollangle, pmove->movevars->rollspeed) * 4.0f; - pmove->angles[0] = v_angle[0]; - pmove->angles[1] = v_angle[1]; + pmove->maxspeed = _min(maxspeed, pmove->maxspeed); + } + + if (spd != 0.0f && spd > (float_precision)pmove->maxspeed) + { + float_precision fRatio = pmove->maxspeed / spd; + + pmove->cmd.forwardmove *= fRatio; + pmove->cmd.sidemove *= fRatio; + pmove->cmd.upmove *= fRatio; + } + + if ((pmove->flags & (FL_FROZEN | FL_ONTRAIN)) || pmove->dead) + { + pmove->cmd.forwardmove = 0; + pmove->cmd.sidemove = 0; + pmove->cmd.upmove = 0; + } + + PM_DropPunchAngle(pmove->punchangle); + + // Take angles from command. + if (!pmove->dead) + { + VectorCopy(pmove->cmd.viewangles, v_angle); + VectorAdd(v_angle, pmove->punchangle, v_angle); + + // Set up view angles. + pmove->angles[ROLL] = PM_CalcRoll(v_angle, pmove->velocity, pmove->movevars->rollangle, pmove->movevars->rollspeed) * 4; + pmove->angles[PITCH] = v_angle[PITCH]; + pmove->angles[YAW] = v_angle[YAW]; + } + else + { + VectorCopy(pmove->oldangles, pmove->angles); + } + + // Set dead player view_offset + if (pmove->dead) + { + pmove->view_ofs[2] = PM_DEAD_VIEWHEIGHT; + } + + // Adjust client view angles to match values used on server. + if (pmove->angles[YAW] > 180.0f) + { + pmove->angles[YAW] -= 360.0f; } - - if (pmove->dead) - pmove->view_ofs[2] = -8.000000f; - - if (pmove->angles[1] > 180.0f) - pmove->angles[1] = pmove->angles[1] - 360.0f; } /* <2cdfc3> ../cstrike/pm_shared/pm_shared.c:3136 */ @@ -1066,54 +2739,311 @@ void PM_ReduceTimers(void) if (pmove->flTimeStepSound > 0) { pmove->flTimeStepSound -= pmove->cmd.msec; + if (pmove->flTimeStepSound < 0) + { pmove->flTimeStepSound = 0; + } } if (pmove->flDuckTime > 0) { pmove->flDuckTime -= pmove->cmd.msec; + if (pmove->flDuckTime < 0) + { pmove->flDuckTime = 0; + } } if (pmove->flSwimTime > 0) { pmove->flSwimTime -= pmove->cmd.msec; + if (pmove->flSwimTime < 0) + { pmove->flSwimTime = 0; + } } if (pmove->fuser2 > 0.0) { pmove->fuser2 -= pmove->cmd.msec; + if (pmove->fuser2 < 0.0) + { pmove->fuser2 = 0; + } } } /* <2cc577> ../cstrike/pm_shared/pm_shared.c:3203 */ -NOXREF qboolean PM_ShouldDoSpectMode(void) +qboolean PM_ShouldDoSpectMode(void) { return (pmove->iuser3 <= 0 || pmove->deadflag == DEAD_DEAD); } +// Returns with origin, angles, and velocity modified in place. +// Numtouch and touchindex[] will be set if any of the physents +// were contacted during the move. + /* <2cdfe9> ../cstrike/pm_shared/pm_shared.c:3225 */ -NOBODY void PM_PlayerMove(qboolean server) +void PM_PlayerMove(qboolean server) { -// physent_t *pLadder; // 3227 -// PM_ShouldDoSpectMode(void); // 3251 -// PM_InWater(void); // 3457 -// PM_Jump(void); // 3392 -// PM_AddCorrectGravity(void); // 3360 -// PM_Jump(void); // 3343 -// PM_FixupGravityVelocity(void); // 3459 + physent_t *pLadder = NULL; + + // Are we running server code? + pmove->server = server; + + // Adjust speeds etc. + PM_CheckParamters(); + + // Assume we don't touch anything + pmove->numtouch = 0; + + // # of msec to apply movement + + //double v2 = (double)pmove->cmd.msec * 0.001; + pmove->frametime = pmove->cmd.msec * 0.001; + + PM_ReduceTimers(); + + // Convert view angles to vectors + AngleVectors(pmove->angles, pmove->forward, pmove->right, pmove->up); + + //PM_ShowClipBox(); + + // Special handling for spectator and observers. (iuser1 is set if the player's in observer mode) + if ((pmove->spectator || pmove->iuser1 > 0) && PM_ShouldDoSpectMode()) + { + PM_SpectatorMove(); + PM_CatagorizePosition(); + return; + } + + // Always try and unstick us unless we are in NOCLIP mode + if (pmove->movetype != MOVETYPE_NOCLIP && pmove->movetype != MOVETYPE_NONE) + { + if (PM_CheckStuck()) + { + // Can't move, we're stuck + return; + } + } + + // Now that we are "unstuck", see where we are (waterlevel and type, pmove->onground). + PM_CatagorizePosition(); + + // Store off the starting water level + pmove->oldwaterlevel = pmove->waterlevel; + + // If we are not on ground, store off how fast we are moving down + if (pmove->onground == -1) + { + pmove->flFallVelocity = -pmove->velocity[2]; + } + + g_onladder = 0; + + // Don't run ladder code if dead or on a train + if (!pmove->dead && !(pmove->flags & FL_ONTRAIN)) + { + pLadder = PM_Ladder(); + + if (pLadder != NULL) + { + g_onladder = 1; + } + } + + PM_Duck(); + PM_UpdateStepSound(); + + // Don't run ladder code if dead or on a train + if (!pmove->dead && !(pmove->flags & FL_ONTRAIN)) + { + if (pLadder != NULL) + { + PM_LadderMove(pLadder); + } + else if (pmove->movetype != MOVETYPE_WALK && pmove->movetype != MOVETYPE_NOCLIP) + { + // Clear ladder stuff unless player is noclipping + // it will be set immediately again next frame if necessary + pmove->movetype = MOVETYPE_WALK; + } + } + + // Handle movement + switch (pmove->movetype) + { + default: + pmove->Con_DPrintf("Bogus pmove player movetype %i on (%i) 0=cl 1=sv\n", pmove->movetype, pmove->server); + break; + + case MOVETYPE_NONE: + break; + + case MOVETYPE_NOCLIP: + PM_NoClip(); + break; + + case MOVETYPE_TOSS: + case MOVETYPE_BOUNCE: + PM_Physics_Toss(); + break; + + case MOVETYPE_FLY: + PM_CheckWater(); + + // Was jump button pressed? + // If so, set velocity to 270 away from ladder. This is currently wrong. + // Also, set MOVE_TYPE to walk, too. + if (pmove->cmd.buttons & IN_JUMP) + { + if (!pLadder) + { + PM_Jump(); + } + } + else + { + pmove->oldbuttons &= ~IN_JUMP; + } + + // Perform the move accounting for any base velocity. + VectorAdd(pmove->velocity, pmove->basevelocity, pmove->velocity); + PM_FlyMove(); + VectorSubtract(pmove->velocity, pmove->basevelocity, pmove->velocity); + break; + + case MOVETYPE_WALK: + if (!PM_InWater()) + { + PM_AddCorrectGravity(); + } + + // If we are leaping out of the water, just update the counters. + if (pmove->waterjumptime != 0.0f) + { + PM_WaterJump(); + PM_FlyMove(); + + // Make sure waterlevel is set correctly + PM_CheckWater(); + return; + } + + // If we are swimming in the water, see if we are nudging against a place we can jump up out + // of, and, if so, start out jump. Otherwise, if we are not moving up, then reset jump timer to 0 + if (pmove->waterlevel >= 2) + { + if (pmove->waterlevel == 2) + { + PM_CheckWaterJump(); + } + + // If we are falling again, then we must not trying to jump out of water any more. + if (pmove->velocity[2] < 0 && pmove->waterjumptime) + { + pmove->waterjumptime = 0; + } + + // Was jump button pressed? + if (pmove->cmd.buttons & IN_JUMP) + { + PM_Jump(); + } + else + { + pmove->oldbuttons &= ~IN_JUMP; + } + + // Perform regular water movement + PM_WaterMove(); + + VectorSubtract(pmove->velocity, pmove->basevelocity, pmove->velocity); + + // Get a final position + PM_CatagorizePosition(); + } + // Not underwater + else + { + // Was jump button pressed? + if (pmove->cmd.buttons & IN_JUMP) + { + if (!pLadder) + { + PM_Jump(); + } + } + else + { + pmove->oldbuttons &= ~IN_JUMP; + } + + // Fricion is handled before we add in any base velocity. That way, if we are on a conveyor, + // we don't slow when standing still, relative to the conveyor. + if (pmove->onground != -1) + { + pmove->velocity[2] = 0; + PM_Friction(); + } + + // Make sure velocity is valid. + PM_CheckVelocity(); + + // Are we on ground now + if (pmove->onground != -1) + { + PM_WalkMove(); + } + else + { + // Take into account movement when in air. + PM_AirMove(); + } + + // Set final flags. + PM_CatagorizePosition(); + + // Now pull the base velocity back out. + // Base velocity is set if you are on a moving object, like + // a conveyor (or maybe another monster?) + VectorSubtract(pmove->velocity, pmove->basevelocity, pmove->velocity); + + // Make sure velocity is valid. + PM_CheckVelocity(); + + // Add any remaining gravitational component. + if (!PM_InWater()) + { + PM_FixupGravityVelocity(); + } + + // If we are on ground, no downward velocity. + if (pmove->onground != -1) + { + pmove->velocity[2] = 0; + } + + // See if we landed on the ground with enough force to play + // a landing sound. + PM_CheckFalling(); + } + + // Did we enter or leave the water? + PM_PlayWaterSounds(); + break; + } } /* <2ce101> ../cstrike/pm_shared/pm_shared.c:3479 */ void PM_CreateStuckTable(void) { float x, y, z; + int idx; int i; float zi[3]; @@ -1121,101 +3051,139 @@ void PM_CreateStuckTable(void) Q_memset(rgv3tStuckTable, 0, sizeof(rgv3tStuckTable)); idx = 0; - x = y = 0; - for (z = -0.125; z <= 0.125; z += 0.125, idx++) + // Little Moves. + x = 0; + y = 0; + + // Z moves + for (z = -0.125; z <= 0.125; z += 0.125) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } - x = z = 0; - - for (y = -0.125; y <= 0.125; y += 0.125, idx++) + x = 0; + z = 0; + // Y moves + for (y = -0.125; y <= 0.125; y += 0.125) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } - y = z = 0; - - for (x = -0.125; x <= 0.125; x += 0.125, idx++) + y = 0; + z = 0; + // X moves + for (x = -0.125; x <= 0.125; x += 0.125) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } + // Remaining multi axis nudges. for (x = -0.125; x <= 0.125; x += 0.250) { for (y = -0.125; y <= 0.125; y += 0.250) { - for (z = -0.125; z <= 0.125; z += 0.250, idx++) + for (z = -0.125; z <= 0.125; z += 0.250) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } } } - x = y = 0; - zi[0] = 0; - zi[1] = 1; - zi[2] = 6; + // Big Moves. + x = 0; + y = 0; - for (i = 0; i < 3; i++, idx++) + zi[0] = 0.0f; + zi[1] = 1.0f; + zi[2] = 6.0f; + + for (i = 0; i < 3; i++) { + // Z moves z = zi[i]; + rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } - x = z = 0.0; + x = 0; + z = 0; - for (y = -2.0; y <= 2.0; y += 2.0, idx++) + // Y moves + for (y = -2.0f ; y <= 2.0f ; y += 2.0) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } - y = z = 0; + y = 0; + z = 0; - for (x = -2.0; x <= 2.0; x += 2.0, idx++) + // X moves + for (x = -2.0f ; x <= 2.0f ; x += 2.0f) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } + // Remaining multi axis nudges. for (i = 0; i < 3; i++) { z = zi[i]; - for (y = -2.0; y <= 2.0; y += 2.0) + for (x = -2.0f ; x <= 2.0f ; x += 2.0f) { - for (z = -2.0; z <= 2.0; z += 2.0, idx++) + for (y = -2.0f ; y <= 2.0f ; y += 2.0) { rgv3tStuckTable[idx][0] = x; rgv3tStuckTable[idx][1] = y; rgv3tStuckTable[idx][2] = z; + + idx++; } } } } +// This module implements the shared player physics code between any particular game and +// the engine. The same PM_Move routine is built into the game .dll and the client .dll and is +// invoked by each side as appropriate. There should be no distinction, internally, between server +// and client. This will ensure that prediction behaves appropriately. + /* <2ce182> ../cstrike/pm_shared/pm_shared.c:3596 */ void PM_Move(struct playermove_s *ppmove, int server) { - assert( pm_shared_initialized ); + assert(pm_shared_initialized); pmove = ppmove; - PM_PlayerMove((server != 0) ? TRUE : FALSE);// TODO: Reverse me + PM_PlayerMove((server != 0) ? TRUE : FALSE); if (pmove->onground != -1) pmove->flags |= FL_ONGROUND; @@ -1223,14 +3191,18 @@ void PM_Move(struct playermove_s *ppmove, int server) pmove->flags &= ~FL_ONGROUND; if (!pmove->multiplayer && pmove->movetype == MOVETYPE_WALK) + { pmove->friction = 1.0f; + } } /* <2ce1c1> ../cstrike/pm_shared/pm_shared.c:3620 */ NOXREF int PM_GetVisEntInfo(int ent) { if (ent >= 0 && ent <= pmove->numvisent) + { return pmove->visents[ent].info; + } return -1; } @@ -1239,7 +3211,9 @@ NOXREF int PM_GetVisEntInfo(int ent) NOXREF int PM_GetPhysEntInfo(int ent) { if (ent >= 0 && ent <= pmove->numphysent) + { return pmove->physents[ent].info; + } return -1; } diff --git a/regamedll/pm_shared/pm_shared.h b/regamedll/pm_shared/pm_shared.h index 78cd5ffd..169fdd51 100644 --- a/regamedll/pm_shared/pm_shared.h +++ b/regamedll/pm_shared/pm_shared.h @@ -32,6 +32,10 @@ #pragma once #endif +#define MAX_CLIENTS 32 + +#define PM_DEAD_VIEWHEIGHT -8 + #define OBS_NONE 0 #define OBS_CHASE_LOCKED 1 #define OBS_CHASE_FREE 2 @@ -60,66 +64,70 @@ #define pm_gcTextures (*ppm_gcTextures) #define pm_grgszTextureName (*ppm_grgszTextureName) #define pm_grgchTextureType (*ppm_grgchTextureType) +#define rgStuckLast (*prgStuckLast) +#define g_onladder (*pg_onladder) #endif // HOOK_GAMEDLL extern playermove_t *pmove; extern int pm_shared_initialized; extern vec3_t rgv3tStuckTable[54]; +extern int rgStuckLast[MAX_CLIENTS][2]; +extern int g_onladder; extern int pm_gcTextures; extern char pm_grgszTextureName[ CTEXTURESMAX ][ CBTEXTURENAMEMAX ]; extern char pm_grgchTextureType[ CTEXTURESMAX ]; -NOXREF void PM_SwapTextures(int i, int j); +void PM_SwapTextures(int i, int j); NOXREF int PM_IsThereGrassTexture(void); -NOXREF void PM_SortTextures(void); +void PM_SortTextures(void); void PM_InitTextureTypes(void); char PM_FindTextureType(char *name); void PM_PlayStepSound(int step, float fvol); -NOXREF int PM_MapTextureTypeStepType(char chTextureType); +int PM_MapTextureTypeStepType(char chTextureType); void PM_CatagorizeTextureType(void); void PM_UpdateStepSound(void); -NOBODY qboolean PM_AddToTouched(pmtrace_t tr, vec3_t impactvelocity); -NOBODY void PM_CheckVelocity(void); -NOBODY int PM_ClipVelocity(vec3_t in, vec3_t normal, vec3_t out, float overbounce); -NOBODY void PM_AddCorrectGravity(void); -NOBODY void PM_FixupGravityVelocity(void); -NOBODY int PM_FlyMove(void); -NOBODY void PM_Accelerate(vec3_t wishdir, float wishspeed, float accel); -NOBODY void PM_WalkMove(void); -NOBODY void PM_Friction(void); -NOBODY void PM_AirAccelerate(vec3_t wishdir, float wishspeed, float accel); -NOBODY void PM_WaterMove(void); -NOBODY void PM_AirMove(void); -NOBODY qboolean PM_InWater(void); -NOBODY qboolean PM_CheckWater(void); -NOBODY void PM_CatagorizePosition(void); -NOBODY int PM_GetRandomStuckOffsets(int nIndex, int server, vec3_t offset); -NOBODY void PM_ResetStuckOffsets(int nIndex, int server); -NOBODY int PM_CheckStuck(void); -NOBODY void PM_SpectatorMove(void); -NOBODY float PM_SplineFraction(float value, float scale); -NOBODY float PM_SimpleSpline(float value); -NOBODY void PM_FixPlayerCrouchStuck(int direction); -NOBODY void PM_Duck(void); -NOBODY void PM_LadderMove(physent_t *pLadder); -NOBODY physent_t *PM_Ladder(void); -NOBODY void PM_WaterJump(void); -NOBODY void PM_AddGravity(void); -NOBODY pmtrace_t PM_PushEntity(vec3_t push); -NOBODY void PM_Physics_Toss(void); -NOBODY void PM_NoClip(void); -NOBODY void PM_PreventMegaBunnyJumping(void); -NOBODY void PM_Jump(void); -NOBODY void PM_CheckWaterJump(void); -NOBODY void PM_CheckFalling(void); -NOBODY void PM_PlayWaterSounds(void); -NOXREF float PM_CalcRoll(vec_t *angles, vec_t *velocity, float rollangle, float rollspeed); -NOXREF void PM_DropPunchAngle(vec_t *punchangle); +qboolean PM_AddToTouched(pmtrace_t tr, vec_t *impactvelocity); +void PM_CheckVelocity(void); +int PM_ClipVelocity(vec_t *in, vec_t *normal, vec_t *out, float overbounce); +void PM_AddCorrectGravity(void); +void PM_FixupGravityVelocity(void); +int PM_FlyMove(void); +void PM_Accelerate(vec_t *wishdir, float_precision wishspeed, float accel); +void PM_WalkMove(void); +void PM_Friction(void); +void PM_AirAccelerate(vec_t *wishdir, float wishspeed, float accel); +void PM_WaterMove(void); +void PM_AirMove(void); +qboolean PM_InWater(void); +qboolean PM_CheckWater(void); +void PM_CatagorizePosition(void); +int PM_GetRandomStuckOffsets(int nIndex, int server, vec_t *offset); +void PM_ResetStuckOffsets(int nIndex, int server); +int PM_CheckStuck(void); +void PM_SpectatorMove(void); +float PM_SplineFraction(float value, float scale); +NOXREF float PM_SimpleSpline(float value); +void PM_FixPlayerCrouchStuck(int direction); +void PM_Duck(void); +void PM_LadderMove(physent_t *pLadder); +physent_t *PM_Ladder(void); +void PM_WaterJump(void); +void PM_AddGravity(void); +pmtrace_t PM_PushEntity(vec_t *push); +void PM_Physics_Toss(void); +void PM_NoClip(void); +void PM_PreventMegaBunnyJumping(void); +void PM_Jump(void); +void PM_CheckWaterJump(void); +void PM_CheckFalling(void); +void PM_PlayWaterSounds(void); +float PM_CalcRoll(vec_t *angles, vec_t *velocity, float rollangle, float rollspeed); +void PM_DropPunchAngle(vec_t *punchangle); void PM_CheckParamters(void); void PM_ReduceTimers(void); -NOXREF qboolean PM_ShouldDoSpectMode(void); +qboolean PM_ShouldDoSpectMode(void); void PM_PlayerMove(qboolean server); void PM_CreateStuckTable(void); void PM_Move(struct playermove_s *ppmove, int server); diff --git a/regamedll/public/MemPool.cpp b/regamedll/public/MemPool.cpp index dbe0047a..fdd43149 100644 --- a/regamedll/public/MemPool.cpp +++ b/regamedll/public/MemPool.cpp @@ -69,7 +69,7 @@ void *CMemoryPool::Alloc(unsigned int amount) return NULL; _blocksAllocated++; - _peakAlloc = max(_peakAlloc, _blocksAllocated); + _peakAlloc = _max(_peakAlloc, _blocksAllocated); if (_blocksAllocated >= _numElements) AddNewBlob(); @@ -91,7 +91,7 @@ void CMemoryPool::Free(void *memblock) return; #ifdef _DEBUG - memset(memblock, 0xDD, _blockSize); + Q_memset(memblock, 0xDD, _blockSize); #endif // _DEBUG _blocksAllocated--; diff --git a/regamedll/regamedll/dlls.h b/regamedll/regamedll/dlls.h index 7ad93000..8e5fa9ea 100644 --- a/regamedll/regamedll/dlls.h +++ b/regamedll/regamedll/dlls.h @@ -26,12 +26,12 @@ * */ -#include "mathlib.h" #include "extdll.h" #include "h_export.h" #include "schedule.h" #include "archtypes.h" +#include "scriptevent.h" #include "enginecallback.h" //#include "entity_state.h" #include "nodes.h" diff --git a/regamedll/regamedll/precompiled.h b/regamedll/regamedll/precompiled.h index efe357c5..111c2a32 100644 --- a/regamedll/regamedll/precompiled.h +++ b/regamedll/regamedll/precompiled.h @@ -22,6 +22,7 @@ #include "hooker.h" #endif // HOOK_GAMEDLL +#include "mathlib.h" #include "dlls.h" #include "basetypes.h" diff --git a/regamedll/unittests/struct_offsets_tests.cpp b/regamedll/unittests/struct_offsets_tests.cpp index 8a6fef50..1c944025 100644 --- a/regamedll/unittests/struct_offsets_tests.cpp +++ b/regamedll/unittests/struct_offsets_tests.cpp @@ -43,8 +43,15 @@ TEST(StructOffsets, ReversingChecks, 5000) REPEAT_SIZEOF_PRINT(BotPhrase); REPEAT_SIZEOF_PRINT(CBasePlayer); REPEAT_SIZEOF_PRINT(ActiveGrenade); + REPEAT_SIZEOF_PRINT(CSoundEnt); + REPEAT_SIZEOF_PRINT(CCSTutor); REPEAT_SIZEOF_PRINT(CHostageImprov); + REPEAT_SIZEOF_PRINT(CHostage); + + REPEAT_SIZEOF_PRINT(CBaseGrenCatch); + REPEAT_SIZEOF_PRINT(CFuncWeaponCheck); + REPEAT_SIZEOF_PRINT(HostageStateMachine); REPEAT_SIZEOF_PRINT(HostageFollowState); REPEAT_SIZEOF_PRINT(CHalfLifeMultiplay); @@ -67,6 +74,11 @@ TEST(StructOffsets, ReversingChecks, 5000) CHECK_CLASS_SIZE(CBasePlayer, 0x9B0, 0x9C4); CHECK_CLASS_SIZE(CHostageImprov, 0x1C8Cu, 0x1C8Cu); + CHECK_CLASS_SIZE(CHostage, 0x7B0, 0x7C4); + + CHECK_CLASS_SIZE(CBaseGrenCatch, 0x98, 0xA8); + CHECK_CLASS_SIZE(CFuncWeaponCheck, 0x11C, 0x12C); + CHECK_CLASS_SIZE(BotPhraseManager, 0x21Cu, 0x214u); CHECK_CLASS_SIZE(BotPhrase, 0x50, 0x44); @@ -80,6 +92,8 @@ TEST(StructOffsets, ReversingChecks, 5000) CHECK_CLASS_SIZE(CCareerTaskManager, 0x28, 0x24); CHECK_CLASS_SIZE(CCareerTask, 0x2C, 0x2C); CHECK_CLASS_SIZE(CPreventDefuseTask, 0x30, 0x30); + CHECK_CLASS_SIZE(CSoundEnt, 0x898, 0x8A8); + //CHECK_CLASS_SIZE(CCSTutor, 0x160u, 0x164u); // UNDONE: don't need a check this //CHECK_CLASS_SIZE(CBotManager, 12u, 12); CHECK_CLASS_SIZE(CCSBot, 11404, 11424);