Final: fully reversed functions CZ

This commit is contained in:
s1lentq 2016-01-25 23:02:57 +06:00
parent e80480a400
commit a8cc9cc76f
76 changed files with 5199 additions and 1895 deletions

View File

@ -12,7 +12,6 @@ At the moment, the work of reverse engineering continues
</ul>
## How can use it?
At the moment there is a workable CS 1.6
Regamedll_CS is fully compatible with official mod CS 1.6 by Valve. All you have to do is to download binaries and replace original mo.dll/cs.so
Compiled binaries are available here: http://nexus.rehlds.org/nexus/content/repositories/regamedll-snapshots/regamedll/regamedll/0.2-SNAPSHOT/
@ -28,7 +27,7 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
## Current status
<ul>
<li> Counter-Strike 1.6 - 100%</li>
<li> Counter-Strike: Condition Zero - 90%</li>
<li> Counter-Strike: Condition Zero - 100%</li>
</ul>
## Build instructions

View File

@ -13,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release MP|Win32">
<Configuration>Release MP</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@ -36,6 +40,12 @@
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
@ -58,6 +68,9 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@ -96,6 +109,21 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(ProjectDir)..\include\</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeaderFile>bzlib_private.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
@ -143,6 +171,7 @@
<ClCompile Include="..\src\precompiled.c">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>

View File

@ -13,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release MP|Win32">
<Configuration>Release MP</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@ -52,6 +56,12 @@
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
@ -80,6 +90,9 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@ -120,6 +133,22 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>$(ProjectDir)..\include\</AdditionalIncludeDirectories>
<CompileAs>CompileAsCpp</CompileAs>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
<ClCompile>
<PrecompiledHeader>

View File

@ -27,6 +27,7 @@ Global
Debug MP|Win32 = Debug MP|Win32
Debug Play|Win32 = Debug Play|Win32
Debug|Win32 = Debug|Win32
Release MP|Win32 = Release MP|Win32
Release Play|Win32 = Release Play|Win32
Release|Win32 = Release|Win32
Tests|Win32 = Tests|Win32
@ -40,6 +41,8 @@ Global
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Debug Play|Win32.Build.0 = Debug Play|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Debug|Win32.ActiveCfg = Debug|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Debug|Win32.Build.0 = Debug|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Release MP|Win32.ActiveCfg = Release MP|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Release MP|Win32.Build.0 = Release MP|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Release Play|Win32.ActiveCfg = Release Play|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Release Play|Win32.Build.0 = Release Play|Win32
{70A2B904-B7DB-4C48-8DE0-AF567360D572}.Release|Win32.ActiveCfg = Release|Win32
@ -54,6 +57,8 @@ Global
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Debug Play|Win32.Build.0 = Debug|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Debug|Win32.ActiveCfg = Debug|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Debug|Win32.Build.0 = Debug|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Release MP|Win32.ActiveCfg = Release MP|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Release MP|Win32.Build.0 = Release MP|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Release Play|Win32.ActiveCfg = Release|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Release Play|Win32.Build.0 = Release|Win32
{CEB94F7C-E459-4673-AABB-36E2074396C0}.Release|Win32.ActiveCfg = Release|Win32
@ -68,6 +73,8 @@ Global
{792DF067-9904-4579-99B9-46C17277ADE3}.Debug Play|Win32.Build.0 = Debug|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Debug|Win32.ActiveCfg = Debug|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Debug|Win32.Build.0 = Debug|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Release MP|Win32.ActiveCfg = Release MP|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Release MP|Win32.Build.0 = Release MP|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Release Play|Win32.ActiveCfg = Release|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Release Play|Win32.Build.0 = Release|Win32
{792DF067-9904-4579-99B9-46C17277ADE3}.Release|Win32.ActiveCfg = Release|Win32

View File

@ -185,7 +185,7 @@ void setupToolchain(NativeBinarySpec b)
if (!unitTestExecutable)
{
cfg.singleDefines 'CSTRIKE'
//cfg.singleDefines 'CSTRIKE'
if (!mpLib)
{

View File

@ -239,7 +239,7 @@ void CBaseAnimating::SetSequenceBox(void)
Vector rmax(-9999, -9999, -9999);
Vector base, transformed;
for (int i = 0; i <= 1; i++)
for (int i = 0; i <= 1; ++i)
{
base.x = bounds[i].x;
for (int j = 0; j <= 1; j++)

View File

@ -72,7 +72,7 @@ int LookupActivity(void *pmodel, entvars_t *pev, int activity)
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex);
for (i = 0; i < pstudiohdr->numseq; i++)
for (i = 0; i < pstudiohdr->numseq; ++i)
{
if (pseqdesc[i].activity == activity)
{
@ -87,7 +87,7 @@ int LookupActivity(void *pmodel, entvars_t *pev, int activity)
{
int which = RANDOM_LONG(0, weightTotal - 1);
for (i = 0; i < pstudiohdr->numseq; i++)
for (i = 0; i < pstudiohdr->numseq; ++i)
{
if (pseqdesc[i].activity == activity)
{
@ -104,7 +104,7 @@ int LookupActivity(void *pmodel, entvars_t *pev, int activity)
{
select = RANDOM_LONG(0, activitySequenceCount - 1);
for (i = 0; i < pstudiohdr->numseq; i++)
for (i = 0; i < pstudiohdr->numseq; ++i)
{
if (pseqdesc[i].activity == activity)
{
@ -136,7 +136,7 @@ int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity)
int weight = 0;
int seq = ACT_INVALID;
for (int i = 0; i < pstudiohdr->numseq; i++)
for (int i = 0; i < pstudiohdr->numseq; ++i)
{
if (pseqdesc[i].activity == activity)
{
@ -181,7 +181,7 @@ int LookupSequence(void *pmodel, const char *label)
// Look up by sequence name.
mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex);
for (int i = 0; i < pstudiohdr->numseq; i++)
for (int i = 0; i < pstudiohdr->numseq; ++i)
{
if (!Q_stricmp(pseqdesc[i].label, label))
return i;
@ -218,7 +218,7 @@ NOXREF void SequencePrecache(void *pmodel, const char *pSequenceName)
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++)
for (int i = 0; i < pseqdesc->numevents; ++i)
{
// Don't send client-side events to the server AI
if (pevent[i].event >= EVENT_CLIENT)
@ -486,7 +486,7 @@ int FindTransition(void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir)
}
// look for someone going
for (int i = 0; i < pstudiohdr->numseq; i++)
for (int i = 0; i < pstudiohdr->numseq; ++i)
{
if (pseqdesc[i].entrynode == iEndNode && pseqdesc[i].exitnode == iInternNode)
{
@ -645,7 +645,7 @@ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt)
float_precision a = 0;
float_precision b = 0;
for (i = 0; i < 4; i++)
for (i = 0; i < 4; ++i)
{
a += (p[i] - q[i]) * (p[i] - q[i]);
b += (p[i] + q[i]) * (p[i] + q[i]);
@ -653,7 +653,7 @@ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt)
if (a > b)
{
for (i = 0; i < 4; i++)
for (i = 0; i < 4; ++i)
q[i] = -q[i];
}
@ -677,7 +677,7 @@ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt)
sclp = 1.0 - t;
}
for (i = 0; i < 4; i++)
for (i = 0; i < 4; ++i)
qt[i] = sclp * p[i] + sclq * q[i];
}
else
@ -690,7 +690,7 @@ void QuaternionSlerp(vec_t *p, vec_t *q, float t, vec_t *qt)
sclp = sin((1.0 - t) * 0.5 * M_PI);
sclq = sin(t * 0.5 * M_PI);
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
qt[i] = sclp * p[i] + sclq * qt[i];
}
}
@ -968,7 +968,7 @@ void StudioSlerpBones(vec4_t *q1, float pos1[][3], vec4_t *q2, float pos2[][3],
s1 = 1.0 - s;
for (i = 0; i < g_pstudiohdr->numbones; i++)
for (i = 0; i < g_pstudiohdr->numbones; ++i)
{
QuaternionSlerp(q1[i], q2[i], s, q3);
@ -1060,7 +1060,7 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
{
chainlength = g_pstudiohdr->numbones;
for (i = 0; i < chainlength; i++)
for (i = 0; i < chainlength; ++i)
chain[(chainlength - i) - 1] = i;
}
else
@ -1203,7 +1203,7 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
panim = StudioGetAnim(pModel, pseqdesc);
StudioCalcRotations(pbones, chain, chainlength, adj, pos2, q2, pseqdesc, panim, 0, 0);
for (i = 0; i < g_pstudiohdr->numbones; i++)
for (i = 0; i < g_pstudiohdr->numbones; ++i)
{
if (!Q_strcmp(pbones[i].name, "Bip01 Spine"))
{

View File

@ -675,7 +675,7 @@ CBasePlayer *CCSBot::GetImportantEnemy(bool checkVisibility) const
CBasePlayer *nearEnemy = NULL;
float nearDist = 999999999.9f;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *entity = UTIL_PlayerByIndex(i);

View File

@ -39,6 +39,9 @@
#define CSBOT_VERSION_MAJOR 1
#define CSBOT_VERSION_MINOR 50
#define PRIMARY_WEAPON_BUY_COUNT 13
#define SECONDARY_WEAPON_BUY_COUNT 3
#define FLAG_PROGRESS_DRAW 0x0 // draw status bar progress
#define FLAG_PROGRESS_START 0x1 // init status bar progress
#define FLAG_PROGRESS_HIDE 0x2 // hide status bar progress
@ -55,11 +58,23 @@
#define _navAreaCount (*pnavAreaCount)
#define _currentIndex (*pcurrentIndex)
#define primaryWeaponBuyInfoCT (*pprimaryWeaponBuyInfoCT)
#define secondaryWeaponBuyInfoCT (*psecondaryWeaponBuyInfoCT)
#define primaryWeaponBuyInfoT (*pprimaryWeaponBuyInfoT)
#define secondaryWeaponBuyInfoT (*psecondaryWeaponBuyInfoT)
#endif // HOOK_GAMEDLL
extern int _navAreaCount;
extern int _currentIndex;
extern struct BuyInfo primaryWeaponBuyInfoCT[ PRIMARY_WEAPON_BUY_COUNT ];
extern struct BuyInfo secondaryWeaponBuyInfoCT[ SECONDARY_WEAPON_BUY_COUNT ];
extern struct BuyInfo primaryWeaponBuyInfoT[ PRIMARY_WEAPON_BUY_COUNT ];
extern struct BuyInfo secondaryWeaponBuyInfoT[ SECONDARY_WEAPON_BUY_COUNT ];
class CCSBot;
class BotChatterInterface;
@ -78,8 +93,8 @@ public:
class IdleState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual const char *GetName(void) const { return "Idle"; }
#ifdef HOOK_GAMEDLL
@ -95,9 +110,9 @@ public:
class HuntState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "Hunt"; }
#ifdef HOOK_GAMEDLL
@ -118,9 +133,9 @@ private:
class AttackState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "Attack"; }
#ifdef HOOK_GAMEDLL
@ -166,9 +181,9 @@ protected:
class InvestigateNoiseState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "InvestigateNoise"; }
#ifdef HOOK_GAMEDLL
@ -180,7 +195,7 @@ public:
#endif // HOOK_GAMEDLL
private:
NOBODY void AttendCurrentNoise(CCSBot *me);
void AttendCurrentNoise(CCSBot *me);
Vector m_checkNoisePosition;
};/* size: 16, cachelines: 1, members: 2 */
@ -189,9 +204,9 @@ private:
class BuyState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "Buy"; }
#ifdef HOOK_GAMEDLL
@ -219,9 +234,9 @@ private:
class MoveToState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "MoveTo"; }
#ifdef HOOK_GAMEDLL
@ -283,9 +298,9 @@ public:
class DefuseBombState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "DefuseBomb"; }
#ifdef HOOK_GAMEDLL
@ -302,9 +317,9 @@ public:
class HideState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "Hide"; }
#ifdef HOOK_GAMEDLL
@ -348,9 +363,9 @@ private:
class EscapeFromBombState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "EscapeFromBomb"; }
#ifdef HOOK_GAMEDLL
@ -367,9 +382,9 @@ public:
class FollowState: public BotState
{
public:
NOBODY virtual void OnEnter(CCSBot *me);
NOBODY virtual void OnUpdate(CCSBot *me);
NOBODY virtual void OnExit(CCSBot *me);
virtual void OnEnter(CCSBot *me);
virtual void OnUpdate(CCSBot *me);
virtual void OnExit(CCSBot *me);
virtual const char *GetName(void) const { return "Follow"; }
#ifdef HOOK_GAMEDLL
@ -383,7 +398,7 @@ public:
void SetLeader(CBaseEntity *leader) { m_leader = leader; }
private:
NOBODY void ComputeLeaderMotionState(float leaderSpeed);
void ComputeLeaderMotionState(float leaderSpeed);
EHANDLE m_leader;
Vector m_lastLeaderPos;
@ -456,12 +471,12 @@ public:
virtual void SpawnBot(void); // (EXTEND) spawn the bot into the game
virtual void Upkeep(void); // lightweight maintenance, invoked frequently
NOBODY virtual void Update(void); // heavyweight algorithms, invoked less often
virtual void Update(void); // heavyweight algorithms, invoked less often
virtual void Walk(void);
virtual bool Jump(bool mustJump = false); // returns true if jump was started
NOBODY virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); // invoked when event occurs in the game (some events have NULL entity)
virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL); // invoked when event occurs in the game (some events have NULL entity)
#define CHECK_FOV true
virtual bool IsVisible(const Vector *pos, bool testFOV = false) const; // return true if we can see the point
@ -642,7 +657,7 @@ public:
// listening for noises
bool IsNoiseHeard(void) const; // return true if we have heard a noise
bool ShouldInvestigateNoise(float *retNoiseDist);
bool ShouldInvestigateNoise(float *retNoiseDist = NULL);
void InvestigateNoise(void); // investigate recent enemy noise
const Vector *GetNoisePosition(void) const; // return position of last heard noise, or NULL if none heard
CNavArea *GetNoiseArea(void) const; // return area where noise was heard
@ -1117,6 +1132,8 @@ private:
GameEventType m_lastRadioCommand; // last radio command we recieved
void RespondToRadioCommands(void);
bool IsRadioCommand(GameEventType event) const; // returns true if the radio message is an order to do something
#define NO_FORCE false
void EndVoiceFeedback(bool force = true);
float m_lastRadioRecievedTimestamp; // time we recieved a radio message
float m_lastRadioSentTimestamp; // time when we send a radio message
@ -1275,8 +1292,7 @@ inline const CSGameState *CCSBot::GetGameState(void) const
/* <5c4ce8> ../cstrike/dlls/bot/cs_bot.h:397 */
inline bool CCSBot::IsAtBombsite(void)
{
UNTESTED
return GetGameState()->IsAtPlantedBombsite();
return (m_signals.GetState() & SIGNAL_BOMB) == SIGNAL_BOMB;
}
/* <5a07c3> ../cstrike/dlls/bot/cs_bot.h:453 */
@ -1344,8 +1360,7 @@ inline BotChatterInterface *CCSBot::GetChatter(void)
/* <111238> ../cstrike/dlls/bot/cs_bot.h:508 */
inline bool CCSBot::IsUsingVoice(void) const
{
UNTESTED
return (m_voiceFeedbackEndTimestamp != 0.0f); //return (m_voiceFeedbackEndTimestamp > gpGlobals->time);
return (m_voiceFeedbackEndTimestamp != 0.0f);
}
/* <519493> ../cstrike/dlls/bot/cs_bot.h:513 */
@ -1927,32 +1942,27 @@ public:
FollowTargetCollector(CBasePlayer *player)
{
m_player = player;
Vector playerVel = player->pev->velocity;
m_forward.x = playerVel.x;
m_forward.y = playerVel.y;
m_forward.x = player->pev->velocity.x;
m_forward.y = player->pev->velocity.y;
float speed = m_forward.NormalizeInPlace();
Vector playerOrigin = player->pev->origin;
const float walkSpeed = 100.0f;
if (speed < walkSpeed)
{
m_cutoff.x = playerOrigin.x;
m_cutoff.y = playerOrigin.y;
m_cutoff.x = player->pev->origin.x;
m_cutoff.y = player->pev->origin.y;
m_forward.x = 0.0f;
m_forward.y = 0.0f;
}
else
{
const float k = 1.5f; // 2.0f;
float trimSpeed = (speed < 200.0f) ? speed : 200.0f;
const float k = 1.5f;
float_precision 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;
m_cutoff.x = player->pev->origin.x + k * trimSpeed * m_forward.x;
m_cutoff.y = player->pev->origin.y + k * trimSpeed * m_forward.y;
}
m_targetAreaCount = 0;
@ -2008,11 +2018,20 @@ typedef void (CCSBot::*HIDE_VECTOR)(const Vector *, float, bool);
typedef const CSGameState *(CCSBot::*GETGAMESTATE_CONST)(void) const;
typedef CSGameState *(CCSBot::*GETGAMESTATE_NOTCONST)(void);
bool NavAreaBuildPath__PathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, PathCost &costFunc, CNavArea **closestArea = NULL);
// refs
// NavAreaBuildPath<PathCost> hook
inline bool NavAreaBuildPath__PathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, PathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
// NavAreaTravelDistance<PathCost> hook
inline float_precision NavAreaTravelDistance__PathCost__wrapper(CNavArea *startArea, CNavArea *endArea, PathCost &costFunc)
{
return NavAreaTravelDistance(startArea, endArea, costFunc);
}
// refs
extern void (*pCCSBot__UpdateLookAngles)(void);
extern void (*pCCSBot__Update)(void);
#endif // HOOK_GAMEDLL

View File

@ -19,8 +19,6 @@ CBaseEntity *g_pSelectedZombieSpawn;
CountdownTimer IMPL_CLASS(BotChatterInterface, m_encourageTimer);
IntervalTimer IMPL_CLASS(BotChatterInterface, m_radioSilenceInterval)[ 2 ];
void (*pBotPhrase__Randomize)(void);
#endif // HOOK_GAMEDLL
/* <303469> ../cstrike/dlls/bot/cs_bot_chatter.cpp:32 */
@ -388,20 +386,10 @@ char *BotPhrase::GetSpeakable(int bankIndex, float *duration) const
// Randomly shuffle the speakable order
/* <30395a> ../cstrike/dlls/bot/cs_bot_chatter.cpp:395 */
#ifdef HOOK_GAMEDLL
void __declspec(naked) BotPhrase::Randomize(void)
{
// you can not hook this function, because it uses the rand() function
// which does not allow us to carry out tests because different results at the output.
__asm
{
jmp pBotPhrase__Randomize
}
}
#else
#ifndef HOOK_GAMEDLL
void BotPhrase::Randomize(void)
{
for (uint32 i = 0; i < m_voiceBank.size(); i++)
for (uint32 i = 0; i < m_voiceBank.size(); ++i)
{
std::random_shuffle(m_voiceBank[i]->begin(), m_voiceBank[i]->end());
}
@ -1617,7 +1605,6 @@ void BotChatterInterface::Update(void)
if (say->IsRedundant(friendSay))
{
// thie statement is redundant - destroy it
//m_me->PrintIfWatched("Teammate said what I was going to say - shutting up.\n");
m_me->PrintIfWatched("Teammate said what I was going to say - shutting up.\n");
RemoveStatement(say);
}
@ -2415,6 +2402,14 @@ void BotChatterInterface::FriendlyFire(void)
#ifdef HOOK_GAMEDLL
void (*pBotPhrase__Randomize)(void);
void __declspec(naked) BotPhrase::Randomize(void)
{
// you can not hook this function, because it uses the rand() function
// which does not allow us to carry out tests because different results at the output.
__asm { jmp pBotPhrase__Randomize }
}
void BotAllHostagesGoneMeme::Interpret(CCSBot *sender, CCSBot *receiver) const
{
Interpret_(sender, receiver);

View File

@ -381,7 +381,7 @@ private:
/* <2fea95> ../cstrike/dlls/bot/cs_bot_chatter.h:298 */
inline int BotPhraseManager::FindPlaceIndex(Place where) const
{
for (int i = 0; i < m_placeCount; i++)
for (int i = 0; i < m_placeCount; ++i)
{
if (m_placeStatementHistory[i].placeID == where)
return i;
@ -596,8 +596,9 @@ public:
NOXREF void GuardingLooseBomb(CBaseEntity *bomb);
void RequestBombLocation(void);
void GuardingHostages(Place place, bool isPlan);
void GuardingHostageEscapeZone(bool isPlan);
#define IS_PLAN true
void GuardingHostages(Place place, bool isPlan = false);
void GuardingHostageEscapeZone(bool isPlan = false);
void HostagesBeingTaken(void);
void HostagesTaken(void);
void TalkingToHostages(void);

View File

@ -1,110 +1,386 @@
#include "precompiled.h"
/* <31d087> ../cstrike/dlls/bot/cs_bot_event.cpp:22 */
NOBODY void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other)
void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other)
{
// {
// class CCSBotManager *ctrl; // 63
// class CBasePlayer *player; // 65
// float range; // 363
// enum PriorityType priority; // 364
// bool isHostile; // 365
// const Vector *newNoisePosition; // 419
// float newNoiseDist; // 420
// {
// class CBasePlayer *killer; // 81
// {
// float const knifeAmbushChance; // 91
// Hurry(CCSBot *const this,
// float duration); // 88
// }
// }
// Say(BotChatterInterface *const this,
// const char *phraseName,
// float lifetime,
// float delay); // 221
// {
// float const bombBeepHearRangeSq; // 242
// operator-(const Vector *const this,
// const Vector &v); // 243
// LengthSquared(const Vector *const this); // 243
// {
// const class Zone *zone; // 248
// }
// }
// {
// float const bombPickupHearRangeSq; // 229
// operator-(const Vector *const this,
// const Vector &v); // 230
// LengthSquared(const Vector *const this); // 230
// }
// {
// class CBasePlayer *victim; // 111
// class CBasePlayer *killer; // 113
// GetNearbyEnemyCount(const class CCSBot *const this); // 175
// {
// float delay; // 185
// }
// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 155
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 164
// GetEnemy(CCSBot *const this); // 164
// Say(BotChatterInterface *const this,
// const char *phraseName,
// float lifetime,
// float delay); // 118
// entindex(CBaseEntity *const this); // 124
// }
// GetEnemy(CCSBot *const this); // 292
// ForceRun(CCSBot *const this,
// float duration); // 294
// {
// float const hearCallRange; // 329
// Vector vecCenter; // 334
// operator-(const Vector *const this,
// const Vector &v); // 330
// IsLengthGreaterThan(const Vector *const this,
// float length); // 330
// {
// enum RouteType route; // 343
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 338
// SetGoalEntity(CCSBot *const this,
// class CBaseEntity *entity); // 340
// }
// }
// operator-(const Vector *const this,
// const Vector &v); // 376
// IsLengthGreaterThan(const Vector *const this,
// float length); // 376
// {
// float const headOffChance; // 390
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 396
// }
// operator-(const Vector *const this,
// const Vector &v); // 420
// Length(const Vector *const this); // 420
// {
// float const veryCloseRange; // 434
// class CNavArea *noiseArea; // 461
// float const maxErrorRadius; // 481
// float const maxHearingRange; // 482
// float errorRadius; // 483
// {
// float const shortTermMemoryTime; // 445
// {
// float oldNoiseDist; // 452
// operator-(const Vector *const this,
// const Vector &v); // 452
// Length(const Vector *const this); // 452
// }
// }
// }
// }
GetGameState()->OnEvent(event, entity, other);
GetChatter()->OnEvent(event, entity, other);
// Morale adjustments happen even for dead players
switch (event)
{
case EVENT_TERRORISTS_WIN:
if (m_iTeam == CT)
{
DecreaseMorale();
}
else
{
IncreaseMorale();
}
break;
case EVENT_CTS_WIN:
if (m_iTeam == CT)
{
IncreaseMorale();
}
else
{
DecreaseMorale();
}
break;
}
if (!IsAlive())
return;
CBasePlayer *player = static_cast<CBasePlayer *>(entity);
// If we just saw a nearby friend die, and we haven't yet acquired an enemy
// automatically acquire our dead friend's killer
if (!IsAttacking() && (GetDisposition() == ENGAGE_AND_INVESTIGATE || GetDisposition() == OPPORTUNITY_FIRE))
{
if (event == EVENT_PLAYER_DIED)
{
if (player->m_iTeam == m_iTeam)
{
CBasePlayer *killer = static_cast<CBasePlayer *>(other);
// check that attacker is an enemy (for friendly fire, etc)
if (killer && killer->IsPlayer())
{
// check if we saw our friend die - dont check FOV - assume we're aware of our surroundings in combat
// snipers stay put
if (!IsSniper() && IsVisible(&player->pev->origin))
{
// people are dying - we should hurry
Hurry(RANDOM_FLOAT(10.0f, 15.0f));
// if we're hiding with only our knife, be a little more cautious
const float knifeAmbushChance = 50.0f;
if (!IsHiding() || !IsUsingKnife() || RANDOM_FLOAT(0, 100) < knifeAmbushChance)
{
PrintIfWatched("Attacking our friend's killer!\n");
Attack(killer);
return;
}
}
}
}
}
}
switch (event)
{
case EVENT_PLAYER_DIED:
{
CBasePlayer *victim = player;
CBasePlayer *killer = (other && other->IsPlayer()) ? static_cast<CBasePlayer *>(other) : NULL;
// if the human player died in the single player game, tell the team
if (g_pGameRules->IsCareer() && !victim->IsBot() && victim->m_iTeam == m_iTeam)
{
GetChatter()->Say("CommanderDown", 20.0f);
}
// keep track of the last player we killed
if (killer == this)
{
m_lastVictimID = victim->entindex();
}
// react to teammate death
if (victim->m_iTeam == m_iTeam)
{
// chastise friendly fire from humans
if (killer != NULL && !killer->IsBot() && killer->m_iTeam == m_iTeam && killer != this)
{
GetChatter()->KilledFriend();
}
if (IsHunting())
{
PrintIfWatched("Rethinking hunt due to teammate death\n");
Idle();
return;
}
if (IsAttacking())
{
if (GetTimeSinceLastSawEnemy() > 0.4f)
{
PrintIfWatched("Rethinking my attack due to teammate death\n");
// allow us to sneak past windows, doors, etc
IgnoreEnemies(1.0f);
// move to last known position of enemy - this could cause us to flank if
// the danger has changed due to our teammate's recent death
SetTask(MOVE_TO_LAST_KNOWN_ENEMY_POSITION, GetEnemy());
MoveTo(&GetLastKnownEnemyPosition());
return;
}
}
}
// an enemy was killed
else
{
if (killer != NULL && killer->m_iTeam == m_iTeam)
{
// only chatter about enemy kills if we see them occur, and they were the last one we see
if (GetNearbyEnemyCount() <= 1)
{
// report if number of enemies left is few and we killed the last one we saw locally
GetChatter()->EnemiesRemaining();
if (IsVisible(&victim->pev->origin, CHECK_FOV))
{
// congratulate teammates on their kills
if (killer != NULL && killer != this)
{
float delay = RANDOM_FLOAT(2.0f, 3.0f);
if (killer->IsBot())
{
if (RANDOM_FLOAT(0.0f, 100.0f) < 40.0f)
GetChatter()->Say("NiceShot", 3.0f, delay);
}
else
{
// humans get the honorific
if (g_pGameRules->IsCareer())
GetChatter()->Say("NiceShotCommander", 3.0f, delay);
else
GetChatter()->Say("NiceShotSir", 3.0f, delay);
}
}
}
}
}
}
return;
}
case EVENT_TERRORISTS_WIN:
if (m_iTeam == TERRORIST)
GetChatter()->CelebrateWin();
return;
case EVENT_CTS_WIN:
if (m_iTeam == CT)
GetChatter()->CelebrateWin();
return;
case EVENT_BOMB_DEFUSED:
if (m_iTeam == CT && TheCSBots()->GetBombTimeLeft() < 2.0)
GetChatter()->Say("BarelyDefused");
return;
case EVENT_BOMB_PICKED_UP:
{
if (m_iTeam == CT && player != NULL)
{
// check if we're close enough to hear it
const float bombPickupHearRangeSq = 1000.0f * 1000.0f;
if ((pev->origin - player->pev->origin).LengthSquared() < bombPickupHearRangeSq)
{
GetChatter()->TheyPickedUpTheBomb();
}
}
return;
}
case EVENT_BOMB_BEEP:
{
// if we don't know where the bomb is, but heard it beep, we've discovered it
if (GetGameState()->IsPlantedBombLocationKnown() == false)
{
// check if we're close enough to hear it
const float bombBeepHearRangeSq = 1000.0f * 1000.0f;
if ((pev->origin - entity->pev->origin).LengthSquared() < bombBeepHearRangeSq)
{
// radio the news to our team
if (m_iTeam == CT && GetGameState()->GetPlantedBombsite() == CSGameState::UNKNOWN)
{
const CCSBotManager::Zone *zone = TheCSBots()->GetZone(&entity->pev->origin);
if (zone != NULL)
GetChatter()->FoundPlantedBomb(zone->m_index);
}
// remember where the bomb is
GetGameState()->UpdatePlantedBomb(&entity->pev->origin);
}
}
return;
}
case EVENT_BOMB_PLANTED:
{
// if we're a CT, forget what we're doing and go after the bomb
if (m_iTeam == CT)
{
Idle();
}
// if we are following someone, stop following
if (IsFollowing())
{
StopFollowing();
Idle();
}
OnEvent(EVENT_BOMB_BEEP, other);
return;
}
case EVENT_BOMB_DEFUSE_ABORTED:
PrintIfWatched("BOMB DEFUSE ABORTED\n");
return;
case EVENT_WEAPON_FIRED:
case EVENT_WEAPON_FIRED_ON_EMPTY:
case EVENT_WEAPON_RELOADED:
{
if (m_enemy == entity && IsUsingKnife())
ForceRun(5.0f);
break;
}
default:
break;
}
// Process radio events from our team
if (player != NULL && player->m_iTeam == m_iTeam && event > EVENT_START_RADIO_1 && event < EVENT_END_RADIO)
{
// TODO: Distinguish between radio commands and responses
if (event != EVENT_RADIO_AFFIRMATIVE && event != EVENT_RADIO_NEGATIVE && event != EVENT_RADIO_REPORTING_IN)
{
m_lastRadioCommand = event;
m_lastRadioRecievedTimestamp = gpGlobals->time;
m_radioSubject = player;
m_radioPosition = player->pev->origin;
}
}
// player_follows needs a player
if (player == NULL)
return;
if (!IsRogue() && event == EVENT_HOSTAGE_CALLED_FOR_HELP && m_iTeam == CT && IsHunting())
{
if ((entity->pev->origin - pev->origin).IsLengthGreaterThan(1000.0f))
return;
if (IsVisible(&entity->Center()))
{
m_task = COLLECT_HOSTAGES;
m_taskEntity = NULL;
Run();
m_goalEntity = entity;
MoveTo(&entity->pev->origin, (RouteType)(m_hostageEscortCount == 0));
PrintIfWatched("I'm fetching a hostage that called out to me\n");
return;
}
}
// don't pay attention to noise that friends make
if (!IsEnemy(player))
return;
float range;
PriorityType priority;
bool isHostile;
if (IsGameEventAudible(event, entity, other, &range, &priority, &isHostile) == false)
return;
if (event == EVENT_HOSTAGE_USED)
{
if (m_iTeam == CT)
return;
if ((entity->pev->origin - pev->origin).IsLengthGreaterThan(range))
return;
GetChatter()->HostagesBeingTaken();
if (!GetGameState()->GetNearestVisibleFreeHostage() && m_task != GUARD_HOSTAGE_RESCUE_ZONE && GuardRandomZone())
{
m_task = GUARD_HOSTAGE_RESCUE_ZONE;
m_taskEntity = NULL;
SetDisposition(OPPORTUNITY_FIRE);
PrintIfWatched("Trying to beat them to an escape zone!\n");
}
}
// check if noise is close enough for us to hear
const Vector *newNoisePosition = &player->pev->origin;
float newNoiseDist = (pev->origin - *newNoisePosition).Length();
if (newNoiseDist < range)
{
// we heard the sound
if ((IsLocalPlayerWatchingMe() && cv_bot_debug.value == 3.0f) || cv_bot_debug.value == 4.0f)
{
PrintIfWatched("Heard noise (%s from %s, pri %s, time %3.1f)\n",
(event == EVENT_WEAPON_FIRED) ? "Weapon fire " : "",
STRING(player->pev->netname),
(priority == PRIORITY_HIGH) ? "HIGH" : ((priority == PRIORITY_MEDIUM) ? "MEDIUM" : "LOW"),
gpGlobals->time);
}
if (event == EVENT_PLAYER_FOOTSTEP && IsUsingSniperRifle() && newNoiseDist < 300.0)
EquipPistol();
// should we pay attention to it
// if noise timestamp is zero, there is no prior noise
if (m_noiseTimestamp > 0.0f)
{
// only overwrite recent sound if we are louder (closer), or more important - if old noise was long ago, its faded
const float shortTermMemoryTime = 3.0f;
if (gpGlobals->time - m_noiseTimestamp < shortTermMemoryTime)
{
// prior noise is more important - ignore new one
if (priority < m_noisePriority)
return;
float oldNoiseDist = (pev->origin - m_noisePosition).Length();
if (newNoiseDist >= oldNoiseDist)
return;
}
}
// find the area in which the noise occured
// TODO: Better handle when noise occurs off the nav mesh
// TODO: Make sure noise area is not through a wall or ceiling from source of noise
// TODO: Change GetNavTravelTime to better deal with NULL destination areas
CNavArea *noiseArea = TheNavAreaGrid.GetNavArea(newNoisePosition);
if (noiseArea == NULL)
noiseArea = TheNavAreaGrid.GetNearestNavArea(newNoisePosition);
if (noiseArea == NULL)
{
PrintIfWatched(" *** Noise occurred off the nav mesh - ignoring!\n");
return;
}
m_noiseArea = noiseArea;
// remember noise priority
m_noisePriority = priority;
// randomize noise position in the area a bit - hearing isn't very accurate
// the closer the noise is, the more accurate our placement
// TODO: Make sure not to pick a position on the opposite side of ourselves.
const float maxErrorRadius = 400.0f;
const float maxHearingRange = 2000.0f;
float errorRadius = maxErrorRadius * newNoiseDist / maxHearingRange;
m_noisePosition.x = newNoisePosition->x + RANDOM_FLOAT(-errorRadius, errorRadius);
m_noisePosition.y = newNoisePosition->y + RANDOM_FLOAT(-errorRadius, errorRadius);
// make sure noise position remains in the same area
m_noiseArea->GetClosestPointOnArea(&m_noisePosition, &m_noisePosition);
m_isNoiseTravelRangeChecked = false;
// note when we heard the noise
m_noiseTimestamp = gpGlobals->time;
}
}
#ifdef HOOK_GAMEDLL

View File

@ -2,8 +2,8 @@
const float updateTimesliceDuration = 0.5f;
int _navAreaCount;
int _currentIndex;
int _navAreaCount = 0;
int _currentIndex = 0;
/* <343cbe> ../cstrike/dlls/bot/cs_bot_learn.cpp:95 */
inline CNavNode *LadderEndSearch(CBaseEntity *entity, const Vector *pos, NavDirType mountDir)
@ -163,7 +163,6 @@ void CCSBot::StartLearnProcess(void)
{
CONSOLE_ECHO("ERROR: Start position invalid\n\n");
m_processMode = PROCESS_NORMAL;
return;
}
@ -180,180 +179,179 @@ void CCSBot::StartLearnProcess(void)
/* <343d37> ../cstrike/dlls/bot/cs_bot_learn.cpp:217 */
bool CCSBot::LearnStep(void)
{
UNTESTED
// take a step
while (true)
{
if (m_currentNode == NULL)
{
// search is exhausted - continue search from ends of ladders
NavLadderList::iterator iter;
for (iter = TheNavLadderList.begin(); iter != TheNavLadderList.end(); ++iter)
{
CNavLadder *ladder = (*iter);
// check ladder bottom
if ((m_currentNode = LadderEndSearch(ladder->m_entity, &ladder->m_bottom, ladder->m_dir)) != 0)
break;
// check ladder top
if ((m_currentNode = LadderEndSearch(ladder->m_entity, &ladder->m_top, ladder->m_dir)) != 0)
break;
}
if (m_currentNode == NULL)
{
// all seeds exhausted, sampling complete
GenerateNavigationAreaMesh();
return false;
}
}
// Take a step from this node
for (int dir = NORTH; dir < NUM_DIRECTIONS; dir++)
{
if (!m_currentNode->HasVisited((NavDirType)dir))
{
float feetOffset = pev->origin.z - GetFeetZ();
// start at current node position
Vector pos = *m_currentNode->GetPosition();
// snap to grid
int cx = SnapToGrid(pos.x);
int cy = SnapToGrid(pos.y);
// attempt to move to adjacent node
switch (dir)
{
case NORTH: cy -= GenerationStepSize; break;
case SOUTH: cy += GenerationStepSize; break;
case EAST: cx += GenerationStepSize; break;
case WEST: cx -= GenerationStepSize; break;
}
pos.x = cx;
pos.y = cy;
m_generationDir = (NavDirType)dir;
// mark direction as visited
m_currentNode->MarkAsVisited(m_generationDir);
// test if we can move to new position
TraceResult result;
Vector from, to;
// modify position to account for change in ground level during step
to.x = pos.x;
to.y = pos.y;
Vector toNormal;
if (GetGroundHeight(&pos, &to.z, &toNormal) == false)
{
return true;
}
from = *m_currentNode->GetPosition();
Vector fromOrigin = from + Vector(0, 0, feetOffset);
Vector toOrigin = to + Vector(0, 0, feetOffset);
UTIL_SetOrigin(pev, toOrigin);
UTIL_TraceLine(fromOrigin, toOrigin, ignore_monsters, dont_ignore_glass, ENT(pev), &result);
bool walkable;
if (result.flFraction == 1.0f && !result.fStartSolid)
{
// the trace didnt hit anything - clear
float toGround = to.z;
float fromGround = from.z;
float epsilon = 0.1f;
// check if ledge is too high to reach or will cause us to fall to our death
if (toGround - fromGround > JumpCrouchHeight + epsilon || fromGround - toGround > DeathDrop)
{
walkable = false;
}
else
{
// check surface normals along this step to see if we would cross any impassable slopes
Vector delta = to - from;
const float inc = 2.0f;
float along = inc;
bool done = false;
float ground;
Vector normal;
walkable = true;
while (!done)
{
Vector p;
// need to guarantee that we test the exact edges
if (along >= GenerationStepSize)
{
p = to;
done = true;
}
else
{
p = from + delta * (along / GenerationStepSize);
}
if (GetGroundHeight(&p, &ground, &normal) == false)
{
walkable = false;
break;
}
// check for maximum allowed slope
if (normal.z < 0.7f)
{
walkable = false;
break;
}
along += inc;
}
}
}
// TraceLine hit something...
else
{
if (IsEntityWalkable(VARS(result.pHit), WALK_THRU_EVERYTHING))
{
walkable = true;
}
else
{
walkable = false;
}
}
#ifdef REGAMEDLL_FIXES
// if we're incrementally generating, don't overlap existing nav areas
CNavArea *overlap = TheNavAreaGrid.GetNavArea(&to, HumanHeight);
if (overlap != NULL)
{
walkable = false;
}
#endif // REGAMEDLL_FIXES
if (walkable)
{
// we can move here
// create a new navigation node, and update current node pointer
CNavNode *newNode = AddNode(&to, &toNormal, m_generationDir, m_currentNode);
}
return true;
}
}
// all directions have been searched from this node - pop back to its parent and continue
m_currentNode = m_currentNode->GetParent();
{
// take a step
while (true)
{
if (m_currentNode == NULL)
{
// search is exhausted - continue search from ends of ladders
NavLadderList::iterator iter;
for (iter = TheNavLadderList.begin(); iter != TheNavLadderList.end(); ++iter)
{
CNavLadder *ladder = (*iter);
// check ladder bottom
if ((m_currentNode = LadderEndSearch(ladder->m_entity, &ladder->m_bottom, ladder->m_dir)) != 0)
break;
// check ladder top
if ((m_currentNode = LadderEndSearch(ladder->m_entity, &ladder->m_top, ladder->m_dir)) != 0)
break;
}
if (m_currentNode == NULL)
{
// all seeds exhausted, sampling complete
GenerateNavigationAreaMesh();
return false;
}
}
// Take a step from this node
for (int dir = NORTH; dir < NUM_DIRECTIONS; dir++)
{
if (!m_currentNode->HasVisited((NavDirType)dir))
{
float feetOffset = pev->origin.z - GetFeetZ();
// start at current node position
Vector pos = *m_currentNode->GetPosition();
// snap to grid
int cx = SnapToGrid(pos.x);
int cy = SnapToGrid(pos.y);
// attempt to move to adjacent node
switch (dir)
{
case NORTH: cy -= GenerationStepSize; break;
case SOUTH: cy += GenerationStepSize; break;
case EAST: cx += GenerationStepSize; break;
case WEST: cx -= GenerationStepSize; break;
}
pos.x = cx;
pos.y = cy;
m_generationDir = (NavDirType)dir;
// mark direction as visited
m_currentNode->MarkAsVisited(m_generationDir);
// test if we can move to new position
TraceResult result;
Vector from, to;
// modify position to account for change in ground level during step
to.x = pos.x;
to.y = pos.y;
Vector toNormal;
if (GetGroundHeight(&pos, &to.z, &toNormal) == false)
{
return true;
}
from = *m_currentNode->GetPosition();
Vector fromOrigin = from + Vector(0, 0, feetOffset);
Vector toOrigin = to + Vector(0, 0, feetOffset);
UTIL_SetOrigin(pev, toOrigin);
UTIL_TraceLine(fromOrigin, toOrigin, ignore_monsters, dont_ignore_glass, ENT(pev), &result);
bool walkable;
if (result.flFraction == 1.0f && !result.fStartSolid)
{
// the trace didnt hit anything - clear
float toGround = to.z;
float fromGround = from.z;
float epsilon = 0.1f;
// check if ledge is too high to reach or will cause us to fall to our death
if (toGround - fromGround > JumpCrouchHeight + epsilon || fromGround - toGround > DeathDrop)
{
walkable = false;
}
else
{
// check surface normals along this step to see if we would cross any impassable slopes
Vector delta = to - from;
const float inc = 2.0f;
float along = inc;
bool done = false;
float ground;
Vector normal;
walkable = true;
while (!done)
{
Vector p;
// need to guarantee that we test the exact edges
if (along >= GenerationStepSize)
{
p = to;
done = true;
}
else
{
p = from + delta * (along / GenerationStepSize);
}
if (GetGroundHeight(&p, &ground, &normal) == false)
{
walkable = false;
break;
}
// check for maximum allowed slope
if (normal.z < 0.7f)
{
walkable = false;
break;
}
along += inc;
}
}
}
// TraceLine hit something...
else
{
if (IsEntityWalkable(VARS(result.pHit), WALK_THRU_EVERYTHING))
{
walkable = true;
}
else
{
walkable = false;
}
}
#ifdef REGAMEDLL_FIXES
// if we're incrementally generating, don't overlap existing nav areas
CNavArea *overlap = TheNavAreaGrid.GetNavArea(&to, HumanHeight);
if (overlap != NULL)
{
walkable = false;
}
#endif // REGAMEDLL_FIXES
if (walkable)
{
// we can move here
// create a new navigation node, and update current node pointer
CNavNode *newNode = AddNode(&to, &toNormal, m_generationDir, m_currentNode);
}
return true;
}
}
// all directions have been searched from this node - pop back to its parent and continue
m_currentNode = m_currentNode->GetParent();
}
}
@ -361,12 +359,12 @@ bool CCSBot::LearnStep(void)
void CCSBot::UpdateLearnProcess(void)
{
float startTime = g_engfuncs.pfnTime();
while (g_engfuncs.pfnTime() - startTime >= updateTimesliceDuration)
while (g_engfuncs.pfnTime() - startTime < updateTimesliceDuration)
{
if (LearnStep() == false)
{
StartAnalyzeAlphaProcess();
break;
return;
}
}
}
@ -390,12 +388,11 @@ void CCSBot::StartAnalyzeAlphaProcess(void)
/* <34396c> ../cstrike/dlls/bot/cs_bot_learn.cpp:427 */
bool CCSBot::AnalyzeAlphaStep(void)
{
++_currentIndex;
if (m_analyzeIter == TheNavAreaList.end())
return false;
CNavArea *area = (*m_analyzeIter);
++_currentIndex;
area->ComputeHidingSpots();
area->ComputeApproachAreas();
++m_analyzeIter;
@ -407,20 +404,19 @@ bool CCSBot::AnalyzeAlphaStep(void)
void CCSBot::UpdateAnalyzeAlphaProcess(void)
{
float startTime = g_engfuncs.pfnTime();
float progress = _currentIndex / _navAreaCount * 50.0f;
while (AnalyzeAlphaStep())
while (g_engfuncs.pfnTime() - startTime < updateTimesliceDuration)
{
if (g_engfuncs.pfnTime() - startTime >= updateTimesliceDuration)
if (AnalyzeAlphaStep() == false)
{
drawProgressMeter(progress, "#CZero_AnalyzingHidingSpots");
drawProgressMeter(50, "#CZero_AnalyzingHidingSpots");
CleanupApproachAreaAnalysisPrep();
StartAnalyzeBetaProcess();
return;
}
}
drawProgressMeter(50, "#CZero_AnalyzingHidingSpots");
CleanupApproachAreaAnalysisPrep();
StartAnalyzeBetaProcess();
float progress = _currentIndex / _navAreaCount * 50.0f;
drawProgressMeter(progress, "#CZero_AnalyzingHidingSpots");
}
/* <344aed> ../cstrike/dlls/bot/cs_bot_learn.cpp:467 */
@ -436,12 +432,11 @@ void CCSBot::StartAnalyzeBetaProcess(void)
/* <3437c8> ../cstrike/dlls/bot/cs_bot_learn.cpp:479 */
bool CCSBot::AnalyzeBetaStep(void)
{
++_currentIndex;
if (m_analyzeIter == TheNavAreaList.end())
return false;
CNavArea *area = (*m_analyzeIter);
++_currentIndex;
area->ComputeSpotEncounters();
area->ComputeSniperSpots();
++m_analyzeIter;
@ -453,19 +448,18 @@ bool CCSBot::AnalyzeBetaStep(void)
void CCSBot::UpdateAnalyzeBetaProcess(void)
{
float startTime = g_engfuncs.pfnTime();
float progress = (_currentIndex / _navAreaCount + 1.0f) * 50.0f;
while (AnalyzeBetaStep())
while (g_engfuncs.pfnTime() - startTime < updateTimesliceDuration)
{
if (g_engfuncs.pfnTime() - startTime >= updateTimesliceDuration)
if (AnalyzeBetaStep() == false)
{
drawProgressMeter(progress, "#CZero_AnalyzingApproachPoints");
drawProgressMeter(100, "#CZero_AnalyzingApproachPoints");
StartSaveProcess();
return;
}
}
drawProgressMeter(100, "#CZero_AnalyzingApproachPoints");
StartSaveProcess();
float progress = ((_currentIndex / _navAreaCount) + 1.0f) * 50.0f;
drawProgressMeter(progress, "#CZero_AnalyzingApproachPoints");
}
/* <344d1f> ../cstrike/dlls/bot/cs_bot_learn.cpp:517 */
@ -482,7 +476,8 @@ void CCSBot::UpdateSaveProcess(void)
char cmd[128];
GET_GAME_DIR(filename);
filename[Q_strlen(filename)] = '\\';
Q_strcat(filename, "\\");
Q_strcat(filename, TheBots->GetNavMapFilename());
HintMessageToAllPlayers("Saving...");

View File

@ -1203,17 +1203,10 @@ void CCSBotManager::ValidateMapData(void)
}
}
void (*pCCSBotManager__AddBot)(void);
/* <36c2b2> ../cstrike/dlls/bot/cs_bot_manager.cpp:1278 */
NOBODY bool __declspec(naked) CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team)
#ifndef HOOK_GAMEDLL
bool CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team)
{
#if 1
__asm
{
jmp pCCSBotManager__AddBot
}
#else
if (!UTIL_IsGame("czero"))
return false;
@ -1287,8 +1280,8 @@ NOBODY bool __declspec(naked) CCSBotManager::AddBot(const BotProfile *profile, B
CONSOLE_ECHO("Could not add bot to the game.\n");
return false;
#endif
}
#endif // HOOK_GAMEDLL
// Return the zone that contains the given position
@ -1583,6 +1576,13 @@ void CCSBotManager::ResetRadioMessageTimestamps(void)
#ifdef HOOK_GAMEDLL
void (*pCCSBotManager__AddBot)(void);
bool __declspec(naked) CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team)
{
__asm { jmp pCCSBotManager__AddBot }
}
void CCSBotManager::ClientDisconnect(CBasePlayer *pPlayer)
{
ClientDisconnect_(pPlayer);

View File

@ -36,13 +36,6 @@
#define TheBots (*pTheBots)
//#define m_flNextCVarCheck (*pm_flNextCVarCheck)
//#define m_isMapDataLoaded (*pm_isMapDataLoaded)
//#define m_editCmd (*pm_editCmd)
//#define m_isLearningMap (*pm_isLearningMap)
//#define m_isAnalysisRequested (*pm_isAnalysisRequested)
#endif // HOOK_GAMEDLL
extern CBotManager *TheBots;
@ -122,8 +115,8 @@ public:
// "zones"
// depending on the game mode, these are bomb zones, rescue zones, etc.
enum { MAX_ZONES = 4 }; // max # of zones in a map
enum { MAX_ZONE_NAV_AREAS = 16 }; // max # of nav areas in a zone
enum { MAX_ZONES = 4 }; // max # of zones in a map
enum { MAX_ZONE_NAV_AREAS = 16 }; // max # of nav areas in a zone
struct Zone
{
CBaseEntity *m_entity; // the map entity
@ -133,8 +126,7 @@ public:
bool m_isLegacy; // if true, use pev->origin and 256 unit radius as zone
int m_index;
Extent m_extent;
};/* size: 116, cachelines: 2, members: 7 */
};
const Zone *GetZone(int i) const { return &m_zone[i]; }
const Zone *GetZone(const Vector *pos) const; // return the zone that contains the given position
@ -160,13 +152,10 @@ public:
if (m_zone[i].m_areaCount == 0)
continue;
if (m_zone[i].m_isBlocked)
continue;
// just use the first overlapping nav area as a reasonable approximation
float dist = NavAreaTravelDistance(startArea, m_zone[i].m_area[0], costFunc);
float_precision dist = NavAreaTravelDistance(startArea, m_zone[i].m_area[0], costFunc);
if (dist >= 0.0f && dist < closeDist)
if (/*dist >= 0.0f && */dist < closeDist)
{
closeZone = &m_zone[i];
closeDist = dist;

View File

@ -74,6 +74,7 @@ void CCSBot::RespondToRadioCommands(void)
return;
}
CCSBotManager *ctrl = TheCSBots();
CBasePlayer *player = m_radioSubject;
if (player == NULL)
return;
@ -141,7 +142,7 @@ void CCSBot::RespondToRadioCommands(void)
}
case EVENT_RADIO_GET_OUT_OF_THERE:
{
if (TheCSBots()->IsBombPlanted())
if (ctrl->IsBombPlanted())
{
EscapeFromBomb();
player->InhibitAutoFollow(inhibitAutoFollowDuration);
@ -153,11 +154,11 @@ void CCSBot::RespondToRadioCommands(void)
{
// if this is a defusal scenario, and the bomb is planted,
// and a human player cleared a bombsite, check it off our list too
if (TheCSBots()->GetScenario() == CCSBotManager::SCENARIO_DEFUSE_BOMB)
if (ctrl->GetScenario() == CCSBotManager::SCENARIO_DEFUSE_BOMB)
{
if (m_iTeam == CT && TheCSBots()->IsBombPlanted())
if (m_iTeam == CT && ctrl->IsBombPlanted())
{
const CCSBotManager::Zone *zone = TheCSBots()->GetClosestZone(player);
const CCSBotManager::Zone *zone = ctrl->GetClosestZone(player);
if (zone != NULL)
{

View File

@ -150,198 +150,609 @@ void CCSBot::__MAKE_VHOOK(Upkeep)(void)
UpdateLookAngles();
}
void (*pCCSBot__Update)(void);
// Heavyweight processing, invoked less often
/* <3c6e1e> ../cstrike/dlls/bot/cs_bot_update.cpp:208 */
NOBODY void __declspec(naked) CCSBot::__MAKE_VHOOK(Update)(void)
void CCSBot::__MAKE_VHOOK(Update)(void)
{
__asm
CCSBotManager *ctrl = TheCSBots();
if (ctrl->IsAnalysisRequested() && m_processMode == PROCESS_NORMAL)
{
jmp pCCSBot__Update
ctrl->AckAnalysisRequest();
StartAnalyzeAlphaProcess();
}
// {
// class CCSBotManager *ctrl; // 210
// float const rememberNoiseDuration; // 401
// float const recomputeApproachPointTolerance; // 419
// class CBasePlayer *threat; // 459
// float const seenRecentTime; // 572
// float const safeRearmTime; // 676
// float const avoidTime; // 691
// float const earliestAutoFollowTime; // 807
// float const minAutoFollowTeamwork; // 808
// {
// Vector vecAiming; // 342
// Vector vecSrc; // 344
// operator+(const Vector *const this,
// const Vector &v); // 341
// operator+(const Vector *const this,
// const Vector &v); // 349
// operator*(float fl,
// const Vector &v); // 349
// operator+(const Vector *const this,
// const Vector &v); // 351
// operator*(float fl,
// const Vector &v); // 351
// Vector(Vector *const this,
// const Vector &v); // 351
// Vector(Vector *const this,
// const Vector &v); // 349
// }
// {
// Vector dir; // 366
// float length; // 367
// const class SpotOrder *order; // 369
// Vector along; // 370
// Vector(Vector *const this,
// const Vector &v); // 364
// Vector(Vector *const this,
// const Vector &v); // 364
// operator-(const Vector *const this,
// const Vector &v); // 366
// NormalizeInPlace(Vector *const this); // 367
// {
// const_iterator iter; // 371
// end(list<SpotOrder, std::allocator<SpotOrder>> *const this); // 371
// operator*(float fl,
// const Vector &v); // 375
// operator+(const Vector *const this,
// const Vector &v); // 375
// Vector(Vector *const this,
// const Vector &v); // 377
// Vector(Vector *const this,
// const Vector &v); // 377
// operator++(_List_const_iterator<SpotOrder> *const this); // 371
// }
// }
// {
// Vector from; // 385
// float const size; // 387
// Vector arrow; // 389
// GetEyePosition(const class CCSBot *const this); // 385
// operator+(const Vector *const this,
// const Vector &v); // 391
// Vector(Vector *const this,
// const Vector &v); // 391
// }
// ForgetNoise(CCSBot *const this); // 403
// SetClearedTimestamp(CNavArea *const this,
// int teamID); // 415
// operator-(const Vector *const this,
// const Vector &v); // 420
// IsLengthGreaterThan(const Vector *const this,
// float length); // 420
// AckAnalysisRequest(CCSBotManager *const this); // 215
// {
// float const selfDefenseRange; // 465
// {
// float const knifeAttackRange; // 490
// operator-(const Vector *const this,
// const Vector &v); // 491
// IsLengthLessThan(const Vector *const this,
// float length); // 491
// }
// GetEnemy(CCSBot *const this); // 485
// operator-(const Vector *const this,
// const Vector &v); // 483
// IsLengthLessThan(const Vector *const this,
// float length); // 483
// {
// float const recentAttackDuration; // 512
// GetTimeSinceAttacked(const class CCSBot *const this); // 513
// }
// SetLastSeenEnemyTimestamp(CCSBotManager *const this); // 522
// }
// IsAwareOfEnemyDeath(const class CCSBot *const this); // 530
// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 573
// {
// Vector target; // 591
// }
// {
// bool doToss; // 601
// IsElapsed(const class CountdownTimer *const this); // 605
// }
// IsActiveWeaponReloading(const class CBot *const this); // 677
// {
// float const duration; // 704
// float crouchDelayTime; // 705
// float standUpTime; // 706
// float elapsed; // 708
// }
// {
// unsigned char status; // 784
// HostageWasTaken(CSGameState *const this); // 793
// }
// {
// float gonnaBlowTime; // 755
// }
// GetElapsedRoundTime(const class CCSBotManager *const this); // 809
// {
// class CBasePlayer *leader; // 820
// GetClosestVisibleHumanFriend(const class CCSBot *const this); // 820
// IsAutoFollowAllowed(const class CBasePlayer *const this); // 821
// {
// float const maxFollowCount; // 824
// {
// float const autoFollowRange; // 827
// operator-(const Vector *const this,
// const Vector &v); // 828
// IsLengthLessThan(const Vector *const this,
// float length); // 828
// {
// class CNavArea *leaderArea; // 830
// {
// class PathCost pc; // 833
// float travelRange; // 834
// PathCost(PathCost *const this,
// class CCSBot *bot,
// enum RouteType route); // 833
// NavAreaTravelDistance<PathCost>(CNavArea *startArea,
// class CNavArea *endArea,
// class PathCost &costFunc); // 834
// }
// }
// }
// }
// }
// {
// class CBaseEntity *leader; // 865
// float const highTeamwork; // 872
// {
// float minFollowDuration; // 875
// GetFollowDuration(const class CCSBot *const this); // 876
// }
// }
// {
// float const campChance; // 890
// }
// IsReloading(CBasePlayer *const this); // 920
// IsElapsed(const class CountdownTimer *const this); // 927
// {
// float const waitForHostageRange; // 929
// Start(CountdownTimer *const this,
// float duration); // 936
// IsElapsed(const class CountdownTimer *const this); // 941
// Start(CountdownTimer *const this,
// float duration); // 945
// }
// GetLooseBomb(CCSBotManager *const this); // 743
// GetBomber(CCSBot *const this); // 740
// GetTimeSinceLastSawEnemy(const class CCSBot *const this); // 678
// }
switch (m_processMode)
{
case PROCESS_LEARN: UpdateLearnProcess(); return;
case PROCESS_ANALYZE_ALPHA: UpdateAnalyzeAlphaProcess(); return;
case PROCESS_ANALYZE_BETA: UpdateAnalyzeBetaProcess(); return;
case PROCESS_SAVE: UpdateSaveProcess(); return;
}
// update our radio chatter
// need to allow bots to finish their chatter even if they are dead
GetChatter()->Update();
if (m_voiceFeedbackEndTimestamp != 0.0f
&& (m_voiceFeedbackEndTimestamp <= gpGlobals->time || gpGlobals->time < m_voiceFeedbackStartTimestamp))
{
EndVoiceFeedback(NO_FORCE);
}
// check if we are dead
if (!IsAlive())
{
// remember that we died
m_diedLastRound = true;
BotDeathThink();
return;
}
// show line of fire
if ((cv_bot_traceview.value == 100.0f && IsLocalPlayerWatchingMe()) || cv_bot_traceview.value == 101.0f)
{
UTIL_MakeVectors(pev->punchangle + pev->v_angle);
if (!IsFriendInLineOfFire())
{
Vector vecAiming = gpGlobals->v_forward;
Vector vecSrc = GetGunPosition();
if (m_iTeam == TERRORIST)
UTIL_DrawBeamPoints(vecSrc, vecSrc + 2000.0f * vecAiming, 1, 255, 0, 0);
else
UTIL_DrawBeamPoints(vecSrc, vecSrc + 2000.0f * vecAiming, 1, 0, 50, 255);
}
}
// Debug beam rendering
if (cv_bot_traceview.value == 2.0f && IsLocalPlayerWatchingMe() || cv_bot_traceview.value == 3.0f)
DrawApproachPoints();
if (cv_bot_traceview.value == 4.0f && IsLocalPlayerWatchingMe() || cv_bot_traceview.value == 5.0f)
{
// ...
}
if (cv_bot_traceview.value == 1.0f && IsLocalPlayerWatchingMe())
{
// ...
}
if (cv_bot_stop.value != 0.0f)
return;
// check if we are stuck
StuckCheck();
// if our current 'noise' was heard a long time ago, forget it
const float rememberNoiseDuration = 20.0f;
if (m_noiseTimestamp > 0.0f && gpGlobals->time - m_noiseTimestamp > rememberNoiseDuration)
{
ForgetNoise();
}
// where are we
if (!m_currentArea || !m_currentArea->Contains(&pev->origin))
{
m_currentArea = TheNavAreaGrid.GetNavArea(&pev->origin);
}
// track the last known area we were in
if (m_currentArea != NULL && m_currentArea != m_lastKnownArea)
{
m_lastKnownArea = m_currentArea;
// assume that we "clear" an area of enemies when we enter it
m_currentArea->SetClearedTimestamp(m_iTeam - 1);
}
// update approach points
const float recomputeApproachPointTolerance = 50.0f;
if ((m_approachPointViewPosition - pev->origin).IsLengthGreaterThan(recomputeApproachPointTolerance))
{
ComputeApproachPoints();
m_approachPointViewPosition = pev->origin;
}
if (cv_bot_show_nav.value > 0.0f && m_lastKnownArea != NULL)
{
m_lastKnownArea->DrawConnectedAreas();
}
// if we're blind, retreat!
if (IsBlind())
{
if (!IsAtHidingSpot())
{
switch (m_blindMoveDir)
{
case FORWARD: MoveForward(); break;
case RIGHT: StrafeRight(); break;
case BACKWARD: MoveBackward(); break;
case LEFT: StrafeLeft(); break;
default: Crouch(); break;
}
}
if (m_blindFire)
{
PrimaryAttack();
}
return;
}
// Enemy acquisition and attack initiation
// take a snapshot and update our reaction time queue
UpdateReactionQueue();
// "threat" may be the same as our current enemy
CBasePlayer *threat = GetRecognizedEnemy();
if (threat != NULL)
{
// adjust our personal "safe" time
AdjustSafeTime();
// Decide if we should attack
bool doAttack = false;
if (!IsUsingGrenade())
{
switch (GetDisposition())
{
case IGNORE_ENEMIES:
{
// never attack
doAttack = false;
break;
}
case SELF_DEFENSE:
{
// attack if fired on
doAttack = IsPlayerLookingAtMe(threat);
// attack if enemy very close
if (!doAttack)
{
const float selfDefenseRange = 750.0f;
doAttack = (pev->origin - threat->pev->origin).IsLengthLessThan(selfDefenseRange);
}
break;
}
case ENGAGE_AND_INVESTIGATE:
case OPPORTUNITY_FIRE:
{
// normal combat range
doAttack = true;
break;
}
}
}
else
ThrowGrenade(&pev->origin);
// if we aren't attacking but we are being attacked, retaliate
if (!doAttack && !IsAttacking() && GetDisposition() != IGNORE_ENEMIES)
{
const float recentAttackDuration = 1.0f;
if (GetTimeSinceAttacked() < recentAttackDuration)
{
// we may not be attacking our attacker, but at least we're not just taking it
// (since m_attacker isn't reaction-time delayed, we can't directly use it)
doAttack = true;
PrintIfWatched("Ouch! Retaliating!\n");
}
}
if (doAttack)
{
if (GetEnemy() == NULL || !IsAttacking() || threat != GetEnemy())
{
if (IsUsingKnife() && IsHiding())
{
// if hiding with a knife, wait until threat is close
const float knifeAttackRange = 250.0f;
if ((pev->origin - threat->pev->origin).IsLengthLessThan(knifeAttackRange))
{
Attack(threat);
}
}
else
{
Attack(threat);
}
}
}
else
{
// dont attack, but keep track of nearby enemies
SetEnemy(threat);
m_isEnemyVisible = true;
}
ctrl->SetLastSeenEnemyTimestamp();
}
// Validate existing enemy, if any
if (m_enemy != NULL)
{
if (IsAwareOfEnemyDeath())
{
// we have noticed that our enemy has died
m_enemy = NULL;
m_isEnemyVisible = false;
}
else
{
// check LOS to current enemy (chest & head), in case he's dead (GetNearestEnemy() only returns live players)
// note we're not checking FOV - once we've acquired an enemy (which does check FOV), assume we know roughly where he is
if (IsVisible(m_enemy, false, &m_visibleEnemyParts))
{
m_isEnemyVisible = true;
m_lastSawEnemyTimestamp = gpGlobals->time;
m_lastEnemyPosition = m_enemy->pev->origin;
}
else
{
m_isEnemyVisible = false;
}
// check if enemy died
if (m_enemy->IsAlive())
{
m_enemyDeathTimestamp = 0.0f;
m_isLastEnemyDead = false;
}
else if (m_enemyDeathTimestamp == 0.0f)
{
// note time of death (to allow bots to overshoot for a time)
m_enemyDeathTimestamp = gpGlobals->time;
m_isLastEnemyDead = true;
}
}
}
else
{
m_isEnemyVisible = false;
}
// if we have seen an enemy recently, keep an eye on him if we can
const float seenRecentTime = 3.0f;
if (m_enemy != NULL && GetTimeSinceLastSawEnemy() < seenRecentTime)
{
AimAtEnemy();
}
else
{
StopAiming();
}
// Hack to fire while retreating
// TODO: Encapsulate aiming and firing on enemies separately from current task
if (GetDisposition() == IGNORE_ENEMIES)
{
FireWeaponAtEnemy();
}
if (IsEndOfSafeTime() && IsUsingGrenade() && (IsWellPastSafe() || !IsUsingHEGrenade()) && !m_isWaitingToTossGrenade)
{
Vector target;
if (FindGrenadeTossPathTarget(&target))
{
ThrowGrenade(&target);
}
}
if (IsUsingGrenade())
{
bool doToss = (m_isWaitingToTossGrenade && (m_tossGrenadeTimer.IsElapsed() || m_lookAtSpotState == LOOK_AT_SPOT));
if (doToss)
{
ClearPrimaryAttack();
m_isWaitingToTossGrenade = false;
}
else
{
PrimaryAttack();
}
}
else
{
m_isWaitingToTossGrenade = false;
}
if (IsHunting() && IsWellPastSafe() && IsUsingGrenade())
{
EquipBestWeapon(MUST_EQUIP);
}
// check if our weapon is totally out of ammo
// or if we no longer feel "safe", equip our weapon
if (!IsSafe() && !IsUsingGrenade() && IsActiveWeaponOutOfAmmo())
{
EquipBestWeapon();
}
// TODO: This doesn't work if we are restricted to just knives and sniper rifles because we cant use the rifle at close range
if (!IsSafe() && !IsUsingGrenade() && IsUsingKnife() && !IsEscapingFromBomb())
{
EquipBestWeapon();
}
// if we haven't seen an enemy in awhile, and we switched to our pistol during combat,
// switch back to our primary weapon (if it still has ammo left)
const float safeRearmTime = 5.0f;
if (!IsActiveWeaponReloading() && IsUsingPistol() && !IsPrimaryWeaponEmpty() && GetTimeSinceLastSawEnemy() > safeRearmTime)
{
EquipBestWeapon();
}
// reload our weapon if we must
ReloadCheck();
// equip silencer
SilencerCheck();
// listen to the radio
RespondToRadioCommands();
// make way
const float avoidTime = 0.33f;
if (gpGlobals->time - m_avoidTimestamp < avoidTime && m_avoid != NULL)
{
StrafeAwayFromPosition(&m_avoid->pev->origin);
}
else
{
m_avoid = NULL;
}
if (m_isJumpCrouching)
{
const float duration = 0.75f;
const float crouchDelayTime = 0.05f;
const float standUpTime = 0.6f;
float elapsed = gpGlobals->time - m_jumpCrouchTimestamp;
if (elapsed > crouchDelayTime && elapsed < standUpTime)
Crouch();
if (elapsed >= standUpTime)
StandUp();
if (elapsed > duration)
m_isJumpCrouching = false;
}
// if we're using a sniper rifle and are no longer attacking, stop looking thru scope
if (!IsAtHidingSpot() && !IsAttacking() && IsUsingSniperRifle() && IsUsingScope())
{
SecondaryAttack();
}
// check encounter spots
UpdatePeripheralVision();
// Update gamestate
if (m_bomber != NULL)
GetChatter()->SpottedBomber(GetBomber());
if (CanSeeLooseBomb())
GetChatter()->SpottedLooseBomb(ctrl->GetLooseBomb());
// Scenario interrupts
switch (ctrl->GetScenario())
{
case CCSBotManager::SCENARIO_DEFUSE_BOMB:
{
// flee if the bomb is ready to blow and we aren't defusing it or attacking and we know where the bomb is
// (aggressive players wait until its almost too late)
float gonnaBlowTime = 8.0f - (2.0f * GetProfile()->GetAggression());
// if we have a defuse kit, can wait longer
if (m_bHasDefuser)
gonnaBlowTime *= 0.66f;
if (!IsEscapingFromBomb() // we aren't already escaping the bomb
&& ctrl->IsBombPlanted() // is the bomb planted
&& GetGameState()->IsPlantedBombLocationKnown() // we know where the bomb is
&& ctrl->GetBombTimeLeft() < gonnaBlowTime // is the bomb about to explode
&& !IsDefusingBomb() // we aren't defusing the bomb
&& !IsAttacking()) // we aren't in the midst of a firefight
{
EscapeFromBomb();
break;
}
break;
}
case CCSBotManager::SCENARIO_RESCUE_HOSTAGES:
{
if (m_iTeam == CT)
{
UpdateHostageEscortCount();
}
else
{
// Terrorists have imperfect information on status of hostages
CSGameState::ValidateStatusType status = GetGameState()->ValidateHostagePositions();
if (status & CSGameState::HOSTAGES_ALL_GONE)
{
GetChatter()->HostagesTaken();
Idle();
}
else if (status & CSGameState::HOSTAGE_GONE)
{
GetGameState()->HostageWasTaken();
Idle();
}
}
break;
}
}
// Follow nearby humans if our co-op is high and we have nothing else to do
// If we were just following someone, don't auto-follow again for a short while to
// give us a chance to do something else.
const float earliestAutoFollowTime = 5.0f;
const float minAutoFollowTeamwork = 0.4f;
if (ctrl->GetElapsedRoundTime() > earliestAutoFollowTime
&& GetProfile()->GetTeamwork() > minAutoFollowTeamwork
&& CanAutoFollow()
&& !IsBusy()
&& !IsFollowing()
&& !GetGameState()->IsAtPlantedBombsite())
{
// chance of following is proportional to teamwork attribute
if (GetProfile()->GetTeamwork() > RANDOM_FLOAT(0.0f, 1.0f))
{
CBasePlayer *leader = GetClosestVisibleHumanFriend();
if (leader != NULL && leader->IsAutoFollowAllowed())
{
// count how many bots are already following this player
const float maxFollowCount = 2;
if (GetBotFollowCount(leader) < maxFollowCount)
{
const float autoFollowRange = 300.0f;
if ((leader->pev->origin - pev->origin).IsLengthLessThan(autoFollowRange))
{
CNavArea *leaderArea = TheNavAreaGrid.GetNavArea(&leader->pev->origin);
if (leaderArea != NULL)
{
PathCost cost(this, FASTEST_ROUTE);
float travelRange = NavAreaTravelDistance(GetLastKnownArea(), leaderArea, cost);
if (/*travelRange >= 0.0f &&*/ travelRange < autoFollowRange)
{
// follow this human
Follow(leader);
PrintIfWatched("Auto-Following %s\n", STRING(leader->pev->netname));
if (g_pGameRules->IsCareer())
{
GetChatter()->Say("FollowingCommander", 10.0f);
}
else
{
GetChatter()->Say("FollowingSir", 10.0f);
}
}
}
}
}
}
}
else
{
// we decided not to follow, don't re-check for a duration
m_allowAutoFollowTime = gpGlobals->time + 15.0f + (1.0f - GetProfile()->GetTeamwork()) * 30.0f;
}
}
if (IsFollowing())
{
// if we are following someone, make sure they are still alive
CBaseEntity *leader = m_leader;
if (leader == NULL || !leader->IsAlive())
{
StopFollowing();
}
// decide whether to continue following them
const float highTeamwork = 0.85f;
if (GetProfile()->GetTeamwork() < highTeamwork)
{
float minFollowDuration = 15.0f;
if (GetFollowDuration() > minFollowDuration + 40.0f * GetProfile()->GetTeamwork())
{
// we are bored of following our leader
StopFollowing();
PrintIfWatched("Stopping following - bored\n");
}
}
}
else
{
if (GetMorale() < NEUTRAL && IsSafe() && GetSafeTimeRemaining() < 2.0f && IsHunting())
{
if (GetMorale() * -40.0 > RANDOM_FLOAT(0.0f, 100.0f))
{
if (ctrl->IsOnOffense(this) || !ctrl->IsDefenseRushing())
{
SetDisposition(OPPORTUNITY_FIRE);
Hide(m_lastKnownArea, RANDOM_FLOAT(3.0f, 15.0f));
GetChatter()->Say("WaitingHere");
}
}
}
}
// Execute state machine
if (m_isAttacking)
{
m_attackState.OnUpdate(this);
}
else
{
m_state->OnUpdate(this);
}
if (m_isWaitingToTossGrenade)
{
ResetStuckMonitor();
ClearMovement();
}
// don't move while reloading unless we see an enemy
if (IsReloading() && !m_isEnemyVisible)
{
ResetStuckMonitor();
ClearMovement();
}
// if we get too far ahead of the hostages we are escorting, wait for them
if (!IsAttacking() && m_inhibitWaitingForHostageTimer.IsElapsed())
{
const float waitForHostageRange = 500.0f;
if (GetTask() == RESCUE_HOSTAGES && GetRangeToFarthestEscortedHostage() > waitForHostageRange)
{
if (!m_isWaitingForHostage)
{
// just started waiting
m_isWaitingForHostage = true;
m_waitForHostageTimer.Start(10.0f);
}
else
{
// we've been waiting
if (m_waitForHostageTimer.IsElapsed())
{
// give up waiting for awhile
m_isWaitingForHostage = false;
m_inhibitWaitingForHostageTimer.Start(3.0f);
}
else
{
// keep waiting
ResetStuckMonitor();
ClearMovement();
}
}
}
}
// remember our prior safe time status
m_wasSafe = IsSafe();
}
#ifdef HOOK_GAMEDLL
// NavAreaBuildPath<PathCost> hook
bool NavAreaBuildPath__PathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, PathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
void CCSBot::Upkeep(void)
{
Upkeep_();
}
void CCSBot::Update(void)
{
Update_();

View File

@ -1036,10 +1036,7 @@ void CCSBot::__MAKE_VHOOK(Blind)(float duration, float holdTime, float fadeTime,
void (*pCCSBot__UpdateLookAngles)(void);
void __declspec(naked) CCSBot::UpdateLookAngles(void)
{
__asm
{
jmp pCCSBot__UpdateLookAngles
}
__asm { jmp pCCSBot__UpdateLookAngles }
}
void CCSBot::Blind(float duration, float holdTime, float fadeTime, int alpha)

View File

@ -1,35 +1,120 @@
#include "precompiled.h"
// Begin attacking
/* <519735> ../cstrike/dlls/bot/states/cs_bot_attack.cpp:16 */
NOBODY void AttackState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void AttackState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// {
// class CBasePlayer *enemy; // 18
// float skill; // 105
// float dodgeChance; // 108
// GetEnemy(CCSBot *const this); // 18
// PushPostureContext(CBot *const this); // 21
// DestroyPath(CCSBot *const this); // 23
// Invalidate(CountdownTimer *const this); // 34
// {
// float const crouchFarRange; // 63
// float crouchChance; // 64
// operator-(const Vector *const this,
// const Vector &v); // 69
// IsLengthGreaterThan(const Vector *const this,
// float length); // 69
// {
// TraceResult result; // 77
// Vector origin; // 79
// Vector(Vector *const this,
// const Vector &v); // 79
// }
// }
// }
CBasePlayer *enemy = me->GetEnemy();
// store our posture when the attack began
me->PushPostureContext();
me->DestroyPath();
// if we are using a knife, try to sneak up on the enemy
if (enemy != NULL && me->IsUsingKnife() && !me->IsPlayerFacingMe(enemy))
me->Walk();
else
me->Run();
me->GetOffLadder();
me->ResetStuckMonitor();
m_repathTimer.Invalidate();
m_haveSeenEnemy = me->IsEnemyVisible();
m_nextDodgeStateTimestamp = 0.0f;
m_firstDodge = true;
m_isEnemyHidden = false;
m_reacquireTimestamp = 0.0f;
m_pinnedDownTimestamp = gpGlobals->time + RANDOM_FLOAT(7.0f, 10.0f);
m_shieldToggleTimestamp = gpGlobals->time + RANDOM_FLOAT(2.0f, 10.0f);
m_shieldForceOpen = false;
// if we encountered someone while escaping, grab our weapon and fight!
if (me->IsEscapingFromBomb())
me->EquipBestWeapon();
if (me->IsUsingKnife())
{
// can't crouch and hold with a knife
m_crouchAndHold = false;
me->StandUp();
}
else
{
// decide whether to crouch where we are, or run and gun (if we havent already - see CCSBot::Attack())
if (!m_crouchAndHold)
{
if (enemy != NULL)
{
const float crouchFarRange = 750.0f;
float crouchChance;
// more likely to crouch if using sniper rifle or if enemy is far away
if (me->IsUsingSniperRifle())
crouchChance = 50.0f;
else if ((me->pev->origin - enemy->pev->origin).IsLengthGreaterThan(crouchFarRange))
crouchChance = 50.0f;
else
crouchChance = 20.0f * (1.0f - me->GetProfile()->GetAggression());
if (RANDOM_FLOAT(0.0f, 100.0f) < crouchChance)
{
// make sure we can still see if we crouch
TraceResult result;
Vector origin = me->pev->origin;
if (!me->IsCrouching())
{
// we are standing, adjust for lower crouch origin
origin.z -= 20.0f;
}
UTIL_TraceLine(origin, enemy->EyePosition(), ignore_monsters, ignore_glass, ENT(me->pev), &result);
if (result.flFraction == 1.0f)
{
m_crouchAndHold = true;
}
}
}
}
if (m_crouchAndHold)
{
me->Crouch();
me->PrintIfWatched("Crouch and hold attack!\n");
}
}
m_scopeTimestamp = 0;
m_didAmbushCheck = false;
float skill = me->GetProfile()->GetSkill();
// tendency to dodge is proportional to skill
float dodgeChance = 80.0f * skill;
if (me->IsUsingKnife())
{
dodgeChance *= 2.0f;
}
// high skill bots always dodge if outnumbered, or they see a sniper
if (skill > 0.5f && me->IsOutnumbered())
{
dodgeChance = 100.0f;
}
m_dodge = (RANDOM_FLOAT(0.0f, 100.0f) < dodgeChance) != 0;
// decide whether we might bail out of this fight
m_isCoward = (RANDOM_FLOAT(0.0f, 100.0f) > 100.0f * me->GetProfile()->GetAggression());
}
/* <51a140> ../cstrike/dlls/bot/states/cs_bot_attack.cpp:135 */
NOBODY void AttackState::StopAttacking(CCSBot *me)
void AttackState::StopAttacking(CCSBot *me)
{
if (me->m_task == CCSBot::SNIPING)
{
@ -42,120 +127,440 @@ NOBODY void AttackState::StopAttacking(CCSBot *me)
}
}
// Perform attack behavior
/* <51997e> ../cstrike/dlls/bot/states/cs_bot_attack.cpp:152 */
NOBODY void AttackState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void AttackState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CBasePlayerWeapon *weapon; // 161
// class CBasePlayer *enemy; // 173
// float notSeenEnemyTime; // 368
// float chaseTime; // 444
// float const hurtRecentlyTime; // 474
// StopRapidFire(CCSBot *const this); // 158
// GetEnemy(CCSBot *const this); // 173
// IsElapsed(const class CountdownTimer *const this); // 189
// {
// bool isPinnedDown; // 198
// Start(CountdownTimer *const this,
// float duration); // 210
// }
// {
// bool repath; // 252
// ForceRun(CCSBot *const this,
// float duration); // 240
// Hurry(CCSBot *const this,
// float duration); // 241
// {
// float const repathRange; // 255
// operator-(const Vector *const this,
// const Vector &v); // 256
// IsLengthGreaterThan(const Vector *const this,
// float length); // 256
// }
// IsElapsed(const class CountdownTimer *const this); // 264
// DestroyPath(CCSBot *const this); // 272
// Start(CountdownTimer *const this,
// float duration); // 267
// }
// IsReloading(CBasePlayer *const this); // 286
// IsProtectedByShield(CBasePlayer *const this); // 289
// {
// float const sniperMinRange; // 320
// operator-(const Vector *const this,
// const Vector &v); // 321
// IsLengthLessThan(const Vector *const this,
// float length); // 321
// }
// {
// float const shotgunMaxRange; // 327
// operator-(const Vector *const this,
// const Vector &v); // 328
// IsLengthGreaterThan(const Vector *const this,
// float length); // 328
// }
// {
// Vector toAimSpot3D; // 342
// float targetRange; // 343
// float const waitScopeTime; // 349
// operator-(const Vector *const this,
// const Vector &v); // 342
// Length(const Vector *const this); // 343
// GetZoomLevel(const class CCSBot *const this); // 346
// }
// IsProtectedByShield(CBasePlayer *const this); // 295
// IsProtectedByShield(CBasePlayer *const this); // 302
// IsAwareOfEnemyDeath(const class CCSBot *const this); // 358
// {
// float hideChance; // 397
// {
// float ambushTime; // 401
// const Vector *spot; // 405
// }
// }
// StopAttacking(AttackState *const this,
// class CCSBot *me); // 424
// StopAttacking(AttackState *const this,
// class CCSBot *me); // 377
// GetNoisePosition(const class CCSBot *const this); // 378
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 465
// entindex(CBaseEntity *const this); // 361
// {
// Vector toEnemy; // 508
// float range; // 509
// float const hysterisRange; // 511
// float minRange; // 513
// float maxRange; // 514
// float const dodgeRange; // 526
// operator-(const Vector *const this,
// const Vector &v); // 508
// Length2D(const Vector *const this); // 509
// {
// int next; // 534
// {
// float const jumpChance; // 540
// IsNotMoving(const class CCSBot *const this); // 541
// }
// }
// }
// GetTimeSinceAttacked(const class CCSBot *const this); // 476
// GetEnemy(CCSBot *const this); // 478
// StopAttacking(AttackState *const this,
// class CCSBot *me); // 459
// GetNearbyEnemyCount(const class CCSBot *const this); // 361
// entindex(CBaseEntity *const this); // 362
// }
// can't be stuck while attacking
me->ResetStuckMonitor();
me->StopRapidFire();
CBasePlayerWeapon *weapon = me->GetActiveWeapon();
if (weapon != NULL)
{
if (weapon->m_iId == WEAPON_C4 ||
weapon->m_iId == WEAPON_HEGRENADE ||
weapon->m_iId == WEAPON_FLASHBANG ||
weapon->m_iId == WEAPON_SMOKEGRENADE)
{
me->EquipBestWeapon();
}
}
CBasePlayer *enemy = me->GetEnemy();
if (enemy == NULL)
{
StopAttacking(me);
return;
}
// keep track of whether we have seen our enemy at least once yet
if (!m_haveSeenEnemy)
m_haveSeenEnemy = me->IsEnemyVisible();
// Retreat check
// Do not retreat if the enemy is too close
if (m_retreatTimer.IsElapsed())
{
// If we've been fighting this battle for awhile, we're "pinned down" and
// need to do something else.
// If we are outnumbered, retreat.
bool isPinnedDown = (gpGlobals->time > m_pinnedDownTimestamp);
if (isPinnedDown ||
(me->IsOutnumbered() && m_isCoward) ||
(me->OutnumberedCount() >= 2 && me->GetProfile()->GetAggression() < 1.0f))
{
// tell our teammates our plight
if (isPinnedDown)
me->GetChatter()->PinnedDown();
else
me->GetChatter()->Scared();
m_retreatTimer.Start(RANDOM_FLOAT(3.0f, 15.0f));
// try to retreat
if (me->TryToRetreat())
{
// if we are a sniper, equip our pistol so we can fire while retreating
if (me->IsUsingSniperRifle())
{
me->EquipPistol();
}
}
else
{
me->PrintIfWatched("I want to retreat, but no safe spots nearby!\n");
}
}
}
// Knife fighting
// We need to pathfind right to the enemy to cut him
if (me->IsUsingKnife())
{
// can't crouch and hold with a knife
m_crouchAndHold = false;
me->StandUp();
// if we are using a knife and our prey is looking towards us, run at him
if (me->IsPlayerFacingMe(enemy))
{
me->ForceRun(5.0f);
me->Hurry(10.0f);
}
else
{
me->Walk();
}
// slash our victim
me->FireWeaponAtEnemy();
// if our victim has moved, repath
bool repath = false;
if (me->HasPath())
{
const float repathRange = 100.0f;
if ((me->GetPathEndpoint() - enemy->pev->origin).IsLengthGreaterThan(repathRange))
{
repath = true;
}
}
else
{
repath = true;
}
if (repath && m_repathTimer.IsElapsed())
{
me->ComputePath(TheNavAreaGrid.GetNearestNavArea(&enemy->pev->origin), &enemy->pev->origin, FASTEST_ROUTE);
const float repathInterval = 0.5f;
m_repathTimer.Start(repathInterval);
}
// move towards victim
if (me->UpdatePathMovement(NO_SPEED_CHANGE) != CCSBot::PROGRESSING)
{
me->DestroyPath();
}
return;
}
// Simple shield usage
if (me->HasShield())
{
if (me->IsEnemyVisible() && !m_shieldForceOpen)
{
if (!me->IsRecognizedEnemyReloading() && !me->IsReloading() && me->IsPlayerLookingAtMe(enemy))
{
// close up - enemy is pointing his gun at us
if (!me->IsProtectedByShield())
me->SecondaryAttack();
}
else
{
// enemy looking away or reloading his weapon - open up and shoot him
if (me->IsProtectedByShield())
me->SecondaryAttack();
}
}
else
{
// can't see enemy, open up
if (me->IsProtectedByShield())
me->SecondaryAttack();
}
if (gpGlobals->time > m_shieldToggleTimestamp)
{
m_shieldToggleTimestamp = gpGlobals->time + RANDOM_FLOAT(0.5, 2.0f);
// toggle shield force open
m_shieldForceOpen = !m_shieldForceOpen;
}
}
// check if our weapon range is bad and we should switch to pistol
if (me->IsUsingSniperRifle())
{
// if we have a sniper rifle and our enemy is too close, switch to pistol
// NOTE: Must be larger than NO_ZOOM range in AdjustZoom()
const float sniperMinRange = 310.0f;
if ((enemy->pev->origin - me->pev->origin).IsLengthLessThan(sniperMinRange))
me->EquipPistol();
}
else if (me->IsUsingShotgun())
{
// if we have a shotgun equipped and enemy is too far away, switch to pistol
const float shotgunMaxRange = 1000.0f;
if ((enemy->pev->origin - me->pev->origin).IsLengthGreaterThan(shotgunMaxRange))
me->EquipPistol();
}
// if we're sniping, look through the scope - need to do this here in case a reload resets our scope
if (me->IsUsingSniperRifle())
{
// for Scouts and AWPs, we need to wait for zoom to resume
if (me->m_bResumeZoom)
{
m_scopeTimestamp = gpGlobals->time;
return;
}
Vector toAimSpot3D = me->m_aimSpot - me->pev->origin;
float targetRange = toAimSpot3D.Length();
// dont adjust zoom level if we're already zoomed in - just fire
if (me->GetZoomLevel() == CCSBot::NO_ZOOM && me->AdjustZoom(targetRange))
m_scopeTimestamp = gpGlobals->time;
const float waitScopeTime = 0.2f + me->GetProfile()->GetReactionTime();
if (gpGlobals->time - m_scopeTimestamp < waitScopeTime)
{
// force us to wait until zoomed in before firing
return;
}
}
// see if we "notice" that our prey is dead
if (me->IsAwareOfEnemyDeath())
{
// let team know if we killed the last enemy
if (me->GetLastVictimID() == enemy->entindex() && me->GetNearbyEnemyCount() <= 1)
{
me->GetChatter()->KilledMyEnemy(enemy->entindex());
}
StopAttacking(me);
return;
}
float notSeenEnemyTime = gpGlobals->time - me->GetLastSawEnemyTimestamp();
// if we haven't seen our enemy for a moment, continue on if we dont want to fight, or decide to ambush if we do
if (!me->IsEnemyVisible())
{
// attend to nearby enemy gunfire
if (notSeenEnemyTime > 0.5f && me->CanHearNearbyEnemyGunfire())
{
// give up the attack, since we didn't want it in the first place
StopAttacking(me);
me->SetLookAt("Nearby enemy gunfire", me->GetNoisePosition(), PRIORITY_HIGH, 0.0f);
me->PrintIfWatched("Checking nearby threatening enemy gunfire!\n");
return;
}
// check if we have lost track of our enemy during combat
if (notSeenEnemyTime > 0.25f)
{
m_isEnemyHidden = true;
}
if (notSeenEnemyTime > 0.1f)
{
if (me->GetDisposition() == CCSBot::ENGAGE_AND_INVESTIGATE)
{
// decide whether we should hide and "ambush" our enemy
if (m_haveSeenEnemy && !m_didAmbushCheck)
{
const float hideChance = 33.3f;
if (RANDOM_FLOAT(0.0, 100.0f) < hideChance)
{
float ambushTime = RANDOM_FLOAT(3.0f, 15.0f);
// hide in ambush nearby
// TODO: look towards where we know enemy is
const Vector *spot = FindNearbyRetreatSpot(me, 200.0f);
if (spot != NULL)
{
me->IgnoreEnemies(1.0f);
me->Run();
me->StandUp();
me->Hide(spot, ambushTime, true);
return;
}
}
// don't check again
m_didAmbushCheck = true;
}
}
else
{
// give up the attack, since we didn't want it in the first place
StopAttacking(me);
return;
}
}
}
else
{
// we can see the enemy again - reset our ambush check
m_didAmbushCheck = false;
// if the enemy is coming out of hiding, we need time to react
if (m_isEnemyHidden)
{
m_reacquireTimestamp = gpGlobals->time + me->GetProfile()->GetReactionTime();
m_isEnemyHidden = false;
}
}
// if we haven't seen our enemy for a long time, chase after them
float chaseTime = 2.0f + 2.0f * (1.0f - me->GetProfile()->GetAggression());
// if we are sniping, be very patient
if (me->IsUsingSniperRifle())
chaseTime += 3.0f;
// if we are crouching, be a little patient
else if (me->IsCrouching())
chaseTime += 1.0f;
// if we can't see the enemy, and have either seen him but currently lost sight of him,
// or haven't yet seen him, chase after him (unless we are a sniper)
if (!me->IsEnemyVisible() && (notSeenEnemyTime > chaseTime || !m_haveSeenEnemy))
{
// snipers don't chase their prey - they wait for their prey to come to them
if (me->GetTask() == CCSBot::SNIPING)
{
StopAttacking(me);
return;
}
else
{
// move to last known position of enemy
me->SetTask(CCSBot::MOVE_TO_LAST_KNOWN_ENEMY_POSITION, enemy);
me->MoveTo(&me->GetLastKnownEnemyPosition());
return;
}
}
// if we can't see our enemy at the moment, and were shot by
// a different visible enemy, engage them instead
const float hurtRecentlyTime = 3.0f;
if (!me->IsEnemyVisible() &&
me->GetTimeSinceAttacked() < hurtRecentlyTime &&
me->GetAttacker() != NULL &&
me->GetAttacker() != me->GetEnemy())
{
// if we can see them, attack, otherwise panic
if (me->IsVisible(me->GetAttacker(), CHECK_FOV))
{
me->Attack(me->GetAttacker());
me->PrintIfWatched("Switching targets to retaliate against new attacker!\n");
}
return;
}
if (gpGlobals->time > m_reacquireTimestamp)
me->FireWeaponAtEnemy();
// do dodge behavior
// If sniping or crouching, stand still.
if (m_dodge && !me->IsUsingSniperRifle() && !m_crouchAndHold)
{
Vector toEnemy = enemy->pev->origin - me->pev->origin;
float range = toEnemy.Length2D();
const float hysterisRange = 125.0f; // (+/-) m_combatRange
float minRange = me->GetCombatRange() - hysterisRange;
float maxRange = me->GetCombatRange() + hysterisRange;
// move towards (or away from) enemy if we are using a knife, behind a corner, or we aren't very skilled
if (me->GetProfile()->GetSkill() < 0.66f || !me->IsEnemyVisible())
{
if (range > maxRange)
me->MoveForward();
else if (range < minRange)
me->MoveBackward();
}
// don't dodge if enemy is facing away
const float dodgeRange = 2000.0f;
if (range > dodgeRange || !me->IsPlayerFacingMe(enemy))
{
m_dodgeState = STEADY_ON;
m_nextDodgeStateTimestamp = 0.0f;
}
else if (gpGlobals->time >= m_nextDodgeStateTimestamp)
{
int next;
// select next dodge state that is different that our current one
do
{
// high-skill bots may jump when first engaging the enemy (if they are moving)
const float jumpChance = 33.3f;
if (m_firstDodge && me->GetProfile()->GetSkill() > 0.5f && RANDOM_FLOAT(0, 100) < jumpChance && !me->IsNotMoving())
next = RANDOM_LONG(0, NUM_ATTACK_STATES - 1);
else
next = RANDOM_LONG(0, NUM_ATTACK_STATES - 2);
}
while (!m_firstDodge && next == m_dodgeState);
m_dodgeState = (DodgeStateType)next;
m_nextDodgeStateTimestamp = gpGlobals->time + RANDOM_FLOAT(0.3f, 1.0f);
m_firstDodge = false;
}
switch (m_dodgeState)
{
case STEADY_ON:
{
break;
}
case SLIDE_LEFT:
{
me->StrafeLeft();
break;
}
case SLIDE_RIGHT:
{
me->StrafeRight();
break;
}
case JUMP:
{
if (me->m_isEnemyVisible)
{
me->Jump();
}
break;
}
}
}
}
// Finish attack
/* <5198d4> ../cstrike/dlls/bot/states/cs_bot_attack.cpp:578 */
NOBODY void AttackState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void AttackState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
// ForgetNoise(CCSBot *const this); // 585
// PopPostureContext(CBot *const this); // 589
// IsProtectedByShield(CBasePlayer *const this); // 592
// StopRapidFire(CCSBot *const this); // 597
// ClearSurpriseDelay(CCSBot *const this); // 598
me->PrintIfWatched("AttackState:OnExit()\n");
m_crouchAndHold = false;
// clear any noises we heard during battle
me->ForgetNoise();
me->ResetStuckMonitor();
// resume our original posture
me->PopPostureContext();
// put shield away
if (me->IsProtectedByShield())
me->SecondaryAttack();
me->StopRapidFire();
me->ClearSurpriseDelay();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,91 +1,525 @@
#include "precompiled.h"
/* <5291fd> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:18 */
NOBODY bool HasDefaultPistol(CCSBot *me)
bool HasDefaultPistol(CCSBot *me)
{
CBasePlayerWeapon *pistol = static_cast<CBasePlayerWeapon *>(me->m_rgpPlayerItems[ PISTOL_SLOT ]);
if (pistol == NULL)
return false;
if (me->m_iTeam == TERRORIST && pistol->m_iId == WEAPON_GLOCK18)
return true;
if (me->m_iTeam == CT && pistol->m_iId == WEAPON_USP)
return true;
return false;
}
// Buy weapons, armor, etc.
/* <5299e4> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:37 */
NOBODY void BuyState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void BuyState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 48
// {
// float const buyDefuseKitChance; // 60
// }
// HasDefaultPistol(CCSBot *me); // 93
// AllowShotguns(const class CCSBotManager *const this); // 96
// }
CCSBotManager *ctrl = TheCSBots();
m_retries = 0;
m_prefRetries = 0;
m_prefIndex = 0;
m_doneBuying = false;
m_isInitialDelay = true;
// this will force us to stop holding live grenade
me->EquipBestWeapon();
m_buyDefuseKit = false;
m_buyShield = false;
if (me->m_iTeam == CT)
{
if (ctrl->GetScenario() == CCSBotManager::SCENARIO_DEFUSE_BOMB)
{
// CT's sometimes buy defuse kits in the bomb scenario (except in career mode, where the player should defuse)
if (g_pGameRules->IsCareer() == false)
{
const float buyDefuseKitChance = 50.0f; // 100.0f * (me->GetProfile()->GetSkill() + 0.2f);
if (RANDOM_FLOAT(0.0f, 100.0f) < buyDefuseKitChance)
{
m_buyDefuseKit = true;
}
}
}
// determine if we want a tactical shield
if (!me->m_bHasPrimary && ctrl->AllowTacticalShield())
{
if (me->m_iAccount > 2500)
{
if (me->m_iAccount < 4000)
m_buyShield = (RANDOM_FLOAT(0, 100.0f) < 33.3f) ? true : false;
else
m_buyShield = (RANDOM_FLOAT(0, 100.0f) < 10.0f) ? true : false;
}
}
}
if (ctrl->AllowGrenades())
{
m_buyGrenade = (RANDOM_FLOAT(0.0f, 100.0f) < 33.3f) ? true : false;
}
else
{
m_buyGrenade = false;
}
m_buyPistol = false;
if (ctrl->AllowPistols())
{
CBasePlayerWeapon *pistol = static_cast<CBasePlayerWeapon *>(me->m_rgpPlayerItems[ PISTOL_SLOT ]);
// check if we have a pistol
if (pistol != NULL)
{
// if we have our default pistol, think about buying a different one
if (HasDefaultPistol(me))
{
// if everything other than pistols is disallowed, buy a pistol
if (ctrl->AllowShotguns() == false &&
ctrl->AllowSubMachineGuns() == false &&
ctrl->AllowRifles() == false &&
ctrl->AllowMachineGuns() == false &&
ctrl->AllowTacticalShield() == false &&
ctrl->AllowSnipers() == false)
{
m_buyPistol = (RANDOM_FLOAT(0, 100) < 75.0f);
}
else if (me->m_iAccount < 1000)
{
// if we're low on cash, buy a pistol
m_buyPistol = (RANDOM_FLOAT(0, 100) < 75.0f);
}
else
{
m_buyPistol = (RANDOM_FLOAT(0, 100) < 33.3f);
}
}
}
else
{
// we dont have a pistol - buy one
m_buyPistol = true;
}
}
}
/* <52972b> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:212 */
NOBODY inline WeaponType GetWeaponType(const char *alias)
enum WeaponType
{
// {
// int i; // 214
// }
PISTOL,
SHOTGUN,
SUB_MACHINE_GUN,
RIFLE,
MACHINE_GUN,
SNIPER_RIFLE,
GRENADE,
NUM_WEAPON_TYPES,
};
struct BuyInfo
{
WeaponType type;
bool preferred; // more challenging bots prefer these weapons
char *buyAlias; // the buy alias for this equipment
};
// These tables MUST be kept in sync with the CT and T buy aliases
#ifndef HOOK_GAMEDLL
static BuyInfo primaryWeaponBuyInfoCT[ PRIMARY_WEAPON_BUY_COUNT ] =
{
{ SHOTGUN, false, "m3" }, // WEAPON_M3
{ SHOTGUN, false, "xm1014" }, // WEAPON_XM1014
{ SUB_MACHINE_GUN, false, "tmp" }, // WEAPON_TMP
{ SUB_MACHINE_GUN, false, "mp5" }, // WEAPON_MP5N
{ SUB_MACHINE_GUN, false, "ump45" }, // WEAPON_UMP45
{ SUB_MACHINE_GUN, false, "p90" }, // WEAPON_P90
{ RIFLE, true, "famas" }, // WEAPON_FAMAS
{ SNIPER_RIFLE, false, "scout" }, // WEAPON_SCOUT
{ RIFLE, true, "m4a1" }, // WEAPON_M4A1
{ RIFLE, false, "aug" }, // WEAPON_AUG
{ SNIPER_RIFLE, true, "sg550" }, // WEAPON_SG550
{ SNIPER_RIFLE, true, "awp" }, // WEAPON_AWP
{ MACHINE_GUN, false, "m249" } // WEAPON_M249
};
static BuyInfo secondaryWeaponBuyInfoCT[ SECONDARY_WEAPON_BUY_COUNT ] =
{
// { PISTOL, false, "glock" },
// { PISTOL, false, "usp" },
{ PISTOL, true, "p228" },
{ PISTOL, true, "deagle" },
{ PISTOL, true, "fn57" }
};
static BuyInfo primaryWeaponBuyInfoT[ PRIMARY_WEAPON_BUY_COUNT ] =
{
{ SHOTGUN, false, "m3" }, // WEAPON_M3
{ SHOTGUN, false, "xm1014" }, // WEAPON_XM1014
{ SUB_MACHINE_GUN, false, "mac10" }, // WEAPON_MAC10
{ SUB_MACHINE_GUN, false, "mp5" }, // WEAPON_MP5N
{ SUB_MACHINE_GUN, false, "ump45" }, // WEAPON_UMP45
{ SUB_MACHINE_GUN, false, "p90" }, // WEAPON_P90
{ RIFLE, true, "galil" }, // WEAPON_GALIL
{ RIFLE, true, "ak47" }, // WEAPON_AK47
{ SNIPER_RIFLE, false, "scout" }, // WEAPON_SCOUT
{ RIFLE, true, "sg552" }, // WEAPON_SG552
{ SNIPER_RIFLE, true, "awp" }, // WEAPON_AWP
{ SNIPER_RIFLE, true, "g3sg1" }, // WEAPON_G3SG1
{ MACHINE_GUN, false, "m249" } // WEAPON_M249
};
static BuyInfo secondaryWeaponBuyInfoT[ SECONDARY_WEAPON_BUY_COUNT ] =
{
// { PISTOL, false, "glock" },
// { PISTOL, false, "usp" },
{ PISTOL, true, "p228" },
{ PISTOL, true, "deagle" },
{ PISTOL, true, "elites" }
};
#else // HOOK_GAMEDLL
BuyInfo primaryWeaponBuyInfoCT[ PRIMARY_WEAPON_BUY_COUNT ];
BuyInfo secondaryWeaponBuyInfoCT[ SECONDARY_WEAPON_BUY_COUNT];
BuyInfo primaryWeaponBuyInfoT[ PRIMARY_WEAPON_BUY_COUNT ];
BuyInfo secondaryWeaponBuyInfoT[ SECONDARY_WEAPON_BUY_COUNT ];
#endif // HOOK_GAMEDLL
// Given a weapon alias, return the kind of weapon it is
/* <52972b> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:212 */
inline WeaponType GetWeaponType(const char *alias)
{
int i;
for (i = 0; i < PRIMARY_WEAPON_BUY_COUNT; ++i)
{
if (!Q_stricmp(alias, primaryWeaponBuyInfoCT[i].buyAlias))
return primaryWeaponBuyInfoCT[i].type;
if (!Q_stricmp(alias, primaryWeaponBuyInfoT[i].buyAlias))
return primaryWeaponBuyInfoT[i].type;
}
for (i = 0; i < SECONDARY_WEAPON_BUY_COUNT; ++i)
{
if (!Q_stricmp(alias, secondaryWeaponBuyInfoCT[i].buyAlias))
return secondaryWeaponBuyInfoCT[i].type;
if (!Q_stricmp(alias, secondaryWeaponBuyInfoT[i].buyAlias))
return secondaryWeaponBuyInfoT[i].type;
}
return NUM_WEAPON_TYPES;
}
/* <529753> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:241 */
NOBODY void BuyState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void BuyState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// bool inBuyZone; // 273
// class CCSBotManager *ctrl; // 288
// {
// float const waitToBuyTime; // 257
// }
// {
// bool isPreferredAllDisallowed; // 295
// {
// int const maxPrefRetries; // 301
// int weaponPreference; // 310
// class CBasePlayerWeapon *weapon; // 313
// const char *buyAlias; // 328
// {
// enum WeaponType type; // 338
// GetWeaponType(const char *alias); // 338
// }
// GetWeaponPreference(const class BotProfile *const this,
// int i); // 310
// }
// {
// class BuyInfo *masterPrimary; // 400
// class BuyInfo *stockPrimary; // 401
// int stockPrimaryCount; // 402
// float const sniperRifleChance; // 405
// bool wantSniper; // 406
// {
// int i; // 408
// AllowShotguns(const class CCSBotManager *const this); // 410
// AllowSubMachineGuns(const class CCSBotManager *const this); // 411
// AllowRifles(const class CCSBotManager *const this); // 412
// AllowSnipers(const class CCSBotManager *const this); // 413
// }
// {
// int which; // 423
// GetDifficultyLevel(void); // 426
// {
// int prefCount; // 429
// {
// int whichPref;// 436
// }
// }
// }
// }
// {
// int which; // 479
// }
// {
// float rnd; // 500
// }
// }
// }
// wait for a Navigation Mesh
if (!TheNavAreaList.size())
return;
// apparently we cant buy things in the first few seconds, so wait a bit
if (m_isInitialDelay)
{
const float waitToBuyTime = 2.0f; // 0.25f;
if (gpGlobals->time - me->GetStateTimestamp() < waitToBuyTime)
return;
m_isInitialDelay = false;
}
// if we're done buying and still in the freeze period, wait
if (m_doneBuying)
{
if (g_pGameRules->IsMultiplayer() && g_pGameRules->IsFreezePeriod())
return;
me->Idle();
//return;
}
// is the bot spawned outside of a buy zone?
if (!(me->m_signals.GetState() & SIGNAL_BUY))
{
m_doneBuying = true;
UTIL_DPrintf("%s bot spawned outside of a buy zone (%d, %d, %d)\n", (me->m_iTeam == CT) ? "CT" : "Terrorist", me->pev->origin.x, me->pev->origin.y, me->pev->origin.z);
return;
}
CCSBotManager *ctrl = TheCSBots();
// try to buy some weapons
const float buyInterval = 0.2f; // 0.02f
if (gpGlobals->time - me->GetStateTimestamp() > buyInterval)
{
me->m_stateTimestamp = gpGlobals->time;
bool isPreferredAllDisallowed = true;
// try to buy our preferred weapons first
if (m_prefIndex < me->GetProfile()->GetWeaponPreferenceCount())
{
// need to retry because sometimes first buy fails??
const int maxPrefRetries = 2;
if (m_prefRetries >= maxPrefRetries)
{
// try to buy next preferred weapon
++m_prefIndex;
m_prefRetries = 0;
return;
}
int weaponPreference = me->GetProfile()->GetWeaponPreference(m_prefIndex);
// don't buy it again if we still have one from last round
CBasePlayerWeapon *weapon = me->GetActiveWeapon();
if (weapon != NULL && weapon->m_iId == weaponPreference)
{
// done with buying preferred weapon
m_prefIndex = 9999;
return;
}
if (me->HasShield() && weaponPreference == WEAPON_SHIELDGUN)
{
// done with buying preferred weapon
m_prefIndex = 9999;
return;
}
const char *buyAlias = NULL;
if (weaponPreference == WEAPON_SHIELDGUN)
{
if (ctrl->AllowTacticalShield())
buyAlias = "shield";
}
else
{
buyAlias = WeaponIDToAlias(weaponPreference);
WeaponType type = GetWeaponType(buyAlias);
switch (type)
{
case PISTOL:
if (!ctrl->AllowPistols())
buyAlias = NULL;
break;
case SHOTGUN:
if (!ctrl->AllowShotguns())
buyAlias = NULL;
break;
case SUB_MACHINE_GUN:
if (!ctrl->AllowSubMachineGuns())
buyAlias = NULL;
break;
case RIFLE:
if (!ctrl->AllowRifles())
buyAlias = NULL;
break;
case MACHINE_GUN:
if (!ctrl->AllowMachineGuns())
buyAlias = NULL;
break;
case SNIPER_RIFLE:
if (!ctrl->AllowSnipers())
buyAlias = NULL;
break;
}
}
if (buyAlias)
{
me->ClientCommand(buyAlias);
me->PrintIfWatched("Tried to buy preferred weapon %s.\n", buyAlias);
isPreferredAllDisallowed = false;
}
++m_prefRetries;
// bail out so we dont waste money on other equipment
// unless everything we prefer has been disallowed, then buy at random
if (isPreferredAllDisallowed == false)
return;
}
// if we have no preferred primary weapon (or everything we want is disallowed), buy at random
if (!me->m_bHasPrimary && (isPreferredAllDisallowed || !me->GetProfile()->HasPrimaryPreference()))
{
if (m_buyShield)
{
// buy a shield
me->ClientCommand("shield");
me->PrintIfWatched("Tried to buy a shield.\n");
}
else
{
// build list of allowable weapons to buy
BuyInfo *masterPrimary = (me->m_iTeam == TERRORIST) ? primaryWeaponBuyInfoT : primaryWeaponBuyInfoCT;
BuyInfo *stockPrimary[ PRIMARY_WEAPON_BUY_COUNT ];
int stockPrimaryCount = 0;
// dont choose sniper rifles as often
const float sniperRifleChance = 50.0f;
bool wantSniper = (RANDOM_FLOAT(0, 100) < sniperRifleChance) ? true : false;
for (int i = 0; i < PRIMARY_WEAPON_BUY_COUNT; ++i)
{
if ((masterPrimary[i].type == SHOTGUN && ctrl->AllowShotguns()) ||
(masterPrimary[i].type == SUB_MACHINE_GUN && ctrl->AllowSubMachineGuns()) ||
(masterPrimary[i].type == RIFLE && ctrl->AllowRifles()) ||
(masterPrimary[i].type == SNIPER_RIFLE && ctrl->AllowSnipers() && wantSniper) ||
(masterPrimary[i].type == MACHINE_GUN && ctrl->AllowMachineGuns()))
{
stockPrimary[ stockPrimaryCount++ ] = &masterPrimary[i];
}
}
if (stockPrimaryCount)
{
// buy primary weapon if we don't have one
int which;
// on hard difficulty levels, bots try to buy preferred weapons on the first pass
if (m_retries == 0 && ctrl->GetDifficultyLevel() >= BOT_HARD)
{
// count up available preferred weapons
int prefCount = 0;
for (which = 0; which < stockPrimaryCount; ++which)
{
if (stockPrimary[which]->preferred)
++prefCount;
}
if (prefCount)
{
int whichPref = RANDOM_LONG(0, prefCount - 1);
for (which = 0; which < stockPrimaryCount; ++which)
{
if (stockPrimary[which]->preferred && whichPref-- == 0)
break;
}
}
else
{
// no preferred weapons available, just pick randomly
which = RANDOM_LONG(0, stockPrimaryCount - 1);
}
}
else
{
which = RANDOM_LONG(0, stockPrimaryCount - 1);
}
me->ClientCommand(stockPrimary[ which ]->buyAlias);
me->PrintIfWatched("Tried to buy %s.\n", stockPrimary[ which ]->buyAlias);
}
}
}
// If we now have a weapon, or have tried for too long, we're done
if (me->m_bHasPrimary || m_retries++ > 5)
{
// primary ammo
if (me->m_bHasPrimary)
{
me->ClientCommand("primammo");
}
// buy armor last, to make sure we bought a weapon first
me->ClientCommand("vesthelm");
me->ClientCommand("vest");
// pistols - if we have no preferred pistol, buy at random
if (ctrl->AllowPistols() && !me->GetProfile()->HasPistolPreference())
{
if (m_buyPistol)
{
int which = RANDOM_LONG(0, SECONDARY_WEAPON_BUY_COUNT - 1);
if (me->m_iTeam == TERRORIST)
me->ClientCommand(secondaryWeaponBuyInfoT[ which ].buyAlias);
else
me->ClientCommand(secondaryWeaponBuyInfoCT[ which ].buyAlias);
// only buy one pistol
m_buyPistol = false;
}
me->ClientCommand("secammo");
}
// buy a grenade if we wish, and we don't already have one
if (m_buyGrenade && !me->HasGrenade())
{
if (UTIL_IsTeamAllBots(me->m_iTeam))
{
// only allow Flashbangs if everyone on the team is a bot (dont want to blind our friendly humans)
float rnd = RANDOM_FLOAT(0, 100);
if (rnd < 10.0f)
{
// smoke grenade
me->ClientCommand("sgren");
}
else if (rnd < 35.0f)
{
// flashbang
me->ClientCommand("flash");
}
else
{
// he grenade
me->ClientCommand("hegren");
}
}
else
{
if (RANDOM_FLOAT(0, 100) < 10.0f)
{
// smoke grenade
me->ClientCommand("sgren");
}
else
{
// he grenade
me->ClientCommand("hegren");
}
}
}
if (m_buyDefuseKit)
{
me->ClientCommand("defuser");
}
m_doneBuying = true;
}
}
}
/* <5296f1> ../cstrike/dlls/bot/states/cs_bot_buy.cpp:529 */
NOBODY void BuyState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void BuyState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
me->ResetStuckMonitor();
me->EquipBestWeapon();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,30 +1,70 @@
#include "precompiled.h"
// Begin defusing the bomb
/* <539f0e> ../cstrike/dlls/bot/states/cs_bot_defuse_bomb.cpp:16 */
NOBODY void DefuseBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void DefuseBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// Say(BotChatterInterface *const this,
// const char *phraseName,
// float lifetime,
// float delay); // 20
me->Crouch();
me->SetDisposition(CCSBot::SELF_DEFENSE);
me->GetChatter()->Say("DefusingBomb");
}
// Defuse the bomb
/* <539eac> ../cstrike/dlls/bot/states/cs_bot_defuse_bomb.cpp:27 */
NOBODY void DefuseBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void DefuseBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// const Vector *bombPos; // 29
// class CCSBotManager *ctrl; // 44
// }
const Vector *bombPos = me->GetGameState()->GetBombPosition();
CCSBotManager *ctrl = TheCSBots();
if (bombPos == NULL)
{
me->PrintIfWatched("In Defuse state, but don't know where the bomb is!\n");
me->Idle();
return;
}
// look at the bomb
me->SetLookAt("Defuse bomb", bombPos, PRIORITY_HIGH);
// defuse...
me->UseEnvironment();
if (gpGlobals->time - me->GetStateTimestamp() > 1.0f)
{
// if we missed starting the defuse, give up
if (ctrl->GetBombDefuser() == NULL)
{
me->PrintIfWatched("Failed to start defuse, giving up\n");
me->Idle();
return;
}
else if (ctrl->GetBombDefuser() != me)
{
// if someone else got the defuse, give up
me->PrintIfWatched("Someone else started defusing, giving up\n");
me->Idle();
return;
}
}
// if bomb has been defused, give up
if (!ctrl->IsBombPlanted())
{
me->Idle();
return;
}
}
/* <539e36> ../cstrike/dlls/bot/states/cs_bot_defuse_bomb.cpp:73 */
NOBODY void DefuseBombState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void DefuseBombState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 77
// ClearLookAt(CCSBot *const this); // 79
me->StandUp();
me->ResetStuckMonitor();
me->SetTask(CCSBot::SEEK_AND_DESTROY);
me->SetDisposition(CCSBot::ENGAGE_AND_INVESTIGATE);
me->ClearLookAt();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,28 +1,49 @@
#include "precompiled.h"
/* <5499ae> ../cstrike/dlls/bot/states/cs_bot_escape_from_bomb.cpp:16 */
NOBODY void EscapeFromBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void EscapeFromBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// DestroyPath(CCSBot *const this); // 20
me->StandUp();
me->Run();
me->DestroyPath();
me->EquipKnife();
}
// Escape from the bomb
/* <549be9> ../cstrike/dlls/bot/states/cs_bot_escape_from_bomb.cpp:28 */
NOBODY void EscapeFromBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void EscapeFromBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// const Vector *bombPos; // 30
// {
// class FarAwayFromPositionFunctor func; // 48
// class CNavArea *goalArea; // 49
// FarAwayFromPositionFunctor(FarAwayFromPositionFunctor *const this,
// const Vector *pos); // 48
// }
// }
const Vector *bombPos = me->GetGameState()->GetBombPosition();
// if we don't know where the bomb is, we shouldn't be in this state
if (bombPos == NULL)
{
me->Idle();
return;
}
// grab our knife to move quickly
me->EquipKnife();
// look around
me->UpdateLookAround();
if (me->UpdatePathMovement() != CCSBot::PROGRESSING)
{
// we have no path, or reached the end of one - create a new path far away from the bomb
FarAwayFromPositionFunctor func(bombPos);
CNavArea *goalArea = FindMinimumCostArea(me->GetLastKnownArea(), func);
// if this fails, we'll try again next time
me->ComputePath(goalArea, NULL, FASTEST_ROUTE);
}
}
/* <549976> ../cstrike/dlls/bot/states/cs_bot_escape_from_bomb.cpp:60 */
NOBODY void EscapeFromBombState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void EscapeFromBombState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
me->EquipBestWeapon();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,19 +1,54 @@
#include "precompiled.h"
// Move to the bomb on the floor and pick it up
/* <5587b3> ../cstrike/dlls/bot/states/cs_bot_fetch_bomb.cpp:17 */
NOBODY void FetchBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void FetchBombState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// DestroyPath(CCSBot *const this); // 19
me->DestroyPath();
}
// Move to the bomb on the floor and pick it up
/* <5587fa> ../cstrike/dlls/bot/states/cs_bot_fetch_bomb.cpp:26 */
NOBODY void FetchBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void FetchBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 28
// class CBaseEntity *bomb; // 30
// GetLooseBomb(CCSBotManager *const this); // 30
// }
if (me->IsCarryingBomb())
{
me->PrintIfWatched( "I picked up the bomb\n" );
me->Idle();
return;
}
CBaseEntity *bomb = TheCSBots()->GetLooseBomb();
if (bomb != NULL)
{
if (!me->HasPath())
{
// build a path to the bomb
if (me->ComputePath(TheNavAreaGrid.GetNavArea(&bomb->pev->origin), &bomb->pev->origin, SAFEST_ROUTE) == false)
{
me->PrintIfWatched("Fetch bomb pathfind failed\n");
// go Hunt instead of Idle to prevent continuous re-pathing to inaccessible bomb
me->Hunt();
//return;
}
}
}
else
{
// someone picked up the bomb
me->PrintIfWatched("Bomb not loose\n");
me->Idle();
return;
}
// look around
me->UpdateLookAround();
if (me->UpdatePathMovement() != CCSBot::PROGRESSING)
me->Idle();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,105 +1,269 @@
#include "precompiled.h"
// Follow our leader
/* <56918b> ../cstrike/dlls/bot/states/cs_bot_follow.cpp:16 */
NOBODY void FollowState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void FollowState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// DestroyPath(CCSBot *const this); // 20
// Invalidate(CountdownTimer *const this); // 33
// Invalidate(IntervalTimer *const this); // 37
// Start(CountdownTimer *const this,
// float duration); // 41
me->StandUp();
me->Run();
me->DestroyPath();
m_isStopped = false;
m_stoppedTimestamp = 0.0f;
// to force immediate repath
m_lastLeaderPos.x = -99999999.9f;
m_lastLeaderPos.y = -99999999.9f;
m_lastLeaderPos.z = -99999999.9f;
m_lastSawLeaderTime = 0;
// set re-pathing frequency
m_repathInterval.Invalidate();
m_isSneaking = false;
m_walkTime.Invalidate();
m_isAtWalkSpeed = false;
m_leaderMotionState = INVALID;
m_idleTimer.Start(RANDOM_FLOAT(2.0f, 5.0f));
}
// Determine the leader's motion state by tracking his speed
/* <569268> ../cstrike/dlls/bot/states/cs_bot_follow.cpp:48 */
NOBODY void FollowState::ComputeLeaderMotionState(float leaderSpeed)
void FollowState::ComputeLeaderMotionState(float leaderSpeed)
{
// {
// float const runWalkThreshold; // 51
// float const walkStopThreshold; // 52
// enum LeaderMotionStateType prevState; // 53
// {
// float const minWalkTime; // 68
// GetElapsedTime(const class IntervalTimer *const this); // 69
// Start(IntervalTimer *const this); // 64
// }
// Start(IntervalTimer *const this); // 83
// }
// walk = 130, run = 250
const float runWalkThreshold = 140.0f;
const float walkStopThreshold = 10.0f;
LeaderMotionStateType prevState = m_leaderMotionState;
if (leaderSpeed > runWalkThreshold)
{
m_leaderMotionState = RUNNING;
m_isAtWalkSpeed = false;
}
else if (leaderSpeed > walkStopThreshold)
{
// track when began to walk
if (!m_isAtWalkSpeed)
{
m_walkTime.Start();
m_isAtWalkSpeed = true;
}
const float minWalkTime = 0.25f;
if (m_walkTime.GetElapsedTime() > minWalkTime)
{
m_leaderMotionState = WALKING;
}
}
else
{
m_leaderMotionState = STOPPED;
m_isAtWalkSpeed = false;
}
// track time spent in this motion state
if (prevState != m_leaderMotionState)
{
m_leaderMotionStateTime.Start();
m_waitTime = RANDOM_FLOAT(1.0f, 3.0f);
}
}
// Follow our leader
// TODO: Clean up this nasty mess
/* <569368> ../cstrike/dlls/bot/states/cs_bot_follow.cpp:164 */
NOBODY void FollowState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void FollowState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// float leaderSpeed; // 194
// bool isLeaderVisible; // 200
// float const farAwayRange; // 213
// float const longTime; // 231
// bool repath; // 241
// float const nearLeaderRange; // 244
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 177
// IsNotMoving(const class CCSBot *const this); // 190
// Length(const class Vector2D *const this); // 194
// operator-(const Vector *const this,
// const Vector &v); // 214
// IsLengthGreaterThan(const Vector *const this,
// float length); // 214
// GetElapsedTime(const class IntervalTimer *const this); // 245
// operator-(const Vector *const this,
// const Vector &v); // 251
// IsLengthLessThan(const Vector *const this,
// float length); // 251
// {
// float const hideRange; // 253
// }
// IsElapsed(const class CountdownTimer *const this); // 263
// DestroyPath(CCSBot *const this); // 280
// IsElapsed(const class CountdownTimer *const this); // 284
// {
// float const runSpeed; // 291
// float const collectRange; // 293
// class FollowTargetCollector collector; // 294
// FollowTargetCollector(FollowTargetCollector *const this,
// class CBasePlayer *player); // 294
// SearchSurroundingAreas<FollowTargetCollector>(CNavArea *startArea,
// const Vector *startPos,
// class FollowTargetCollector &func,
// float maxRange); // 295
// {
// int i; // 299
// }
// {
// class CNavArea *target; // 306
// Vector targetPos; // 307
// IsElapsed(const class CountdownTimer *const this); // 310
// {
// class CNavArea *area; // 321
// float closeRangeSq; // 322
// Vector close; // 323
// {
// int a; // 325
// {
// float rangeSq;// 331
// operator-(const Vector *const this,
// const Vector &v); // 331
// LengthSquared(const Vector *const this); // 331
// }
// }
// }
// Start(CountdownTimer *const this,
// float duration); // 345
// Reset(CountdownTimer *const this); // 347
// }
// }
// Start(CountdownTimer *const this,
// float duration); // 191
// }
// if we lost our leader, give up
if (m_leader == NULL || !m_leader->IsAlive())
{
me->Idle();
return;
}
// if we are carrying the bomb and at a bombsite, plant
if (me->IsCarryingBomb() && me->IsAtBombsite())
{
// plant it
me->SetTask(CCSBot::PLANT_BOMB);
me->PlantBomb();
// radio to the team
me->GetChatter()->PlantingTheBomb(me->GetPlace());
return;
}
// look around
me->UpdateLookAround();
// if we are moving, we are not idle
if (me->IsNotMoving() == false)
m_idleTimer.Start(RANDOM_FLOAT(2.0f, 5.0f));
// compute the leader's speed
float leaderSpeed = Vector2D(m_leader->pev->velocity.x, m_leader->pev->velocity.y).Length();
// determine our leader's movement state
ComputeLeaderMotionState(leaderSpeed);
// track whether we can see the leader
bool isLeaderVisible;
if (me->IsVisible(&m_leader->pev->origin))
{
m_lastSawLeaderTime = gpGlobals->time;
isLeaderVisible = true;
}
else
{
isLeaderVisible = false;
}
// determine whether we should sneak or not
const float farAwayRange = 750.0f;
if ((m_leader->pev->origin - me->pev->origin).IsLengthGreaterThan(farAwayRange))
{
// far away from leader - run to catch up
m_isSneaking = false;
}
else if (isLeaderVisible)
{
// if we see leader walking and we are nearby, walk
if (m_leaderMotionState == WALKING)
m_isSneaking = true;
// if we are sneaking and our leader starts running, stop sneaking
if (m_isSneaking && m_leaderMotionState == RUNNING)
m_isSneaking = false;
}
// if we haven't seen the leader for a long time, run
const float longTime = 20.0f;
if (gpGlobals->time - m_lastSawLeaderTime > longTime)
m_isSneaking = false;
if (m_isSneaking)
me->Walk();
else
me->Run();
bool repath = false;
// if the leader has stopped, hide nearby
const float nearLeaderRange = 250.0f;
if (!me->HasPath() && m_leaderMotionState == STOPPED && m_leaderMotionStateTime.GetElapsedTime() > m_waitTime)
{
// throttle how often this check occurs
m_waitTime += RANDOM_FLOAT(1.0f, 3.0f);
// the leader has stopped - if we are close to him, take up a hiding spot
if ((m_leader->pev->origin - me->pev->origin).IsLengthLessThan(nearLeaderRange))
{
const float hideRange = 250.0f;
if (me->TryToHide(NULL, -1.0f, hideRange, false, USE_NEAREST))
{
me->ResetStuckMonitor();
return;
}
}
}
// if we have been idle for awhile, move
if (m_idleTimer.IsElapsed())
{
repath = true;
// always walk when we move such a short distance
m_isSneaking = true;
}
// if our leader has moved, repath (don't repath if leading is stopping)
if (leaderSpeed > 100.0f && m_leaderMotionState != STOPPED)
{
repath = true;
}
// move along our path
if (me->UpdatePathMovement(NO_SPEED_CHANGE) != CCSBot::PROGRESSING)
{
me->DestroyPath();
}
// recompute our path if necessary
if (repath && m_repathInterval.IsElapsed())
{
// recompute our path to keep us near our leader
m_lastLeaderPos = m_leader->pev->origin;
me->ResetStuckMonitor();
const float runSpeed = 200.0f;
const float collectRange = (leaderSpeed > runSpeed) ? 600.0f : 400.0f;
FollowTargetCollector collector(m_leader);
SearchSurroundingAreas(TheNavAreaGrid.GetNearestNavArea(&m_lastLeaderPos), &m_lastLeaderPos, collector, collectRange);
if (cv_bot_debug.value > 0.0f)
{
for (int i = 0; i < collector.m_targetAreaCount; ++i)
collector.m_targetArea[i]->Draw(255, 0, 0, 2);
}
// move to one of the collected areas
if (collector.m_targetAreaCount)
{
CNavArea *target = NULL;
Vector targetPos;
// if we are idle, pick a random area
if (m_idleTimer.IsElapsed())
{
target = collector.m_targetArea[ RANDOM_LONG(0, collector.m_targetAreaCount - 1) ];
targetPos = *target->GetCenter();
me->PrintIfWatched("%4.1f: Bored. Repathing to a new nearby area\n", gpGlobals->time);
}
else
{
me->PrintIfWatched("%4.1f: Repathing to stay with leader.\n", gpGlobals->time);
// find closest area to where we are
CNavArea *area;
float closeRangeSq = 9999999999.9f;
Vector close;
for (int a = 0; a < collector.m_targetAreaCount; ++a)
{
area = collector.m_targetArea[a];
area->GetClosestPointOnArea(&me->pev->origin, &close);
float_precision rangeSq = (me->pev->origin - close).LengthSquared();
if (rangeSq < closeRangeSq)
{
target = area;
targetPos = close;
closeRangeSq = rangeSq;
}
}
}
if (me->ComputePath(target, NULL, FASTEST_ROUTE) == NULL)
me->PrintIfWatched("Pathfind to leader failed.\n");
// throttle how often we repath
m_repathInterval.Start(0.5f);
m_idleTimer.Reset();
}
}
}
/* <569231> ../cstrike/dlls/bot/states/cs_bot_follow.cpp:353 */
NOBODY void FollowState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void FollowState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
;
}
#ifdef HOOK_GAMEDLL

View File

@ -1,122 +1,439 @@
#include "precompiled.h"
// Begin moving to a nearby hidey-hole.
// NOTE: Do not forget this state may include a very long "move-to" time to get to our hidey spot!
/* <57c261> ../cstrike/dlls/bot/states/cs_bot_hide.cpp:22 */
NOBODY void HideState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void HideState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// GetFollowLeader(CCSBot *const this); // 50
m_isAtSpot = false;
// if duration is "infinite", set it to a reasonably long time to prevent infinite camping
if (m_duration < 0.0f)
{
m_duration = RANDOM_FLOAT(30.0f, 60.0f);
}
// decide whether to "ambush" or not - never set to false so as not to override external setting
if (RANDOM_FLOAT(0.0f, 100.0f) < 50.0f)
{
m_isHoldingPosition = true;
}
// if we are holding position, decide for how long
if (m_isHoldingPosition)
{
m_holdPositionTime = RANDOM_FLOAT(3.0f, 10.0f);
}
else
{
m_holdPositionTime = 0.0f;
}
m_heardEnemy = false;
m_firstHeardEnemyTime = 0.0f;
m_retry = 0;
if (me->IsFollowing())
{
m_leaderAnchorPos = me->GetFollowLeader()->pev->origin;
}
}
// Move to a nearby hidey-hole.
// NOTE: Do not forget this state may include a very long "move-to" time to get to our hidey spot!
/* <57c35e> ../cstrike/dlls/bot/states/cs_bot_hide.cpp:59 */
NOBODY void HideState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void HideState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 61
// IsActiveWeaponReloading(const class CBot *const this); // 64
// {
// bool isSettledInSniper; // 241
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 94
// {
// const class Zone *zone; // 78
// {
// class CNavArea *area; // 81
// }
// }
// {
// class CBasePlayer *leader; // 109
// float runThreshold; // 111
// float const followRange; // 120
// GetFollowLeader(CCSBot *const this); // 109
// IsLengthGreaterThan(const Vector *const this,
// float length); // 112
// operator-(const Vector *const this,
// const Vector &v); // 121
// IsLengthGreaterThan(const Vector *const this,
// float length); // 121
// }
// {
// Vector toDefuser; // 184
// float const hearDefuseRange; // 186
// operator-(const Vector *const this,
// const Vector &v); // 184
// IsLengthLessThan(const Vector *const this,
// float length); // 187
// }
// GetLooseBomb(CCSBotManager *const this); // 157
// {
// class CBaseEntity *hostage; // 222
// {
// class CNavArea *area; // 226
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 229
// }
// }
// IsActiveWeaponReloading(const class CBot *const this); // 245
// }
// {
// float range; // 343
// class CBasePlayer *camper; // 344
// float const closeRange; // 346
// Vector toSpot; // 367
// float dist; // 371
// float const crouchDist; // 373
// float const atDist; // 377
// {
// const Vector *pos; // 422
// GetFeetZ(const class CCSBot *const this); // 431
// }
// {
// int const maxRetries; // 352
// }
// GetFeetZ(const class CCSBot *const this); // 370
// Length(const Vector *const this); // 371
// {
// TraceResult result; // 397
// float outAngle; // 398
// float outAngleRange; // 399
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 394
// {
// float angle; // 400
// GetEyePosition(const class CCSBot *const this); // 402
// operator*(float fl,
// const Vector &v); // 402
// operator+(const Vector *const this,
// const Vector &v); // 402
// GetEyePosition(const class CCSBot *const this); // 402
// }
// SetLookAheadAngle(CCSBot *const this,
// float angle); // 411
// }
// }
// {
// float const hurtRecentlyTime; // 294
// GetNearbyEnemyCount(const class CCSBot *const this); // 310
// {
// float const someTime; // 312
// float const littleTime; // 313
// }
// GetNearbyEnemyCount(const class CCSBot *const this); // 326
// {
// class CHostage *hostage; // 328
// }
// GetTimeSinceAttacked(const class CCSBot *const this); // 295
// IsProtectedByShield(CBasePlayer *const this); // 290
// }
// }
CCSBotManager *ctrl = TheCSBots();
// wait until finished reloading to leave hide state
if (!me->IsActiveWeaponReloading())
{
if (gpGlobals->time - me->GetStateTimestamp() > m_duration)
{
if (me->GetTask() == CCSBot::GUARD_LOOSE_BOMB)
{
// if we're guarding the loose bomb, continue to guard it but pick a new spot
me->Hide(ctrl->GetLooseBombArea());
return;
}
else if (me->GetTask() == CCSBot::GUARD_BOMB_ZONE)
{
// if we're guarding a bombsite, continue to guard it but pick a new spot
const CCSBotManager::Zone *zone = ctrl->GetClosestZone(&me->pev->origin);
if (zone != NULL)
{
CNavArea *area = ctrl->GetRandomAreaInZone(zone);
if (area != NULL)
{
me->Hide(area);
return;
}
}
}
else if (me->GetTask() == CCSBot::GUARD_HOSTAGE_RESCUE_ZONE)
{
// if we're guarding a rescue zone, continue to guard this or another rescue zone
if (me->GuardRandomZone())
{
me->SetTask(CCSBot::GUARD_HOSTAGE_RESCUE_ZONE);
me->PrintIfWatched("Continuing to guard hostage rescue zones\n");
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->GetChatter()->GuardingHostageEscapeZone(IS_PLAN);
return;
}
}
me->Idle();
return;
}
// if we are momentarily hiding while following someone, check to see if he has moved on
if (me->IsFollowing())
{
CBasePlayer *leader = me->GetFollowLeader();
// BOTPORT: Determine walk/run velocity thresholds
float runThreshold = 200.0f;
if (leader->pev->velocity.IsLengthGreaterThan(runThreshold))
{
// leader is running, stay with him
me->Follow(leader);
return;
}
// if leader has moved, stay with him
const float followRange = 250.0f;
if ((m_leaderAnchorPos - leader->pev->origin).IsLengthGreaterThan(followRange))
{
me->Follow(leader);
return;
}
}
// if we see a nearby buddy in combat, join him
// TODO: Perhaps tie in to TakeDamage(), so it works for human players, too
// Scenario logic
switch (ctrl->GetScenario())
{
case CCSBotManager::SCENARIO_DEFUSE_BOMB:
{
if (me->m_iTeam == CT)
{
// if we are just holding position (due to a radio order) and the bomb has just planted, go defuse it
if (me->GetTask() == CCSBot::HOLD_POSITION &&
ctrl->IsBombPlanted() &&
ctrl->GetBombPlantTimestamp() > me->GetStateTimestamp())
{
me->Idle();
return;
}
// if we are guarding the defuser and he dies/gives up, stop hiding (to choose another defuser)
if (me->GetTask() == CCSBot::GUARD_BOMB_DEFUSER && ctrl->GetBombDefuser() == NULL)
{
me->Idle();
return;
}
// if we are guarding the loose bomb and it is picked up, stop hiding
if (me->GetTask() == CCSBot::GUARD_LOOSE_BOMB && ctrl->GetLooseBomb() == NULL)
{
me->GetChatter()->TheyPickedUpTheBomb();
me->Idle();
return;
}
// if we are guarding a bombsite and the bomb is dropped and we hear about it, stop guarding
if (me->GetTask() == CCSBot::GUARD_BOMB_ZONE && me->GetGameState()->IsLooseBombLocationKnown())
{
me->Idle();
return;
}
// if we are guarding (bombsite, initial encounter, etc) and the bomb is planted, go defuse it
if (me->IsDoingScenario() && me->GetTask() == CCSBot::GUARD_BOMB_ZONE && ctrl->IsBombPlanted())
{
me->Idle();
return;
}
}
// TERRORIST
else
{
// if we are near the ticking bomb and someone starts defusing it, attack!
if (ctrl->GetBombDefuser())
{
Vector toDefuser = ctrl->GetBombDefuser()->pev->origin;
const float hearDefuseRange = 2000.0f;
if ((toDefuser - me->pev->origin).IsLengthLessThan(hearDefuseRange))
{
// if we are nearby, attack, otherwise move to the bomb (which will cause us to attack when we see defuser)
if (me->CanSeePlantedBomb())
{
me->Attack(ctrl->GetBombDefuser());
}
else
{
me->MoveTo(&toDefuser, FASTEST_ROUTE);
me->InhibitLookAround(10.0f);
}
return;
}
}
}
break;
}
case CCSBotManager::SCENARIO_RESCUE_HOSTAGES:
{
// if we're guarding the hostages and they all die or are taken, do something else
if (me->GetTask() == CCSBot::GUARD_HOSTAGES)
{
if (me->GetGameState()->AreAllHostagesBeingRescued() || me->GetGameState()->AreAllHostagesGone())
{
me->Idle();
return;
}
}
else if (me->GetTask() == CCSBot::GUARD_HOSTAGE_RESCUE_ZONE)
{
// if we stumble across a hostage, guard it
CHostage *hostage = me->GetGameState()->GetNearestVisibleFreeHostage();
if (hostage != NULL)
{
// we see a free hostage, guard it
CNavArea *area = TheNavAreaGrid.GetNearestNavArea(&hostage->pev->origin);
if (area != NULL)
{
me->SetTask(CCSBot::GUARD_HOSTAGES);
me->Hide(area);
me->PrintIfWatched("I'm guarding hostages I found\n");
// don't chatter here - he'll tell us when he's in his hiding spot
return;
}
}
}
}
}
bool isSettledInSniper = (me->IsSniper() && m_isAtSpot) ? true : false;
// only investigate noises if we are initiating attacks, and we aren't a "settled in" sniper
// dont investigate noises if we are reloading
if (!me->IsActiveWeaponReloading() &&
!isSettledInSniper &&
me->GetDisposition() == CCSBot::ENGAGE_AND_INVESTIGATE)
{
// if we are holding position, and have heard the enemy nearby, investigate after our hold time is up
if (m_isHoldingPosition && m_heardEnemy && (gpGlobals->time - m_firstHeardEnemyTime > m_holdPositionTime))
{
// TODO: We might need to remember specific location of last enemy noise here
me->InvestigateNoise();
return;
}
// investigate nearby enemy noises
if (me->ShouldInvestigateNoise())
{
// if we are holding position, check if enough time has elapsed since we first heard the enemy
if (m_isAtSpot && m_isHoldingPosition)
{
if (!m_heardEnemy)
{
// first time we heard the enemy
m_heardEnemy = true;
m_firstHeardEnemyTime = gpGlobals->time;
me->PrintIfWatched("Heard enemy, holding position for %f2.1 seconds...\n", m_holdPositionTime);
}
}
else
{
// not holding position - investigate enemy noise
me->InvestigateNoise();
return;
}
}
}
}
// look around
me->UpdateLookAround();
// if we are at our hiding spot, crouch and wait
if (m_isAtSpot)
{
me->Crouch();
// if we have a shield, hide behind it
if (me->HasShield() && !me->IsProtectedByShield())
me->SecondaryAttack();
// while sitting at our hiding spot, if we are being attacked but can't see our attacker, move somewhere else
const float hurtRecentlyTime = 1.0f;
if (!me->IsEnemyVisible() && me->GetTimeSinceAttacked() < hurtRecentlyTime)
{
me->Idle();
return;
}
// encourage the human player
if (!me->IsDoingScenario())
{
if (me->m_iTeam == CT)
{
if (me->GetTask() == CCSBot::GUARD_BOMB_ZONE && me->IsAtHidingSpot() && ctrl->IsBombPlanted())
{
if (me->GetNearbyEnemyCount() == 0)
{
const float someTime = 30.0f;
const float littleTime = 11.0;
if (ctrl->GetBombTimeLeft() > someTime)
me->GetChatter()->Encourage("BombsiteSecure", RANDOM_FLOAT(10.0f, 15.0f));
else if (ctrl->GetBombTimeLeft() > littleTime)
me->GetChatter()->Encourage("WaitingForHumanToDefuseBomb", RANDOM_FLOAT(5.0f, 8.0f));
else
me->GetChatter()->Encourage("WaitingForHumanToDefuseBombPanic", RANDOM_FLOAT(3.0f, 4.0f));
}
}
if (me->GetTask() == CCSBot::GUARD_HOSTAGES && me->IsAtHidingSpot())
{
if (me->GetNearbyEnemyCount() == 0)
{
CHostage *hostage = me->GetGameState()->GetNearestVisibleFreeHostage();
if (hostage != NULL)
{
me->GetChatter()->Encourage("WaitingForHumanToRescueHostages", RANDOM_FLOAT(10.0f, 15.0f));
}
}
}
}
}
}
else
{
// if a Player is using this hiding spot, give up
float range;
CBasePlayer *camper = UTIL_GetClosestPlayer(&m_hidingSpot, &range);
const float closeRange = 75.0f;
if (camper != NULL && camper != me && range < closeRange && me->IsVisible(camper, CHECK_FOV))
{
// player is in our hiding spot
me->PrintIfWatched("Someone's in my hiding spot - picking another...\n");
const int maxRetries = 3;
if (m_retry++ >= maxRetries)
{
me->PrintIfWatched("Can't find a free hiding spot, giving up.\n");
me->Idle();
return;
}
// pick another hiding spot near where we were planning on hiding
me->Hide(TheNavAreaGrid.GetNavArea(&m_hidingSpot));
return;
}
Vector toSpot;
toSpot.x = m_hidingSpot.x - me->pev->origin.x;
toSpot.y = m_hidingSpot.y - me->pev->origin.y;
toSpot.z = m_hidingSpot.z - me->GetFeetZ(); // use feet location
float dist = toSpot.Length();
const float crouchDist = 200.0f;
if (dist < crouchDist)
me->Crouch();
const float atDist = 20.0f;
if (dist < atDist)
{
m_isAtSpot = true;
// make sure our approach points are valid, since we'll be watching them
me->ComputeApproachPoints();
// ready our weapon and prepare to attack
me->EquipBestWeapon(MUST_EQUIP);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
// if we are a sniper, update our task
if (me->GetTask() == CCSBot::MOVE_TO_SNIPER_SPOT)
{
me->SetTask(CCSBot::SNIPING);
}
// determine which way to look
TraceResult result;
float outAngle = 0.0f;
float outAngleRange = 0.0f;
for (float angle = 0.0f; angle < 360.0f; angle += 45.0f)
{
UTIL_TraceLine(me->GetEyePosition(), me->GetEyePosition() + 1000.0f * Vector(BotCOS(angle), BotSIN(angle), 0.0f), ignore_monsters, ignore_glass, ENT(me->pev), &result);
if (result.flFraction > outAngleRange)
{
outAngle = angle;
outAngleRange = result.flFraction;
}
}
me->SetLookAheadAngle(outAngle);
}
// move to hiding spot
if (me->UpdatePathMovement() != CCSBot::PROGRESSING && !m_isAtSpot)
{
// we couldn't get to our hiding spot - pick another
me->PrintIfWatched("Can't get to my hiding spot - finding another...\n");
// search from hiding spot, since we know it was valid
const Vector *pos = FindNearbyHidingSpot(me, &m_hidingSpot, m_searchFromArea, m_range, me->IsSniper());
if (pos == NULL)
{
// no available hiding spots
me->PrintIfWatched("No available hiding spots - hiding where I'm at.\n");
// hide where we are
m_hidingSpot.x = me->pev->origin.x;
m_hidingSpot.x = me->pev->origin.y;
m_hidingSpot.z = me->GetFeetZ();
}
else
{
m_hidingSpot = *pos;
}
// build a path to our new hiding spot
if (me->ComputePath(TheNavAreaGrid.GetNavArea(&m_hidingSpot), &m_hidingSpot, FASTEST_ROUTE) == false)
{
me->PrintIfWatched("Can't pathfind to hiding spot\n");
me->Idle();
return;
}
}
}
}
/* <57c2c8> ../cstrike/dlls/bot/states/cs_bot_hide.cpp:450 */
NOBODY void HideState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void HideState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
// ClearLookAt(CCSBot *const this); // 456
// ClearApproachPoints(CCSBot *const this); // 457
// IsProtectedByShield(CBasePlayer *const this); // 460
// OnExit(HideState *const this,
// class CCSBot *me); // 450
m_isHoldingPosition = false;
me->StandUp();
me->ResetStuckMonitor();
me->ClearLookAt();
me->ClearApproachPoints();
// if we have a shield, put it away
if (me->HasShield() && me->IsProtectedByShield())
me->SecondaryAttack();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,65 +1,204 @@
#include "precompiled.h"
// Begin the hunt
/* <58e6e0> ../cstrike/dlls/bot/states/cs_bot_hunt.cpp:18 */
NOBODY void HuntState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void HuntState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 29
// DestroyPath(CCSBot *const this); // 31
// lurking death
if (me->IsUsingKnife() && me->IsWellPastSafe() && !me->IsHurrying())
me->Walk();
else
me->Run();
me->StandUp();
me->SetDisposition(CCSBot::ENGAGE_AND_INVESTIGATE);
me->SetTask(CCSBot::SEEK_AND_DESTROY);
me->DestroyPath();
}
// Hunt down our enemies
/* <58e452> ../cstrike/dlls/bot/states/cs_bot_hunt.cpp:38 */
NOBODY void HuntState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void HuntState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 40
// float const huntingTooLongTime; // 44
// {
// class CHostage *hostage; // 129
// {
// class CNavArea *area; // 132
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 136
// }
// }
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 118
// {
// float const safeTime; // 62
// }
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 82
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 92
// {
// float oldest; // 163
// int areaCount; // 165
// float const minSize; // 166
// iterator iter; // 167
// int which; // 189
// {
// class CNavArea *area; // 170
// const class Extent *extent; // 175
// float age; // 180
// GetClearedTimestamp(CNavArea *const this,
// int teamID); // 180
// }
// operator++(_List_iterator<CNavArea*> *const this); // 168
// operator++(_List_iterator<CNavArea*> *const this); // 192
// }
// SetRogue(CCSBot *const this,
// bool rogue); // 49
// }
// if we've been hunting for a long time, drop into Idle for a moment to
// select something else to do
const float huntingTooLongTime = 30.0f;
if (gpGlobals->time - me->GetStateTimestamp() > huntingTooLongTime)
{
// stop being a rogue and do the scenario, since there must not be many enemies left to hunt
me->PrintIfWatched("Giving up hunting, and being a rogue\n");
me->SetRogue(false);
me->Idle();
return;
}
CCSBotManager *ctrl = TheCSBots();
// scenario logic
if (ctrl->GetScenario() == CCSBotManager::SCENARIO_DEFUSE_BOMB)
{
if (me->m_iTeam == TERRORIST)
{
// if we have the bomb and it's time to plant, or we happen to be in a bombsite and it seems safe, do it
if (me->IsCarryingBomb())
{
const float safeTime = 3.0f;
if (ctrl->IsTimeToPlantBomb() || (me->IsAtBombsite() && gpGlobals->time - me->GetLastSawEnemyTimestamp() > safeTime))
{
me->Idle();
return;
}
}
// if we notice the bomb lying on the ground, go get it
if (me->NoticeLooseBomb())
{
me->FetchBomb();
return;
}
// if bomb has been planted, and we hear it, move to a hiding spot near the bomb and watch it
const Vector *bombPos = me->GetGameState()->GetBombPosition();
if (!me->IsRogue() && me->GetGameState()->IsBombPlanted() && bombPos != NULL)
{
me->SetTask(CCSBot::GUARD_TICKING_BOMB);
me->Hide(TheNavAreaGrid.GetNavArea(bombPos));
return;
}
}
// CT
else
{
if (!me->IsRogue() && me->CanSeeLooseBomb())
{
// if we are near the loose bomb and can see it, hide nearby and guard it
me->SetTask(CCSBot::GUARD_LOOSE_BOMB);
me->Hide(ctrl->GetLooseBombArea());
me->GetChatter()->AnnouncePlan("GoingToGuardLooseBomb", ctrl->GetLooseBombArea()->GetPlace());
return;
}
else if (ctrl->IsBombPlanted())
{
// rogues will defuse a bomb, but not guard the defuser
if (!me->IsRogue() || !ctrl->GetBombDefuser())
{
// search for the planted bomb to defuse
me->Idle();
return;
}
}
}
}
else if (ctrl->GetScenario() == CCSBotManager::SCENARIO_RESCUE_HOSTAGES)
{
if (me->m_iTeam == TERRORIST)
{
if (me->GetGameState()->AreAllHostagesBeingRescued())
{
// all hostages are being rescued, head them off at the escape zones
if (me->GuardRandomZone())
{
me->SetTask(CCSBot::GUARD_HOSTAGE_RESCUE_ZONE);
me->PrintIfWatched("Trying to beat them to an escape zone!\n");
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->GetChatter()->GuardingHostageEscapeZone(IS_PLAN);
return;
}
}
// if safe time is up, and we stumble across a hostage, guard it
if (!me->IsRogue() && !me->IsSafe())
{
CHostage *hostage = me->GetGameState()->GetNearestVisibleFreeHostage();
if (hostage != NULL)
{
CNavArea *area = TheNavAreaGrid.GetNearestNavArea(&hostage->pev->origin);
if (area != NULL)
{
// we see a free hostage, guard it
me->SetTask(CCSBot::GUARD_HOSTAGES);
me->Hide(area);
me->PrintIfWatched("I'm guarding hostages\n");
me->GetChatter()->GuardingHostages(area->GetPlace(), IS_PLAN);
return;
}
}
}
}
}
// listen for enemy noises
if (me->ShouldInvestigateNoise())
{
me->InvestigateNoise();
return;
}
// look around
me->UpdateLookAround();
// if we have reached our destination area, pick a new one
// if our path fails, pick a new one
if (me->GetLastKnownArea() == m_huntArea || me->UpdatePathMovement() != CCSBot::PROGRESSING)
{
m_huntArea = NULL;
float oldest = 0.0f;
int areaCount = 0;
const float minSize = 150.0f;
NavAreaList::iterator iter;
for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter)
{
CNavArea *area = (*iter);
++areaCount;
// skip the small areas
const Extent *extent = area->GetExtent();
if (extent->hi.x - extent->lo.x < minSize || extent->hi.y - extent->lo.y < minSize)
continue;
// keep track of the least recently cleared area
float_precision age = gpGlobals->time - area->GetClearedTimestamp(me->m_iTeam - 1);
if (age > oldest)
{
oldest = age;
m_huntArea = area;
}
}
// if all the areas were too small, pick one at random
int which = RANDOM_LONG(0, areaCount - 1);
areaCount = 0;
for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter)
{
m_huntArea = (*iter);
if (which == areaCount)
break;
--which;
}
if (m_huntArea != NULL)
{
// create a new path to a far away area of the map
me->ComputePath(m_huntArea, NULL, SAFEST_ROUTE);
}
}
}
// Done hunting
/* <58e418> ../cstrike/dlls/bot/states/cs_bot_hunt.cpp:211 */
NOBODY void HuntState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void HuntState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
;
}
#ifdef HOOK_GAMEDLL

View File

@ -1,158 +1,758 @@
#include "precompiled.h"
// range for snipers to select a hiding spot
const float sniperHideRange = 2000.0f;
// The Idle state.
// We never stay in the Idle state - it is a "home base" for the state machine that
// does various checks to determine what we should do next.
/* <5a12ee> ../cstrike/dlls/bot/states/cs_bot_idle.cpp:26 */
NOBODY void IdleState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void IdleState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// DestroyPath(CCSBot *const this); // 28
// SetTask(CCSBot *const this,
// enum TaskType task,
// class CBaseEntity *entity); // 38
me->DestroyPath();
me->SetEnemy(NULL);
// lurking death
if (me->IsUsingKnife() && me->IsWellPastSafe() && !me->IsHurrying())
me->Walk();
// Since Idle assigns tasks, we assume that coming back to Idle means our task is complete
me->SetTask(CCSBot::SEEK_AND_DESTROY);
me->SetDisposition(CCSBot::ENGAGE_AND_INVESTIGATE);
}
/* <5a0c66> ../cstrike/dlls/bot/states/cs_bot_idle.cpp:46 */
NOBODY void IdleState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void IdleState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 59
// float const defenseSniperCampChance; // 95
// float const offenseSniperCampChance; // 96
// {
// const class Zone *zone; // 81
// }
// {
// const class Zone *zone; // 121
// {
// Place place; // 126
// {
// const Vector *spot; // 130
// }
// }
// }
// {
// int zoneIndex; // 149
// const Vector *pos; // 152
// }
// {
// const class Zone *zone; // 178
// {
// const Vector *pos; // 182
// }
// }
// {
// const Vector *bombPos; // 228
// {
// const class Zone *zone; // 261
// }
// {
// const class Zone *zone; // 286
// float travelDistance; // 287
// {
// int z; // 289
// {
// class ShortestPathCost pathCost; // 299
// float dist; // 300
// }
// }
// {
// float const farAwayRange; // 314
// }
// {
// int zoneIndex; // 324
// }
// {
// const Vector *pos; // 331
// }
// }
// }
// {
// class CNavArea *snipingArea; // 368
// {
// const class Zone *zone; // 379
// }
// }
// {
// float guardBombsiteChance; // 410
// {
// class CNavArea *area; // 414
// float guardRange; // 415
// const class Zone *zone; // 418
// {
// class CNavArea *area; // 421
// }
// }
// }
// {
// float guardEscapeZoneChance; // 472
// {
// const class Zone *zone; // 450
// {
// class CNavArea *area; // 453
// }
// }
// {
// const class Zone *zone; // 477
// {
// class CNavArea *area; // 480
// {
// float escapeGuardRange; // 487
// }
// }
// }
// }
// {
// float const earlyTime; // 501
// const class Zone *zone; // 502
// {
// const Vector *pos; // 518
// {
// float const repeatTime; // 527
// }
// }
// }
// {
// bool campHostages; // 556
// float const huntChance; // 625
// const Vector *hostagePos; // 639
// {
// float const campZoneChance; // 570
// }
// {
// const Vector *hostagePos; // 581
// }
// {
// class CBaseEntity *hostage; // 607
// {
// class CNavArea *area; // 611
// }
// }
// {
// class CNavArea *area; // 642
// {
// float hostageGuardRange; // 649
// }
// }
// }
// {
// class CHostage *hostage; // 699
// bool fetchHostages; // 721
// bool rescueHostages; // 722
// const class Zone *zone; // 723
// {
// float const huntChance; // 689
// }
// {
// class CNavArea *area; // 706
// }
// {
// class PathCost pathCost; // 736
// float toZone; // 737
// float toHostage; // 738
// }
// {
// enum RouteType route; // 772
// }
// }
// }
// all other states assume GetLastKnownArea() is valid, ensure that it is
if (me->GetLastKnownArea() == NULL && me->StayOnNavMesh() == false)
return;
// zombies never leave the Idle state
if (cv_bot_zombie.value > 0.0f)
{
me->ResetStuckMonitor();
return;
}
// if we are in the early "safe" time, grab a knife or grenade
if (me->IsSafe())
{
// if we have a grenade, use it
if (!me->EquipGrenade())
{
// high-skill bots run with the knife
if (me->GetProfile()->GetSkill() > 0.33f)
{
me->EquipKnife();
}
}
}
CCSBotManager *ctrl = TheCSBots();
// if round is over, hunt
if (me->GetGameState()->IsRoundOver())
{
// if we are escorting hostages, try to get to the rescue zone
if (me->GetHostageEscortCount())
{
const CCSBotManager::Zone *zone = ctrl->GetClosestZone(me->GetLastKnownArea(), PathCost(me, FASTEST_ROUTE));
me->SetTask(CCSBot::RESCUE_HOSTAGES);
me->Run();
me->SetDisposition(CCSBot::SELF_DEFENSE);
me->MoveTo(ctrl->GetRandomPositionInZone(zone), FASTEST_ROUTE);
me->PrintIfWatched("Trying to rescue hostages at the end of the round\n");
return;
}
me->Hunt();
return;
}
const float defenseSniperCampChance = 75.0f;
const float offenseSniperCampChance = 10.0f;
// if we were following someone, continue following them
if (me->IsFollowing())
{
me->ContinueFollowing();
return;
}
// Scenario logic
switch (ctrl->GetScenario())
{
case CCSBotManager::SCENARIO_DEFUSE_BOMB:
{
static int inumpo = 0;
inumpo++;
// if this is a bomb game and we have the bomb, go plant it
if (me->m_iTeam == TERRORIST)
{
if (me->GetGameState()->IsBombPlanted())
{
if (me->GetGameState()->GetPlantedBombsite() != CSGameState::UNKNOWN)
{
// T's always know where the bomb is - go defend it
const CCSBotManager::Zone *zone = ctrl->GetZone(me->GetGameState()->GetPlantedBombsite());
me->SetTask(CCSBot::GUARD_TICKING_BOMB);
Place place = TheNavAreaGrid.GetPlace(&zone->m_center);
if (place != UNDEFINED_PLACE)
{
// pick a random hiding spot in this place
const Vector *spot = FindRandomHidingSpot(me, place, me->IsSniper());
if (spot != NULL)
{
me->Hide(spot);
return;
}
}
// hide nearby
me->Hide(TheNavAreaGrid.GetNearestNavArea(&zone->m_center));
return;
}
else
{
// ask our teammates where the bomb is
me->GetChatter()->RequestBombLocation();
// we dont know where the bomb is - we must search the bombsites
int zoneIndex = me->GetGameState()->GetNextBombsiteToSearch();
// move to bombsite - if we reach it, we'll update its cleared status, causing us to select another
const Vector *pos = ctrl->GetRandomPositionInZone(ctrl->GetZone(zoneIndex));
if (pos != NULL)
{
me->SetTask(CCSBot::FIND_TICKING_BOMB);
me->MoveTo(pos);
return;
}
}
}
else if (me->IsCarryingBomb())
{
// if we're at a bomb site, plant the bomb
if (me->IsAtBombsite())
{
// plant it
me->SetTask(CCSBot::PLANT_BOMB);
me->PlantBomb();
// radio to the team
me->GetChatter()->PlantingTheBomb(me->GetPlace());
return;
}
else if (ctrl->IsTimeToPlantBomb())
{
// move to the closest bomb site
const CCSBotManager::Zone *zone = ctrl->GetClosestZone(me->GetLastKnownArea(), PathCost(me));
if (zone != NULL)
{
// pick a random spot within the bomb zone
const Vector *pos = ctrl->GetRandomPositionInZone(zone);
if (pos != NULL)
{
// move to bombsite
me->SetTask(CCSBot::PLANT_BOMB);
me->Run();
me->MoveTo(pos);
return;
}
}
}
}
else
{
// small chance of sniper camping on offense, if we aren't carrying the bomb
if (me->GetFriendsRemaining() && me->IsSniper() && RANDOM_FLOAT(0, 100.0f) < offenseSniperCampChance)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(me->GetLastKnownArea(), RANDOM_FLOAT(10.0f, 30.0f), sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->PrintIfWatched("Sniping!\n");
return;
}
// if the bomb is loose (on the ground), go get it
if (me->NoticeLooseBomb())
{
me->FetchBomb();
return;
}
// if bomb has been planted, and we hear it, move to a hiding spot near the bomb and guard it
if (!me->IsRogue() && me->GetGameState()->IsBombPlanted() && me->GetGameState()->GetBombPosition() != NULL)
{
const Vector *bombPos = me->GetGameState()->GetBombPosition();
if (bombPos != NULL)
{
me->SetTask(CCSBot::GUARD_TICKING_BOMB);
me->Hide(TheNavAreaGrid.GetNavArea(bombPos));
return;
}
}
}
}
// CT
else
{
if (me->GetGameState()->IsBombPlanted())
{
// if the bomb has been planted, attempt to defuse it
const Vector *bombPos = me->GetGameState()->GetBombPosition();
if (bombPos != NULL)
{
// if someone is defusing the bomb, guard them
if (ctrl->GetBombDefuser())
{
if (!me->IsRogue())
{
me->SetTask(CCSBot::GUARD_BOMB_DEFUSER);
me->Hide(TheNavAreaGrid.GetNavArea(bombPos));
return;
}
}
else if (me->IsDoingScenario())
{
// move to the bomb and defuse it
me->SetTask(CCSBot::DEFUSE_BOMB);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->MoveTo(bombPos);
return;
}
else
{
// we're not allowed to defuse, guard the bomb zone
me->SetTask(CCSBot::GUARD_BOMB_ZONE);
me->Hide(TheNavAreaGrid.GetNavArea(bombPos));
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
else if (me->GetGameState()->GetPlantedBombsite() != CSGameState::UNKNOWN)
{
// we know which bombsite, but not exactly where the bomb is, go there
const CCSBotManager::Zone *zone = ctrl->GetZone(me->GetGameState()->GetPlantedBombsite());
if (zone != NULL)
{
if (me->IsDoingScenario())
{
me->SetTask(CCSBot::DEFUSE_BOMB);
me->MoveTo(&zone->m_center);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
else
{
// we're not allowed to defuse, guard the bomb zone
me->SetTask(CCSBot::GUARD_BOMB_ZONE);
me->Hide(TheNavAreaGrid.GetNavArea(&zone->m_center));
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
}
else
{
// we dont know where the bomb is - we must search the bombsites
// find closest un-cleared bombsite
const CCSBotManager::Zone *zone = NULL;
float travelDistance = 9999999.9f;
for (int z = 0; z < ctrl->GetZoneCount(); ++z)
{
if (ctrl->GetZone(z)->m_areaCount == 0)
continue;
// don't check bombsites that have been cleared
if (me->GetGameState()->IsBombsiteClear(z))
continue;
// just use the first overlapping nav area as a reasonable approximation
ShortestPathCost pathCost = ShortestPathCost();
float_precision dist = NavAreaTravelDistance(me->GetLastKnownArea(), TheNavAreaGrid.GetNearestNavArea(&ctrl->GetZone(z)->m_center), pathCost);
if (/*dist >= 0.0f && */dist < travelDistance)
{
zone = ctrl->GetZone(z);
travelDistance = dist;
}
}
if (zone != NULL)
{
const float farAwayRange = 2000.0f;
if (travelDistance > farAwayRange)
{
zone = NULL;
}
}
// if closest bombsite is "far away", pick one at random
if (zone == NULL)
{
int zoneIndex = me->GetGameState()->GetNextBombsiteToSearch();
zone = ctrl->GetZone(zoneIndex);
}
// move to bombsite - if we reach it, we'll update its cleared status, causing us to select another
if (zone != NULL)
{
const Vector *pos = ctrl->GetRandomPositionInZone(zone);
if (pos != NULL)
{
me->SetTask(CCSBot::FIND_TICKING_BOMB);
me->MoveTo(pos);
return;
}
}
}
assert((0, "A CT bot doesn't know what to do while the bomb is planted!\n"));
}
// if we have a sniper rifle, we like to camp, whether rogue or not
if (me->IsSniper())
{
if (RANDOM_FLOAT(0, 100) <= defenseSniperCampChance)
{
CNavArea *snipingArea = NULL;
// if the bomb is loose, snipe near it
if (me->GetGameState()->IsLooseBombLocationKnown())
{
snipingArea = TheNavAreaGrid.GetNearestNavArea(me->GetGameState()->GetBombPosition());
me->PrintIfWatched("Sniping near loose bomb\n");
}
else
{
// snipe bomb zone(s)
const CCSBotManager::Zone *zone = ctrl->GetRandomZone();
if (zone != NULL)
{
snipingArea = ctrl->GetRandomAreaInZone(zone);
me->PrintIfWatched("Sniping near bombsite\n");
}
}
if (snipingArea != NULL)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(snipingArea, -1.0f, sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
}
// rogues just hunt, unless they want to snipe
// if the whole team has decided to rush, hunt
// if we know the bomb is dropped, hunt for enemies and the loose bomb
if (me->IsRogue() || ctrl->IsDefenseRushing() || me->GetGameState()->IsLooseBombLocationKnown())
{
me->Hunt();
return;
}
// the lower our morale gets, the more we want to camp the bomb zone(s)
// only decide to camp at the start of the round, or if we haven't seen anything for a long time
if (me->IsSafe() || me->HasNotSeenEnemyForLongTime())
{
float guardBombsiteChance = -34.0f * me->GetMorale();
if (RANDOM_FLOAT(0.0f, 100.0f) < guardBombsiteChance)
{
float guardRange = 500.0f + 100.0f * (me->GetMorale() + 3);
// guard bomb zone(s)
const CCSBotManager::Zone *zone = ctrl->GetRandomZone();
if (zone != NULL)
{
CNavArea *area = ctrl->GetRandomAreaInZone(zone);
if (area != NULL)
{
me->PrintIfWatched("I'm guarding a bombsite\n");
me->GetChatter()->AnnouncePlan("GoingToDefendBombsite", area->GetPlace());
me->SetTask(CCSBot::GUARD_BOMB_ZONE);
me->Hide(area, -1.0, guardRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
}
}
}
break;
}
case CCSBotManager::SCENARIO_ESCORT_VIP:
{
if (me->m_iTeam == TERRORIST)
{
// if we have a sniper rifle, we like to camp, whether rogue or not
if (me->IsSniper())
{
if (RANDOM_FLOAT(0, 100) <= defenseSniperCampChance)
{
// snipe escape zone(s)
const CCSBotManager::Zone *zone = ctrl->GetRandomZone();
if (zone != NULL)
{
CNavArea *area = ctrl->GetRandomAreaInZone(zone);
if (area != NULL)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(area, -1.0, sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->PrintIfWatched("Sniping near escape zone\n");
return;
}
}
}
}
// rogues just hunt, unless they want to snipe
// if the whole team has decided to rush, hunt
if (me->IsRogue() || ctrl->IsDefenseRushing())
break;
// the lower our morale gets, the more we want to camp the escape zone(s)
float guardEscapeZoneChance = -34.0f * me->GetMorale();
if (RANDOM_FLOAT(0.0f, 100.0f) < guardEscapeZoneChance)
{
// guard escape zone(s)
const CCSBotManager::Zone *zone = ctrl->GetRandomZone();
if (zone != NULL)
{
CNavArea *area = ctrl->GetRandomAreaInZone(zone);
if (area != NULL)
{
// guard the escape zone - stay closer if our morale is low
me->SetTask(CCSBot::GUARD_VIP_ESCAPE_ZONE);
me->PrintIfWatched("I'm guarding an escape zone\n");
float escapeGuardRange = 750.0f + 250.0f * (me->GetMorale() + 3);
me->Hide(area, -1.0, escapeGuardRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
}
}
// CT
else
{
if (me->m_bIsVIP)
{
// if early in round, pick a random zone, otherwise pick closest zone
const float earlyTime = 20.0f;
const CCSBotManager::Zone *zone = NULL;
if (ctrl->GetElapsedRoundTime() < earlyTime)
{
// pick random zone
zone = ctrl->GetRandomZone();
}
else
{
// pick closest zone
zone = ctrl->GetClosestZone(me->GetLastKnownArea(), PathCost(me));
}
if (zone != NULL)
{
// pick a random spot within the escape zone
const Vector *pos = ctrl->GetRandomPositionInZone(zone);
if (pos != NULL)
{
// move to escape zone
me->SetTask(CCSBot::VIP_ESCAPE);
me->Run();
me->MoveTo(pos);
// tell team to follow
const float repeatTime = 30.0f;
if (me->GetFriendsRemaining() && ctrl->GetRadioMessageInterval(EVENT_RADIO_FOLLOW_ME, me->m_iTeam) > repeatTime)
me->SendRadioMessage(EVENT_RADIO_FOLLOW_ME);
return;
}
}
}
else
{
// small chance of sniper camping on offense, if we aren't VIP
if (me->GetFriendsRemaining() && me->IsSniper() && RANDOM_FLOAT(0, 100.0f) < offenseSniperCampChance)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(me->GetLastKnownArea(), RANDOM_FLOAT(10.0f, 30.0f), sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->PrintIfWatched("Sniping!\n");
return;
}
}
}
break;
}
case CCSBotManager::SCENARIO_RESCUE_HOSTAGES:
{
if (me->m_iTeam == TERRORIST)
{
bool campHostages;
// if we are in early game, camp the hostages
if (me->IsSafe())
{
campHostages = true;
}
else if (me->GetGameState()->HaveSomeHostagesBeenTaken() || me->GetGameState()->AreAllHostagesBeingRescued())
{
campHostages = false;
}
else
{
// later in the game, camp either hostages or escape zone
const float campZoneChance = 100.0f * (ctrl->GetElapsedRoundTime() - me->GetSafeTime()) / 120.0f;
campHostages = (RANDOM_FLOAT(0, 100) > campZoneChance) ? true : false;
}
// if we have a sniper rifle, we like to camp, whether rogue or not
if (me->IsSniper())
{
if (RANDOM_FLOAT(0, 100) <= defenseSniperCampChance)
{
const Vector *hostagePos = me->GetGameState()->GetRandomFreeHostagePosition();
if (hostagePos != NULL && campHostages)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->PrintIfWatched("Sniping near hostages\n");
me->Hide(TheNavAreaGrid.GetNearestNavArea(hostagePos), -1.0, sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
else
{
// camp the escape zone(s)
if (me->GuardRandomZone(sniperHideRange))
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->PrintIfWatched("Sniping near a rescue zone\n");
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
return;
}
}
}
}
// if safe time is up, and we stumble across a hostage, guard it
if (!me->IsSafe() && !me->IsRogue())
{
CBaseEntity *hostage = me->GetGameState()->GetNearestVisibleFreeHostage();
if (hostage != NULL)
{
// we see a free hostage, guard it
CNavArea *area = TheNavAreaGrid.GetNearestNavArea(&hostage->pev->origin);
if (area != NULL)
{
me->SetTask(CCSBot::GUARD_HOSTAGES);
me->Hide(area);
me->PrintIfWatched("I'm guarding hostages I found\n");
// don't chatter here - he'll tell us when he's in his hiding spot
return;
}
}
}
// decide if we want to hunt, or guard
const float huntChance = 70.0f + 25.0f * me->GetMorale();
// rogues just hunt, unless they want to snipe
// if the whole team has decided to rush, hunt
if (me->GetFriendsRemaining())
{
if (me->IsRogue() || ctrl->IsDefenseRushing() || RANDOM_FLOAT(0, 100) < huntChance)
{
me->Hunt();
return;
}
}
// decide whether to camp the hostages or the escape zones
const Vector *hostagePos = me->GetGameState()->GetRandomFreeHostagePosition();
if (hostagePos != NULL && campHostages)
{
CNavArea *area = TheNavAreaGrid.GetNearestNavArea(hostagePos);
if (area != NULL)
{
// guard the hostages - stay closer to hostages if our morale is low
me->SetTask(CCSBot::GUARD_HOSTAGES);
me->PrintIfWatched("I'm guarding hostages\n");
float hostageGuardRange = 750.0f + 250.0f * (me->GetMorale() + 3);
me->Hide(area, -1.0, hostageGuardRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
if (RANDOM_FLOAT(0, 100) < 50)
me->GetChatter()->GuardingHostages(area->GetPlace(), IS_PLAN);
return;
}
}
// guard rescue zone(s)
if (me->GuardRandomZone())
{
me->SetTask(CCSBot::GUARD_HOSTAGE_RESCUE_ZONE);
me->PrintIfWatched("I'm guarding a rescue zone\n");
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->GetChatter()->GuardingHostageEscapeZone(IS_PLAN);
return;
}
}
// CT
else
{
// only decide to do something else if we aren't already rescuing hostages
if (!me->GetHostageEscortCount())
{
// small chance of sniper camping on offense
if (me->GetFriendsRemaining() && me->IsSniper() && RANDOM_FLOAT(0, 100.0f) < offenseSniperCampChance)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(me->GetLastKnownArea(), RANDOM_FLOAT(10.0f, 30.0f), sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->PrintIfWatched("Sniping!\n");
return;
}
if (me->GetFriendsRemaining() && !me->GetHostageEscortCount())
{
// rogues just hunt, unless all friends are dead
// if we have friends left, we might go hunting instead of hostage rescuing
const float huntChance = 33.3f;
if (me->IsRogue() || RANDOM_FLOAT(0.0f, 100.0f) < huntChance)
{
me->Hunt();
return;
}
}
}
// look for free hostages - CT's have radar so they know where hostages are at all times
CHostage *hostage = me->GetGameState()->GetNearestFreeHostage();
// if we are not allowed to do the scenario, guard the hostages to clear the area for the human(s)
if (!me->IsDoingScenario())
{
if (hostage != NULL)
{
CNavArea *area = TheNavAreaGrid.GetNearestNavArea(&hostage->pev->origin);
if (area != NULL)
{
me->SetTask(CCSBot::GUARD_HOSTAGES);
me->Hide(area);
me->PrintIfWatched("I'm securing the hostages for a human to rescue\n");
return;
}
}
me->Hunt();
return;
}
bool fetchHostages = false;
bool rescueHostages = false;
const CCSBotManager::Zone *zone = NULL;
me->SetGoalEntity(NULL);
// if we are escorting hostages, determine where to take them
if (me->GetHostageEscortCount())
zone = ctrl->GetClosestZone(me->GetLastKnownArea(), PathCost(me, FASTEST_ROUTE));
// if we are escorting hostages and there are more hostages to rescue,
// determine whether it's faster to rescue the ones we have, or go get the remaining ones
if (hostage != NULL)
{
if (zone != NULL)
{
PathCost pathCost(me, FASTEST_ROUTE);
float toZone = NavAreaTravelDistance(me->GetLastKnownArea(), zone->m_area[0], pathCost);
float toHostage = NavAreaTravelDistance(me->GetLastKnownArea(), TheNavAreaGrid.GetNearestNavArea(&hostage->pev->origin), pathCost);
if (toHostage < 0.0f)
{
rescueHostages = true;
}
else
{
if (toZone < toHostage)
rescueHostages = true;
else
fetchHostages = true;
}
}
else
{
fetchHostages = true;
}
}
else if (zone != NULL)
{
rescueHostages = true;
}
if (fetchHostages)
{
// go get hostages
me->SetTask(CCSBot::COLLECT_HOSTAGES);
me->Run();
me->SetGoalEntity(hostage);
me->ResetWaitForHostagePatience();
// if we already have some hostages, move to the others by the quickest route
RouteType route = (me->GetHostageEscortCount()) ? FASTEST_ROUTE : SAFEST_ROUTE;
me->MoveTo(&hostage->pev->origin, route);
me->PrintIfWatched("I'm collecting hostages\n");
return;
}
if (rescueHostages)
{
me->SetTask(CCSBot::RESCUE_HOSTAGES);
me->Run();
me->SetDisposition(CCSBot::SELF_DEFENSE);
me->MoveTo(ctrl->GetRandomPositionInZone(zone), FASTEST_ROUTE);
me->PrintIfWatched("I'm rescuing hostages\n");
me->GetChatter()->EscortingHostages();
return;
}
}
break;
}
// deathmatch
default:
{
// sniping check
if (me->GetFriendsRemaining() && me->IsSniper() && RANDOM_FLOAT(0, 100.0f) < offenseSniperCampChance)
{
me->SetTask(CCSBot::MOVE_TO_SNIPER_SPOT);
me->Hide(me->GetLastKnownArea(), RANDOM_FLOAT(10.0f, 30.0f), sniperHideRange);
me->SetDisposition(CCSBot::OPPORTUNITY_FIRE);
me->PrintIfWatched("Sniping!\n");
return;
}
break;
}
}
// if we have nothing special to do, go hunting for enemies
me->Hunt();
}
#ifdef HOOK_GAMEDLL

View File

@ -3,47 +3,117 @@
// Move towards currently heard noise
/* <5b3114> ../cstrike/dlls/bot/states/cs_bot_investigate_noise.cpp:17 */
NOBODY void InvestigateNoiseState::AttendCurrentNoise(CCSBot *me)
void InvestigateNoiseState::AttendCurrentNoise(CCSBot *me)
{
// IsNoiseHeard(const class CCSBot *const this); // 19
if (!me->IsNoiseHeard() && me->GetNoisePosition())
return;
// remember where the noise we heard was
m_checkNoisePosition = *me->GetNoisePosition();
// tell our teammates (unless the noise is obvious, like gunfire)
if (me->IsWellPastSafe() && me->HasNotSeenEnemyForLongTime() && me->GetNoisePriority() != PRIORITY_HIGH)
me->GetChatter()->HeardNoise(me->GetNoisePosition());
// figure out how to get to the noise
me->PrintIfWatched("Attending to noise...\n");
me->ComputePath(me->GetNoiseArea(), &m_checkNoisePosition, SAFEST_ROUTE);
// consume the noise
me->ForgetNoise();
}
/* <5b2f37> ../cstrike/dlls/bot/states/cs_bot_investigate_noise.cpp:38 */
NOBODY void InvestigateNoiseState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void InvestigateNoiseState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// AttendCurrentNoise(InvestigateNoiseState *const this,
// class CCSBot *me); // 40
AttendCurrentNoise(me);
}
// Use TravelDistance instead of distance...
/* <5b2fa2> ../cstrike/dlls/bot/states/cs_bot_investigate_noise.cpp:47 */
NOBODY void InvestigateNoiseState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void InvestigateNoiseState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// float newNoiseDist; // 50
// float noiseDist; // 74
// float const nearDist; // 111
// {
// Vector toOldNoise; // 54
// float const muchCloserDist; // 56
// operator-(const Vector *const this,
// const Vector &v); // 54
// IsLengthGreaterThan(const Vector *const this,
// float length); // 57
// AttendCurrentNoise(InvestigateNoiseState *const this,
// class CCSBot *me); // 60
// }
// operator-(const Vector *const this,
// const Vector &v); // 74
// Length(const Vector *const this); // 74
// {
// float const closeToNoiseRange; // 85
// }
// }
float newNoiseDist;
if (me->ShouldInvestigateNoise(&newNoiseDist))
{
Vector toOldNoise = m_checkNoisePosition - me->pev->origin;
const float muchCloserDist = 100.0f;
if (toOldNoise.IsLengthGreaterThan(newNoiseDist + muchCloserDist))
{
// new sound is closer
AttendCurrentNoise(me);
}
}
// if the pathfind fails, give up
if (!me->HasPath())
{
me->Idle();
return;
}
// look around
me->UpdateLookAround();
// get distance remaining on our path until we reach the source of the noise
float noiseDist = (m_checkNoisePosition - me->pev->origin).Length();
if (me->IsUsingKnife())
{
if (me->IsHurrying())
me->Run();
else
me->Walk();
}
else
{
const float closeToNoiseRange = 1500.0f;
if (noiseDist < closeToNoiseRange)
{
// if we dont have many friends left, or we are alone, and we are near noise source, sneak quietly
if (me->GetFriendsRemaining() <= 2 && !me->IsHurrying())
{
me->Walk();
}
else
{
me->Run();
}
}
else
{
me->Run();
}
}
// if we can see the noise position and we're close enough to it and looking at it,
// we don't need to actually move there (it's checked enough)
const float closeRange = 200.0f;
if (noiseDist < closeRange)
{
if (me->IsLookingAtPosition(&m_checkNoisePosition) && me->IsVisible(&m_checkNoisePosition))
{
// can see noise position
me->PrintIfWatched("Noise location is clear.\n");
//me->ForgetNoise();
me->Idle();
return;
}
}
// move towards noise
if (me->UpdatePathMovement() != CCSBot::PROGRESSING)
{
me->Idle();
}
}
/* <5b2e95> ../cstrike/dlls/bot/states/cs_bot_investigate_noise.cpp:129 */
NOBODY void InvestigateNoiseState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void InvestigateNoiseState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
// reset to run mode in case we were sneaking about
me->Run();
}
#ifdef HOOK_GAMEDLL

View File

@ -1,89 +1,304 @@
#include "precompiled.h"
// Move to a potentially far away position.
/* <5c4e91> ../cstrike/dlls/bot/states/cs_bot_move_to.cpp:21 */
NOBODY void MoveToState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
void MoveToState::__MAKE_VHOOK(OnEnter)(CCSBot *me)
{
// {
// enum RouteType route; // 30
// }
if (me->IsUsingKnife() && me->IsWellPastSafe() && !me->IsHurrying())
{
me->Walk();
}
else
{
me->Run();
}
// if we need to find the bomb, get there as quick as we can
RouteType route;
switch (me->GetTask())
{
case CCSBot::FIND_TICKING_BOMB:
case CCSBot::DEFUSE_BOMB:
case CCSBot::MOVE_TO_LAST_KNOWN_ENEMY_POSITION:
route = FASTEST_ROUTE;
break;
default:
route = SAFEST_ROUTE;
break;
}
// build path to, or nearly to, goal position
me->ComputePath(TheNavAreaGrid.GetNavArea(&m_goalPosition), &m_goalPosition, route);
m_radioedPlan = false;
m_askedForCover = false;
}
// Move to a potentially far away position.
/* <5c4edf> ../cstrike/dlls/bot/states/cs_bot_move_to.cpp:55 */
NOBODY void MoveToState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
void MoveToState::__MAKE_VHOOK(OnUpdate)(CCSBot *me)
{
// {
// class CCSBotManager *ctrl; // 76
// {
// class CBasePlayer *victim; // 61
// GetTaskEntity(CCSBot *const this); // 61
// }
// {
// float const nearPlantSite; // 161
// {
// float const radioTime; // 173
// }
// }
// Say(BotChatterInterface *const this,
// const char *phraseName,
// float lifetime,
// float delay); // 140
// {
// class CHostage *hostage; // 197
// float const repathToleranceSq; // 205
// float error; // 206
// GetGoalEntity(CCSBot *const this); // 197
// IsValid(CHostage *const this); // 198
// IsFollowingSomeone(CHostage *const this); // 198
// operator-(const Vector *const this,
// const Vector &v); // 206
// LengthSquared(const Vector *const this); // 206
// {
// Vector pos; // 216
// Vector to; // 217
// float const watchHostageRange; // 220
// operator+(const Vector *const this,
// const Vector &v); // 216
// operator-(const Vector *const this,
// const Vector &v); // 217
// IsLengthLessThan(const Vector *const this,
// float length); // 221
// {
// enum NavRelativeDirType dir; // 226
// float const useRange; // 236
// GetGoalEntity(CCSBot *const this); // 239
// }
// }
// }
// {
// int z; // 100
// Contains(const class Extent *const this,
// const Vector *pos); // 106
// }
// {
// const Vector *bombPos; // 284
// IsActiveWeaponReloading(const class CBot *const this); // 278
// {
// Vector toBomb; // 287
// float const defuseRange; // 291
// GetFeetZ(const class CCSBot *const this); // 290
// IsLengthLessThan(const Vector *const this,
// float length); // 292
// }
// }
// {
// class CBasePlayer *victim; // 303
// GetTaskEntity(CCSBot *const this); // 303
// Say(BotChatterInterface *const this,
// const char *phraseName,
// float lifetime,
// float delay); // 307
// }
// }
CCSBotManager *ctrl = TheCSBots();
// assume that we are paying attention and close enough to know our enemy died
if (me->GetTask() == CCSBot::MOVE_TO_LAST_KNOWN_ENEMY_POSITION)
{
// TODO: Account for reaction time so we take some time to realized the enemy is dead
CBasePlayer *victim = static_cast<CBasePlayer *>(me->GetTaskEntity());
if (victim == NULL || !victim->IsAlive())
{
me->PrintIfWatched("The enemy I was chasing was killed - giving up.\n");
me->Idle();
return;
}
}
// look around
me->UpdateLookAround();
// Scenario logic
switch (ctrl->GetScenario())
{
case CCSBotManager::SCENARIO_DEFUSE_BOMB:
{
// if the bomb has been planted, find it
// NOTE: This task is used by both CT and T's to find the bomb
if (me->GetTask() == CCSBot::FIND_TICKING_BOMB)
{
if (!me->GetGameState()->IsBombPlanted())
{
// the bomb is not planted - give up this task
me->Idle();
return;
}
if (me->GetGameState()->GetPlantedBombsite() != CSGameState::UNKNOWN)
{
// we know where the bomb is planted, stop searching
me->Idle();
return;
}
// check off bombsites that we explore or happen to stumble into
for (int z = 0; z < ctrl->GetZoneCount(); ++z)
{
// don't re-check zones
if (me->GetGameState()->IsBombsiteClear(z))
continue;
if (ctrl->GetZone(z)->m_extent.Contains(&me->pev->origin))
{
// note this bombsite is clear
me->GetGameState()->ClearBombsite(z);
if (me->m_iTeam == CT)
{
// tell teammates this bombsite is clear
me->GetChatter()->BombsiteClear(z);
}
// find another zone to check
me->Idle();
return;
}
}
// move to a bombsite
break;
}
else if (me->m_iTeam == CT)
{
if (me->GetGameState()->IsBombPlanted())
{
switch (me->GetTask())
{
case CCSBot::DEFUSE_BOMB:
{
// if we are trying to defuse the bomb, and someone has started defusing, guard them instead
if (me->CanSeePlantedBomb() && ctrl->GetBombDefuser())
{
me->GetChatter()->Say("CoveringFriend");
me->Idle();
return;
}
break;
}
default:
{
// we need to find the bomb
me->Idle();
return;
}
}
}
}
// TERRORIST
else
{
if (me->GetTask() == CCSBot::PLANT_BOMB)
{
if (me->GetFriendsRemaining())
{
// if we are about to plant, radio for cover
if (!m_askedForCover)
{
const float nearPlantSite = 50.0f;
if (me->IsAtBombsite() && me->GetPathDistanceRemaining() < nearPlantSite)
{
// radio to the team
me->GetChatter()->PlantingTheBomb(me->GetPlace());
m_askedForCover = true;
}
// after we have started to move to the bombsite, tell team we're going to plant, and where
// don't do this if we have already radioed that we are starting to plant
if (!m_radioedPlan)
{
const float radioTime = 2.0f;
if (gpGlobals->time - me->GetStateTimestamp() > radioTime)
{
me->GetChatter()->GoingToPlantTheBomb(TheNavAreaGrid.GetPlace(&m_goalPosition));
m_radioedPlan = true;
}
}
}
}
}
}
break;
}
case CCSBotManager::SCENARIO_RESCUE_HOSTAGES:
{
if (me->GetTask() == CCSBot::COLLECT_HOSTAGES)
{
// Since CT's have a radar, they can directly look at the actual hostage state
// check if someone else collected our hostage, or the hostage died or was rescued
CHostage *hostage = static_cast<CHostage *>(me->GetGoalEntity());
if (hostage == NULL || !hostage->IsValid() || hostage->IsFollowingSomeone())
{
me->Idle();
return;
}
// if our hostage has moved, repath
const float repathToleranceSq = 75.0f * 75.0f;
float error = (hostage->pev->origin - m_goalPosition).LengthSquared();
if (error > repathToleranceSq)
{
m_goalPosition = hostage->pev->origin;
me->ComputePath(TheNavAreaGrid.GetNavArea(&m_goalPosition), &m_goalPosition, SAFEST_ROUTE);
}
// TODO: Generalize ladder priorities over other tasks
if (!me->IsUsingLadder())
{
Vector pos = hostage->pev->origin + Vector(0, 0, HumanHeight * 0.75f);
Vector to = pos - me->pev->origin;
// look at the hostage as we approach
const float watchHostageRange = 100.0f;
if (to.IsLengthLessThan(watchHostageRange))
{
me->SetLookAt("Hostage", &pos, PRIORITY_LOW, 0.5f);
// randomly move just a bit to avoid infinite use loops from bad hostage placement
NavRelativeDirType dir = (NavRelativeDirType)RANDOM_LONG(0, 3);
switch (dir)
{
case LEFT: me->StrafeLeft(); break;
case RIGHT: me->StrafeRight(); break;
case FORWARD: me->MoveForward(); break;
case BACKWARD: me->MoveBackward(); break;
}
// check if we are close enough to the hostage to talk to him
const float useRange = PLAYER_USE_RADIUS - 14.0f; // shave off a fudge factor to make sure we're within range
if (to.IsLengthLessThan(useRange))
{
me->UseEntity(me->GetGoalEntity());
return;
}
}
}
}
else if (me->GetTask() == CCSBot::RESCUE_HOSTAGES)
{
// periodically check if we lost all our hostages
if (me->GetHostageEscortCount() == 0)
{
// lost our hostages - go get 'em
me->Idle();
return;
}
}
break;
}
}
if (me->UpdatePathMovement() != CCSBot::PROGRESSING)
{
// reached destination
switch (me->GetTask())
{
case CCSBot::PLANT_BOMB:
{
// if we are at bombsite with the bomb, plant it
if (me->IsAtBombsite() && me->IsCarryingBomb())
{
me->PlantBomb();
return;
}
break;
}
case CCSBot::DEFUSE_BOMB:
{
if (!me->IsActiveWeaponReloading())
{
// if we are near the bomb, defuse it (if we are reloading, don't try to defuse until we finish)
const Vector *bombPos = me->GetGameState()->GetBombPosition();
if (bombPos != NULL)
{
const float defuseRange = 100.0f;
Vector toBomb = *bombPos - me->pev->origin + Vector(0, 0, me->GetFeetZ());
if (toBomb.IsLengthLessThan(defuseRange))
{
me->DefuseBomb();
return;
}
}
}
break;
}
case CCSBot::MOVE_TO_LAST_KNOWN_ENEMY_POSITION:
{
CBasePlayer *victim = static_cast<CBasePlayer *>(me->GetTaskEntity());
if (victim != NULL && victim->IsAlive())
{
// if we got here and haven't re-acquired the enemy, we lost him
me->GetChatter()->Say("LostEnemy");
}
break;
}
}
// default behavior when destination is reached
me->Idle();
return;
}
}
/* <5c4e54> ../cstrike/dlls/bot/states/cs_bot_move_to.cpp:320 */
NOBODY void MoveToState::__MAKE_VHOOK(OnExit)(CCSBot *me)
void MoveToState::__MAKE_VHOOK(OnExit)(CCSBot *me)
{
// reset to run in case we were walking near our goal position
me->Run();
me->SetDisposition(CCSBot::ENGAGE_AND_INVESTIGATE);
//me->StopAiming();
}
#ifdef HOOK_GAMEDLL

View File

@ -483,7 +483,7 @@ void CCareerTaskManager::AddTask(const char *taskName, const char *weaponName, i
{
++m_nextId;
for (int i = 0; i < ARRAYSIZE(taskInfo); i++)
for (int i = 0; i < ARRAYSIZE(taskInfo); ++i)
{
const TaskInfo *pTaskInfo = &taskInfo[ i ];
@ -598,9 +598,9 @@ void CCareerTaskManager::HandleDeath(int team, CBasePlayer *pAttacker)
if (enemyTeam != team)
return;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer && pPlayer->m_iTeam == enemyTeam && pPlayer->IsAlive())
++numEnemies;

View File

@ -117,7 +117,7 @@ void EmptyEntityHashTable(void)
int i;
hash_item_t *item, *temp, *free;
for (i = 0; i < stringsHashTable.Count(); i++)
for (i = 0; i < stringsHashTable.Count(); ++i)
{
item = &stringsHashTable[i];
temp = item->next;
@ -281,7 +281,7 @@ void RemoveEntityHashValue(entvars_t *pev, const char *value, hash_types_e field
/* <31125> ../cstrike/dlls/cbase.cpp:337 */
void printEntities(void)
{
for (int i = 0; i < stringsHashTable.Count(); i++)
for (int i = 0; i < stringsHashTable.Count(); ++i)
{
hash_item_t *item = &stringsHashTable[i];
@ -342,7 +342,7 @@ void loopPerformance(void)
start = loopCounter.GetCurTime();
for (i = 0; i < 100; i++)
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"))
@ -364,7 +364,7 @@ void loopPerformance(void)
// check time new search loop
start = loopCounter.GetCurTime();
for (i = 0; i < 100; i++)
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"))
@ -392,7 +392,7 @@ 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++)
for (int i = 0; i < stringsHashTable.Count(); ++i)
{
stringsHashTable[i].next = NULL;
}
@ -968,7 +968,7 @@ void SetObjectCollisionBox(entvars_t *pev)
int i;
max = 0;
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
v = fabs((float_precision)((float *)pev->mins)[i]);
if (v > max)
@ -982,7 +982,7 @@ void SetObjectCollisionBox(entvars_t *pev)
max = v;
}
}
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
((float *)pev->absmin)[i] = ((float *)pev->origin)[i] - max;
((float *)pev->absmax)[i] = ((float *)pev->origin)[i] + max;

View File

@ -88,7 +88,7 @@ int CMD_ARGC_(void)
int i = 0;
while (BotArgs[i])
i++;
++i;
return i;
}
@ -352,7 +352,7 @@ int CountTeamPlayers(int iTeam)
continue;
if (GetClassPtr((CBasePlayer *)pPlayer->pev)->m_iTeam == iTeam)
i++;
++i;
}
return i;
@ -3637,7 +3637,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
player->m_bNightVisionOn = false;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
@ -3663,7 +3663,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
player->m_bNightVisionOn = true;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
@ -3798,7 +3798,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
{
player->ClearAutoBuyData();
for (int i = 1; i < CMD_ARGC_(); i++)
for (int i = 1; i < CMD_ARGC_(); ++i)
{
player->AddAutoBuyData(CMD_ARGV_(i));
}
@ -3973,7 +3973,7 @@ void EXT_FUNC ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
EmptyEntityHashTable();
// Clients have not been initialized yet
for (i = 0; i < edictCount; i++)
for (i = 0; i < edictCount; ++i)
{
edict_t *pEdict = &pEdictList[i];
@ -4222,12 +4222,12 @@ void ClientPrecache(void)
else
numPlayerModels = ARRAYSIZE(sPlayerModelFiles) - 2;
for (i = 0; i < numPlayerModels; i++)
for (i = 0; i < numPlayerModels; ++i)
PRECACHE_MODEL(sPlayerModelFiles[i]);
if (isCZero)
{
for (i = FirstCustomSkin; i <= LastCustomSkin; i++)
for (i = FirstCustomSkin; i <= LastCustomSkin; ++i)
{
const char *fname = TheBotProfiles->GetCustomSkinFname(i);
@ -4287,12 +4287,12 @@ void ClientPrecache(void)
Vector vMin = Vector(-38, -24, -41);
Vector vMax = Vector(38, 24, 41);
for (i = 0; i < numPlayerModels; i++)
for (i = 0; i < numPlayerModels; ++i)
ENGINE_FORCE_UNMODIFIED(force_model_specifybounds, (float *)&vMin, (float *)&vMax, sPlayerModelFiles[i]);
if (isCZero)
{
for (i = FirstCustomSkin; i <= LastCustomSkin; i++)
for (i = FirstCustomSkin; i <= LastCustomSkin; ++i)
{
const char *fname = TheBotProfiles->GetCustomSkinFname(i);
@ -4663,7 +4663,7 @@ bool CheckPlayerPVSLeafChanged(edict_t *client, int clientnum)
if (pvs->headnode != client->headnode || pvs->num_leafs != client->num_leafs)
return true;
for (int i = 0; i < pvs->num_leafs; i++)
for (int i = 0; i < pvs->num_leafs; ++i)
{
if (client->leafnums[i] != pvs->leafnums[i])
return true;
@ -4794,10 +4794,10 @@ int EXT_FUNC AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, ed
state->framerate = ent->v.framerate;
state->body = ent->v.body;
for (i = 0; i < 4; i++)
for (i = 0; i < 4; ++i)
state->controller[i] = ent->v.controller[i];
for (i = 0; i < 2; i++)
for (i = 0; i < 2; ++i)
state->blending[i] = ent->v.blending[i];
state->rendermode = ent->v.rendermode;
@ -5086,7 +5086,7 @@ int EXT_FUNC GetWeaponData(edict_s *player, struct weapon_data_s *info)
return 1;
}
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
CBasePlayerItem *pPlayerItem = pl->m_rgpPlayerItems[i];

View File

@ -25,7 +25,7 @@ NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cG
return;
}
for (i = 0; i < cGibs; i++)
for (i = 0; i < cGibs; ++i)
{
CGib *pGib = GetClassPtr((CGib *)NULL);
@ -1047,7 +1047,7 @@ void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker,
UTIL_ScreenFade(pPlayer, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0);
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
@ -1921,7 +1921,7 @@ void CBaseEntity::__MAKE_VHOOK(TraceBleed)(float flDamage, Vector vecDir, TraceR
cCount = 4;
}
for (i = 0; i < cCount; i++)
for (i = 0; i < cCount; ++i)
{
// trace in the opposite direction the shot came from (the direction the shot is going)
vecTraceDir = vecDir * -1.0f;
@ -1961,7 +1961,7 @@ NOXREF void CBaseMonster::MakeDamageBloodDecal(int cCount, float flNoise, TraceR
pev->max_health--;
}
for (i = 0; i < cCount; i++)
for (i = 0; i < cCount; ++i)
{
vecTraceDir = vecDir;

View File

@ -72,7 +72,7 @@ void PrintDebugFlags(void)
theDebugBuffer[0] = '\0';
tmp = BufPrintf(theDebugBuffer, remainder, "mp_debug:\n");
for (int i = 0; i < NUM_LEVELS - 1; i++)
for (int i = 0; i < NUM_LEVELS - 1; ++i)
{
DebugOutputLevel level = outputLevel[i];
@ -87,7 +87,7 @@ void SetDebugFlag(const char *flagStr, bool state)
if (flagStr != NULL)
{
DebugOutputType flag;
for (int i = 0; i < ARRAYSIZE(outputLevel); i++)
for (int i = 0; i < ARRAYSIZE(outputLevel); ++i)
{
DebugOutputLevel level = outputLevel[ i ];
@ -115,7 +115,7 @@ void PrintDebugFlag(const char *flagStr)
if (flagStr != NULL)
{
DebugOutputType flag;
for (int i = 0; i < ARRAYSIZE(outputLevel); i++)
for (int i = 0; i < ARRAYSIZE(outputLevel); ++i)
{
DebugOutputLevel level = outputLevel[ i ];

View File

@ -1655,7 +1655,7 @@ void CTestEffect::TestThink(void)
if (t < 3.0)
{
for (i = 0; i < m_iBeam; i++)
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);
@ -1664,7 +1664,7 @@ void CTestEffect::TestThink(void)
}
else
{
for (i = 0; i < m_iBeam; i++)
for (i = 0; i < m_iBeam; ++i)
{
UTIL_Remove(m_pBeam[i]);
}

View File

@ -189,7 +189,7 @@ void CEnvExplosion::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCal
{
int sparkCount = RANDOM_LONG(0, 3);
for (int i = 0; i < sparkCount; i++)
for (int i = 0; i < sparkCount; ++i)
{
Create("spark_shower", pev->origin, tr.vecPlaneNormal, NULL);
}

View File

@ -322,7 +322,7 @@ void CBreakable::MaterialSoundPrecache(Materials precacheMaterial)
pSoundList = MaterialSoundList(precacheMaterial, soundCount);
for (i = 0; i < soundCount; i++)
for (i = 0; i < soundCount; ++i)
{
PRECACHE_SOUND((char *)pSoundList[i]);
}
@ -834,7 +834,7 @@ void CBreakable::Die(void)
if (count)
{
for (int i = 0; i < count; i++)
for (int i = 0; i < count; ++i)
{
pList[i]->pev->flags &= ~FL_ONGROUND;
pList[i]->pev->groundentity = NULL;
@ -917,7 +917,7 @@ void CPushable::__MAKE_VHOOK(Spawn)(void)
/* <863eb> ../cstrike/dlls/func_break.cpp:920 */
void CPushable::__MAKE_VHOOK(Precache)(void)
{
for (int i = 0; i < 3; i++)
for (int i = 0; i < 3; ++i)
{
PRECACHE_SOUND(m_soundNames[i]);
}

View File

@ -696,9 +696,9 @@ void CFuncTankGun::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &for
if (bulletCount > 0)
{
for (i = 0; i < bulletCount; i++)
for (i = 0; i < bulletCount; ++i)
{
switch(m_bulletType)
switch (m_bulletType)
{
case TANK_BULLET_9MM:
FireBullets(1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_9MM, 1, m_iBulletDamage, pevAttacker);
@ -807,14 +807,14 @@ void CFuncTankLaser::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &f
if (bulletCount)
{
for (i = 0; i < bulletCount; i++)
for (i = 0; i < bulletCount; ++i)
{
m_pLaser->pev->origin = barrelEnd;
TankTrace(barrelEnd, forward, gTankSpread[m_spread], tr);
m_laserTime = gpGlobals->time;
m_pLaser->TurnOn();
m_pLaser->pev->dmgtime = gpGlobals->time - 1.0;
m_pLaser->pev->dmgtime = gpGlobals->time - 1.0f;
m_pLaser->FireAtPoint(tr);
m_pLaser->pev->nextthink = 0;
}
@ -849,7 +849,7 @@ void CFuncTankRocket::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &
if (bulletCount > 0)
{
for (i = 0; i < bulletCount; i++)
for (i = 0; i < bulletCount; ++i)
{
CBaseEntity *pRocket = CBaseEntity::Create("rpg_rocket", barrelEnd, pev->angles, edict());
}

View File

@ -123,18 +123,7 @@ void CGameRules::__MAKE_VHOOK(RefreshSkillData)(void)
gSkillData.healthkitCapacity = 15;
}
void (*pInstallGameRules)(void);
/* <ada23> ../cstrike/dlls/gamerules.cpp:157 */
#ifdef HOOK_GAMEDLL
NOBODY __declspec(naked) CGameRules *InstallGameRules(void)
{
__asm
{
jmp pInstallGameRules
}
}
#else
CGameRules *InstallGameRules(void)
{
SERVER_COMMAND("exec game.cfg\n");
@ -145,7 +134,6 @@ CGameRules *InstallGameRules(void)
return new CHalfLifeMultiplay;
}
#endif // HOOK_GAMEDLL
#ifdef HOOK_GAMEDLL

View File

@ -812,9 +812,6 @@ int CountPlayers(void);
void ExtractCommandString(char *s, char *szCommand);
int GetMapCount(void);
// refs
extern void (*pInstallGameRules)(void);
#ifdef HOOK_GAMEDLL
// linked objects

View File

@ -100,7 +100,7 @@ void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType)
{
int sparkCount = RANDOM_LONG(0, 3);
for (int i = 0; i < sparkCount; i++)
for (int i = 0; i < sparkCount; ++i)
Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL);
}
}
@ -234,7 +234,7 @@ void CGrenade::Explode2(TraceResult *pTrace, int bitsDamageType)
{
int sparkCount = RANDOM_LONG(0, 3);
for (int i = 0; i < sparkCount; i++)
for (int i = 0; i < sparkCount; ++i)
Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL);
}
}
@ -313,7 +313,7 @@ void CGrenade::Explode3(TraceResult *pTrace, int bitsDamageType)
pev->nextthink = gpGlobals->time + 0.55;
int sparkCount = RANDOM_LONG(0, 3);
for (int i = 0; i < sparkCount; i++)
for (int i = 0; i < sparkCount; ++i)
Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL);
}
@ -362,7 +362,7 @@ NOXREF void CGrenade::SG_Explode(TraceResult *pTrace, int bitsDamageType)
{
int sparkCount = RANDOM_LONG(0, 3);
for (int i = 0; i < sparkCount; i++)
for (int i = 0; i < sparkCount; ++i)
Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL);
}
}

View File

@ -27,7 +27,7 @@ NOXREF BOOL FBoxVisible(entvars_t *pevLooker, entvars_t *pevTarget, Vector &vecT
//look through the monster's 'eyes'
Vector vecLookerOrigin = pevLooker->origin + pevLooker->view_ofs;
for (int i = 0; i < 5; i++)
for (int i = 0; i < 5; ++i)
{
Vector vecTarget = pevTarget->origin;

View File

@ -216,7 +216,7 @@ void CCyclerSprite::__MAKE_VHOOK(Spawn)(void)
m_rendermode = pev->rendermode;
m_renderamt = pev->renderamt;
for (int i = 0; i < ARRAYSIZE(pev->rendercolor); i++)
for (int i = 0; i < ARRAYSIZE(pev->rendercolor); ++i)
{
pev->rendercolor[i] = m_rendercolor[i];
}
@ -239,7 +239,7 @@ void CCyclerSprite::__MAKE_VHOOK(Restart)(void)
pev->rendermode = m_rendermode;
pev->renderamt = m_renderamt;
for (int i = 0; i < ARRAYSIZE(pev->rendercolor); i++)
for (int i = 0; i < ARRAYSIZE(pev->rendercolor); ++i)
{
pev->rendercolor[i] = m_rendercolor[i];
}

View File

@ -9,7 +9,7 @@ CHintMessage::CHintMessage(const char *hintString, bool isHint, CUtlVector<const
if (args)
{
for (int i = 0; i < args->Count(); i++)
for (int i = 0; i < args->Count(); ++i)
m_args.AddToTail(CloneString((*args)[i]));
}
}

View File

@ -1148,7 +1148,7 @@ void CHostage::Wiggle(void)
Vector(-50, -50, 0)
};
for (int i = 0; i < ARRAYSIZE(wiggle_directions); i++)
for (int i = 0; i < ARRAYSIZE(wiggle_directions); ++i)
{
Vector dest = pev->origin + wiggle_directions[i];
@ -1424,7 +1424,7 @@ void CHostageManager::ServerDeactivate(void)
/* <45e3f7> ../cstrike/dlls/hostage/hostage.cpp:1631 */
void CHostageManager::RestartRound(void)
{
for (int i = 0; i < m_hostageCount; i++)
for (int i = 0; i < m_hostageCount; ++i)
{
if (m_hostage[i]->m_improv != NULL)
{
@ -1440,7 +1440,7 @@ void CHostageManager::AddHostage(CHostage *hostage)
return;
int i;
for (i = 0; i < m_hostageCount; i++)
for (i = 0; i < m_hostageCount; ++i)
{
if (m_hostage[i] == hostage)
{
@ -1458,7 +1458,7 @@ void CHostageManager::AddHostage(CHostage *hostage)
/* <45e47f> ../cstrike/dlls/hostage/hostage.cpp:1657 */
bool CHostageManager::IsNearbyHostageTalking(CHostageImprov *improv)
{
for (int i = 0; i < m_hostageCount; i++)
for (int i = 0; i < m_hostageCount; ++i)
{
const float closeRange = 500.0f;
const CHostageImprov *other = m_hostage[i]->m_improv;
@ -1481,7 +1481,7 @@ bool CHostageManager::IsNearbyHostageTalking(CHostageImprov *improv)
/* <45e57b> ../cstrike/dlls/hostage/hostage.cpp:1689 */
bool CHostageManager::IsNearbyHostageJumping(CHostageImprov *improv)
{
for (int i = 0; i < m_hostageCount; i++)
for (int i = 0; i < m_hostageCount; ++i)
{
const CHostageImprov *other = m_hostage[i]->m_improv;
@ -1504,7 +1504,7 @@ bool CHostageManager::IsNearbyHostageJumping(CHostageImprov *improv)
/* <45e642> ../cstrike/dlls/hostage/hostage.cpp:1716 */
void CHostageManager::OnEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other)
{
for (int i = 0; i < m_hostageCount; i++)
for (int i = 0; i < m_hostageCount; ++i)
{
CHostageImprov *improv = m_hostage[ i ]->m_improv;
@ -1518,7 +1518,7 @@ void CHostageManager::OnEvent(GameEventType event, CBaseEntity *entity, CBaseEnt
/* <45e6b8> ../cstrike/dlls/hostage/hostage.cpp:1726 */
SimpleChatter::SimpleChatter(void)
{
for (int i = 0; i < ARRAYSIZE(m_chatter); i++)
for (int i = 0; i < ARRAYSIZE(m_chatter); ++i)
{
m_chatter[i].count = 0;
m_chatter[i].index = 0;
@ -1529,7 +1529,7 @@ SimpleChatter::SimpleChatter(void)
/* <45e6f0> ../cstrike/dlls/hostage/hostage.cpp:1737 */
SimpleChatter::~SimpleChatter(void)
{
for (int i = 0; i < ARRAYSIZE(m_chatter); i++)
for (int i = 0; i < ARRAYSIZE(m_chatter); ++i)
{
for (int f = 0; f < m_chatter[i].count; f++)
{
@ -1566,7 +1566,7 @@ void SimpleChatter::Shuffle(ChatterSet *chatter)
if (!chatter->needsShuffle)
return;
for (int i = 1; i < chatter->count; i++)
for (int i = 1; i < chatter->count; ++i)
{
for (int j = i; j < chatter->count; j++)
{

View File

@ -1534,7 +1534,7 @@ CBasePlayer *CHostageImprov::GetClosestVisiblePlayer(int team)
CBasePlayer *close = NULL;
float closeRangeSq = 1e8f;
for (int i = 0; i < m_visiblePlayerCount; i++)
for (int i = 0; i < m_visiblePlayerCount; ++i)
{
CBasePlayer *player = (CBasePlayer *)m_visiblePlayer[i];
@ -1937,18 +1937,6 @@ void CHostageImprov::UpdateStationaryAnimation(void)
#ifdef HOOK_GAMEDLL
// NavAreaBuildPath<HostagePathCost> hook
bool NavAreaBuildPath__HostagePathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class HostagePathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
// NavAreaBuildPath<ShortestPathCost> hook
bool NavAreaBuildPath__ShortestPathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class ShortestPathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
void CHostageImprov::OnMoveToFailure(const Vector &goal, MoveToFailureType reason)
{
OnMoveToFailure_(goal, reason);

View File

@ -513,8 +513,17 @@ private:
#ifdef HOOK_GAMEDLL
bool NavAreaBuildPath__HostagePathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class HostagePathCost &costFunc, CNavArea **closestArea = NULL);
bool NavAreaBuildPath__ShortestPathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class ShortestPathCost &costFunc, CNavArea **closestArea = NULL);
// NavAreaBuildPath<HostagePathCost> hook
inline bool NavAreaBuildPath__HostagePathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class HostagePathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
// NavAreaBuildPath<ShortestPathCost> hook
inline bool NavAreaBuildPath__ShortestPathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, class ShortestPathCost &costFunc, CNavArea **closestArea)
{
return NavAreaBuildPath(startArea, goalArea, goalPos, costFunc, closestArea);
}
typedef bool (CHostageImprov::*IS_FRIEND_IN_THE_WAY_VECTOR)(const Vector &) const;
typedef bool (CHostageImprov::*IS_FRIEND_IN_THE_WAY_CBASE)(CBaseEntity *, const Vector &) const;

View File

@ -860,7 +860,7 @@ void CLocalNav::RequestNav(CHostage *pCaller)
return;
}
for (int i = 0; i < tot_inqueue; i++)
for (int i = 0; i < tot_inqueue; ++i)
{
CHostage *pQueueItem = GetClassPtr((CHostage *)_queue[curr]->pev);

View File

@ -249,7 +249,7 @@ void CGameTeamMaster::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
int type = Q_atoi(pkvd->szValue);
switch(type)
switch (type)
{
case 0:
triggerType = USE_OFF;
@ -398,9 +398,9 @@ void CGamePlayerZone::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
CBaseEntity *pPlayer = NULL;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer)
{
@ -417,7 +417,7 @@ void CGamePlayerZone::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
if (trace.fStartSolid)
{
playersInCount++;
++playersInCount;
if (!FStringNull(m_iszInTarget))
{
FireTargets(STRING(m_iszInTarget), pPlayer, pActivator, useType, value);
@ -425,7 +425,7 @@ void CGamePlayerZone::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
}
else
{
playersOutCount++;
++playersOutCount;
if (!FStringNull(m_iszOutTarget))
{
FireTargets(STRING(m_iszOutTarget), pPlayer, pActivator, useType, value);
@ -547,7 +547,7 @@ void CGamePlayerEquip::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
if (!pkvd->fHandled)
{
for (int i = 0; i < MAX_EQUIP; i++)
for (int i = 0; i < MAX_EQUIP; ++i)
{
if (FStringNull(m_weaponNames[i]))
{
@ -590,12 +590,12 @@ void CGamePlayerEquip::EquipPlayer(CBaseEntity *pEntity)
if (!pPlayer)
return;
for (int i = 0; i < MAX_EQUIP; i++)
for (int i = 0; i < MAX_EQUIP; ++i)
{
if (FStringNull(m_weaponNames[i]))
break;
for (int j = 0; j < m_weaponCount[i]; j++)
for (int j = 0; j < m_weaponCount[i]; ++j)
{
pPlayer->GiveNamedItem(STRING(m_weaponNames[i]));
}

View File

@ -139,7 +139,7 @@ void CFuncMortarField::FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, U
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++)
for (int i = 0; i < m_iCount; ++i)
{
Vector vecSpot = vecStart;
vecSpot.x += RANDOM_FLOAT(-m_flSpread, m_flSpread);

View File

@ -171,7 +171,7 @@ void CBaseMonster::__MAKE_VHOOK(Look)(int iDistance)
// Find only monsters/clients in box, NOT limited to PVS
int count = UTIL_EntitiesInBox(pList, ARRAYSIZE(pList), pev->origin - delta, pev->origin + delta, (FL_CLIENT | FL_MONSTER));
for (int i = 0; i < count; i++)
for (int i = 0; i < count; ++i)
{
pSightEnt = pList[i];
if (pSightEnt != this && pSightEnt->pev->health > 0)

View File

@ -21,14 +21,14 @@ CHalfLifeMultiplay *g_pMPGameRules = NULL;
/* <1153e2> ../cstrike/dlls/multiplay_gamerules.cpp:92 */
bool IsBotSpeaking(void)
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer == NULL || !pPlayer->IsBot())
continue;
CCSBot *pBot = reinterpret_cast<CCSBot *>(pPlayer);
CCSBot *pBot = static_cast<CCSBot *>(pPlayer);
if (pBot->IsUsingVoice())
return true;
@ -51,9 +51,9 @@ void SV_Continue_f(void)
WRITE_STRING("GOGOGO");
MESSAGE_END();
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer && !pPlayer->IsBot())
{
@ -99,9 +99,9 @@ void SV_Career_EndRound_f(void)
{
SERVER_COMMAND("kill\n");
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!player || FNullEnt(player->pev))
continue;
@ -804,9 +804,9 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(GiveC4)(void)
if (giveToHumans)
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!player || FNullEnt(player->edict()))
continue;
@ -1164,7 +1164,7 @@ bool CHalfLifeMultiplay::NeededPlayersCheck(bool &bNeededPlayers)
{
if (IsCareer())
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(gpGlobals->maxClients));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(gpGlobals->maxClients));
if (!player || !player->IsBot())
{
@ -1410,7 +1410,7 @@ bool CHalfLifeMultiplay::TeamExterminationCheck(int NumAliveTerrorist, int NumAl
while ((temp = UTIL_FindEntityByClassname(temp, "grenade")) != NULL)
{
CGrenade *C4 = reinterpret_cast<CGrenade *>(temp);
CGrenade *C4 = static_cast<CGrenade *>(temp);
if (C4->m_bIsC4 && !C4->m_bJustBlew)
{
@ -1632,7 +1632,7 @@ void CHalfLifeMultiplay::BalanceTeams(void)
int iHighestUserID = 0;
CBasePlayer *toSwap = NULL;
for (int i = 1; i <= iNumToSwap; i++)
for (int i = 1; i <= iNumToSwap; ++i)
{
iHighestUserID = 0;
toSwap = NULL;
@ -1808,9 +1808,9 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(RestartRound)(void)
UpdateTeamScores();
// Reset the player stats
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *plr = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *plr = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (plr && !FNullEnt(plr->pev))
plr->Reset();
@ -1908,7 +1908,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(RestartRound)(void)
if (acct_tmp >= 2000)
break;
CHostage *temp = reinterpret_cast<CHostage *>(hostage);
CHostage *temp = static_cast<CHostage *>(hostage);
if (hostage->pev->solid != SOLID_NOT)
{
@ -2208,7 +2208,7 @@ void CHalfLifeMultiplay::StackVIPQueue(void)
/* <114e63> ../cstrike/dlls/multiplay_gamerules.cpp:2232 */
bool CHalfLifeMultiplay::IsVIPQueueEmpty(void)
{
for (int i = 0; i < MAX_VIP_QUEUES; i++)
for (int i = 0; i < MAX_VIP_QUEUES; ++i)
{
CBasePlayer *toCheck = VIPQueue[i];
@ -2225,7 +2225,7 @@ bool CHalfLifeMultiplay::IsVIPQueueEmpty(void)
/* <114eea> ../cstrike/dlls/multiplay_gamerules.cpp:2257 */
bool CHalfLifeMultiplay::AddToVIPQueue(CBasePlayer *toAdd)
{
for (int i = 0; i < MAX_VIP_QUEUES; i++)
for (int i = 0; i < MAX_VIP_QUEUES; ++i)
{
CBasePlayer *toCheck = VIPQueue[i];
@ -2317,7 +2317,7 @@ void CHalfLifeMultiplay::PickNextVIP(void)
ResetCurrentVIP();
}
for (int i = 0; i < MAX_VIP_QUEUES; i++)
for (int i = 0; i < MAX_VIP_QUEUES; ++i)
{
if (VIPQueue[i] != NULL)
{
@ -2528,9 +2528,9 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)(void)
m_bFreezePeriod = TRUE;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer != NULL && !pPlayer->IsBot())
{
@ -2780,9 +2780,9 @@ void CHalfLifeMultiplay::CheckFreezePeriodExpired(void)
TheCareerTasks->HandleEvent(EVENT_ROUND_START);
}
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *plr = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *plr = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!plr || plr->pev->flags == FL_DORMANT)
{
@ -3031,7 +3031,7 @@ void CHalfLifeMultiplay::MarkLivingPlayersOnTeamAsNotReceivingMoneyNextRound(int
{
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!player || FNullEnt(player->pev))
continue;
@ -3068,9 +3068,9 @@ void CHalfLifeMultiplay::CareerRestart(void)
m_bSkipSpawn = false;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!player || FNullEnt(player->pev))
continue;
@ -3138,7 +3138,7 @@ BOOL CHalfLifeMultiplay::__MAKE_VHOOK(GetNextBestWeapon)(CBasePlayer *pPlayer, C
iBestWeight = -1; // no weapon lower than -1 can be autoswitched to
pBest = NULL;
for (i = 0; i < MAX_ITEM_TYPES; i++)
for (i = 0; i < MAX_ITEM_TYPES; ++i)
{
pCheck = pPlayer->m_rgpPlayerItems[i];
@ -3252,10 +3252,10 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(InitHUD)(CBasePlayer *pl)
SendMOTDToClient(pl->edict());
// loop through all active players and send their score info to the new client
for (i = 1; i <= gpGlobals->maxClients; i++)
for (i = 1; i <= gpGlobals->maxClients; ++i)
{
// FIXME: Probably don't need to cast this just to read m_iDeaths
CBasePlayer *plr = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *plr = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (plr != NULL)
{
@ -3295,9 +3295,9 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(InitHUD)(CBasePlayer *pl)
MESSAGE_END();
}
for (i = 1; i <= gpGlobals->maxClients; i++)
for (i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *plr = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *plr = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (plr != NULL)
{
@ -3361,7 +3361,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(ClientDisconnected)(edict_t *pClient)
{
if (pClient != NULL)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(CBaseEntity::Instance(pClient));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(CBaseEntity::Instance(pClient));
if (pPlayer != NULL)
{
@ -3505,7 +3505,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer)
if (pPlayer->m_pActiveItem && pPlayer->m_pActiveItem->IsWeapon())
{
CBasePlayerWeapon *pWeapon = reinterpret_cast<CBasePlayerWeapon *>(pPlayer->m_pActiveItem->GetWeaponPtr());
CBasePlayerWeapon *pWeapon = static_cast<CBasePlayerWeapon *>(pPlayer->m_pActiveItem->GetWeaponPtr());
if (pWeapon->m_iWeaponState & WPNSTATE_SHIELD_DRAWN)
{
@ -3660,16 +3660,16 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerKilled)(CBasePlayer *pVictim, entvar
if (ktmp && ktmp->Classify() == CLASS_PLAYER)
{
peKiller = reinterpret_cast<CBasePlayer *>(ktmp);
peKiller = static_cast<CBasePlayer *>(ktmp);
}
else if (ktmp && ktmp->Classify() == CLASS_VEHICLE)
{
CBasePlayer *pDriver = reinterpret_cast<CBasePlayer *>(((CFuncVehicle *)ktmp)->m_pDriver);
CBasePlayer *pDriver = static_cast<CBasePlayer *>(((CFuncVehicle *)ktmp)->m_pDriver);
if (pDriver != NULL)
{
pKiller = pDriver->pev;
peKiller = reinterpret_cast<CBasePlayer *>(pDriver);
peKiller = static_cast<CBasePlayer *>(pDriver);
}
}
@ -3781,7 +3781,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerKilled)(CBasePlayer *pVictim, entvar
if (ep && ep->Classify() == CLASS_PLAYER)
{
CBasePlayer *PK = reinterpret_cast<CBasePlayer *>(ep);
CBasePlayer *PK = static_cast<CBasePlayer *>(ep);
MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo);
WRITE_BYTE(ENTINDEX(PK->edict()));
@ -3820,7 +3820,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars
if (pevInflictor == pKiller)
{
// If the inflictor is the killer, then it must be their current weapon doing the damage
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer*>(CBaseEntity::Instance(pKiller));
CBasePlayer *pPlayer = static_cast<CBasePlayer*>(CBaseEntity::Instance(pKiller));
if (pPlayer && pPlayer->m_pActiveItem)
{
@ -3887,7 +3887,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars
}
else if (pKiller->flags & FL_CLIENT)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(CBaseEntity::Instance(pKiller));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(CBaseEntity::Instance(pKiller));
char *VictimTeam = GetTeam(pVictim->m_iTeam);
char *KillerTeam = GetTeam(pPlayer->m_iTeam);
@ -4470,7 +4470,7 @@ int CountPlayers(void)
{
int num = 0;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pEnt = UTIL_PlayerByIndex(i);

View File

@ -393,7 +393,7 @@ void LinkUserMessages(void)
/* <1535a5> ../cstrike/dlls/player.cpp:380 */
void WriteSigonMessages(void)
{
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
ItemInfo &II = IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[i];
@ -1135,7 +1135,7 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (friendlyfire.string[0] == '2')
teamAttack = FALSE;
#endif // REGAMEDLL_ADD
pAttack = reinterpret_cast<CBasePlayer *>(CBasePlayer::Instance(pevAttacker));
pAttack = static_cast<CBasePlayer *>(CBasePlayer::Instance(pevAttacker));
}
else if (pGrenade->m_iTeam == m_iTeam && (&edict()->v != pevAttacker))
{
@ -1210,9 +1210,9 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (mp->IsCareer())
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pPlayer)
continue;
@ -1232,7 +1232,7 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
{
// reset damage time countdown for each type of time based damage player just sustained
for (int i = 0; i < CDMG_TIMEBASED; i++)
for (int i = 0; i < CDMG_TIMEBASED; ++i)
{
if (bitsDamageType & (DMG_PARALYZE << i))
m_rgbTimeBasedDamage[i] = 0;
@ -1253,9 +1253,9 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
WRITE_BYTE((int)Q_max(pev->health, 0.0f) | DRC_FLAG_FACEPLAYER);
MESSAGE_END();
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pPlayer || pPlayer->m_hObserverTarget != this)
continue;
@ -1453,9 +1453,9 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (mp->IsCareer())
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pPlayer)
continue;
@ -1475,7 +1475,7 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
{
// reset damage time countdown for each type of time based damage player just sustained
for (int i = 0; i < CDMG_TIMEBASED; i++)
for (int i = 0; i < CDMG_TIMEBASED; ++i)
{
if (bitsDamageType & (DMG_PARALYZE << i))
m_rgbTimeBasedDamage[i] = 0;
@ -1496,9 +1496,9 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
WRITE_BYTE((int)Q_max(pev->health, 0.0f) | DRC_FLAG_FACEPLAYER);
MESSAGE_END();
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pPlayer)
continue;
@ -1665,7 +1665,7 @@ void CBasePlayer::RemoveAllItems(BOOL removeSuit)
}
m_pLastItem = NULL;
for (i = 0; i < MAX_ITEM_TYPES; i++)
for (i = 0; i < MAX_ITEM_TYPES; ++i)
{
m_pActiveItem = m_rgpPlayerItems[i];
@ -1691,7 +1691,7 @@ void CBasePlayer::RemoveAllItems(BOOL removeSuit)
else
pev->weapons &= ~WEAPON_ALLWEAPONS;
for (i = 0; i < MAX_AMMO_SLOTS; i++)
for (i = 0; i < MAX_AMMO_SLOTS; ++i)
m_rgAmmo[i] = 0;
UpdateClientData();
@ -2043,9 +2043,9 @@ void CBasePlayer::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
wasBlind = true;
}
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pPlayer)
continue;
@ -2076,7 +2076,7 @@ void CBasePlayer::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pObserver)
continue;
@ -3016,7 +3016,7 @@ BOOL CBasePlayer::IsOnLadder(void)
/* <160720> ../cstrike/dlls/player.cpp:3387 */
NOXREF void CBasePlayer::ThrowWeapon(char *pszItemName)
{
for (int i = 0; i < MAX_WEAPON_SLOTS; i++)
for (int i = 0; i < MAX_WEAPON_SLOTS; ++i)
{
CBasePlayerItem *pWeapon = m_rgpPlayerItems[i];
@ -4006,7 +4006,7 @@ void CBasePlayer::PlayerUse(void)
if (!pClosest)
{
while ((pObject = UTIL_FindEntityInSphere(pObject, pev->origin, PLAYER_SEARCH_RADIUS)) != NULL)
while ((pObject = UTIL_FindEntityInSphere(pObject, pev->origin, PLAYER_USE_RADIUS)) != NULL)
{
if (pObject->ObjectCaps() & (FCAP_IMPULSE_USE | FCAP_CONTINUOUS_USE | FCAP_ONOFF_USE))
{
@ -4141,7 +4141,7 @@ NOXREF void FixPlayerCrouchStuck(edict_t *pPlayer)
TraceResult trace;
// Move up as many as 18 pixels if the player is stuck.
for (int i = 0; i < 18; i++)
for (int i = 0; i < 18; ++i)
{
UTIL_TraceHull(pPlayer->v.origin, pPlayer->v.origin, dont_ignore_monsters, head_hull, pPlayer, &trace);
@ -4200,9 +4200,9 @@ void CBasePlayer::__MAKE_VHOOK(AddPointsToTeam)(int score, BOOL bAllowNegativeSc
{
int index = entindex();
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer != NULL && i != index)
{
@ -4571,7 +4571,7 @@ void CBasePlayer::CheckTimeBasedDamage(void)
m_tbdPrev = gpGlobals->time;
for (i = 0; i < CDMG_TIMEBASED; i++)
for (i = 0; i < CDMG_TIMEBASED; ++i)
{
// make sure bit is set for damage type
if (m_bitsDamageType & (DMG_PARALYZE << i))
@ -4704,7 +4704,7 @@ void CBasePlayer::CheckSuitUpdate(void)
if (gpGlobals->time >= m_flSuitUpdate && m_flSuitUpdate > 0)
{
// play a sentence off of the end of the queue
for (i = 0; i < CSUITPLAYLIST; i++)
for (i = 0; i < CSUITPLAYLIST; ++i)
{
if (isentence = m_rgSuitPlayList[ isearch ])
break;
@ -4978,7 +4978,7 @@ pt_end:
#ifdef CLIENT_WEAPONS
// Decay timers on weapons
// go through all of the weapons and make a list of the ones to pack
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
if (m_rgpPlayerItems[i])
{
@ -5370,7 +5370,7 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)(void)
m_iNumSpawns++;
InitStatusBar();
for (i = 0; i < MAX_RECENT_PATH; i++)
for (i = 0; i < MAX_RECENT_PATH; ++i)
m_vRecentPath[ i ] = Vector(0, 0, 0);
if (m_pActiveItem != NULL && !pev->viewmodel)
@ -5461,7 +5461,7 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)(void)
{
m_iClientHideHUD = -1;
for (i = 0; i < MAX_AMMO_SLOTS; i++)
for (i = 0; i < MAX_AMMO_SLOTS; ++i)
m_rgAmmo[i] = 0;
m_bHasPrimary = false;
@ -5471,7 +5471,7 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)(void)
}
else
{
for (i = 0; i < MAX_AMMO_SLOTS; i++)
for (i = 0; i < MAX_AMMO_SLOTS; ++i)
m_rgAmmoLast[i] = -1;
}
@ -5481,9 +5481,9 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)(void)
m_bNightVisionOn = false;
for (i = 1; i <= gpGlobals->maxClients; i++)
for (i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pObserver && pObserver->IsObservingPlayer(this))
{
@ -5571,7 +5571,7 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)(void)
sv_aim = CVAR_GET_POINTER("sv_aim");
for (i = 0; i < ARRAYSIZE(m_flLastCommandTime); i++)
for (i = 0; i < ARRAYSIZE(m_flLastCommandTime); ++i)
m_flLastCommandTime[i] = -1;
}
@ -5635,9 +5635,9 @@ void CBasePlayer::SetScoreboardAttributes(CBasePlayer *destination)
return;
}
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (player != NULL && !FNullEnt(player->edict()))
SetScoreboardAttributes(player);
@ -5789,7 +5789,7 @@ void CBasePlayer::SelectItem(const char *pstr)
CBasePlayerItem *pItem = NULL;
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
pItem = m_rgpPlayerItems[ i ];
@ -5849,7 +5849,7 @@ void CBasePlayer::SelectLastItem(void)
if (!m_pLastItem || m_pLastItem == m_pActiveItem)
{
for (int i = 1; i < MAX_ITEMS; i++)
for (int i = 1; i < MAX_ITEMS; ++i)
{
CBasePlayerItem *pItem = m_rgpPlayerItems[i];
if (pItem != NULL && pItem != m_pActiveItem)
@ -5896,7 +5896,7 @@ void CBasePlayer::SelectLastItem(void)
/* <15733a> ../cstrike/dlls/player.cpp:6967 */
BOOL CBasePlayer::HasWeapons(void)
{
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
if (m_rgpPlayerItems[i] != NULL)
return TRUE;
@ -6319,7 +6319,7 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse)
{
float bloodRange = r * 50.0f;
for (int i = 0; i < 50; i++)
for (int i = 0; i < 50; ++i)
{
dir.x = RANDOM_FLOAT(-1, 1);
dir.y = RANDOM_FLOAT(-1, 1);
@ -6656,7 +6656,7 @@ int CBasePlayer::GetAmmoIndex(const char *psz)
if (!psz)
return -1;
for (int i = 1; i < MAX_AMMO_SLOTS; i++)
for (int i = 1; i < MAX_AMMO_SLOTS; ++i)
{
if (!IMPL_CLASS(CBasePlayerItem, AmmoInfoArray)[ i ].pszName)
continue;
@ -6670,7 +6670,7 @@ int CBasePlayer::GetAmmoIndex(const char *psz)
/* <158bf7> ../cstrike/dlls/player.cpp:7865 */
void CBasePlayer::SendAmmoUpdate(void)
{
for (int i = 0; i < MAX_AMMO_SLOTS; i++)
for (int i = 0; i < MAX_AMMO_SLOTS; ++i)
{
if (m_rgAmmo[i] != m_rgAmmoLast[i])
{
@ -7020,7 +7020,7 @@ void CBasePlayer::__MAKE_VHOOK(UpdateClientData)(void)
SendAmmoUpdate();
// Update all the items
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
if (m_rgpPlayerItems[i])
{
@ -7069,7 +7069,7 @@ void CBasePlayer::__MAKE_VHOOK(UpdateClientData)(void)
if ((pev->origin - m_vLastOrigin).Length() >= 64)
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pEntity = UTIL_PlayerByIndex(i);
@ -7428,7 +7428,7 @@ void CBasePlayer::UpdateStatusBar(void)
}
// Check values and send if they don't match
for (int i = 1; i < SBAR_END; i++)
for (int i = 1; i < SBAR_END; ++i)
{
if (newSBarState[ i ] != m_izSBarState[ i ] || bForceResend)
{
@ -7464,7 +7464,7 @@ void CBasePlayer::DropPlayerItem(const char *pszItemName)
return;
}
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
CBasePlayerItem *pWeapon = m_rgpPlayerItems[i];
@ -7611,7 +7611,7 @@ BOOL CBasePlayer::HasNamedPlayerItem(const char *pszItemName)
CBasePlayerItem *pItem;
int i;
for (i = 0; i < MAX_ITEM_TYPES; i++)
for (i = 0; i < MAX_ITEM_TYPES; ++i)
{
pItem = m_rgpPlayerItems[ i ];
@ -7765,7 +7765,7 @@ void CBasePlayer::SwitchTeam(void)
SendItemStatus(this);
SetProgressBarTime(0);
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
m_pActiveItem = m_rgpPlayerItems[ i ];
@ -7790,7 +7790,7 @@ void CBasePlayer::SwitchTeam(void)
szNewTeam
);
CCSBot *pBot = reinterpret_cast<CCSBot *>(this);
CCSBot *pBot = static_cast<CCSBot *>(this);
if (pBot->IsBot())
{
@ -8257,7 +8257,7 @@ void CBasePlayer::ResetStamina(void)
float_precision GetPlayerPitch(const edict_t *pEdict)
{
entvars_t *pev = VARS((edict_t *)pEdict);
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(CBasePlayer::Instance(pev));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(CBasePlayer::Instance(pev));
if (!pPlayer)
return 0.0f;
@ -8269,7 +8269,7 @@ float_precision GetPlayerPitch(const edict_t *pEdict)
float_precision GetPlayerYaw(const edict_t *pEdict)
{
entvars_t *pev = VARS((edict_t *)pEdict);
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(CBasePlayer::Instance(pev));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(CBasePlayer::Instance(pev));
if (!pPlayer)
return 0.0f;
@ -8281,7 +8281,7 @@ float_precision 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 = static_cast<CBasePlayer *>(CBasePlayer::Instance(pev));
if (!pPlayer)
return 1;
@ -8424,7 +8424,7 @@ bool CBasePlayer::CanAffordPrimary(void)
if (m_iTeam == CT)
{
WeaponStruct *temp;
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
temp = &g_weaponStruct[ i ];
@ -8435,7 +8435,7 @@ bool CBasePlayer::CanAffordPrimary(void)
else if (m_iTeam == TERRORIST)
{
WeaponStruct *temp;
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
temp = &g_weaponStruct[ i ];
@ -8452,7 +8452,7 @@ bool CBasePlayer::CanAffordPrimaryAmmo(void)
{
CBasePlayerWeapon *primary = (CBasePlayerWeapon *)&m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ];
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
WeaponStruct *temp = &g_weaponStruct[ i ];
@ -8468,7 +8468,7 @@ bool CBasePlayer::CanAffordSecondaryAmmo(void)
{
CBasePlayerWeapon *secondary = (CBasePlayerWeapon *)&m_rgpPlayerItems[ PISTOL_SLOT ];
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
WeaponStruct *temp = &g_weaponStruct[ i ];
@ -8778,7 +8778,7 @@ const char *CBasePlayer::PickPrimaryCareerTaskWeapon(void)
}
buf[0] = '\0';
primary = reinterpret_cast<CBasePlayerWeapon *>(m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]);
primary = static_cast<CBasePlayerWeapon *>(m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]);
for (CareerTaskListIt it = TheCareerTasks->GetTasks()->begin(); it != TheCareerTasks->GetTasks()->end(); ++it)
{
@ -8831,7 +8831,7 @@ const char *CBasePlayer::PickPrimaryCareerTaskWeapon(void)
return NULL;
}
for (int i = 0; i < taskNum; i++)
for (int i = 0; i < taskNum; ++i)
{
CCareerTask *pTask = taskVector[i];
@ -8859,7 +8859,7 @@ const char *CBasePlayer::PickSecondaryCareerTaskWeapon(void)
return NULL;
}
secondary = reinterpret_cast<CBasePlayerWeapon *>(m_rgpPlayerItems[PISTOL_SLOT]);
secondary = static_cast<CBasePlayerWeapon *>(m_rgpPlayerItems[PISTOL_SLOT]);
for (CareerTaskListIt it = TheCareerTasks->GetTasks()->begin(); it != TheCareerTasks->GetTasks()->end(); ++it)
{
@ -8914,7 +8914,7 @@ const char *CBasePlayer::PickSecondaryCareerTaskWeapon(void)
buf[0] = '\0';
for (int i = 0; i < taskNum; i++)
for (int i = 0; i < taskNum; ++i)
{
CCareerTask *pTask = taskVector[i];
@ -9000,7 +9000,7 @@ void CBasePlayer::PrioritizeAutoBuyString(char *autobuyString, const char *prior
// get the next token from the priority string.
while (*priorityChar != '\0' && *priorityChar != ' ')
{
priorityToken[ i++ ] = *priorityChar;
priorityToken[i++] = *priorityChar;
++priorityChar;
}
@ -9159,7 +9159,7 @@ AutoBuyInfoStruct *CBasePlayer::GetAutoBuyCommandInfo(const char *command)
if (Q_stricmp(temp->m_command, command) == 0)
ret = temp;
i++;
++i;
}
return ret;
@ -9377,7 +9377,7 @@ void CBasePlayer::RebuyHEGrenade(void)
int numToBuy = m_rebuyStruct.m_heGrenade - m_rgAmmo[ iAmmoIndex ];
for (int i = 0; i < numToBuy; i++)
for (int i = 0; i < numToBuy; ++i)
ClientCommand("hegren");
}
@ -9391,7 +9391,7 @@ void CBasePlayer::RebuyFlashbang(void)
int numToBuy = m_rebuyStruct.m_flashbang - m_rgAmmo[ iAmmoIndex ];
for (int i = 0; i < numToBuy; i++)
for (int i = 0; i < numToBuy; ++i)
ClientCommand("flash");
}
@ -9405,7 +9405,7 @@ void CBasePlayer::RebuySmokeGrenade(void)
int numToBuy = m_rebuyStruct.m_smokeGrenade - m_rgAmmo[ iAmmoIndex ];
for (int i = 0; i < numToBuy; i++)
for (int i = 0; i < numToBuy; ++i)
ClientCommand("sgren");
}
@ -9488,9 +9488,9 @@ void CBasePlayer::UpdateLocation(bool forceUpdate)
m_flLastUpdateTime = gpGlobals->time;
Q_snprintf(m_lastLocation, sizeof(m_lastLocation), "#%s", placeName);
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!player)
continue;

View File

@ -50,7 +50,7 @@
#define PLAYER_FATAL_FALL_SPEED 1100.0f
#define PLAYER_MAX_SAFE_FALL_SPEED 500.0f
#define PLAYER_SEARCH_RADIUS 64.0f
#define PLAYER_USE_RADIUS 64.0f
#define ARMOR_RATIO 0.5 // Armor Takes 50% of the damage
#define ARMOR_BONUS 0.5 // Each Point of Armor is work 1/x points of health

View File

@ -1058,11 +1058,11 @@ void USENTENCEG_InitLRU(unsigned char *plru, int count)
if (count > CSENTENCE_LRU_MAX)
count = CSENTENCE_LRU_MAX;
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
plru[i] = (unsigned char)i;
// randomize array
for (i = 0; i < (count * 4); i++)
for (i = 0; i < (count * 4); ++i)
{
j = RANDOM_LONG(0, count - 1);
k = RANDOM_LONG(0, count - 1);
@ -1148,7 +1148,7 @@ int USENTENCEG_Pick(int isentenceg, char *szfound)
while (!ffound)
{
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
{
if (plru[i] != 0xFF)
{
@ -1194,7 +1194,7 @@ int SENTENCEG_GetIndex(const char *szgroupname)
if (!Q_strcmp(szgroupname, rgsentenceg[i].szgroupname))
return i;
i++;
++i;
}
return -1;
@ -1339,7 +1339,7 @@ void SENTENCEG_Init(void)
// skip whitespace
i = 0;
while (buffer[i] && buffer[i] == ' ')
i++;
++i;
if (!buffer[i])
continue;
@ -1428,7 +1428,7 @@ void SENTENCEG_Init(void)
while (rgsentenceg[i].count && i < CSENTENCEG_MAX)
{
USENTENCEG_InitLRU(&(rgsentenceg[i].rgblru[0]), rgsentenceg[i].count);
i++;
++i;
}
}
@ -1442,7 +1442,7 @@ int SENTENCEG_Lookup(const char *sample, char *sentencenum)
// this is a sentence name; lookup sentence number
// and give to engine as string.
for (i = 0; i < gcallsentences; i++)
for (i = 0; i < gcallsentences; ++i)
{
if (!Q_stricmp(gszallsentencenames[i], sample + 1))
{
@ -1552,7 +1552,7 @@ char *memfgets(byte *pMemFile, int fileSize, int &filePos, char *pBuffer, int bu
{
if (pMemFile[i] == '\n')
stop = 1;
i++;
++i;
}
// If we actually advanced the pointer, copy it over
@ -1604,7 +1604,7 @@ void TEXTURETYPE_Init(void)
// skip whitespace
i = 0;
while (buffer[i] && isspace(buffer[i]))
i++;
++i;
if (!buffer[i])
continue;
@ -1618,7 +1618,7 @@ void TEXTURETYPE_Init(void)
// skip whitespace
while (buffer[i] && isspace(buffer[i]))
i++;
++i;
if (!buffer[i])
continue;
@ -1653,7 +1653,7 @@ char TEXTURETYPE_Find(char *name)
{
// CONSIDER: pre-sort texture names and perform faster binary search here
for (int i = 0; i < gcTextures; i++)
for (int i = 0; i < gcTextures; ++i)
{
if (!Q_strnicmp(name, &(grgszTextureName[ i ][0]), CBTEXTURENAMEMAX - 1))
return (grgchTextureType[ i ]);

View File

@ -220,7 +220,7 @@ void CSoundEnt::Initialize(void)
m_iActiveSound = SOUNDLIST_EMPTY;
// clear all sounds, and link them into the free sound list.
for (i = 0; i < MAX_WORLD_SOUNDS; i++)
for (i = 0; i < MAX_WORLD_SOUNDS; ++i)
{
m_SoundPool[ i ].Clear();
m_SoundPool[ i ].m_iNext = i + 1;
@ -230,7 +230,7 @@ void CSoundEnt::Initialize(void)
m_SoundPool[ i - 1 ].m_iNext = SOUNDLIST_EMPTY;
// now reserve enough sounds for each client
for (i = 0; i < gpGlobals->maxClients; i++)
for (i = 0; i < gpGlobals->maxClients; ++i)
{
iSound = pSoundEnt->IAllocSound();
@ -284,8 +284,7 @@ int CSoundEnt::ISoundsInList(int iListType)
while (iThisSound != SOUNDLIST_EMPTY)
{
i++;
++i;
iThisSound = m_SoundPool[ iThisSound ].m_iNext;
}

View File

@ -113,7 +113,7 @@ void CBaseEntity::UpdateOnRemove(void)
{
// this entity was a LinkEnt in the world node graph, so we must remove it from
// the graph since we are removing it from the world.
for (i = 0; i < WorldGraph.m_cLinks; i++)
for (i = 0; i < WorldGraph.m_cLinks; ++i)
{
if (WorldGraph.m_pLinkPool[i].m_pLinkEnt == pev)
{

View File

@ -501,7 +501,7 @@ void CFuncWeaponCheck::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
return;
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
for (int i = 1; i <= iItemCount; i++)
for (int i = 1; i <= iItemCount; ++i)
{
if (iAnyWeapon)
{

View File

@ -276,7 +276,7 @@ void CMultiManager::__MAKE_VHOOK(Spawn)(void)
while (swapped)
{
swapped = 0;
for (int i = 1; i < m_cTargets; i++)
for (int i = 1; i < m_cTargets; ++i)
{
if (m_flTargetDelay[i] < m_flTargetDelay[i - 1])
{
@ -299,7 +299,7 @@ void CMultiManager::__MAKE_VHOOK(Restart)(void)
{
edict_t *pentTarget = NULL;
for (int i = 0; i < m_cTargets; i++)
for (int i = 0; i < m_cTargets; ++i)
{
const char *name = STRING(m_iTargetName[i]);
@ -334,7 +334,7 @@ void CMultiManager::__MAKE_VHOOK(Restart)(void)
/* <1a1402> ../cstrike/dlls/triggers.cpp:420 */
BOOL CMultiManager::__MAKE_VHOOK(HasTarget)(string_t targetname)
{
for (int i = 0; i < m_cTargets; i++)
for (int i = 0; i < m_cTargets; ++i)
{
if (FStrEq(STRING(targetname), STRING(m_iTargetName[i])))
{
@ -1363,7 +1363,7 @@ int CChangeLevel::AddTransitionToList(LEVELLIST *pLevelList, int listCount, cons
return 0;
}
for (i = 0; i < listCount; i++)
for (i = 0; i < listCount; ++i)
{
if (pLevelList[i].pentLandmark == pentLandmark && Q_strcmp(pLevelList[i].mapName, pMapName) == 0)
{
@ -1477,7 +1477,7 @@ int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList)
{
CSave saveHelper((SAVERESTOREDATA *)gpGlobals->pSaveData);
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
{
int j, entityCount = 0;
CBaseEntity *pEntList[ MAX_ENTITY ];
@ -1788,7 +1788,7 @@ void CBuyZone::BuyTouch(CBaseEntity *pOther)
if (!pOther->IsPlayer())
return;
CBasePlayer *p = reinterpret_cast<CBasePlayer *>(pOther);
CBasePlayer *p = static_cast<CBasePlayer *>(pOther);
if (pev->team == UNASSIGNED || pev->team == p->m_iTeam)
{
@ -1814,7 +1814,7 @@ void CBombTarget::BombTargetTouch(CBaseEntity *pOther)
if (!pOther->IsPlayer())
return;
CBasePlayer *p = reinterpret_cast<CBasePlayer *>(pOther);
CBasePlayer *p = static_cast<CBasePlayer *>(pOther);
if (p->m_bHasC4)
{
@ -1869,7 +1869,7 @@ void CEscapeZone::EscapeTouch(CBaseEntity *pOther)
if (!pOther->IsPlayer())
return;
CBasePlayer *p = reinterpret_cast<CBasePlayer *>(pOther);
CBasePlayer *p = static_cast<CBasePlayer *>(pOther);
switch (p->m_iTeam)
{
@ -1887,9 +1887,9 @@ void CEscapeZone::EscapeTouch(CBaseEntity *pOther)
GETPLAYERAUTHID(p->edict())
);
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer == NULL || FNullEnt(pPlayer->pev))
continue;
@ -1923,7 +1923,7 @@ void CVIP_SafetyZone::VIP_SafetyTouch(CBaseEntity *pOther)
if (!pOther->IsPlayer())
return;
CBasePlayer *p = reinterpret_cast<CBasePlayer *>(pOther);
CBasePlayer *p = static_cast<CBasePlayer *>(pOther);
p->m_signals.Signal(SIGNAL_VIPSAFETY);
if (p->m_bIsVIP)

View File

@ -91,9 +91,9 @@ void MonitorTutorStatus(void)
else
tutor_enableCvarExists = false;
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (pPlayer && !pPlayer->IsBot())
{

View File

@ -3075,105 +3075,90 @@ void CCSTutor::CheckExamineMessages(float time)
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;
}
CBaseEntity *entity = NULL;
bool isPlayerLooking = false;
if (i == YOU_SEE_FRIEND_CORPSE || i == YOU_SEE_ENEMY_CORPSE)
while ((entity = GetEntityForMessageID(i, entity)) != NULL)
{
if (IsPlayerLookingAtPosition((Vector *)entity, localPlayer))
if (i == YOU_SEE_FRIEND_CORPSE || i == YOU_SEE_ENEMY_CORPSE)
{
if (IsPlayerLookingAtPosition((Vector *)entity, localPlayer))
{
isPlayerLooking = true;
break;
}
}
else if (i == YOU_SEE_HOSTAGE_CT_EXAMINE || i == YOU_SEE_FRIEND || i == YOU_SEE_ENEMY)
{
if (IsPlayerLookingAtEntity(entity, localPlayer))
{
isPlayerLooking = true;
break;
}
}
else if (IsPlayerLookingAtPosition(&entity->pev->origin, localPlayer))
{
isPlayerLooking = true;
break;
}
}
else if (i == YOU_SEE_HOSTAGE_CT_EXAMINE || i == YOU_SEE_FRIEND || i == YOU_SEE_ENEMY)
if (isPlayerLooking)
{
if (IsPlayerLookingAtEntity(entity, localPlayer))
if (message->m_examineStartTime == -1.0f)
continue;
if (time - message->m_examineStartTime <= cv_tutor_examine_time.value)
continue;
bool validEntity = false;
if (i == YOU_SEE_FRIEND)
{
isPlayerLooking = true;
CBasePlayer *player = static_cast<CBasePlayer *>(entity);
if (player->IsPlayer() && player->IsAlive() && player->m_iTeam == localPlayer->m_iTeam)
validEntity = true;
}
else if (i == YOU_SEE_ENEMY)
{
CBasePlayer *player = static_cast<CBasePlayer *>(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 = static_cast<CHostage *>(entity);
if (entity->pev->takedamage == DAMAGE_YES)
{
if (!hostage->IsFollowingSomeone())
validEntity = true;
}
if (!hostage->IsValid() || !validEntity)
continue;
}
if (validEntity)
{
CreateAndAddEventToList((TutorMessageID)i, entity);
}
}
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 = static_cast<CBasePlayer *>(entity);
if (player->IsPlayer() && player->IsAlive() && player->m_iTeam == localPlayer->m_iTeam)
validEntity = true;
}
else if (i == YOU_SEE_ENEMY)
{
CBasePlayer *player = static_cast<CBasePlayer *>(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 = static_cast<CHostage *>(entity);
if (entity->pev->takedamage == DAMAGE_YES)
{
if (!hostage->IsFollowingSomeone())
validEntity = true;
}
if (!hostage->IsValid() || !validEntity)
continue;
}
if (validEntity)
{
CreateAndAddEventToList((TutorMessageID)i, entity);
}
message->m_examineStartTime = -1.0f;
}
}

View File

@ -123,7 +123,7 @@ int g_groupop = 0;
const int gSizes[18] = { 4, 4, 4, 4, 4, 4, 4, 12, 12, 4, 4, 4, 4, 2, 1, 4, 4, 4 };
#else //HOOK_GAMEDLL
#else // HOOK_GAMEDLL
unsigned int seed_table[256];
TYPEDESCRIPTION gEntvarsDescription[86];
@ -133,7 +133,7 @@ int g_groupmask;
const int gSizes[18];
#endif //HOOK_GAMEDLL
#endif // HOOK_GAMEDLL
float UTIL_WeaponTimeBase(void)
{
@ -283,6 +283,7 @@ NOXREF float UTIL_AngleDiff(float destAngle, float srcAngle)
if (delta <= -180.0f)
delta += 360.0f;
}
return delta;
}
@ -312,7 +313,7 @@ int UTIL_EntitiesInBox(CBaseEntity **pList, int listMax, const Vector &mins, con
if (!pEdict)
return 0;
for (int i = 1; i < gpGlobals->maxEntities; i++, pEdict++)
for (int i = 1; i < gpGlobals->maxEntities; ++i, ++pEdict)
{
if (pEdict->free)
continue;
@ -356,12 +357,12 @@ NOXREF int UTIL_MonstersInSphere(CBaseEntity ** pList, int listMax, const Vector
if (!pEdict)
return count;
for (int i = 1; i < gpGlobals->maxEntities; i++, pEdict++)
for (int i = 1; i < gpGlobals->maxEntities; ++i, ++pEdict)
{
if (pEdict->free)
continue;
if (!(pEdict->v.flags & (FL_CLIENT|FL_MONSTER)))
if (!(pEdict->v.flags & (FL_CLIENT | FL_MONSTER)))
continue;
delta = center.x - pEdict->v.origin.x;
@ -404,7 +405,7 @@ NOXREF int UTIL_MonstersInSphere(CBaseEntity ** pList, int listMax, const Vector
CBaseEntity *UTIL_FindEntityInSphere(CBaseEntity *pStartEntity, const Vector &vecCenter, float flRadius)
{
edict_t *pentEntity;
if (pStartEntity)
if (pStartEntity != NULL)
pentEntity = pStartEntity->edict();
else
pentEntity = NULL;
@ -422,7 +423,7 @@ CBaseEntity *UTIL_FindEntityInSphere(CBaseEntity *pStartEntity, const Vector &ve
CBaseEntity *UTIL_FindEntityByString_Old(CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue)
{
edict_t *pentEntity;
if (pStartEntity)
if (pStartEntity != NULL)
pentEntity = pStartEntity->edict();
else
pentEntity = NULL;
@ -535,7 +536,7 @@ CBaseEntity *UTIL_FindEntityGeneric(const char *szWhatever, const Vector &vecSrc
{
CBaseEntity *pSearch = NULL;
CBaseEntity *pEntity = UTIL_FindEntityByTargetname(NULL, szWhatever);
if (pEntity)
if (pEntity != NULL)
return pEntity;
float flMaxDist2 = flRadius * flRadius;
@ -549,6 +550,7 @@ CBaseEntity *UTIL_FindEntityGeneric(const char *szWhatever, const Vector &vecSrc
flMaxDist2 = flDist2;
}
}
return pEntity;
}
@ -645,7 +647,7 @@ void UTIL_ScreenShake(const Vector &center, float amplitude, float frequency, fl
shake.duration = FixedUnsigned16(duration, 1<<12);
shake.frequency = FixedUnsigned16(frequency, 1<<8);
for (i = 1; i <= gpGlobals->maxClients; i++)
for (i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pPlayer = UTIL_PlayerByIndex(i);
if (!pPlayer || !(pPlayer->pev->flags & FL_ONGROUND))
@ -717,7 +719,7 @@ void UTIL_ScreenFadeAll(const Vector &color, float fadeTime, float fadeHold, int
int i;
ScreenFade fade;
UTIL_ScreenFadeBuild(fade, color, fadeTime, fadeHold, alpha, flags);
for (i = 1; i <= gpGlobals->maxClients; i++)
for (i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pPlayer = UTIL_PlayerByIndex(i);
UTIL_ScreenFadeWrite(fade, pPlayer);
@ -779,10 +781,10 @@ void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, cons
/* <1ae1bf> ../cstrike/dlls/util.cpp:963 */
void UTIL_HudMessageAll(const hudtextparms_t &textparms, const char *pMessage)
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pPlayer = UTIL_PlayerByIndex(i);
if (pPlayer)
if (pPlayer != NULL)
UTIL_HudMessage(pPlayer, textparms, pMessage);
}
}
@ -877,14 +879,14 @@ NOXREF char *UTIL_dtos4(int d)
/* <1ae6c6> ../cstrike/dlls/util.cpp:1061 */
void UTIL_ShowMessageArgs(const char *pString, CBaseEntity *pPlayer, CUtlVector<char *> *args, bool isHint)
{
if (pPlayer && pPlayer->IsNetClient())
if (pPlayer != NULL && pPlayer->IsNetClient())
{
MESSAGE_BEGIN(MSG_ONE, gmsgHudTextArgs, NULL, pPlayer->pev);
WRITE_STRING(pString);
WRITE_BYTE(isHint);
WRITE_BYTE(args->Count());
for (int i = 0; i < args->Count(); i++)
for (int i = 0; i < args->Count(); ++i)
WRITE_STRING(args->Element(i));
MESSAGE_END();
@ -913,10 +915,10 @@ void UTIL_ShowMessage(const char *pString, CBaseEntity *pEntity, bool isHint)
/* <1ae8ac> ../cstrike/dlls/util.cpp:1095 */
void UTIL_ShowMessageAll(const char *pString, bool isHint)
{
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBaseEntity *pPlayer = UTIL_PlayerByIndex(i);
if (pPlayer)
if (pPlayer != NULL)
UTIL_ShowMessage(pString, pPlayer, isHint);
}
}
@ -980,7 +982,8 @@ float UTIL_VecToYaw(const Vector &vec)
void UTIL_SetOrigin(entvars_t *pev, const Vector &vecOrigin)
{
edict_t *ent = ENT(pev);
if (ent)
if (ent != NULL)
SET_ORIGIN(ent, vecOrigin);
}
@ -1000,6 +1003,7 @@ float UTIL_Approach(float target, float value, float speed)
value -= speed;
else
value = target;
return value;
}
@ -1024,6 +1028,7 @@ float_precision UTIL_ApproachAngle(float target, float value, float speed)
value -= speed;
else
value = target;
return value;
}
@ -1105,6 +1110,7 @@ BOOL UTIL_ShouldShowBlood(int color)
return TRUE;
}
}
return FALSE;
}
@ -1231,6 +1237,7 @@ void UTIL_DecalTrace(TraceResult *pTrace, int decalNumber)
index -= 256;
}
}
MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY);
WRITE_BYTE(message);
WRITE_COORD(pTrace->vecEndPos.x);
@ -1330,6 +1337,7 @@ BOOL UTIL_TeamsMatch(const char *pTeamName1, const char *pTeamName2)
if (!Q_stricmp(pTeamName1, pTeamName2))
return TRUE;
}
return FALSE;
}
@ -1506,7 +1514,7 @@ void UTIL_BubbleTrail(Vector from, Vector to, int count)
/* <1afcfe> ../cstrike/dlls/util.cpp:1731 */
void UTIL_Remove(CBaseEntity *pEntity)
{
if (pEntity)
if (pEntity != NULL)
{
pEntity->UpdateOnRemove();
pEntity->pev->flags |= FL_KILLME;
@ -1570,9 +1578,9 @@ void UTIL_StripToken(const char *pKey, char *pDest)
while (pKey[i] && pKey[i] != '#')
{
pDest[i] = pKey[i];
i++;
++i;
}
pDest[i] = 0;
pDest[i] = '\0';
}
/* <1b003a> ../cstrike/dlls/util.cpp:1847 */
@ -1623,12 +1631,13 @@ int CSaveRestoreBuffer::EntityIndex(edict_t *pentLookup)
if (!m_pdata || !pentLookup)
return -1;
for (int i = 0; i < m_pdata->tableCount; i++)
for (int i = 0; i < m_pdata->tableCount; ++i)
{
ENTITYTABLE *pTable = &m_pdata->pTable[i];
if (pTable->pent == pentLookup)
return i;
}
return -1;
}
@ -1638,12 +1647,13 @@ edict_t *CSaveRestoreBuffer::EntityFromIndex(int entityIndex)
if (!m_pdata || entityIndex < 0)
return NULL;
for (int i = 0; i < m_pdata->tableCount; i++)
for (int i = 0; i < m_pdata->tableCount; ++i)
{
ENTITYTABLE *pTable = &m_pdata->pTable[i];
if (pTable->id == entityIndex)
return pTable->pent;
}
return NULL;
}
@ -1691,6 +1701,7 @@ extern "C"
if (lobit)
num |= 0x80000000;
}
return num;
}
}
@ -1710,7 +1721,7 @@ unsigned int CSaveRestoreBuffer::HashString(const char *pszToken)
unsigned short CSaveRestoreBuffer::TokenHash(const char *pszToken)
{
unsigned short hash = (unsigned short)(HashString(pszToken) % (unsigned)m_pdata->tokenCount);
for (int i = 0; i < m_pdata->tokenCount; i++)
for (int i = 0; i < m_pdata->tokenCount; ++i)
{
int index = hash + i;
if (index >= m_pdata->tokenCount)
@ -1757,7 +1768,7 @@ void CSave::WriteTime(const char *pname, const float *data, int count)
int i;
BufferHeader(pname, sizeof(float) * count);
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
{
float tmp = data[0];
@ -1781,11 +1792,11 @@ void CSave::WriteString(const char *pname, const int *stringId, int count)
int i;
int size = 0;
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
size += Q_strlen(STRING(stringId[i])) + 1;
BufferHeader(pname, size);
for (i = 0; i < count; i++)
for (i = 0; i < count; ++i)
{
const char *pString = STRING(stringId[i]);
BufferData(pString, Q_strlen(pString) + 1);
@ -1820,7 +1831,7 @@ NOXREF void CSave::WritePositionVector(const char *pname, const Vector &value)
void CSave::WritePositionVector(const char *pname, const float *value, int count)
{
BufferHeader(pname, sizeof(float) * 3 * count);
for (int i = 0; i < count; i++)
for (int i = 0; i < count; ++i)
{
Vector tmp(value[0], value[1], value[2]);
@ -1846,7 +1857,7 @@ void CSave::WriteFunction(const char *pname, void **data, int count)
/* <1b2e7a> ../cstrike/dlls/util.cpp:2157 */
void EntvarsKeyvalue(entvars_t *pev, KeyValueData *pkvd)
{
for (int i = 0; i < ARRAYSIZE(gEntvarsDescription); i++)
for (int i = 0; i < ARRAYSIZE(gEntvarsDescription); ++i)
{
TYPEDESCRIPTION *pField = &gEntvarsDescription[i];
@ -1898,7 +1909,7 @@ int CSave::WriteFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pFie
int i;
int emptyCount = 0;
for (i = 0; i < fieldCount; i++)
for (i = 0; i < fieldCount; ++i)
{
void *pOutputData = ((char *)pBaseData + pFields[i].fieldOffset);
if (DataEmpty((const char *)pOutputData, pFields[i].fieldSize * gSizes[pFields[i].fieldType]))
@ -1909,7 +1920,7 @@ int CSave::WriteFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pFie
int actualCount = fieldCount - emptyCount;
WriteInt(pname, &actualCount, 1);
for (i = 0; i < fieldCount; i++)
for (i = 0; i < fieldCount; ++i)
{
TYPEDESCRIPTION *pTest = &pFields[i];
void *pOutputData = ((char *)pBaseData + pTest->fieldOffset);
@ -1994,6 +2005,7 @@ int CSave::WriteFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pFie
default: ALERT(at_error, "Bad field type\n");
}
}
return 1;
}
@ -2008,11 +2020,12 @@ NOXREF void CSave::BufferString(char *pdata, int len)
/* <1b3f5d> ../cstrike/dlls/util.cpp:2333 */
int CSave::DataEmpty(const char *pdata, int size)
{
for (int i = 0; i < size; i++)
for (int i = 0; i < size; ++i)
{
if (pdata[i])
return 0;
}
return 1;
}
@ -2064,7 +2077,7 @@ int CRestore::ReadField(void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCoun
if (m_pdata->fUseLandmark)
position = m_pdata->vecLandmarkOffset;
}
for (int i = 0; i < fieldCount; i++)
for (int i = 0; i < fieldCount; ++i)
{
int fieldNumber = (i + startField) % fieldCount;
TYPEDESCRIPTION *pTest = &pFields[fieldNumber];
@ -2244,12 +2257,12 @@ int CRestore::ReadFields(const char *pname, void *pBaseData, TYPEDESCRIPTION *pF
int fileCount = ReadInt();
int lastField = 0;
for (i = 0; i < fieldCount; i++)
for (i = 0; i < fieldCount; ++i)
{
if (!m_global || !(pFields[i].flags & FTYPEDESC_GLOBAL))
Q_memset(((char *)pBaseData + pFields[i].fieldOffset), 0, pFields[i].fieldSize * gSizes[pFields[i].fieldType]);
}
for (i = 0; i < fileCount; i++)
for (i = 0; i < fileCount; ++i)
{
HEADER header;
BufferReadHeader(&header);
@ -2369,6 +2382,7 @@ NOXREF int CRestore::BufferCheckZString(const char *string)
if (!strncmp(string, m_pdata->pCurrentData, len))
return 1;
}
return 0;
}
@ -2402,18 +2416,19 @@ char UTIL_TextureHit(TraceResult *ptr, Vector vecSrc, Vector vecEnd)
pTextureName++;
Q_strcpy(szbuffer, pTextureName);
szbuffer[16] = 0;
szbuffer[16] = '\0';
chTextureType = TEXTURETYPE_Find(szbuffer);
}
else
chTextureType = 0;
chTextureType = '\0';
return chTextureType;
}
/* <1b5330> ../cstrike/dlls/util.cpp:2767 */
NOXREF int GetPlayerTeam(int index)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(index));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(index));
if (pPlayer != NULL)
{
return pPlayer->m_iTeam;
@ -2440,7 +2455,7 @@ bool UTIL_IsGame(const char *gameName)
/* <1b5470> ../cstrike/dlls/util.cpp:2802 */
float_precision UTIL_GetPlayerGaitYaw(int playerIndex)
{
CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(playerIndex));
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(playerIndex));
if (pPlayer != NULL)
{
return pPlayer->m_flGaityaw;

View File

@ -78,7 +78,7 @@ MULTIDAMAGE gMultiDamage;
/* <1d018e> ../cstrike/dlls/weapons.cpp:82 */
int MaxAmmoCarry(int iszName)
{
for (int i = 0; i < MAX_WEAPONS; i++)
for (int i = 0; i < MAX_WEAPONS; ++i)
{
ItemInfo *info = &IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[ i ];
@ -229,7 +229,7 @@ NOXREF void EjectBrass2(const Vector &vecOrigin, const Vector &vecVelocity, floa
void AddAmmoNameToAmmoRegistry(const char *szAmmoname)
{
// make sure it's not already in the registry
for (int i = 0; i < MAX_AMMO_SLOTS; i++)
for (int i = 0; i < MAX_AMMO_SLOTS; ++i)
{
if (!IMPL_CLASS(CBasePlayerItem, AmmoInfoArray)[ i ].pszName)
continue;
@ -1716,7 +1716,7 @@ void CWeaponBox::Kill(void)
int i;
// destroy the weapons
for (i = 0; i < MAX_ITEM_TYPES; i++)
for (i = 0; i < MAX_ITEM_TYPES; ++i)
{
pWeapon = m_rgpPlayerItems[i];
@ -1768,7 +1768,7 @@ void CWeaponBox::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
// go through my weapons and try to give the usable ones to the player.
// it's important the the player be given ammo first, so the weapons code doesn't refuse
// to deploy a better weapon that the player may pick up because he has no ammo for it.
for (int i = 0; i < MAX_ITEM_TYPES; i++)
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
if (!m_rgpPlayerItems[i])
{
@ -2035,7 +2035,7 @@ int CWeaponBox::GiveAmmo(int iCount, char *szName, int iMax, int *pIndex)
{
int i;
for (i = 1; i < MAX_AMMO_SLOTS && !FStringNull(m_rgiszAmmo[i]); i++)
for (i = 1; i < MAX_AMMO_SLOTS && !FStringNull(m_rgiszAmmo[i]); ++i)
{
if (!Q_stricmp(szName, STRING(m_rgiszAmmo[i])))
{
@ -2096,7 +2096,7 @@ BOOL CWeaponBox::IsEmpty(void)
{
int i;
for (i = 0; i < MAX_ITEM_TYPES; i++)
for (i = 0; i < MAX_ITEM_TYPES; ++i)
{
if (m_rgpPlayerItems[i])
{
@ -2104,7 +2104,7 @@ BOOL CWeaponBox::IsEmpty(void)
}
}
for (i = 0; i < MAX_AMMO_SLOTS; i++)
for (i = 0; i < MAX_AMMO_SLOTS; ++i)
{
if (m_rgiszAmmo[i])
{

View File

@ -95,14 +95,6 @@ enum ArmouryItemPack
ARMOURY_SMOKEGRENADE,
};
struct BuyInfo
{
WeaponType type;
bool preferred;
char *buyAlias;
};/* size: 12, cachelines: 1, members: 3 */
struct ItemInfo
{
int iSlot;

View File

@ -247,7 +247,7 @@ const char *BuyAliasToWeaponID(const char *alias, WeaponIdType &id)
{
if (alias)
{
for (int i = 0; weaponBuyAliasInfo[i].alias != NULL; i++)
for (int i = 0; weaponBuyAliasInfo[i].alias != NULL; ++i)
{
if (!Q_stricmp(weaponBuyAliasInfo[i].alias, alias))
{
@ -266,7 +266,7 @@ const char *BuyAliasToWeaponID(const char *alias, WeaponIdType &id)
/* <22cd03> ../cstrike/dlls/weapontype.cpp:246 */
const char *WeaponIDToAlias(int id)
{
for (int i = 0; weaponAliasInfo[i].alias != NULL; i++)
for (int i = 0; weaponAliasInfo[i].alias != NULL; ++i)
{
if (weaponAliasInfo[i].id == id)
return weaponAliasInfo[i].alias;
@ -280,7 +280,7 @@ WeaponClassType AliasToWeaponClass(const char *alias)
{
if (alias != NULL)
{
for (int i = 0; weaponClassAliasInfo[i].alias != NULL; i++)
for (int i = 0; weaponClassAliasInfo[i].alias != NULL; ++i)
{
if (!Q_stricmp(weaponClassAliasInfo[i].alias, alias))
return weaponClassAliasInfo[i].id;
@ -354,7 +354,7 @@ NOXREF bool IsSecondaryWeapon(int id)
/* <22cf48> ../cstrike/dlls/weapontype.cpp:426 */
WeaponInfoStruct *GetWeaponInfo(int weaponID)
{
for (int i = 0; weaponInfo[i].id != 0; i++)
for (int i = 0; weaponInfo[i].id != 0; ++i)
{
if (weaponInfo[i].id == weaponID)
return &weaponInfo[i];
@ -372,63 +372,7 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_XM1014:
case WEAPON_AUG:
case WEAPON_FIVESEVEN:
case WEAPON_UMP45:
case WEAPON_SG550:
case WEAPON_FAMAS:
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_MP5N:
case WEAPON_M249:
case WEAPON_M3:
case WEAPON_M4A1:
case WEAPON_TMP:
case WEAPON_DEAGLE:
case WEAPON_P90:
case WEAPON_SHIELDGUN:
{
return true;
}
default:
{
return false;
}
}
}
else if (playerTeam == TERRORIST)
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_MAC10:
case WEAPON_ELITE:
case WEAPON_UMP45:
case WEAPON_GALIL:
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_AWP:
case WEAPON_DEAGLE:
case WEAPON_AK47:
{
return true;
}
default:
{
return false;
}
}
}
return false;
}
if (playerTeam == CT)
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_SCOUT:
case WEAPON_XM1014:
case WEAPON_AUG:
case WEAPON_FIVESEVEN:
@ -437,7 +381,6 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi
case WEAPON_FAMAS:
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_AWP:
case WEAPON_MP5N:
case WEAPON_M249:
case WEAPON_M3:
@ -446,22 +389,16 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi
case WEAPON_DEAGLE:
case WEAPON_P90:
case WEAPON_SHIELDGUN:
{
return true;
}
default:
{
return false;
}
}
}
else if (playerTeam == TERRORIST)
{
switch (weaponID)
else if (playerTeam == TERRORIST)
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_SCOUT:
case WEAPON_XM1014:
case WEAPON_MAC10:
case WEAPON_ELITE:
case WEAPON_UMP45:
@ -469,22 +406,70 @@ bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasi
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_AWP:
case WEAPON_MP5N:
case WEAPON_M249:
case WEAPON_M3:
case WEAPON_G3SG1:
case WEAPON_DEAGLE:
case WEAPON_SG552:
case WEAPON_AK47:
case WEAPON_P90:
{
return true;
}
default:
{
return false;
}
}
return false;
}
if (playerTeam == CT)
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_SCOUT:
case WEAPON_XM1014:
case WEAPON_AUG:
case WEAPON_FIVESEVEN:
case WEAPON_UMP45:
case WEAPON_SG550:
case WEAPON_FAMAS:
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_AWP:
case WEAPON_MP5N:
case WEAPON_M249:
case WEAPON_M3:
case WEAPON_M4A1:
case WEAPON_TMP:
case WEAPON_DEAGLE:
case WEAPON_P90:
case WEAPON_SHIELDGUN:
return true;
default:
return false;
}
}
else if (playerTeam == TERRORIST)
{
switch (weaponID)
{
case WEAPON_P228:
case WEAPON_SCOUT:
case WEAPON_XM1014:
case WEAPON_MAC10:
case WEAPON_ELITE:
case WEAPON_UMP45:
case WEAPON_GALIL:
case WEAPON_USP:
case WEAPON_GLOCK18:
case WEAPON_AWP:
case WEAPON_MP5N:
case WEAPON_M249:
case WEAPON_M3:
case WEAPON_G3SG1:
case WEAPON_DEAGLE:
case WEAPON_SG552:
case WEAPON_AK47:
case WEAPON_P90:
return true;
default:
return false;
}
}
return false;

View File

@ -338,22 +338,10 @@ enum InventorySlotType
GRENADE_SLOT,
C4_SLOT,
};
enum WeaponType
{
PISTOL = 0,
SHOTGUN,
SUB_MACHINE_GUN,
RIFLE,
MACHINE_GUN,
SNIPER_RIFLE,
GRENADE,
NUM_WEAPON_TYPES,
};
enum Bullet
{
BULLET_NONE = 0,
BULLET_NONE,
BULLET_PLAYER_9MM,
BULLET_PLAYER_MP5,
BULLET_PLAYER_357,
@ -376,26 +364,26 @@ struct AutoBuyInfoStruct
AutoBuyClassType m_class;
char *m_command;
char *m_classname;
};/* size: 12, cachelines: 1, members: 3 */
};
struct WeaponAliasInfo
{
char *alias;
WeaponIdType id;
};/* size: 8, cachelines: 1, members: 2 */
};
struct WeaponBuyAliasInfo
{
char *alias;
WeaponIdType id;
char *failName;
};/* size: 12, cachelines: 1, members: 3 */
};
struct WeaponClassAliasInfo
{
char *alias;
WeaponClassType id;
};/* size: 8, cachelines: 1, members: 2 */
};
struct WeaponInfoStruct
{

View File

@ -330,7 +330,7 @@ int CGlobalState::Save(CSave &save)
}
pEntity = m_pList;
for (i = 0; i < m_listCount && pEntity != NULL; i++)
for (i = 0; i < m_listCount && pEntity != NULL; ++i)
{
if (!save.WriteFields("GENT", pEntity, gGlobalEntitySaveData, ARRAYSIZE(gGlobalEntitySaveData)))
{
@ -362,7 +362,7 @@ int CGlobalState::Restore(CRestore &restore)
// Clear loaded data
m_listCount = 0;
for (i = 0; i < listCount; i++)
for (i = 0; i < listCount; ++i)
{
if (!restore.ReadFields("GENT", &tmpEntity, gGlobalEntitySaveData, ARRAYSIZE(gGlobalEntitySaveData)))
{
@ -605,7 +605,7 @@ void CWorld::__MAKE_VHOOK(Precache)(void)
// 63 testing
LIGHT_STYLE(63, "a");
for (int i = 0; i < ARRAYSIZE(gDecals); i++)
for (int i = 0; i < ARRAYSIZE(gDecals); ++i)
gDecals[i].index = DECAL_INDEX(gDecals[i].name);
// init the WorldGraph.

View File

@ -235,7 +235,7 @@ const char *CBotManager::GetNavMapFilename(void) const
void CBotManager::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBaseEntity *other)
{
// propogate event to all bots
for (int i = 1; i <= gpGlobals->maxClients; i++)
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));

View File

@ -150,7 +150,7 @@ inline void BotProfile::Inherit(const BotProfile *parent, const BotProfile *base
if (parent->m_weaponPreferenceCount != baseline->m_weaponPreferenceCount)
{
m_weaponPreferenceCount = parent->m_weaponPreferenceCount;
for (int i = 0; i<parent->m_weaponPreferenceCount; i++)
for (int i = 0; i < parent->m_weaponPreferenceCount; ++i)
m_weaponPreference[i] = parent->m_weaponPreference[i];
}

View File

@ -318,10 +318,10 @@ inline void SnapToGrid(float *value)
}
// custom
inline float SnapToGrid(float v)
inline float SnapToGrid(float value)
{
int c = v / GenerationStepSize;
return c;
int c = value / GenerationStepSize;
return c * GenerationStepSize;
}
/* <14ea2f> ../game_shared/bot/nav.h:251 */

View File

@ -1053,7 +1053,7 @@ inline CNavArea *FindFirstAreaInDirection(const Vector *start, NavDirType dir, f
Vector pos = *start;
int end = (int)((range / GenerationStepSize) + 0.5f);
for (int i = 1; i <= end; i++)
for (int i = 1; i <= end; ++i)
{
AddDirectionVector(&pos, dir, GenerationStepSize);
@ -1872,7 +1872,7 @@ void GenerateNavigationAreaMesh(void)
while (uncoveredNodes > 0)
{
for (CNavNode *node = CNavNode::GetFirst(); node; node = node->GetNext())
for (CNavNode *node = CNavNode::GetFirst(); node != NULL; node = node->GetNext())
{
if (node->IsCovered())
continue;
@ -2260,7 +2260,7 @@ CNavArea *CNavArea::GetRandomAdjacentArea(NavDirType dir) const
if (i == which)
return (*iter).area;
i++;
++i;
}
return NULL;
@ -2556,7 +2556,7 @@ void CNavArea::DrawMarkedCorner(NavCornerType corner, byte red, byte green, byte
se.x -= border;
se.y -= border;
switch(corner)
switch (corner)
{
case NORTH_WEST:
UTIL_DrawBeamPoints(nw + Vector(0, 0, 10), nw, duration, red, green, blue);
@ -2684,7 +2684,7 @@ const Vector *CNavArea::GetCorner(NavCornerType corner) const
{
static Vector pos;
switch(corner)
switch (corner)
{
case NORTH_WEST:
return &m_extent.lo;
@ -2824,7 +2824,7 @@ void CNavArea::ComputeHidingSpots(void)
}
}
switch(d)
switch (d)
{
case NORTH:
if (extent.lo - m_extent.lo.x >= cornerSize)
@ -3742,7 +3742,6 @@ void CNavArea::DrawConnectedAreas(void)
NavDirType dir = (NavDirType)dirSet[i];
int count = GetAdjacentCount(dir);
for (int a = 0; a < count; ++a)
{
CNavArea *adj = GetAdjacentArea(dir, a);
@ -3787,7 +3786,7 @@ void CNavArea::DrawConnectedAreas(void)
float size = 5.0f;
ComputePortal(adj, dir, &hookPos, &halfWidth);
switch(dir)
switch (dir)
{
case NORTH:
from = hookPos + Vector(0.0f, size, 0.0f);
@ -4086,7 +4085,7 @@ void EditNavAreas(NavEditCmdType cmd)
{
area->DrawConnectedAreas();
switch(cmd)
switch (cmd)
{
case EDIT_TOGGLE_PLACE_MODE:
EMIT_SOUND_DYN(ENT(UTIL_GetLocalPlayer()->pev), CHAN_ITEM, "buttons/blip1.wav", 1, ATTN_NORM, 0, 100);
@ -4790,25 +4789,24 @@ CNavAreaGrid::CNavAreaGrid(void) : m_cellSize(300.0f)
/* <4c4a70> ../game_shared/bot/nav_area.cpp:4953 */
CNavAreaGrid::~CNavAreaGrid(void)
{
delete [] m_grid;
delete[] m_grid;
m_grid = NULL;
}
// Clear the grid
/* <4cf837> ../game_shared/bot/nav_area.cpp:4962 */
void CNavAreaGrid::Reset(void)
{
if (m_grid)
{
// TODO: FIX ME
//delete[] m_grid;
}
delete[] m_grid;
m_grid = NULL;
m_gridSizeX = 0;
m_gridSizeY = 0;
// clear the hash table
for (int i = 0; i < HASH_TABLE_SIZE; i++)
for (int i = 0; i < HASH_TABLE_SIZE; ++i)
m_hashTable[i] = NULL;
m_areaCount = 0;
@ -4817,6 +4815,8 @@ void CNavAreaGrid::Reset(void)
EditNavAreasReset();
}
// Allocate the grid and define its extents
/* <4cf984> ../game_shared/bot/nav_area.cpp:4983 */
void CNavAreaGrid::Initialize(float minX, float maxX, float minY, float maxY)
{
@ -4826,8 +4826,8 @@ void CNavAreaGrid::Initialize(float minX, float maxX, float minY, float maxY)
m_minX = minX;
m_minY = minY;
m_gridSizeX = ((maxX - minX) / m_cellSize) + 1;
m_gridSizeY = ((maxY - minY) / m_cellSize) + 1;
m_gridSizeX = (int)((maxX - minX) / m_cellSize + 1);
m_gridSizeY = (int)((maxY - minY) / m_cellSize + 1);
m_grid = new NavAreaList[ m_gridSizeX * m_gridSizeY ];
}
@ -4846,8 +4846,10 @@ void CNavAreaGrid::AddNavArea(CNavArea *area)
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 ].push_back(const_cast<CNavArea *>(area));
}
// add to hash table
int key = ComputeHashKey(area->GetID());

View File

@ -129,7 +129,7 @@ void PlaceDirectory::Load(SteamFile *file)
// read each entry
char placeName[256];
unsigned short len;
for (int i = 0; i < count; i++)
for (int i = 0; i < count; ++i)
{
file->Read(&len, sizeof(unsigned short));
file->Read(placeName, len);
@ -190,7 +190,7 @@ void CNavArea::Save(int fd, unsigned int version)
// save connections to adjacent areas
// in the enum order NORTH, EAST, SOUTH, WEST
for (int d = 0; d < NUM_DIRECTIONS; d++)
for (int d = 0; d < NUM_DIRECTIONS; ++d)
{
// save number of connections for this direction
unsigned int count = m_connect[d].size();
@ -360,13 +360,13 @@ void CNavArea::Load(SteamFile *file, unsigned int version)
// load connections (IDs) to adjacent areas
// in the enum order NORTH, EAST, SOUTH, WEST
for (int d = 0; d < NUM_DIRECTIONS; d++)
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; i<count; ++i)
for (unsigned int i = 0; i < count; ++i)
{
NavConnect connect;
file->Read(&connect.id, sizeof(unsigned int));
@ -509,7 +509,7 @@ NavErrorType CNavArea::PostLoad(void)
NavErrorType error = NAV_OK;
// connect areas together
for (int d = 0; d < NUM_DIRECTIONS; d++)
for (int d = 0; d < NUM_DIRECTIONS; ++d)
{
NavConnectList::iterator iter;
for (iter = m_connect[d].begin(); iter != m_connect[d].end(); ++iter)
@ -946,7 +946,7 @@ NavErrorType LoadNavigationMap(void)
extent.hi.y = -9999999999.9f;
// load the areas and compute total extent
for (unsigned int i = 0; i < count; i++)
for (unsigned int i = 0; i < count; ++i)
{
CNavArea *area = new CNavArea;
area->Load(&navFile, version);

View File

@ -2514,7 +2514,7 @@ FunctionHook g_FunctionHooks[] =
#ifndef GameRules_Region
//{ 0x01D80C90, "_Z16InstallGameRulesv", (size_t)&InstallGameRules },
{ 0x01D80C90, "_Z16InstallGameRulesv", (size_t)&InstallGameRules }, // HOOK: FIX ME
{ 0x01D80C00, "_ZN10CGameRules16RefreshSkillDataEv", mfunc_ptr_cast(&CGameRules::RefreshSkillData_) },
//{ 0x01D8EBB0, "_ZN10CGameRules10IsTeamplayEv", mfunc_ptr_cast(&CGameRules::IsTeamplay_) }, // DEFAULT
//{ 0x01D8EBC0, "_ZN10CGameRules18GetGameDescriptionEv", mfunc_ptr_cast(&CGameRules::GetGameDescription_) }, // DEFAULT
@ -3746,7 +3746,7 @@ FunctionHook g_FunctionHooks[] =
//{ 0x01D24D10, "_ZN13CCSBotManager15MonitorBotCVarsEv", mfunc_ptr_cast(&CCSBotManager::MonitorBotCVars) },
{ 0x01D24AE0, "_ZN13CCSBotManager16MaintainBotQuotaEv", mfunc_ptr_cast(&CCSBotManager::MaintainBotQuota) },
//{ 0x0, "_ZN13CCSBotManager16GetRandomBotNameENS_9SkillTypeE", mfunc_ptr_cast(&CCSBotManager::GetRandomBotName) },
//{ 0x01D25270, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", mfunc_ptr_cast(&CCSBotManager::AddBot) },
//{ 0x01D25270, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", mfunc_ptr_cast(&CCSBotManager::AddBot) }, // HOOK: FIX ME
{ 0x01D248B0, "_ZN13CCSBotManager13BotAddCommandE18BotProfileTeamTypeb", mfunc_ptr_cast(&CCSBotManager::BotAddCommand) },
//{ 0x01D238A0, "_Z16PrintAllEntitiesv", (size_t)&PrintAllEntities }, // NOXREF
//{ 0x01D23020, "_Z12UTIL_DrawBoxP6Extentiiii", (size_t)&UTIL_DrawBox },
@ -3761,7 +3761,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D20A60, "_ZN6CCSBot10InitializeEPK10BotProfile", mfunc_ptr_cast(&CCSBot::Initialize_) },
{ 0x01D20E40, "_ZN6CCSBot8SpawnBotEv", mfunc_ptr_cast(&CCSBot::SpawnBot_) },
{ 0x01D2D370, "_ZN6CCSBot6UpkeepEv", mfunc_ptr_cast(&CCSBot::Upkeep_) },
//{ 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", mfunc_ptr_cast(&CCSBot::Update_) }, // using refs
//{ 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", mfunc_ptr_cast(&CCSBot::Update_) }, // using refs HOOK: FIX ME
{ 0x01D17370, "_ZN6CCSBot4WalkEv", mfunc_ptr_cast(&CCSBot::Walk_) },
{ 0x01D173A0, "_ZN6CCSBot4JumpEb", mfunc_ptr_cast(&CCSBot::Jump_) },
//{ 0x01D1F990, "_ZN6CCSBot7OnEventE13GameEventTypeP11CBaseEntityS2_", mfunc_ptr_cast(&CCSBot::OnEvent_) },
@ -4046,6 +4046,9 @@ FunctionHook g_FunctionHooks[] =
//{ 0x0, "_ZNK11CSGameState17GetNearestHostageEv", mfunc_ptr_cast(&CSGameState::GetNearestHostage) }, // NOXREF
{ 0x01D32BE0, "_ZN11CSGameState21InitializeHostageInfoEv", mfunc_ptr_cast(&CSGameState::InitializeHostageInfo) },
//{ 0x01D15EA0, "_Z16NavAreaBuildPathI8PathCostEbP8CNavAreaS2_PK6VectorRT_PS2_", (size_t)&NavAreaBuildPath__PathCost__wrapper },
#ifdef _WIN32
{ 0x01D15A30, "", (size_t)&NavAreaTravelDistance__PathCost__wrapper },
#endif // _WIN32
{ 0x01D2B2E0, "_ZN8PathCostclEP8CNavAreaS1_PK10CNavLadder", mfunc_ptr_cast(&PathCost::operator()) },
{ 0x01D172A0, "_Z17GetBotFollowCountP11CBasePlayer", (size_t)&GetBotFollowCount },
{ 0x01D187B0, "_Z21FindNearbyRetreatSpotP6CCSBotf", mfunc_ptr_cast<FIND_SPOT_CSSBOT>(&FindNearbyRetreatSpot) },
@ -4065,53 +4068,53 @@ FunctionHook g_FunctionHooks[] =
//{ 0x0, "_ZNK8BotState7GetNameEv", mfunc_ptr_cast(&BotState::GetName) }, // NOXREF
//IdleState
//virtual func
//{ 0x01D142A0, "_ZN9IdleState7OnEnterEP6CCSBot", mfunc_ptr_cast(&IdleState::OnEnter_) },
//{ 0x01D14320, "_ZN9IdleState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&IdleState::OnUpdate_) },
{ 0x01D142A0, "_ZN9IdleState7OnEnterEP6CCSBot", mfunc_ptr_cast(&IdleState::OnEnter_) },
{ 0x01D14320, "_ZN9IdleState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&IdleState::OnUpdate_) },
//{ 0x01D212C0, "_ZNK9IdleState7GetNameEv", mfunc_ptr_cast(&IdleState::GetName_) },
//HuntState
//virtual func
//{ 0x01D13E20, "_ZN9HuntState7OnEnterEP6CCSBot", mfunc_ptr_cast(&HuntState::OnEnter_) },
//{ 0x01D13EA0, "_ZN9HuntState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&HuntState::OnUpdate_) },
//{ 0x01D14290, "_ZN9HuntState6OnExitEP6CCSBot", mfunc_ptr_cast(&HuntState::OnExit_) },
{ 0x01D13E20, "_ZN9HuntState7OnEnterEP6CCSBot", mfunc_ptr_cast(&HuntState::OnEnter_) },
{ 0x01D13EA0, "_ZN9HuntState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&HuntState::OnUpdate_) },
//{ 0x01D14290, "_ZN9HuntState6OnExitEP6CCSBot", mfunc_ptr_cast(&HuntState::OnExit_) }, // PURE
//{ 0x01D212D0, "_ZNK9HuntState7GetNameEv", mfunc_ptr_cast(&HuntState::GetName_) },
//non-virtual func
//{ 0x0, "_ZN9HuntState13ClearHuntAreaEv", mfunc_ptr_cast(&HuntState::ClearHuntArea) }, // NOXREF
//AttackState
//virtual func
//{ 0x01D10960, "_ZN11AttackState7OnEnterEP6CCSBot", mfunc_ptr_cast(&AttackState::OnEnter_) },
//{ 0x01D10CF0, "_ZN11AttackState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&AttackState::OnUpdate_) },
//{ 0x01D11860, "_ZN11AttackState6OnExitEP6CCSBot", mfunc_ptr_cast(&AttackState::OnExit_) },
{ 0x01D10960, "_ZN11AttackState7OnEnterEP6CCSBot", mfunc_ptr_cast(&AttackState::OnEnter_) },
{ 0x01D10CF0, "_ZN11AttackState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&AttackState::OnUpdate_) },
{ 0x01D11860, "_ZN11AttackState6OnExitEP6CCSBot", mfunc_ptr_cast(&AttackState::OnExit_) },
//{ 0x01D212E0, "_ZNK11AttackState7GetNameEv", mfunc_ptr_cast(&AttackState::GetName_) },
//non-virtual func
//{ 0x0, "_ZN11AttackState16SetCrouchAndHoldEb", mfunc_ptr_cast(&AttackState::SetCrouchAndHold) }, // NOXREF
//{ 0x01D10CC0, "_ZN11AttackState13StopAttackingEP6CCSBot", mfunc_ptr_cast(&AttackState::StopAttacking) }, // NOXREF
//InvestigateNoiseState
//virtual func
//{ 0x01D165C0, "_ZN21InvestigateNoiseState7OnEnterEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnEnter_) },
//{ 0x01D166B0, "_ZN21InvestigateNoiseState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnUpdate_) },
//{ 0x01D16920, "_ZN21InvestigateNoiseState6OnExitEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnExit_) },
{ 0x01D165C0, "_ZN21InvestigateNoiseState7OnEnterEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnEnter_) },
{ 0x01D166B0, "_ZN21InvestigateNoiseState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnUpdate_) },
{ 0x01D16920, "_ZN21InvestigateNoiseState6OnExitEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::OnExit_) },
//{ 0x01D212F0, "_ZNK21InvestigateNoiseState7GetNameEv", mfunc_ptr_cast(&InvestigateNoiseState::GetName_) },
//non-virtual func
//{ 0x0, "_ZN21InvestigateNoiseState18AttendCurrentNoiseEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::AttendCurrentNoise) }, // NOXREF
//{ 0x01D164D0, "_ZN21InvestigateNoiseState18AttendCurrentNoiseEP6CCSBot", mfunc_ptr_cast(&InvestigateNoiseState::AttendCurrentNoise) }, // NOXREF
//BuyState
//virtual func
//{ 0x01D11910, "_ZN8BuyState7OnEnterEP6CCSBot", mfunc_ptr_cast(&BuyState::OnEnter_) },
//{ 0x01D11B60, "_ZN8BuyState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&BuyState::OnUpdate_) },
//{ 0x01D121E0, "_ZN8BuyState6OnExitEP6CCSBot", mfunc_ptr_cast(&BuyState::OnExit_) },
{ 0x01D11910, "_ZN8BuyState7OnEnterEP6CCSBot", mfunc_ptr_cast(&BuyState::OnEnter_) },
{ 0x01D11B60, "_ZN8BuyState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&BuyState::OnUpdate_) },
{ 0x01D121E0, "_ZN8BuyState6OnExitEP6CCSBot", mfunc_ptr_cast(&BuyState::OnExit_) },
//{ 0x01D21300, "_ZNK8BuyState7GetNameEv", mfunc_ptr_cast(&BuyState::GetName_) }, // DEFAULT
//MoveToState
//virtual func
//{ 0x01D16930, "_ZN11MoveToState7OnEnterEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnEnter_) },
//{ 0x01D169C0, "_ZN11MoveToState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnUpdate_) },
//{ 0x01D16FE0, "_ZN11MoveToState6OnExitEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnExit_) },
{ 0x01D16930, "_ZN11MoveToState7OnEnterEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnEnter_) },
//{ 0x01D169C0, "_ZN11MoveToState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnUpdate_) }, // HOOK: FIX ME
{ 0x01D16FE0, "_ZN11MoveToState6OnExitEP6CCSBot", mfunc_ptr_cast(&MoveToState::OnExit_) },
//{ 0x01D21310, "_ZNK11MoveToState7GetNameEv", mfunc_ptr_cast(&MoveToState::GetName_) }, // DEFAULT
//non-virtual func
//{ 0x0, "_ZN11MoveToState15SetGoalPositionEPK6Vector", mfunc_ptr_cast(&MoveToState::SetGoalPosition) }, // NOXREF
//{ 0x0, "_ZN11MoveToState12SetRouteTypeE9RouteType", mfunc_ptr_cast(&MoveToState::SetRouteType) }, // NOXREF
//FetchBombState
//virtual func
//{ 0x01D125A0, "_ZN14FetchBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&FetchBombState::OnEnter_) },
//{ 0x01D125C0, "_ZN14FetchBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&FetchBombState::OnUpdate_) },
{ 0x01D125A0, "_ZN14FetchBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&FetchBombState::OnEnter_) },
{ 0x01D125C0, "_ZN14FetchBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&FetchBombState::OnUpdate_) },
//{ 0x01D21320, "_ZNK14FetchBombState7GetNameEv", mfunc_ptr_cast(&FetchBombState::GetName_) }, // DEFAULT
//PlantBombState
//virtual func
@ -4121,15 +4124,15 @@ FunctionHook g_FunctionHooks[] =
//{ 0x01D21330, "_ZNK14PlantBombState7GetNameEv", mfunc_ptr_cast(&PlantBombState::GetName_) }, // DEFAULT
//DefuseBombState
//virtual func
//{ 0x01D12200, "_ZN15DefuseBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnEnter_) },
//{ 0x01D12270, "_ZN15DefuseBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnUpdate_) },
//{ 0x01D12340, "_ZN15DefuseBombState6OnExitEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnExit_) },
{ 0x01D12200, "_ZN15DefuseBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnEnter_) },
{ 0x01D12270, "_ZN15DefuseBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnUpdate_) },
{ 0x01D12340, "_ZN15DefuseBombState6OnExitEP6CCSBot", mfunc_ptr_cast(&DefuseBombState::OnExit_) },
//{ 0x01D21340, "_ZNK15DefuseBombState7GetNameEv", mfunc_ptr_cast(&DefuseBombState::GetName_) }, // DEFAULT
//HideState
//virtual func
//{ 0x01D13250, "_ZN9HideState7OnEnterEP6CCSBot", mfunc_ptr_cast(&HideState::OnEnter_) },
//{ 0x01D13300, "_ZN9HideState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&HideState::OnUpdate_) },
//{ 0x01D13D90, "_ZN9HideState6OnExitEP6CCSBot", mfunc_ptr_cast(&HideState::OnExit_) },
{ 0x01D13250, "_ZN9HideState7OnEnterEP6CCSBot", mfunc_ptr_cast(&HideState::OnEnter_) },
{ 0x01D13300, "_ZN9HideState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&HideState::OnUpdate_) },
{ 0x01D13D90, "_ZN9HideState6OnExitEP6CCSBot", mfunc_ptr_cast(&HideState::OnExit_) },
//{ 0x01D21350, "_ZNK9HideState7GetNameEv", mfunc_ptr_cast(&HideState::GetName_) }, // DEFAULT
//non-virtual func
//{ 0x0, "_ZN9HideState13SetHidingSpotEPK6Vector", mfunc_ptr_cast(&HideState::SetHidingSpot) }, // NOXREF
@ -4141,19 +4144,19 @@ FunctionHook g_FunctionHooks[] =
//{ 0x0, "_ZNK9HideState8IsAtSpotEv", mfunc_ptr_cast(&HideState::IsAtSpot) }, // NOXREF
//EscapeFromBombState
//virtual func
//{ 0x01D12390, "_ZN19EscapeFromBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnEnter_) },
//{ 0x01D123D0, "_ZN19EscapeFromBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnUpdate_) },
//{ 0x01D12560, "_ZN19EscapeFromBombState6OnExitEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnExit_) },
{ 0x01D12390, "_ZN19EscapeFromBombState7OnEnterEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnEnter_) },
{ 0x01D123D0, "_ZN19EscapeFromBombState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnUpdate_) },
{ 0x01D12560, "_ZN19EscapeFromBombState6OnExitEP6CCSBot", mfunc_ptr_cast(&EscapeFromBombState::OnExit_) },
//{ 0x01D21360, "_ZNK19EscapeFromBombState7GetNameEv", mfunc_ptr_cast(&EscapeFromBombState::GetName_) }, // DEFAULT
//FollowState
//virtual func
//{ 0x01D12660, "_ZN11FollowState7OnEnterEP6CCSBot", mfunc_ptr_cast(&FollowState::OnEnter_) },
//{ 0x01D127A0, "_ZN11FollowState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&FollowState::OnUpdate_) },
//{ 0x01D130C0, "_ZN11FollowState6OnExitEP6CCSBot", mfunc_ptr_cast(&FollowState::OnExit_) }, // PURE
{ 0x01D12660, "_ZN11FollowState7OnEnterEP6CCSBot", mfunc_ptr_cast(&FollowState::OnEnter_) },
{ 0x01D127A0, "_ZN11FollowState8OnUpdateEP6CCSBot", mfunc_ptr_cast(&FollowState::OnUpdate_) },
//{ 0x01D130C0, "_ZN11FollowState6OnExitEP6CCSBot", mfunc_ptr_cast(&FollowState::OnExit_) }, // PURE
//{ 0x01D21370, "_ZNK11FollowState7GetNameEv", mfunc_ptr_cast(&FollowState::GetName_) }, // DEFAULT
//non-virtual func
//{ 0x0, "_ZN11FollowState9SetLeaderEP11CBasePlayer", mfunc_ptr_cast(&FollowState::SetLeader) }, // NOXREF
//{ 0x0, "_ZN11FollowState24ComputeLeaderMotionStateEf", mfunc_ptr_cast(&FollowState::ComputeLeaderMotionState) },
//{ 0x01D126E0, "_ZN11FollowState24ComputeLeaderMotionStateEf", mfunc_ptr_cast(&FollowState::ComputeLeaderMotionState) },
//UseEntityState
//virtual func
{ 0x01D171A0, "_ZN14UseEntityState7OnEnterEP6CCSBot", mfunc_ptr_cast(&UseEntityState::OnEnter_) },
@ -4164,7 +4167,7 @@ FunctionHook g_FunctionHooks[] =
//{ 0x0, "_ZN14UseEntityState9SetEntityEP11CBaseEntity", mfunc_ptr_cast(&UseEntityState::SetEntity) }, // NOXREF
#ifdef _WIN32
//{ 0x01D12F90, "_ZN21FollowTargetCollectorclEP8CNavArea", mfunc_ptr_cast(&FollowTargetCollector::operator()) },
{ 0x01D12F90, "_ZN21FollowTargetCollectorclEP8CNavArea", mfunc_ptr_cast(&FollowTargetCollector::operator()) },
#endif // _WIN32
#endif // CS_BotState_Region
@ -5000,7 +5003,7 @@ FunctionHook g_FunctionHooks[] =
//{ 0x01D43000, "", mfunc_ptr_cast(&CNavAreaGrid::CNavAreaGrid) }, // NOXREF
//{ 0x01D43090, "", mfunc_ptr_cast(&CNavAreaGrid::~CNavAreaGrid) }, // NOXREF
//{ 0x01D43180, "_ZN12CNavAreaGrid5ResetEv", mfunc_ptr_cast(&CNavAreaGrid::Reset) }, // NOXREF
{ 0x01D43360, "_ZN12CNavAreaGrid10InitializeEffff", mfunc_ptr_cast(&CNavAreaGrid::Initialize) },
{ 0x01D43230, "_ZN12CNavAreaGrid10InitializeEffff", mfunc_ptr_cast(&CNavAreaGrid::Initialize) },
{ 0x01D43390, "_ZN12CNavAreaGrid10AddNavAreaEP8CNavArea", mfunc_ptr_cast(&CNavAreaGrid::AddNavArea) },
{ 0x01D43560, "_ZN12CNavAreaGrid13RemoveNavAreaEP8CNavArea", mfunc_ptr_cast(&CNavAreaGrid::RemoveNavArea) },
{ 0x01D43710, "_ZNK12CNavAreaGrid10GetNavAreaEPK6Vectorf", mfunc_ptr_cast(&CNavAreaGrid::GetNavArea) },
@ -5639,10 +5642,8 @@ AddressRef g_FunctionRefs[] =
#ifndef Function_References_Region
{ 0x01D2EDD0, "_ZN6CCSBot16UpdateLookAnglesEv", (size_t)&pCCSBot__UpdateLookAngles },
{ 0x01D2D9B0, "_ZN6CCSBot6UpdateEv", (size_t)&pCCSBot__Update },
{ 0x01D19C70, "_ZN9BotPhrase9RandomizeEv", (size_t)&pBotPhrase__Randomize },
{ 0x01D25270, "_ZN13CCSBotManager6AddBotEPK10BotProfile18BotProfileTeamType", (size_t)&pCCSBotManager__AddBot },
{ 0x01D80C90, "_Z16InstallGameRulesv", (size_t)&pInstallGameRules },
{ 0x01D4C450, "_ZN8CHostage9IdleThinkEv", (size_t)&pCHostage__IdleThink },
#endif // Function_References_Region
@ -6165,6 +6166,12 @@ AddressRef g_DataRefs[] =
{ 0x01E2F8B4, "sclp", (size_t)&psclp },
{ 0x01E2F8B8, "sclq", (size_t)&psclq },
{ 0x01E0DF70, "primaryWeaponBuyInfoCT", (size_t)&pprimaryWeaponBuyInfoCT },
{ 0x01E0E00C, "secondaryWeaponBuyInfoCT", (size_t)&psecondaryWeaponBuyInfoCT },
{ 0x01E0E030, "primaryWeaponBuyInfoT", (size_t)&pprimaryWeaponBuyInfoT },
{ 0x01E0E0CC, "secondaryWeaponBuyInfoT", (size_t)&psecondaryWeaponBuyInfoT },
{ 0x01E287E8, "_ZN19BotChatterInterface16m_encourageTimerE", mfunc_ptr_cast(&BotChatterInterface::pm_encourageTimer) },
{ 0x01E287E0, "_ZN19BotChatterInterface22m_radioSilenceIntervalE", mfunc_ptr_cast(&BotChatterInterface::pm_radioSilenceInterval) },

View File

@ -17,6 +17,10 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release MP|Win32">
<Configuration>Release MP</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release Play|Win32">
<Configuration>Release Play</Configuration>
<Platform>Win32</Platform>
@ -40,6 +44,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -49,6 +54,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
@ -56,6 +63,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -65,6 +73,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
@ -74,6 +84,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
@ -83,6 +95,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -92,6 +105,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
@ -99,6 +114,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -107,6 +123,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -117,6 +134,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
@ -128,6 +147,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
@ -138,18 +159,22 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\bot\cs_bot_vision.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\bot\cs_bot_weapon.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -157,12 +182,14 @@
<ClCompile Include="..\dlls\bot\cs_gamestate.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\bot\states\cs_bot_attack.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -171,6 +198,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -179,6 +207,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -187,6 +216,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -195,6 +225,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -203,6 +234,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -211,6 +243,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -219,6 +252,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -227,6 +261,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -235,6 +270,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -243,6 +279,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -251,6 +288,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -259,6 +297,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -284,48 +323,56 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\hostage_improv.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\hostage_localnav.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\states\hostage_animate.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\states\hostage_escape.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\states\hostage_follow.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\states\hostage_idle.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\hostage\states\hostage_retreat.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\dlls\h_ai.cpp" />
@ -369,6 +416,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -377,6 +425,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -385,6 +434,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -393,6 +443,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -401,6 +452,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -409,6 +461,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -417,6 +470,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -425,6 +479,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -433,6 +488,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -441,6 +497,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -449,6 +506,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -457,6 +515,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -465,6 +524,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -473,6 +533,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -481,6 +542,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -489,6 +551,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -497,6 +560,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -505,6 +569,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -513,6 +578,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -521,6 +587,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -529,6 +596,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -537,6 +605,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -545,6 +614,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -553,6 +623,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -561,6 +632,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -569,6 +641,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -577,6 +650,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -584,6 +658,7 @@
<ClCompile Include="..\dlls\wpn_shared\wpn_usp.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
@ -593,6 +668,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Play|Win32'">false</ExcludedFromBuild>
@ -610,15 +686,18 @@
<ClCompile Include="..\game_shared\voice_gamemgr.cpp" />
<ClCompile Include="..\hookers\6153_hooker.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\hookers\hooker.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Tests|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\hookers\main.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\hookers\main_mp.cpp">
@ -626,6 +705,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@ -633,6 +713,7 @@
</ClCompile>
<ClCompile Include="..\hookers\memory.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
@ -656,9 +737,11 @@
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">precompiled.h</PrecompiledHeaderFile>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">precompiled.h</PrecompiledHeaderFile>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">precompiled.h</PrecompiledHeaderFile>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">precompiled.h</PrecompiledHeaderFile>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">precompiled.h</PrecompiledHeaderFile>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tests|Win32'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tests|Win32'">precompiled.h</PrecompiledHeaderFile>
@ -669,38 +752,46 @@
<ClCompile Include="..\regamedll\sse_mathfun.cpp" />
<ClCompile Include="..\testsuite\demoplayer.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\testsuite\funccalls.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\testsuite\recorder.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\testsuite\testsuite.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\unittests\animation_tests.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\unittests\mathfun_tests.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\unittests\struct_offsets_tests.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\unittests\TestRunner.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\version\version.cpp" />
@ -736,6 +827,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClInclude>
@ -744,6 +837,8 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClInclude>
@ -752,12 +847,15 @@
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="..\dlls\bot\cs_gamestate.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">false</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="..\dlls\buttons.h" />
@ -935,6 +1033,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Tests|Win32'">true</ExcludedFromBuild>
</None>
@ -942,6 +1041,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Play|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Tests|Win32'">true</ExcludedFromBuild>
</None>
@ -982,6 +1082,13 @@
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
@ -1020,6 +1127,9 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@ -1052,6 +1162,13 @@
<CodeAnalysisRules />
<CodeAnalysisRuleAssemblies />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
<TargetName>mp</TargetName>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules />
<CodeAnalysisRuleAssemblies />
<LinkIncremental />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
<TargetName>mp</TargetName>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
@ -1169,7 +1286,7 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>CSTRIKE;REGAMEDLL_ADD;REGAMEDLL_FIXES;REGAMEDLL_SELF;REGAMEDLL_CHECKS;CLIENT_WEAPONS;USE_BREAKPAD_HANDLER;DEDICATED;_CRT_SECURE_NO_WARNINGS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>REGAMEDLL_ADD;REGAMEDLL_FIXES;REGAMEDLL_SELF;REGAMEDLL_CHECKS;CLIENT_WEAPONS;USE_BREAKPAD_HANDLER;DEDICATED;_CRT_SECURE_NO_WARNINGS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<FloatingPointModel>Precise</FloatingPointModel>
<AdditionalOptions>/arch:IA32 %(AdditionalOptions)</AdditionalOptions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
@ -1195,6 +1312,50 @@
<Inputs>subversion.always.run</Inputs>
</CustomBuildStep>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MP|Win32'">
<PreBuildEvent>
<Command>IF EXIST "$(ProjectDir)PreBuild.bat" (CALL "$(ProjectDir)PreBuild.bat" "$(ProjectDir)..\version\" "$(ProjectDir)..\")</Command>
<Message>Setup version from Git revision</Message>
</PreBuildEvent>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectDir)\..\;$(ProjectDir)\..\hookers\;$(ProjectDir)\..\common;$(ProjectDir)\..\dlls;$(ProjectDir)\..\engine;$(ProjectDir)\..\public;$(ProjectDir)\..\public\regamedll;$(ProjectDir)\..\pm_shared;$(ProjectDir)\..\regamedll\;$(ProjectDir)\..\testsuite\;$(VCInstallDir)UnitTest\include;$(SolutionDir)..\dep\bzip2\include\;$(SolutionDir)..\dep\cppunitlite\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>REGAMEDLL_SELF;REGAMEDLL_CHECKS;CLIENT_WEAPONS;USE_BREAKPAD_HANDLER;DEDICATED;_CRT_SECURE_NO_WARNINGS;NDEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<FloatingPointModel>Precise</FloatingPointModel>
<AdditionalOptions>/arch:IA32 %(AdditionalOptions)</AdditionalOptions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>precompiled.h</PrecompiledHeaderFile>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<IntrinsicFunctions>true</IntrinsicFunctions>
<MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>psapi.lib;ws2_32.lib;$(ProjectDir)../lib/steam_api.lib;%(AdditionalDependencies)</AdditionalDependencies>
<MinimumRequiredVersion>
</MinimumRequiredVersion>
<ModuleDefinitionFile>mp.def</ModuleDefinitionFile>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<ImageHasSafeExceptionHandlers>true</ImageHasSafeExceptionHandlers>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent>
<Command>IF EXIST "$(ProjectDir)PostBuild_mp.bat" (CALL "$(ProjectDir)PostBuild_mp.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")</Command>
<Message>Automatic deployment script</Message>
</PostBuildEvent>
<CustomBuildStep>
<Command>echo Empty Action</Command>
<Message>Force build to run Pre-Build event</Message>
<Outputs>subversion.always.run</Outputs>
<Inputs>subversion.always.run</Inputs>
</CustomBuildStep>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MP Play|Win32'">
<PreBuildEvent>
<Command>IF EXIST "$(ProjectDir)PreBuild.bat" (CALL "$(ProjectDir)PreBuild.bat" "$(ProjectDir)..\version\" "$(ProjectDir)..\")</Command>
@ -1205,7 +1366,7 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>CSTRIKE;REGAMEDLL_SELF;PLAY_GAMEDLL;REGAMEDLL_CHECKS;CLIENT_WEAPONS;USE_BREAKPAD_HANDLER;DEDICATED;_CRT_SECURE_NO_WARNINGS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>REGAMEDLL_SELF;PLAY_GAMEDLL;REGAMEDLL_CHECKS;CLIENT_WEAPONS;USE_BREAKPAD_HANDLER;DEDICATED;_CRT_SECURE_NO_WARNINGS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<FloatingPointModel>Precise</FloatingPointModel>
<AdditionalOptions>/arch:IA32 %(AdditionalOptions)</AdditionalOptions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

View File

@ -158,7 +158,7 @@ NOBODY void VectorTransform(const vec_t *in1, float *in2, vec_t *out)
int VectorCompare(const vec_t *v1, const vec_t *v2)
{
int i;
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
if (v1[i] != v2[i])
return 0;
@ -218,7 +218,7 @@ float_precision Length(const vec_t *v)
int i;
float_precision length = 0.0f;
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
length += v[i] * v[i];
return sqrt(length);

View File

@ -54,7 +54,7 @@ NOXREF int PM_IsThereGrassTexture(void)
{
int i;
for (i = 0; i < pm_gcTextures; i++)
for (i = 0; i < pm_gcTextures; ++i)
{
if (pm_grgchTextureType[i] == CHAR_TEX_GRASS)
return 1;
@ -69,7 +69,7 @@ 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++)
{
@ -113,7 +113,7 @@ void PM_InitTextureTypes(void)
// skip whitespace
i = 0;
while (buffer[i] && isspace(buffer[i]))
i++;
++i;
if (!buffer[i])
continue;
@ -127,7 +127,7 @@ void PM_InitTextureTypes(void)
// skip whitespace
while (buffer[i] && isspace(buffer[i]))
i++;
++i;
if (!buffer[i])
continue;
@ -528,7 +528,7 @@ void PM_UpdateStepSound(void)
qboolean PM_AddToTouched(pmtrace_t tr, vec_t *impactvelocity)
{
int i;
for (i = 0; i < pmove->numtouch; i++)
for (i = 0; i < pmove->numtouch; ++i)
{
if (pmove->touchindex[i].ent == tr.ent)
break;
@ -557,7 +557,7 @@ void PM_CheckVelocity(void)
int i;
// bound velocity
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
// See if it's bogus.
if (IS_NAN(pmove->velocity[i]))
@ -620,7 +620,7 @@ int PM_ClipVelocity(vec_t *in, vec_t *normal, vec_t *out, float overbounce)
// Scale by overbounce factor.
backoff = DotProduct(in, normal) * overbounce;
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
change = in[i] - normal[i] * backoff;
out[i] = change;
@ -710,7 +710,7 @@ int PM_FlyMove(void)
// Assume we can move all the way from the current origin to the
// end point.
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
float_precision flScale = time_left * pmove->velocity[i];
@ -794,7 +794,7 @@ int PM_FlyMove(void)
// relfect player velocity
if (numplanes == 1 && pmove->movetype == MOVETYPE_WALK && (pmove->onground == -1 || pmove->friction != 1))
{
for (i = 0; i < numplanes; i++)
for (i = 0; i < numplanes; ++i)
{
if (planes[i][2] > 0.7f)
{
@ -811,7 +811,7 @@ int PM_FlyMove(void)
}
else
{
for (i = 0; i < numplanes; i++)
for (i = 0; i < numplanes; ++i)
{
PM_ClipVelocity(original_velocity, planes[i], pmove->velocity, 1);
@ -891,7 +891,7 @@ void PM_Accelerate(vec_t *wishdir, float_precision wishspeed, float accel)
accelspeed = addspeed;
// Adjust velocity.
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
pmove->velocity[i] += accelspeed * wishdir[i];
}
@ -941,7 +941,7 @@ void PM_WalkMove(void)
VectorNormalize(pmove->right);
// Determine x and y parts of velocity
for (i = 0; i < 2; i++)
for (i = 0; i < 2; ++i)
{
wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove;
}
@ -1208,7 +1208,7 @@ void PM_AirAccelerate(vec_t *wishdir, float wishspeed, float accel)
accelspeed = addspeed;
// Adjust pmove vel.
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
pmove->velocity[i] += accelspeed * wishdir[i];
}
@ -1228,7 +1228,7 @@ void PM_WaterMove(void)
float newspeed, addspeed;
// user intentions
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
wishvel[i] = (pmove->forward[i] * pmove->cmd.forwardmove) + (pmove->cmd.sidemove * pmove->right[i]);
}
@ -1296,7 +1296,7 @@ void PM_WaterMove(void)
accelspeed = addspeed;
}
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
pmove->velocity[i] += accelspeed * wishvel[i];
}
@ -1344,7 +1344,7 @@ void PM_AirMove(void)
VectorNormalize(pmove->right);
// Determine x and y parts of velocity
for (i = 0; i < 2; i++)
for (i = 0; i < 2; ++i)
{
wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove;
}
@ -1715,7 +1715,7 @@ void PM_SpectatorMove(void)
VectorNormalize(pmove->forward);
VectorNormalize(pmove->right);
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove;
}
@ -1746,7 +1746,7 @@ void PM_SpectatorMove(void)
accelspeed = addspeed;
}
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
pmove->velocity[i] += accelspeed * wishdir[i];
}
@ -1823,7 +1823,7 @@ void PM_FixPlayerCrouchStuck(int direction)
VectorCopy(pmove->origin, test);
for (i = 0; i < 36; i++)
for (i = 0; i < 36; ++i)
{
pmove->origin[2] += direction;
hitent = pmove->PM_TestPlayerPosition(pmove->origin, NULL);
@ -2087,7 +2087,7 @@ physent_t *PM_Ladder(void)
int num;
vec3_t test;
for (i = 0; i < pmove->nummoveent; i++)
for (i = 0; i < pmove->nummoveent; ++i)
{
pe = &pmove->moveents[i];
@ -2298,7 +2298,7 @@ void PM_NoClip(void)
VectorNormalize(pmove->right);
// Determine x and y parts of velocity
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
wishvel[i] = pmove->forward[i] * fmove + pmove->right[i] * smove;
}
@ -3096,7 +3096,7 @@ void PM_CreateStuckTable(void)
zi[1] = 1.0f;
zi[2] = 6.0f;
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
// Z moves
z = zi[i];
@ -3135,7 +3135,7 @@ void PM_CreateStuckTable(void)
}
// Remaining multi axis nudges.
for (i = 0; i < 3; i++)
for (i = 0; i < 3; ++i)
{
z = zi[i];