Merge pull request #32 from s1lentq/regamedll_api_01

Regamedll api 01
This commit is contained in:
s1lentq 2016-05-12 01:05:02 +06:00
commit a9d5e3bb4a
309 changed files with 34923 additions and 2570 deletions

View File

@ -1,4 +1,4 @@
# ReGameDLL_CS
# ReGameDLL_CS [![Build Status](http://teamcity.rehlds.org/app/rest/builds/buildType:(id:ReGameDLLCs_Publish)/statusIcon)](http://teamcity.rehlds.org/viewType.html?buildTypeId=ReGameDLLCs_Publish&guest=1)
Reverse-engineered gamedll (mp.dll / Counter-Strike)
## What is this?

19
dist/game.cfg vendored
View File

@ -30,3 +30,22 @@ mp_maxmoney 16000
// Example setting: "ae" - blocks round time and bomb round end checks
// Default value: "0"
mp_round_infinite 0
// Disable grenade damage through walls
// 0 - disabled
// 1 - enabled
// Default value: "0"
mp_hegrenade_penetration 0
// Drop a grenade after player death
// 0 - disabled
// 1 - enabled (only the first slot grenades)
// 2 - drop a everyone
// Default value: "0"
mp_nadedrops 0
// Player cannot respawn until next round
// if more than N seconds has elapsed since the beginning round
//
// Default value: "20"
mp_roundrespawn_time 20

View File

@ -46,26 +46,12 @@ task publishPrepareFiles {
into 'publish/publishRoot'
}
//hlsdk
//project.file('publish/publishRoot/hlsdk').mkdirs()
//copy {
// from 'regamedll/common'
// into 'publish/publishRoot/hlsdk/common'
//}
//copy {
// from 'regamedll/dlls'
// into 'publish/publishRoot/hlsdk/dlls'
//}
//copy {
// from 'regamedll/pm_shared'
// into 'publish/publishRoot/hlsdk/pm_shared'
//}
//copy {
// from 'regamedll/public'
// into 'publish/publishRoot/hlsdk/public'
// include 'interface.h', 'interface.cpp', 'FileSystem.h'
//}
//cssdk
project.file('publish/publishRoot/cssdk').mkdirs()
copy {
from 'regamedll/extra/cssdk'
into 'publish/publishRoot/cssdk'
}
}
}

View File

@ -104,7 +104,7 @@ void setupToolchain(NativeBinarySpec b)
b.lib LazyNativeDepSet.create(dep_cppunitlite, 'cppunitlite', b.buildType.name, true)
}
cfg.singleDefines 'USE_BREAKPAD_HANDLER', 'DEDICATED', 'REGAMEDLL_SELF', 'CLIENT_WEAPONS'
cfg.singleDefines 'USE_BREAKPAD_HANDLER', 'DEDICATED', 'REGAMEDLL_SELF', 'REGAMEDLL_API', 'CLIENT_WEAPONS'
if (cfg instanceof MsvcToolchainConfig)
{
@ -146,7 +146,8 @@ void setupToolchain(NativeBinarySpec b)
'_vsnprintf': 'vsnprintf',
'_write' : 'write',
'_close' : 'close',
'_vsnwprintf' : 'vswprintf'
'_vsnwprintf' : 'vswprintf',
'_access' : 'access'
])
cfg.linkerOptions.args '-no-opt-class-analysis'

View File

@ -45,19 +45,11 @@ typedef float float_precision;
#endif // PLAY_GAMEDLL
/* <42b7f> ../common/mathlib.h:3 */
typedef float vec_t;
/* <42b91> ../common/mathlib.h:6 */
typedef vec_t vec3_t[3];
/* <80013> ../common/mathlib.h:8 */
typedef vec_t vec4_t[4];
/* <42bac> ../common/mathlib.h:18 */
typedef int fixed16_t;
/* <42bb7> ../common/mathlib.h:60 */
typedef union DLONG_u
{
int i[2];

View File

@ -32,7 +32,7 @@
#pragma once
#endif
typedef enum
typedef enum Activity_s
{
ACT_INVALID = -1,

View File

@ -12,7 +12,7 @@ TYPEDESCRIPTION CAirtank::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(item_airtank, CAirtank);
LINK_ENTITY_TO_CLASS(item_airtank, CAirtank, CCSAirtank);
IMPLEMENT_SAVERESTORE(CAirtank, CGrenade);
void CAirtank::__MAKE_VHOOK(Spawn)()

View File

@ -24,7 +24,7 @@ BOOL C9MMAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_9mm, C9MMAmmo);
LINK_ENTITY_TO_CLASS(ammo_9mm, C9MMAmmo, CCS9MMAmmo);
void CBuckShotAmmo::__MAKE_VHOOK(Spawn)()
{
@ -50,7 +50,7 @@ BOOL CBuckShotAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_buckshot, CBuckShotAmmo);
LINK_ENTITY_TO_CLASS(ammo_buckshot, CBuckShotAmmo, CCSBuckShotAmmo);
void C556NatoAmmo::__MAKE_VHOOK(Spawn)()
{
@ -76,7 +76,7 @@ BOOL C556NatoAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_556nato, C556NatoAmmo);
LINK_ENTITY_TO_CLASS(ammo_556nato, C556NatoAmmo, CCS556NatoAmmo);
void C556NatoBoxAmmo::__MAKE_VHOOK(Spawn)()
{
@ -102,7 +102,7 @@ BOOL C556NatoBoxAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_556natobox, C556NatoBoxAmmo);
LINK_ENTITY_TO_CLASS(ammo_556natobox, C556NatoBoxAmmo, CCS556NatoBoxAmmo);
void C762NatoAmmo::__MAKE_VHOOK(Spawn)()
{
@ -128,7 +128,7 @@ BOOL C762NatoAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_762nato, C762NatoAmmo);
LINK_ENTITY_TO_CLASS(ammo_762nato, C762NatoAmmo, CCS762NatoAmmo);
void C45ACPAmmo::__MAKE_VHOOK(Spawn)()
{
@ -154,7 +154,7 @@ BOOL C45ACPAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_45acp, C45ACPAmmo);
LINK_ENTITY_TO_CLASS(ammo_45acp, C45ACPAmmo, CCS45ACPAmmo);
void C50AEAmmo::__MAKE_VHOOK(Spawn)()
{
@ -180,7 +180,7 @@ BOOL C50AEAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_50ae, C50AEAmmo);
LINK_ENTITY_TO_CLASS(ammo_50ae, C50AEAmmo, CCS50AEAmmo);
void C338MagnumAmmo::__MAKE_VHOOK(Spawn)()
{
@ -206,7 +206,7 @@ BOOL C338MagnumAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_338magnum, C338MagnumAmmo);
LINK_ENTITY_TO_CLASS(ammo_338magnum, C338MagnumAmmo, CCS338MagnumAmmo);
void C57MMAmmo::__MAKE_VHOOK(Spawn)()
{
@ -232,7 +232,7 @@ BOOL C57MMAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_57mm, C57MMAmmo);
LINK_ENTITY_TO_CLASS(ammo_57mm, C57MMAmmo, CCS57MMAmmo);
void C357SIGAmmo::__MAKE_VHOOK(Spawn)()
{
@ -258,4 +258,4 @@ BOOL C357SIGAmmo::__MAKE_VHOOK(AddAmmo)(CBaseEntity *pOther)
return TRUE;
}
LINK_ENTITY_TO_CLASS(ammo_357sig, C357SIGAmmo);
LINK_ENTITY_TO_CLASS(ammo_357sig, C357SIGAmmo, CCS357SIGAmmo);

View File

@ -101,7 +101,9 @@ int CBaseAnimating::LookupSequence(const char *label)
return ::LookupSequence(pmodel, label);
}
void CBaseAnimating::ResetSequenceInfo()
LINK_HOOK_CLASS_VOID_CHAIN2(CBaseAnimating, ResetSequenceInfo)
void CBaseAnimating::__API_HOOK(ResetSequenceInfo)()
{
void *pmodel = GET_MODEL_PTR(ENT(pev));

View File

@ -32,6 +32,19 @@
#pragma once
#endif
enum MONSTERSTATE
{
MONSTERSTATE_NONE = 0,
MONSTERSTATE_IDLE,
MONSTERSTATE_COMBAT,
MONSTERSTATE_ALERT,
MONSTERSTATE_HUNT,
MONSTERSTATE_PRONE,
MONSTERSTATE_SCRIPT,
MONSTERSTATE_PLAYDEAD,
MONSTERSTATE_DEAD
};
void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore = 0, int bitsDamageType = 0);
void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType);
void RadiusDamage2(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType);

View File

@ -31,10 +31,10 @@ TYPEDESCRIPTION CPendulum::m_SaveData[] =
// BModelOrigin - calculates origin of a bmodel from absmin/size because all bmodel origins are 0 0 0
Vector VecBModelOrigin(entvars_t *pevBModel)
{
return pevBModel->absmin + (pevBModel->size * 0.5);
return pevBModel->absmin + (pevBModel->size * 0.5f);
}
LINK_ENTITY_TO_CLASS(func_wall, CFuncWall);
LINK_ENTITY_TO_CLASS(func_wall, CFuncWall, CCSFuncWall);
void CFuncWall::__MAKE_VHOOK(Spawn)()
{
@ -58,7 +58,7 @@ void CFuncWall::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
}
}
LINK_ENTITY_TO_CLASS(func_wall_toggle, CFuncWallToggle);
LINK_ENTITY_TO_CLASS(func_wall_toggle, CFuncWallToggle, CCSFuncWallToggle);
void CFuncWallToggle::__MAKE_VHOOK(Spawn)()
{
@ -107,7 +107,7 @@ void CFuncWallToggle::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
}
}
LINK_ENTITY_TO_CLASS(func_conveyor, CFuncConveyor);
LINK_ENTITY_TO_CLASS(func_conveyor, CFuncConveyor, CCSFuncConveyor);
void CFuncConveyor::__MAKE_VHOOK(Spawn)()
{
@ -154,7 +154,7 @@ void CFuncConveyor::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCal
UpdateSpeed(pev->speed);
}
LINK_ENTITY_TO_CLASS(func_illusionary, CFuncIllusionary);
LINK_ENTITY_TO_CLASS(func_illusionary, CFuncIllusionary, CCSFuncIllusionary);
void CFuncIllusionary::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -184,7 +184,7 @@ void CFuncIllusionary::__MAKE_VHOOK(Spawn)()
// MAKE_STATIC(ENT(pev));
}
LINK_ENTITY_TO_CLASS(func_monsterclip, CFuncMonsterClip);
LINK_ENTITY_TO_CLASS(func_monsterclip, CFuncMonsterClip, CCSFuncMonsterClip);
void CFuncMonsterClip::__MAKE_VHOOK(Spawn)()
{
@ -198,8 +198,7 @@ void CFuncMonsterClip::__MAKE_VHOOK(Spawn)()
pev->flags |= FL_MONSTERCLIP;
}
LINK_ENTITY_TO_CLASS(func_rotating, CFuncRotating);
LINK_ENTITY_TO_CLASS(func_rotating, CFuncRotating, CCSFuncRotating);
IMPLEMENT_SAVERESTORE(CFuncRotating, CBaseEntity);
void CFuncRotating::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -602,7 +601,7 @@ void CFuncRotating::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther)
pOther->TakeDamage(pev, pev, pev->dmg, DMG_CRUSH);
}
LINK_ENTITY_TO_CLASS(func_pendulum, CPendulum);
LINK_ENTITY_TO_CLASS(func_pendulum, CPendulum, CCSPendulum);
IMPLEMENT_SAVERESTORE(CPendulum, CBaseEntity);
void CPendulum::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)

View File

@ -1,5 +1,12 @@
#include "precompiled.h"
#ifdef REGAMEDLL_ADD
// Give 3rd-party to get the virtual table of the object.
// Example: AMXModX module: Hamsandwich
// RegisterHam(Ham_Spawn, "bot", "CCSBot__Spawn", 1);
LINK_ENTITY_TO_CLASS(bot, CCSBot, CAPI_CSBot);
#endif
// Return the number of bots following the given player
int GetBotFollowCount(CBasePlayer *leader)
{
@ -68,7 +75,7 @@ bool CCSBot::__MAKE_VHOOK(Jump)(bool mustJump)
// NOTE: We dont want to directly call Attack() here, or the bots will have super-human reaction times when injured
int CCSBot::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
CBaseEntity *attacker = GetClassPtr((CBaseEntity *)pevInflictor);
CBaseEntity *attacker = GetClassPtr<CCSEntity>((CBaseEntity *)pevInflictor);
// if we were attacked by a teammate, rebuke
if (attacker->IsPlayer())

View File

@ -421,8 +421,6 @@ class CCSBot: public CBot
{
public:
CCSBot(); // constructor initializes all values to zero
public:
virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType); // invoked when injured by something (EXTEND) - returns the amount of damage inflicted
virtual void Killed(entvars_t *pevAttacker, int iGib); // invoked when killed (EXTEND)
virtual void RoundRespawn();
@ -967,6 +965,7 @@ private:
NUM_LOOK_AT_SPOT_STATES
}
m_lookAtSpotState;
Vector m_lookAtSpot; // the spot we're currently looking at
PriorityType m_lookAtSpotPriority;
float m_lookAtSpotDuration; // how long we need to look at the spot
@ -1525,12 +1524,12 @@ inline float CCSBot::GetFeetZ() const
{
if (IsCrouching())
{
const Vector crouch = Vector(0, 0, -StepHeight);
const Vector crouch(0, 0, -StepHeight);
return (pev->origin + crouch).z;
}
else
{
const Vector stand = Vector(0, 0, -HalfHumanHeight);
const Vector stand(0, 0, -HalfHumanHeight);
return (pev->origin + stand).z;
}
}

View File

@ -419,6 +419,14 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
char baseDir[RadioPathLen] = "";
char compositeFilename[RadioPathLen];
#ifdef REGAMEDLL_ADD
char soundDir[MAX_PATH];
char filePath[MAX_PATH];
GET_GAME_DIR(soundDir);
Q_strcat(soundDir, "\\sound\\");
#endif
// Parse the BotChatter.db into BotPhrase collections
while (true)
{
@ -567,8 +575,8 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
FREE_FILE(phraseDataFile);
return false;
}
token = MP_COM_GetToken();
token = MP_COM_GetToken();
GameEventType event = NameToGameEvent(token);
if (event <= EVENT_START_RADIO_1 || event >= EVENT_END_RADIO)
{
@ -578,7 +586,6 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
}
radioEvent = event;
continue;
}
@ -593,6 +600,13 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
if (!Q_stricmp(token, "End"))
break;
#ifdef REGAMEDLL_ADD
Q_snprintf(filePath, sizeof(filePath), "%s%s%s", soundDir, baseDir, token);
if (Q_access(filePath, 0) != 0)
continue;
#endif
// found a phrase - add it to the collection
BotSpeakable *speak = new BotSpeakable;
if (baseDir[0])

View File

@ -347,7 +347,7 @@ void CCSBotManager::__MAKE_VHOOK(ClientDisconnect)(CBasePlayer *pPlayer)
FREE_PRIVATE(pPlayer->edict());
CBasePlayer *player = GetClassPtr((CBasePlayer *)temp);
CBasePlayer *player = GetClassPtr<CCSPlayer>((CBasePlayer *)temp);
AddEntityHashValue(player->pev, STRING(player->pev->classname), CLASSNAME);
player->pev->flags = FL_DORMANT;
}
@ -376,7 +376,7 @@ void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd)
if (FStrEq(pcmd, "bot_about"))
{
Q_sprintf(buffer, "\n--------------------------------------------------------------------------\nThe Official Counter-Strike Bot V%d.%02d\nCreated by Michael S. Booth\nWeb: www.turtlerockstudios.com\\csbot\nE-mail: csbot@turtlerockstudios.com\n--------------------------------------------------------------------------\n\n", CSBOT_VERSION_MAJOR, CSBOT_VERSION_MINOR);
Q_sprintf(buffer, "\n--------------------------------------------------------------------------\nThe Official Counter-Strike Bot V%d.%02d\nCreated by Michael S. Booth\nWeb: www.turtlerockstudios.com\\csbot\nE-mail: csbot@turtlerockstudios.com\n--------------------------------------------------------------------------\n\n", BOT_VERSION_MAJOR, BOT_VERSION_MINOR);
CONSOLE_ECHO(buffer);
HintMessageToAllPlayers(buffer);
}
@ -681,7 +681,7 @@ void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd)
if ((pEntity->pev->flags & FL_DORMANT) == FL_DORMANT)
continue;
CBasePlayer *playerOrBot = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *playerOrBot = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (playerOrBot->IsBot())
{
@ -1189,7 +1189,7 @@ bool CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team)
return false;
}
CCSBot *pBot = CreateBot<CCSBot>(profile);
CCSBot *pBot = CreateBot<CCSBot, CAPI_CSBot>(profile);
if (pBot == NULL)
{
return false;

View File

@ -409,7 +409,7 @@ NOXREF bool CCSBot::FindApproachPointNearestPath(Vector *pos)
if (m_approachPointCount == 0)
return false;
Vector target = Vector(0, 0, 0), close;
Vector target(0, 0, 0), close;
float targetRangeSq = 0.0f;
bool found = false;

View File

@ -633,7 +633,7 @@ int CCSBot::FindOurPositionOnPath(Vector *close, bool local) const
return -1;
Vector along, toFeet;
Vector feet = Vector(pev->origin.x, pev->origin.y, GetFeetZ());
Vector feet(pev->origin.x, pev->origin.y, GetFeetZ());
Vector eyes = feet + Vector(0, 0, HalfHumanHeight); // in case we're crouching
Vector pos;
const Vector *from, *to;
@ -857,7 +857,7 @@ int CCSBot::FindPathPoint(float aheadRange, Vector *point, int *prevIndex)
Vector initDir = m_path[ startIndex ].pos - m_path[ startIndex - 1 ].pos;
initDir.NormalizeInPlace();
Vector feet = Vector(pev->origin.x, pev->origin.y, GetFeetZ());
Vector feet(pev->origin.x, pev->origin.y, GetFeetZ());
Vector eyes = feet + Vector(0, 0, HalfHumanHeight);
float rangeSoFar = 0;
@ -1172,7 +1172,7 @@ void CCSBot::FeelerReflexAdjustment(Vector *goalPosition)
// correct the sideways vector
lat = CrossProduct(dir, normal);
Vector feet = Vector(pev->origin.x, pev->origin.y, GetFeetZ());
Vector feet(pev->origin.x, pev->origin.y, GetFeetZ());
feet.z += feelerHeight;
Vector from = feet + feelerOffset * lat;

View File

@ -53,7 +53,7 @@ TYPEDESCRIPTION CEnvSpark::m_SaveData[] =
#endif // HOOK_GAMEDLL
IMPLEMENT_SAVERESTORE(CEnvGlobal, CBaseEntity);
LINK_ENTITY_TO_CLASS(env_global, CEnvGlobal);
LINK_ENTITY_TO_CLASS(env_global, CEnvGlobal, CCSEnvGlobal);
void CEnvGlobal::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -135,7 +135,7 @@ void CEnvGlobal::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller
}
IMPLEMENT_SAVERESTORE(CMultiSource, CBaseEntity);
LINK_ENTITY_TO_CLASS(multisource, CMultiSource);
LINK_ENTITY_TO_CLASS(multisource, CMultiSource, CCSMultiSource);
// Cache user-entity-field values until spawn is called.
void CMultiSource::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -425,7 +425,7 @@ int CBaseButton::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
// 1) wooden clunk
// 2) metallic click
// 3) in-out
LINK_ENTITY_TO_CLASS(func_button, CBaseButton);
LINK_ENTITY_TO_CLASS(func_button, CBaseButton, CCSButton);
void CBaseButton::__MAKE_VHOOK(Spawn)()
{
@ -789,7 +789,7 @@ void CBaseButton::ButtonBackHome()
}
}
LINK_ENTITY_TO_CLASS(func_rot_button, CRotButton);
LINK_ENTITY_TO_CLASS(func_rot_button, CRotButton, CCSRotButton);
void CRotButton::__MAKE_VHOOK(Spawn)()
{
@ -856,7 +856,7 @@ void CRotButton::__MAKE_VHOOK(Spawn)()
}
IMPLEMENT_SAVERESTORE(CMomentaryRotButton, CBaseToggle);
LINK_ENTITY_TO_CLASS(momentary_rot_button, CMomentaryRotButton);
LINK_ENTITY_TO_CLASS(momentary_rot_button, CMomentaryRotButton, CCSMomentaryRotButton);
void CMomentaryRotButton::__MAKE_VHOOK(Spawn)()
{
@ -1071,8 +1071,8 @@ void CMomentaryRotButton::UpdateSelfReturn(float value)
}
IMPLEMENT_SAVERESTORE(CEnvSpark, CBaseEntity);
LINK_ENTITY_TO_CLASS(env_spark, CEnvSpark);
LINK_ENTITY_TO_CLASS(env_debris, CEnvSpark);
LINK_ENTITY_TO_CLASS(env_spark, CEnvSpark, CCSEnvSpark);
LINK_ENTITY_TO_CLASS(env_debris, CEnvSpark, CCSEnvSpark);
void CEnvSpark::__MAKE_VHOOK(Spawn)()
{
@ -1154,7 +1154,7 @@ void CEnvSpark::SparkStop(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
SetThink(NULL);
}
LINK_ENTITY_TO_CLASS(button_target, CButtonTarget);
LINK_ENTITY_TO_CLASS(button_target, CButtonTarget, CCSButtonTarget);
void CButtonTarget::__MAKE_VHOOK(Spawn)()
{

View File

@ -170,7 +170,6 @@ public:
public:
static TYPEDESCRIPTION IMPL(m_SaveData)[1];
float m_flDelay;
};

View File

@ -62,6 +62,8 @@ static DLL_FUNCTIONS gFunctionTable =
static NEW_DLL_FUNCTIONS gNewDLLFunctions
{
&OnFreeEntPrivateData,
&GameDLLShutdown,
NULL,
NULL,
NULL
};
@ -283,7 +285,7 @@ void printEntities()
}
}
NOINLINE edict_t *CREATE_NAMED_ENTITY(string_t iClass)
NOINLINE edict_t *EXT_FUNC CREATE_NAMED_ENTITY(string_t iClass)
{
edict_t *named = g_engfuncs.pfnCreateNamedEntity(iClass);
if (named != NULL)
@ -1080,4 +1082,5 @@ void OnFreeEntPrivateData(edict_t *pEnt)
pEntity->UpdateOnRemove();
RemoveEntityHashValue(pEntity->pev, STRING(pEntity->pev->classname), CLASSNAME);
Regamedll_FreeEntities(pEntity);
}

View File

@ -39,16 +39,19 @@
#undef CREATE_NAMED_ENTITY
#undef REMOVE_ENTITY
// These are caps bits to indicate what an object's capabilities (currently used for save/restore and level transitions)
#define FCAP_CUSTOMSAVE 0x00000001
#define FCAP_ACROSS_TRANSITION 0x00000002
#define FCAP_MUST_SPAWN 0x00000004
#define FCAP_DONT_SAVE 0x80000000
#define FCAP_IMPULSE_USE 0x00000008
#define FCAP_CONTINUOUS_USE 0x00000010
#define FCAP_ONOFF_USE 0x00000020
#define FCAP_DIRECTIONAL_USE 0x00000040
#define FCAP_MASTER 0x00000080
#define FCAP_FORCE_TRANSITION 0x00000080
#define FCAP_ACROSS_TRANSITION 0x00000002 // should transfer between transitions
#define FCAP_MUST_SPAWN 0x00000004 // Spawn after restore
#define FCAP_DONT_SAVE 0x80000000 // Don't save this
#define FCAP_IMPULSE_USE 0x00000008 // can be used by the player
#define FCAP_CONTINUOUS_USE 0x00000010 // can be used by the player
#define FCAP_ONOFF_USE 0x00000020 // can be used by the player
#define FCAP_DIRECTIONAL_USE 0x00000040 // Player sends +/- 1 when using (currently only tracktrains)
#define FCAP_MASTER 0x00000080 // Can be used to "master" other entities (like multisource)
// UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!!
#define FCAP_FORCE_TRANSITION 0x00000080 // ALWAYS goes across transitions
#define SetThink(a)\
m_pfnThink = static_cast<void (CBaseEntity::*)()>(a)
@ -62,6 +65,7 @@
#define SetMoveDone(a)\
m_pfnCallWhenMoveDone = static_cast<void (CBaseToggle::*)()>(a)
// for Classify
#define CLASS_NONE 0
#define CLASS_MACHINE 1
#define CLASS_PLAYER 2
@ -74,10 +78,10 @@
#define CLASS_ALIEN_PREDATOR 9
#define CLASS_INSECT 10
#define CLASS_PLAYER_ALLY 11
#define CLASS_PLAYER_BIOWEAPON 12
#define CLASS_ALIEN_BIOWEAPON 13
#define CLASS_PLAYER_BIOWEAPON 12 // hornets and snarks.launched by players
#define CLASS_ALIEN_BIOWEAPON 13 // hornets and snarks.launched by the alien menace
#define CLASS_VEHICLE 14
#define CLASS_BARNACLE 99
#define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures.
#define GIB_HEALTH_VALUE -30
@ -102,37 +106,43 @@
#define bits_CAP_FLY (1<<15)
#define bits_CAP_DOORS_GROUP (bits_CAP_USE | bits_CAP_AUTO_DOORS | bits_CAP_OPEN_DOORS)
#define DMG_GENERIC 0
#define DMG_CRUSH (1<<0)
#define DMG_BULLET (1<<1)
#define DMG_SLASH (1<<2)
#define DMG_BURN (1<<3)
#define DMG_FREEZE (1<<4)
#define DMG_FALL (1<<5)
#define DMG_BLAST (1<<6)
#define DMG_CLUB (1<<7)
#define DMG_SHOCK (1<<8)
#define DMG_SONIC (1<<9)
#define DMG_ENERGYBEAM (1<<10)
#define DMG_NEVERGIB (1<<12)
#define DMG_ALWAYSGIB (1<<13)
#define DMG_DROWN (1<<14)
#define DMG_TIMEBASED (~(0x3FFF))
#define SF_NORESPAWN (1<<30) // set this bit on guns and stuff that should never respawn.
#define DMG_PARALYZE (1<<15)
#define DMG_NERVEGAS (1<<16)
#define DMG_POISON (1<<17)
#define DMG_RADIATION (1<<18)
#define DMG_DROWNRECOVER (1<<19)
#define DMG_ACID (1<<20)
#define DMG_SLOWBURN (1<<21)
#define DMG_SLOWFREEZE (1<<22)
#define DMG_MORTAR (1<<23)
#define DMG_GENERIC 0 // generic damage was done
#define DMG_CRUSH (1<<0) // crushed by falling or moving object
#define DMG_BULLET (1<<1) // shot
#define DMG_SLASH (1<<2) // cut, clawed, stabbed
#define DMG_BURN (1<<3) // heat burned
#define DMG_FREEZE (1<<4) // frozen
#define DMG_FALL (1<<5) // fell too far
#define DMG_BLAST (1<<6) // explosive blast damage
#define DMG_CLUB (1<<7) // crowbar, punch, headbutt
#define DMG_SHOCK (1<<8) // electric shock
#define DMG_SONIC (1<<9) // sound pulse shockwave
#define DMG_ENERGYBEAM (1<<10) // laser or other high energy beam
#define DMG_NEVERGIB (1<<12) // with this bit OR'd in, no damage type will be able to gib victims upon death
#define DMG_ALWAYSGIB (1<<13) // with this bit OR'd in, any damage type can be made to gib victims upon death
#define DMG_DROWN (1<<14) // Drowning
// time-based damage
#define DMG_TIMEBASED (~(0x3FFF)) // mask for time-based damage
#define DMG_PARALYZE (1<<15) // slows affected creature down
#define DMG_NERVEGAS (1<<16) // nerve toxins, very bad
#define DMG_POISON (1<<17) // blood poisioning
#define DMG_RADIATION (1<<18) // radiation exposure
#define DMG_DROWNRECOVER (1<<19) // drowning recovery
#define DMG_ACID (1<<20) // toxic chemicals or acid burns
#define DMG_SLOWBURN (1<<21) // in an oven
#define DMG_SLOWFREEZE (1<<22) // in a subzero freezer
#define DMG_MORTAR (1<<23) // Hit by air raid (done to distinguish grenade from mortar)
#define DMG_EXPLOSION (1<<24)
#define DMG_GIB_CORPSE (DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB)
#define DMG_SHOWNHUD (DMG_POISON | DMG_ACID | DMG_FREEZE | DMG_SLOWFREEZE | DMG_DROWN | DMG_BURN | DMG_SLOWBURN | DMG_NERVEGAS | DMG_RADIATION | DMG_SHOCK)
#define SF_NORESPAWN (1 << 30)
// these are the damage types that are allowed to gib corpses
#define DMG_GIB_CORPSE (DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB)
// these are the damage types that have client hud art
#define DMG_SHOWNHUD (DMG_POISON | DMG_ACID | DMG_FREEZE | DMG_SLOWFREEZE | DMG_DROWN | DMG_BURN | DMG_SLOWBURN | DMG_NERVEGAS | DMG_RADIATION | DMG_SHOCK)
#define AIRTIME 12 // lung full of air lasts this many seconds
#define PARALYZE_DURATION 2 // number of 2 second intervals to take damage
@ -166,9 +176,11 @@
#define itbd_SlowFreeze 7
#define CDMG_TIMEBASED 8
#define GIB_NORMAL 0
#define GIB_NEVER 1
#define GIB_ALWAYS 2
// when calling KILLED(), a value that governs gib behavior is expected to be
// one of these three values
#define GIB_NORMAL 0 // gib if entity was overkilled
#define GIB_NEVER 1 // never gib, no matter how much death damage is done ( freezing, etc )
#define GIB_ALWAYS 2 // always gib ( Houndeye Shock, Barnacle Bite )
#define SF_ITEM_USE_ONLY 256
@ -181,49 +193,6 @@
#define EXPORT /**/
#endif // _WIN32
enum hash_types_e { CLASSNAME };
typedef struct hash_item_s
{
entvars_t *pev;
struct hash_item_s *next;
struct hash_item_s *lastHash;
int pevIndex;
} hash_item_t;
typedef struct locksounds
{
string_t sLockedSound;
string_t sLockedSentence;
string_t sUnlockedSound;
string_t sUnlockedSentence;
int iLockedSentence;
int iUnlockedSentence;
float flwaitSound;
float flwaitSentence;
BYTE bEOFLocked;
BYTE bEOFUnlocked;
} locksound_t;
typedef enum
{
USE_OFF,
USE_ON,
USE_SET,
USE_TOGGLE,
} USE_TYPE;
typedef enum
{
TRAIN_SAFE,
TRAIN_BLOCKING,
TRAIN_FOLLOWING
} TRAIN_CODE;
class CGrenade;
class CBaseEntity;
class CBaseMonster;
@ -234,8 +203,8 @@ class CSquadMonster;
class CCineMonster;
class CSound;
class EHANDLE
{
// EHANDLE. Safe way to point to CBaseEntities who may die between frames
class EHANDLE {
public:
edict_t *Get();
edict_t *Set(edict_t *pent);
@ -252,8 +221,8 @@ private:
int m_serialnumber;
};
class CBaseEntity
{
// Base Entity. All entity types derive from this
class CBaseEntity {
public:
virtual void Spawn() {}
virtual void Precache() {}
@ -299,36 +268,15 @@ public:
virtual BOOL IsNetClient() { return FALSE; }
virtual const char *TeamID() { return ""; }
virtual CBaseEntity *GetNextTarget();
virtual void Think()
{
if (m_pfnThink)
{
(this->*m_pfnThink)();
}
}
virtual void Touch(CBaseEntity *pOther)
{
if (m_pfnTouch)
{
(this->*m_pfnTouch)(pOther);
}
}
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType = USE_OFF, float value = 0.0f)
{
if (m_pfnUse)
{
(this->*m_pfnUse)(pActivator, pCaller, useType, value);
}
}
virtual void Blocked(CBaseEntity *pOther)
{
if (m_pfnBlocked)
{
(this->*m_pfnBlocked)(pOther);
}
}
virtual void Think() { if (m_pfnThink) (this->*m_pfnThink)(); }
virtual void Touch(CBaseEntity *pOther) { if (m_pfnTouch) (this->*m_pfnTouch)(pOther); }
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType = USE_OFF, float value = 0.0f) { if (m_pfnUse) (this->*m_pfnUse)(pActivator, pCaller, useType, value); }
virtual void Blocked(CBaseEntity *pOther) { if (m_pfnBlocked) (this->*m_pfnBlocked)(pOther); }
virtual CBaseEntity *Respawn() { return NULL; }
// used by monsters that are created by the MonsterMaker
virtual void UpdateOwner() {}
virtual BOOL FBecomeProne() { return FALSE; }
virtual Vector Center() { return (pev->absmax + pev->absmin) * 0.5f; }
virtual Vector EyePosition() { return (pev->origin + pev->view_ofs); }
@ -358,6 +306,7 @@ public:
#endif
public:
// allow engine to allocate instance data
void *operator new(size_t stAllocateBlock, entvars_t *pevnew) { return ALLOC_PRIVATE(ENT(pevnew), stAllocateBlock); }
void operator delete(void *pMem, entvars_t *pevnew) { pevnew->flags |= FL_KILLME; }
void UpdateOnRemove();
@ -384,28 +333,29 @@ public:
{
CBaseEntity *pEntity = Instance(pevMonster);
if (pEntity != NULL)
{
return pEntity->MyMonsterPointer();
}
return NULL;
}
CBaseMonster *GetMonsterPointer(edict_t *pentMonster)
{
CBaseEntity *pEntity = Instance(pentMonster);
if (pEntity)
if (pEntity != NULL)
return pEntity->MyMonsterPointer();
return NULL;
}
static CBaseEntity *Create(char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner = NULL);
edict_t *edict() { return ENT(pev); }
EOFFSET eoffset() { return OFFSET(pev); }
int entindex() { return ENTINDEX(edict()); }
public:
entvars_t *pev;
CBaseEntity *m_pGoalEnt;
CBaseEntity *m_pLink;
entvars_t *pev; // Don't need to save/restore this pointer, the engine resets it
// path corners
CBaseEntity *m_pGoalEnt; // path corner we are heading towards
CBaseEntity *m_pLink; // used for temporary link-list operations.
static TYPEDESCRIPTION IMPL(m_SaveData)[5];
@ -414,6 +364,7 @@ public:
void (CBaseEntity::*m_pfnUse)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
void (CBaseEntity::*m_pfnBlocked)(CBaseEntity *pOther);
// We use this variables to store each ammo count.
int *current_ammo;
float currentammo;
int maxammo_buckshot;
@ -436,17 +387,20 @@ public:
int ammo_57mm;
int maxammo_357sig;
int ammo_357sig;
// Special stuff for grenades and knife.
float m_flStartThrow;
float m_flReleaseThrow;
int m_iSwing;
// client has left the game
bool has_disconnected;
};
inline int FNullEnt(CBaseEntity *ent) { return (ent == NULL || FNullEnt(ent->edict())); }
inline int FNullEnt(EHANDLE hent) { return (hent == NULL || FNullEnt(OFFSET(hent.Get()))); }
class CPointEntity: public CBaseEntity
{
class CPointEntity: public CBaseEntity {
public:
virtual void Spawn();
virtual int ObjectCaps() { return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION); }
@ -459,25 +413,25 @@ public:
};
class CMultiSource: public CPointEntity
{
// MultiSouce
class CMultiSource: public CPointEntity {
public:
virtual void Spawn();
virtual void KeyValue(KeyValueData *pkvd);
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
virtual int ObjectCaps() { return (CPointEntity::ObjectCaps() | FCAP_MASTER); }
virtual BOOL IsTriggered(CBaseEntity *pActivator);
virtual int Save(CSave &save);
virtual int Restore(CRestore &restore);
virtual int ObjectCaps() { return (CPointEntity::ObjectCaps() | FCAP_MASTER); }
virtual BOOL IsTriggered(CBaseEntity *pActivator);
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
#ifdef HOOK_GAMEDLL
void Spawn_();
void KeyValue_(KeyValueData *pkvd);
void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
BOOL IsTriggered_(CBaseEntity *pActivator);
int Save_(CSave &save);
int Restore_(CRestore &restore);
BOOL IsTriggered_(CBaseEntity *pActivator);
void Use_(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
#endif
@ -493,8 +447,8 @@ public:
string_t m_globalstate;
};
class CBaseDelay: public CBaseEntity
{
// generic Delay entity.
class CBaseDelay: public CBaseEntity {
public:
virtual void KeyValue(KeyValueData *pkvd);
virtual int Save(CSave &save);
@ -518,8 +472,7 @@ public:
int m_iszKillTarget;
};
class CBaseAnimating: public CBaseDelay
{
class CBaseAnimating: public CBaseDelay {
public:
virtual int Save(CSave &save);
virtual int Restore(CRestore &restore);
@ -533,13 +486,15 @@ public:
#endif
public:
float StudioFrameAdvance(float flInterval = 0.0f);
// Basic Monster Animation functions
float StudioFrameAdvance(float flInterval = 0.0f); // accumulate animation frame time from last time called until now
BOOL GetSequenceFlags();
int LookupActivity(int activity);
int LookupActivityHeaviest(int activity);
int LookupSequence(const char *label);
void ResetSequenceInfo();
void DispatchAnimEvents(float flFutureInterval = 0.1f);
void ResetSequenceInfo_();
void DispatchAnimEvents(float flFutureInterval = 0.1f); // Handle events that have happend since last time called up until X seconds into the future
float SetBoneController(int iController, float flValue = 0.0f);
void InitBoneControllers();
@ -556,15 +511,16 @@ public:
public:
static TYPEDESCRIPTION IMPL(m_SaveData)[5];
float m_flFrameRate;
float m_flGroundSpeed;
float m_flLastEventCheck;
BOOL m_fSequenceFinished;
BOOL m_fSequenceLoops;
// animation needs
float m_flFrameRate; // computed FPS for current sequence
float m_flGroundSpeed; // computed linear movement rate for current sequence
float m_flLastEventCheck; // last time the event list was checked
BOOL m_fSequenceFinished; // flag set when StudioAdvanceFrame moves across a frame boundry
BOOL m_fSequenceLoops; // true if the sequence loops
};
class CBaseToggle: public CBaseAnimating
{
// generic Toggle entity.
class CBaseToggle: public CBaseAnimating {
public:
virtual void KeyValue(KeyValueData *pkvd);
virtual int Save(CSave &save);
@ -596,39 +552,39 @@ public:
static TYPEDESCRIPTION IMPL(m_SaveData)[19];
TOGGLE_STATE m_toggle_state;
float m_flActivateFinished;
float m_flMoveDistance;
float m_flActivateFinished; // like attack_finished, but for doors
float m_flMoveDistance; // how far a door should slide or rotate
float m_flWait;
float m_flLip;
float m_flTWidth;
float m_flTLength;
float m_flTWidth; // for plats
float m_flTLength; // for plats
Vector m_vecPosition1;
Vector m_vecPosition2;
Vector m_vecAngle1;
Vector m_vecAngle2;
int m_cTriggersLeft;
int m_cTriggersLeft; // trigger_counter only, # of activations remaining
float m_flHeight;
EHANDLE m_hActivator;
void (CBaseToggle::*m_pfnCallWhenMoveDone)();
Vector m_vecFinalDest;
Vector m_vecFinalAngle;
int m_bitsDamageInflict;
string_t m_sMaster;
int m_bitsDamageInflict; // DMG_ damage type that the door or tigger does
string_t m_sMaster; // If this button has a master switch, this is the targetname.
// A master switch must be of the multisource type. If all
// of the switches in the multisource have been triggered, then
// the button will be allowed to operate. Otherwise, it will be
// deactivated.
};
#include "basemonster.h"
// Generic Button
class CBaseButton: public CBaseToggle
{
enum BUTTON_CODE
{
BUTTON_NOTHING,
BUTTON_ACTIVATE,
BUTTON_RETURN
};
class CBaseButton: public CBaseToggle {
public:
virtual void Spawn();
virtual void Precache();
virtual void KeyValue(KeyValueData *pkvd);
@ -669,6 +625,7 @@ public:
void EXPORT ButtonBackHome();
void EXPORT ButtonUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
enum BUTTON_CODE { BUTTON_NOTHING, BUTTON_ACTIVATE, BUTTON_RETURN };
BUTTON_CODE ButtonResponseToTouch();
public:
@ -685,8 +642,8 @@ public:
int m_sounds;
};
class CWorld: public CBaseEntity
{
// This spawns first when each level begins.
class CWorld: public CBaseEntity {
public:
virtual void Spawn();
virtual void Precache();
@ -702,22 +659,37 @@ public:
};
template <class T>
#ifdef REGAMEDLL_SELF
extern class CCSEntity **g_GameEntities;
#endif
// Converts a entvars_t * to a class pointer
// It will allocate the class and entity if necessary
template <class TWrap, class T>
T *GetClassPtr(T *a)
{
entvars_t *pev = (entvars_t *)a;
if (!pev)
// allocate entity if necessary
if (pev == NULL)
pev = VARS(CREATE_ENTITY());
// get the private data
a = (T *)GET_PRIVATE(ENT(pev));
if (!a)
{
// allocate private data
a = new(pev) T;
a->pev = pev;
#ifdef REGAMEDLL_SELF
g_GameEntities[a->entindex()] = new TWrap (a);
#endif
#if defined(HOOK_GAMEDLL) && defined(_WIN32) && !defined(REGAMEDLL_UNIT_TESTS)
VirtualTableInit((void *)a, stripClass(typeid(T).name()));
#endif
}
return a;

File diff suppressed because it is too large Load Diff

View File

@ -115,7 +115,7 @@ int CMD_ARGC_();
const char *CMD_ARGV_(int i);
void set_suicide_frame(entvars_t *pev);
void TeamChangeUpdate(CBasePlayer *player, int team_id);
void BlinkAccount(CBasePlayer *player, int numBlinks);
void BlinkAccount(CBasePlayer *player, int numBlinks = 2);
BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason);
void ClientDisconnect(edict_t *pEntity);
void respawn(entvars_t *pev, BOOL fCopyCorpse = FALSE);
@ -132,6 +132,7 @@ void Host_Say(edict_t *pEntity, int teamonly);
void DropSecondary(CBasePlayer *pPlayer);
void DropPrimary(CBasePlayer *pPlayer);
bool CanBuyThis(CBasePlayer *pPlayer, int iWeapon);
bool CanBuyThis_(CBasePlayer *pPlayer, int iWeapon);
void BuyPistol(CBasePlayer *pPlayer, int iSlot);
void BuyShotgun(CBasePlayer *pPlayer, int iSlot);
void BuySubMachineGun(CBasePlayer *pPlayer, int iSlot);
@ -190,4 +191,19 @@ void CreateInstancedBaselines();
int InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message);
int AllowLagCompensation();
inline const char *GetTeamName(int team)
{
switch (team)
{
case CT:
return "CT";
case TERRORIST:
return "TERRORIST";
case SPECTATOR:
return "SPECTATOR";
default:
return "UNASSIGNED";
}
}
#endif // CLIENT_H

View File

@ -15,17 +15,15 @@ void CGib::LimitVelocity()
NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cGibs)
{
int i;
if (g_Language == LANGUAGE_GERMAN)
{
// no sticky gibs in germany right now!
return;
}
for (i = 0; i < cGibs; ++i)
for (int i = 0; i < cGibs; ++i)
{
CGib *pGib = GetClassPtr((CGib *)NULL);
CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL);
pGib->Spawn("models/stickygib.mdl");
pGib->pev->body = RANDOM_LONG(0, 2);
@ -67,7 +65,7 @@ NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cG
pGib->pev->movetype = MOVETYPE_TOSS;
pGib->pev->solid = SOLID_BBOX;
UTIL_SetSize(pGib->pev, Vector (0, 0,0), Vector (0, 0, 0));
UTIL_SetSize(pGib->pev, Vector(0, 0,0), Vector(0, 0, 0));
pGib->SetTouch(&CGib::StickyGibTouch);
pGib->SetThink(NULL);
}
@ -78,7 +76,7 @@ NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cG
void CGib::SpawnHeadGib(entvars_t *pevVictim)
{
CGib *pGib = GetClassPtr((CGib *)NULL);
CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL);
if (g_Language == LANGUAGE_GERMAN)
{
@ -139,9 +137,9 @@ void CGib::SpawnHeadGib(entvars_t *pevVictim)
void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human)
{
int cSplat;
for (cSplat = 0; cSplat < cGibs; cSplat++)
for (cSplat = 0; cSplat < cGibs; ++cSplat)
{
CGib *pGib = GetClassPtr((CGib *)NULL);
CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL);
if (g_Language == LANGUAGE_GERMAN)
{
@ -613,9 +611,10 @@ void CGib::WaitTillLand()
{
SetThink(&CBaseEntity::SUB_StartFadeOut);
pev->nextthink = gpGlobals->time + m_lifeTime;
#ifndef REGAMEDLL_FIXES
if (m_bloodColor != DONT_BLEED)
CSoundEnt::InsertSound(bits_SOUND_MEAT, pev->origin, 384, 25);
#endif
}
else
pev->nextthink = gpGlobals->time + 0.5f;
@ -733,9 +732,6 @@ int CBaseMonster::__MAKE_VHOOK(TakeHealth)(float flHealth, int bitsDamageType)
// When a monster is poisoned via an arrow etc it takes all the poison damage at once.
int CBaseMonster::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
float flTake;
Vector vecDir;
if (pev->takedamage == DAMAGE_NO)
return 0;
@ -751,13 +747,13 @@ int CBaseMonster::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *p
}
// LATER: make armor consideration here!
flTake = flDamage;
float flTake = flDamage;
// set damage type sustained
m_bitsDamageType |= bitsDamageType;
// grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit).
vecDir = Vector(0, 0, 0);
Vector vecDir(0, 0, 0);
if (!FNullEnt(pevInflictor))
{
@ -848,7 +844,7 @@ int CBaseMonster::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *p
int CBaseMonster::DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
// grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit).
Vector vecDir = Vector(0, 0, 0);
Vector vecDir(0, 0, 0);
if (!FNullEnt(pevInflictor))
{
@ -902,6 +898,31 @@ float CBaseMonster::DamageForce(float damage)
return force;
}
void EXT_FUNC PlayerBlind(CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector &color)
{
UTIL_ScreenFade(pPlayer, color, fadeTime, fadeHold, alpha, 0);
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pObserver || !pObserver->IsObservingPlayer(pPlayer))
continue;
if (!fadetoblack.value)
{
UTIL_ScreenFade(pObserver, color, fadeTime, fadeHold, alpha, 0);
}
}
pPlayer->Blind(fadeTime * 0.33, fadeHold, fadeTime, alpha);
if (TheBots != NULL)
{
TheBots->OnEvent(EVENT_PLAYER_BLINDED_BY_FLASHBANG, pPlayer);
}
}
void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType)
{
CBaseEntity *pEntity = NULL;
@ -947,12 +968,16 @@ void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker,
vecSpot = pPlayer->BodyTarget(vecSrc);
UTIL_TraceLine(vecSrc, vecSpot, dont_ignore_monsters, ENT(pevInflictor), &tr);
g_ReGameHookchains.m_RadiusFlash_TraceLine.callChain(NULL, pPlayer, pevInflictor, pevAttacker, vecSrc, vecSpot, &tr);
if (tr.flFraction != 1.0f && tr.pHit != pPlayer->pev->pContainingEntity)
continue;
#ifndef REGAMEDLL_FIXES
UTIL_TraceLine(vecSpot, vecSrc, dont_ignore_monsters, tr.pHit, &tr2);
if (tr2.flFraction >= 1.0)
#endif
{
if (tr.fStartSolid)
{
@ -999,27 +1024,8 @@ 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)
{
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pObserver || !pObserver->IsObservingPlayer(pPlayer))
continue;
if (!fadetoblack.value)
{
UTIL_ScreenFade(pObserver, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0);
}
}
pPlayer->Blind(fadeTime * 0.33, fadeHold, fadeTime, alpha);
if (TheBots != NULL)
{
TheBots->OnEvent(EVENT_PLAYER_BLINDED_BY_FLASHBANG, pPlayer);
}
Vector color(255, 255, 255);
g_ReGameHookchains.m_PlayerBlind.callChain(PlayerBlind, pPlayer, pevInflictor, pevAttacker, fadeTime, fadeHold, alpha, color);
}
}
}
@ -1029,8 +1035,6 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
float retval = 0.0f;
TraceResult tr;
Vector spot;
Vector2D dir;
Vector2D perp;
const float topOfHead = 25.0f;
const float standFeet = 34.0f;
@ -1069,11 +1073,10 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
if (tr.flFraction == 1.0f)
retval += 0.2f;
dir = (entity->pev->origin - vecSrc).Make2D();
Vector2D dir = (entity->pev->origin - vecSrc).Make2D();
dir.NormalizeInPlace();
perp.x = -dir.y * edgeOffset;
perp.y = dir.x * edgeOffset;
Vector2D perp(-dir.y * edgeOffset, dir.x * edgeOffset);
spot = entity->pev->origin + Vector(perp.x, perp.y, 0);
@ -1137,7 +1140,16 @@ void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker
damageRatio = GetAmountOfPlayerVisible(vecSrc, pEntity);
}
float length = (vecSrc - pEntity->pev->origin).Length();
damageRatio = GetAmountOfPlayerVisible(vecSrc, pEntity);
float length;
#ifdef REGAMEDLL_ADD
// allow to damage breakable objects
if (FClassnameIs(pEntity->pev, "func_breakable"))
length = (vecSrc - pEntity->Center()).Length();
else
#endif
length = (vecSrc - pEntity->pev->origin).Length();
if (useLOS)
{
@ -1150,12 +1162,28 @@ void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker
flAdjustedDamage = (flRadius - length) * (flRadius - length) * 1.25 / (flRadius * flRadius) * (damageRatio * flDamage) * 1.5;
}
else
{
flAdjustedDamage = flDamage - length * falloff;
#ifdef REGAMEDLL_ADD
// disable grenade damage through walls?
if (hegrenade_penetration.string[0] == '1' && (bitsDamageType & DMG_EXPLOSION))
{
UTIL_TraceLine(vecSrc, pEntity->pev->origin, ignore_monsters, NULL, &tr);
if (tr.flFraction != 1.0f)
flAdjustedDamage = 0.0f;
}
#endif
}
if (flAdjustedDamage < 0)
flAdjustedDamage = 0;
#ifdef REGAMEDLL_FIXES
if (flAdjustedDamage > 0)
#endif
pEntity->TakeDamage(pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType);
}
}
}
@ -1468,7 +1496,7 @@ void CBaseEntity::FireBullets(ULONG cShots, Vector vecSrc, Vector vecDirShooting
ClearMultiDamage();
gMultiDamage.type = (DMG_BULLET | DMG_NEVERGIB);
for (ULONG iShot = 1; iShot <= cShots; iShot++)
for (ULONG iShot = 1; iShot <= cShots; ++iShot)
{
int spark = 0;

View File

@ -187,10 +187,10 @@ void CBaseDoor::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
// 2) base
// 3) stone chain
// 4) screechy metal
LINK_ENTITY_TO_CLASS(func_door, CBaseDoor);
LINK_ENTITY_TO_CLASS(func_door, CBaseDoor, CCSDoor);
// func_water - same as a door.
LINK_ENTITY_TO_CLASS(func_water, CBaseDoor);
LINK_ENTITY_TO_CLASS(func_water, CBaseDoor, CCSDoor);
void CBaseDoor::__MAKE_VHOOK(Spawn)()
{
@ -767,7 +767,7 @@ void CBaseDoor::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther)
if (FClassnameIs(pentTarget, "func_door") || FClassnameIs(pentTarget, "func_door_rotating"))
{
pDoor = GetClassPtr((CBaseDoor *)VARS(pentTarget));
pDoor = GetClassPtr<CCSDoor>((CBaseDoor *)VARS(pentTarget));
if (pDoor->m_flWait >= 0)
{
@ -840,7 +840,7 @@ void CBaseDoor::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther)
// 2) base
// 3) stone chain
// 4) screechy metal
LINK_ENTITY_TO_CLASS(func_door_rotating, CRotDoor);
LINK_ENTITY_TO_CLASS(func_door_rotating, CRotDoor, CCSRotDoor);
void CRotDoor::__MAKE_VHOOK(Restart)()
{
@ -938,7 +938,7 @@ void CRotDoor::__MAKE_VHOOK(SetToggleState)(int state)
UTIL_SetOrigin(pev, pev->origin);
}
LINK_ENTITY_TO_CLASS(momentary_door, CMomentaryDoor);
LINK_ENTITY_TO_CLASS(momentary_door, CMomentaryDoor, CCSMomentaryDoor);
IMPLEMENT_SAVERESTORE(CMomentaryDoor, CBaseToggle);
void CMomentaryDoor::__MAKE_VHOOK(Spawn)()

View File

@ -61,8 +61,8 @@ TYPEDESCRIPTION CGibShooter::m_SaveData[] =
#endif // HOOK_GAMEDLL
LINK_ENTITY_TO_CLASS(info_target, CPointEntity);
LINK_ENTITY_TO_CLASS(env_bubbles, CBubbling);
LINK_ENTITY_TO_CLASS(info_target, CPointEntity, CCSPointEntity);
LINK_ENTITY_TO_CLASS(env_bubbles, CBubbling, CCSBubbling);
IMPLEMENT_SAVERESTORE(CBubbling, CBaseEntity);
void CBubbling::__MAKE_VHOOK(Spawn)()
@ -154,7 +154,7 @@ void CBubbling::FizzThink()
pev->nextthink = gpGlobals->time + 2.5f - (0.1f * m_frequency);
}
LINK_ENTITY_TO_CLASS(beam, CBeam);
LINK_ENTITY_TO_CLASS(beam, CBeam, CCSBeam);
void CBeam::__MAKE_VHOOK(Spawn)()
{
@ -218,7 +218,7 @@ const Vector &CBeam::GetEndPos()
CBeam *CBeam::BeamCreate(const char *pSpriteName, int width)
{
// Create a new entity with CBeam private data
CBeam *pBeam = GetClassPtr((CBeam *)NULL);
CBeam *pBeam = GetClassPtr<CCSBeam>((CBeam *)NULL);
MAKE_STRING_CLASS("beam", pBeam->pev);
pBeam->BeamInit(pSpriteName, width);
@ -350,8 +350,8 @@ void CBeam::DoSparks(const Vector &start, const Vector &end)
}
}
LINK_ENTITY_TO_CLASS(env_lightning, CLightning);
LINK_ENTITY_TO_CLASS(env_beam, CLightning);
LINK_ENTITY_TO_CLASS(env_lightning, CLightning, CCSLightning);
LINK_ENTITY_TO_CLASS(env_beam, CLightning, CCSLightning);
IMPLEMENT_SAVERESTORE(CLightning, CBeam);
void CLightning::__MAKE_VHOOK(Spawn)()
@ -715,7 +715,7 @@ void CLightning::RandomArea()
for (int iLoops = 0; iLoops < 10; iLoops++)
{
Vector vecSrc = pev->origin;
Vector vecDir1 = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1));
Vector vecDir1(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1));
vecDir1 = vecDir1.Normalize();
TraceResult tr1;
@ -756,7 +756,7 @@ void CLightning::RandomPoint(Vector &vecSrc)
{
for (int iLoops = 0; iLoops < 10; iLoops++)
{
Vector vecDir1 = Vector(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1));
Vector vecDir1(RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1), RANDOM_FLOAT(-1, 1));
vecDir1 = vecDir1.Normalize();
TraceResult tr1;
@ -846,7 +846,7 @@ void CLightning::BeamUpdateVars()
}
}
LINK_ENTITY_TO_CLASS(env_laser, CLaser);
LINK_ENTITY_TO_CLASS(env_laser, CLaser, CCSLaser);
IMPLEMENT_SAVERESTORE(CLaser, CBeam);
void CLaser::__MAKE_VHOOK(Spawn)()
@ -1005,7 +1005,7 @@ void CLaser::StrikeThink()
pev->nextthink = gpGlobals->time + 0.1f;
}
LINK_ENTITY_TO_CLASS(env_glow, CGlow);
LINK_ENTITY_TO_CLASS(env_glow, CGlow, CCSGlow);
IMPLEMENT_SAVERESTORE(CGlow, CPointEntity);
void CGlow::__MAKE_VHOOK(Spawn)()
@ -1044,7 +1044,7 @@ void CGlow::Animate(float frames)
}
}
LINK_ENTITY_TO_CLASS(env_bombglow, CBombGlow);
LINK_ENTITY_TO_CLASS(env_bombglow, CBombGlow, CCSBombGlow);
void CBombGlow::__MAKE_VHOOK(Spawn)()
{
@ -1096,7 +1096,7 @@ void CBombGlow::__MAKE_VHOOK(Think)()
pev->nextthink = gpGlobals->time + 0.05f;
}
LINK_ENTITY_TO_CLASS(env_sprite, CSprite);
LINK_ENTITY_TO_CLASS(env_sprite, CSprite, CCSSprite);
IMPLEMENT_SAVERESTORE(CSprite, CPointEntity);
void CSprite::__MAKE_VHOOK(Spawn)()
@ -1160,7 +1160,7 @@ void CSprite::SpriteInit(const char *pSpriteName, const Vector &origin)
CSprite *CSprite::SpriteCreate(const char *pSpriteName, const Vector &origin, BOOL animate)
{
CSprite *pSprite = GetClassPtr((CSprite *)NULL);
CSprite *pSprite = GetClassPtr<CCSSprite>((CSprite *)NULL);
pSprite->SpriteInit(pSpriteName, origin);
MAKE_STRING_CLASS("env_sprite", pSprite->pev);
@ -1273,7 +1273,7 @@ void CSprite::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, U
}
IMPLEMENT_SAVERESTORE(CGibShooter, CBaseDelay);
LINK_ENTITY_TO_CLASS(gibshooter, CGibShooter);
LINK_ENTITY_TO_CLASS(gibshooter, CGibShooter, CCSGibShooter);
void CGibShooter::__MAKE_VHOOK(Precache)()
{
@ -1345,7 +1345,7 @@ CGib *CGibShooter::__MAKE_VHOOK(CreateGib)()
if (CVAR_GET_FLOAT("violence_hgibs") == 0)
return NULL;
CGib *pGib = GetClassPtr((CGib *)NULL);
CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL);
pGib->Spawn("models/hgibs.mdl");
pGib->m_bloodColor = BLOOD_COLOR_RED;
@ -1425,7 +1425,7 @@ void CGibShooter::ShootThink()
}
}
LINK_ENTITY_TO_CLASS(env_shooter, CEnvShooter);
LINK_ENTITY_TO_CLASS(env_shooter, CEnvShooter, CCSEnvShooter);
void CEnvShooter::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -1474,7 +1474,7 @@ void CEnvShooter::__MAKE_VHOOK(Precache)()
CGib *CEnvShooter::__MAKE_VHOOK(CreateGib)()
{
CGib *pGib = GetClassPtr((CGib *)NULL);
CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL);
pGib->Spawn(STRING(pev->model));
@ -1497,7 +1497,7 @@ CGib *CEnvShooter::__MAKE_VHOOK(CreateGib)()
return pGib;
}
LINK_ENTITY_TO_CLASS(test_effect, CTestEffect);
LINK_ENTITY_TO_CLASS(test_effect, CTestEffect, CCSTestEffect);
void CTestEffect::__MAKE_VHOOK(Spawn)()
{
@ -1571,7 +1571,7 @@ void CTestEffect::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCalle
m_flStartTime = gpGlobals->time;
}
LINK_ENTITY_TO_CLASS(env_blood, CBlood);
LINK_ENTITY_TO_CLASS(env_blood, CBlood, CCSBlood);
void CBlood::__MAKE_VHOOK(Spawn)()
{
@ -1659,7 +1659,7 @@ void CBlood::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, US
}
}
LINK_ENTITY_TO_CLASS(env_shake, CShake);
LINK_ENTITY_TO_CLASS(env_shake, CShake, CCSShake);
void CShake::__MAKE_VHOOK(Spawn)()
{
@ -1703,7 +1703,7 @@ void CShake::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, US
UTIL_ScreenShake(pev->origin, Amplitude(), Frequency(), Duration(), Radius());
}
LINK_ENTITY_TO_CLASS(env_fade, CFade);
LINK_ENTITY_TO_CLASS(env_fade, CFade, CCSFade);
void CFade::__MAKE_VHOOK(Spawn)()
{
@ -1752,7 +1752,7 @@ void CFade::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE
SUB_UseTargets(this, USE_TOGGLE, 0);
}
LINK_ENTITY_TO_CLASS(env_message, CMessage);
LINK_ENTITY_TO_CLASS(env_message, CMessage, CCSMessage);
void CMessage::__MAKE_VHOOK(Spawn)()
{
@ -1845,7 +1845,7 @@ void CMessage::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
SUB_UseTargets(this, USE_TOGGLE, 0);
}
LINK_ENTITY_TO_CLASS(env_funnel, CEnvFunnel);
LINK_ENTITY_TO_CLASS(env_funnel, CEnvFunnel, CCSEnvFunnel);
void CEnvFunnel::__MAKE_VHOOK(Precache)()
{
@ -1891,7 +1891,7 @@ void CEnvBeverage::__MAKE_VHOOK(Precache)()
PRECACHE_SOUND("weapons/g_bounce3.wav");
}
LINK_ENTITY_TO_CLASS(env_beverage, CEnvBeverage);
LINK_ENTITY_TO_CLASS(env_beverage, CEnvBeverage, CCSEnvBeverage);
void CEnvBeverage::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -1933,7 +1933,7 @@ void CItemSoda::__MAKE_VHOOK(Precache)()
;
}
LINK_ENTITY_TO_CLASS(item_sodacan, CItemSoda);
LINK_ENTITY_TO_CLASS(item_sodacan, CItemSoda, CCSItemSoda);
void CItemSoda::__MAKE_VHOOK(Spawn)()
{

View File

@ -13,7 +13,7 @@ TYPEDESCRIPTION CEnvExplosion::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(spark_shower, CShower);
LINK_ENTITY_TO_CLASS(spark_shower, CShower, CCSShower);
void CShower::__MAKE_VHOOK(Spawn)()
{
@ -68,7 +68,7 @@ void CShower::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
}
IMPLEMENT_SAVERESTORE(CEnvExplosion, CBaseMonster);
LINK_ENTITY_TO_CLASS(env_explosion, CEnvExplosion);
LINK_ENTITY_TO_CLASS(env_explosion, CEnvExplosion, CCSEnvExplosion);
void CEnvExplosion::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{

78
regamedll/dlls/extdef.h Normal file
View File

@ -0,0 +1,78 @@
/*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#pragma once
enum hash_types_e { CLASSNAME };
// Things that toggle (buttons/triggers/doors) need this
enum TOGGLE_STATE { TS_AT_TOP, TS_AT_BOTTOM, TS_GOING_UP, TS_GOING_DOWN };
typedef struct hash_item_s
{
entvars_t *pev;
struct hash_item_s *next;
struct hash_item_s *lastHash;
int pevIndex;
} hash_item_t;
typedef struct locksounds
{
string_t sLockedSound;
string_t sLockedSentence;
string_t sUnlockedSound;
string_t sUnlockedSentence;
int iLockedSentence;
int iUnlockedSentence;
float flwaitSound;
float flwaitSentence;
BYTE bEOFLocked;
BYTE bEOFUnlocked;
} locksound_t;
typedef struct hudtextparms_s
{
float x;
float y;
int effect;
byte r1,g1,b1,a1;
byte r2,g2,b2,a2;
float fadeinTime;
float fadeoutTime;
float holdTime;
float fxTime;
int channel;
} hudtextparms_t;
enum USE_TYPE { USE_OFF, USE_ON, USE_SET, USE_TOGGLE };
enum TRAIN_CODE { TRAIN_SAFE, TRAIN_BLOCKING, TRAIN_FOLLOWING };
enum IGNORE_MONSTERS { ignore_monsters = 1, dont_ignore_monsters = 0, missile = 2 };
enum IGNORE_GLASS { ignore_glass = 1, dont_ignore_glass = 0 };
enum { point_hull = 0, human_hull = 1, large_hull = 2, head_hull = 3 };

View File

@ -169,7 +169,7 @@ void CBreakable::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseDelay::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(func_breakable, CBreakable);
LINK_ENTITY_TO_CLASS(func_breakable, CBreakable, CCSBreakable);
IMPLEMENT_SAVERESTORE(CBreakable, CBaseEntity);
void CBreakable::__MAKE_VHOOK(Spawn)()
@ -848,7 +848,7 @@ int CBreakable::__MAKE_VHOOK(DamageDecal)(int bitsDamageType)
return CBaseEntity::DamageDecal(bitsDamageType);
}
LINK_ENTITY_TO_CLASS(func_pushable, CPushable);
LINK_ENTITY_TO_CLASS(func_pushable, CPushable, CCSPushable);
IMPLEMENT_SAVERESTORE(CPushable, CBreakable);
void CPushable::__MAKE_VHOOK(Spawn)()

View File

@ -654,7 +654,7 @@ void CFuncTank::StopRotSound()
pev->spawnflags &= ~SF_TANK_SOUNDON;
}
LINK_ENTITY_TO_CLASS(func_tank, CFuncTankGun);
LINK_ENTITY_TO_CLASS(func_tank, CFuncTankGun, CCSFuncTankGun);
void CFuncTankGun::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker)
{
@ -693,7 +693,7 @@ void CFuncTankGun::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &for
CFuncTank::Fire(barrelEnd, forward, pevAttacker);
}
LINK_ENTITY_TO_CLASS(func_tanklaser, CFuncTankLaser);
LINK_ENTITY_TO_CLASS(func_tanklaser, CFuncTankLaser, CCSFuncTankLaser);
IMPLEMENT_SAVERESTORE(CFuncTankLaser, CFuncTank);
void CFuncTankLaser::__MAKE_VHOOK(Activate)()
@ -789,7 +789,7 @@ void CFuncTankLaser::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &f
}
}
LINK_ENTITY_TO_CLASS(func_tankrocket, CFuncTankRocket);
LINK_ENTITY_TO_CLASS(func_tankrocket, CFuncTankRocket, CCSFuncTankRocket);
void CFuncTankRocket::__MAKE_VHOOK(Precache)()
{
@ -819,7 +819,7 @@ void CFuncTankRocket::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &
CFuncTank::Fire(barrelEnd, forward, pev);
}
LINK_ENTITY_TO_CLASS(func_tankmortar, CFuncTankMortar);
LINK_ENTITY_TO_CLASS(func_tankmortar, CFuncTankMortar, CCSFuncTankMortar);
void CFuncTankMortar::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -847,9 +847,7 @@ void CFuncTankMortar::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &
UTIL_MakeAimVectors(pev->angles);
TankTrace(barrelEnd, forward, gTankSpread[m_spread], tr);
ExplosionCreate(tr.vecEndPos, pev->angles, edict(), pev->impulse, TRUE);
CFuncTank::Fire(barrelEnd, forward, pev);
}
}
@ -857,7 +855,7 @@ void CFuncTankMortar::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &
CFuncTank::Fire(barrelEnd, forward, pev);
}
LINK_ENTITY_TO_CLASS(func_tankcontrols, CFuncTankControls);
LINK_ENTITY_TO_CLASS(func_tankcontrols, CFuncTankControls, CCSFuncTankControls);
IMPLEMENT_SAVERESTORE(CFuncTankControls, CBaseEntity);
void CFuncTankControls::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)

View File

@ -162,9 +162,7 @@ public:
virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker);
#ifdef HOOK_GAMEDLL
void Fire_(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker);
#endif
};
@ -252,7 +250,6 @@ public:
public:
static TYPEDESCRIPTION IMPL(m_SaveData)[1];
CFuncTank *m_pTank;
};

View File

@ -95,9 +95,12 @@ cvar_t sk_scientist_heal3 = { "sk_scientist_heal3", "0", 0, 0.0f, NULL };
#ifdef REGAMEDLL_ADD
cvar_t game_version = { "game_version", APP_VERSION_STRD, FCVAR_SERVER, 0.0f, NULL };
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, NULL };
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t game_version = { "game_version", APP_VERSION_STRD, FCVAR_SERVER, 0.0f, nullptr };
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, nullptr };
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, nullptr };
cvar_t hegrenade_penetration = { "mp_hegrenade_penetration", "0", 0, 0.0f, nullptr };
cvar_t nadedrops = { "mp_nadedrops", "0", 0, 0.0f, nullptr };
cvar_t roundrespawn_time = { "mp_roundrespawn_time", "20", 0, 20.0f, nullptr };
void GameDLL_Version_f()
{
@ -222,6 +225,9 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&game_version);
CVAR_REGISTER(&maxmoney);
CVAR_REGISTER(&round_infinite);
CVAR_REGISTER(&hegrenade_penetration);
CVAR_REGISTER(&nadedrops);
CVAR_REGISTER(&roundrespawn_time);
// print version
CONSOLE_ECHO("ReGameDLL build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")\n");
@ -233,3 +239,8 @@ void EXT_FUNC GameDLLInit()
Tutor_RegisterCVars();
Hostage_RegisterCVars();
}
void EXT_FUNC GameDLLShutdown()
{
Regamedll_FreeEntities();
}

View File

@ -135,9 +135,13 @@ extern cvar_t sk_scientist_heal3;
extern cvar_t maxmoney;
extern cvar_t round_infinite;
extern cvar_t hegrenade_penetration;
extern cvar_t nadedrops;
extern cvar_t roundrespawn_time;
#endif
void GameDLLInit();
void GameDLLShutdown();
#endif // GAME_H

View File

@ -113,7 +113,9 @@ void CGameRules::__MAKE_VHOOK(RefreshSkillData)()
gSkillData.healthkitCapacity = 15;
}
CGameRules *InstallGameRules()
LINK_HOOK_CHAIN2(CGameRules *, InstallGameRules);
CGameRules *__API_HOOK(InstallGameRules)()
{
SERVER_COMMAND("exec game.cfg\n");
SERVER_EXECUTE();

View File

@ -34,8 +34,6 @@
#include "game_shared/voice_gamemgr.h"
#define COM_TOKEN_LEN 1500
#define MAX_RULE_BUFFER 1024
#define MAX_VOTE_MAPS 100
#define MAX_VIP_QUEUES 5
@ -52,6 +50,7 @@
#define ITEM_RESPAWN_TIME 30
#define WEAPON_RESPAWN_TIME 20
#define AMMO_RESPAWN_TIME 20
#define ROUND_RESPAWN_TIME 20
// longest the intermission can last, in seconds
#define MAX_INTERMISSION_TIME 120
@ -76,9 +75,10 @@ enum
// custom enum
// used for EndRoundMessage() logged messages
enum ScenarionEventEndRound
enum ScenarioEventEndRound
{
ROUND_TARGET_BOMB = 1,
ROUND_NONE,
ROUND_TARGET_BOMB,
ROUND_VIP_ESCAPED,
ROUND_VIP_ASSASSINATED,
ROUND_TERRORISTS_ESCAPED,
@ -502,21 +502,44 @@ public:
public:
// Checks if it still needs players to start a round, or if it has enough players to start rounds.
// Starts a round and returns true if there are enough players.
bool NeededPlayersCheck(bool &bNeededPlayers);
bool NeededPlayersCheck();
// Setup counts for m_iNumTerrorist, m_iNumCT, m_iNumSpawnableTerrorist, m_iNumSpawnableCT, etc.
void InitializePlayerCounts(int &NumAliveTerrorist, int &NumAliveCT, int &NumDeadTerrorist, int &NumDeadCT);
// Check to see if the round is over for the various game types. Terminates the round
// and returns true if the round should end.
bool PrisonRoundEndCheck(int NumAliveTerrorist, int NumAliveCT, int NumDeadTerrorist, int NumDeadCT, bool bNeededPlayers);
bool BombRoundEndCheck(bool bNeededPlayers);
bool HostageRescueRoundEndCheck(bool bNeededPlayers);
bool VIPRoundEndCheck(bool bNeededPlayers);
bool PrisonRoundEndCheck(int NumAliveTerrorist, int NumAliveCT, int NumDeadTerrorist, int NumDeadCT);
bool BombRoundEndCheck();
bool HostageRescueRoundEndCheck();
bool VIPRoundEndCheck();
// Check to see if the teams exterminated each other. Ends the round and returns true if so.
bool TeamExterminationCheck(int NumAliveTerrorist, int NumAliveCT, int NumDeadTerrorist, int NumDeadCT, bool bNeededPlayers);
void TerminateRound(float tmDelay, int iWinStatus);
bool TeamExterminationCheck(int NumAliveTerrorist, int NumAliveCT, int NumDeadTerrorist, int NumDeadCT);
// for internal functions API
bool NeededPlayersCheck_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool VIP_Escaped_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool VIP_Died_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool VIP_NotEscaped_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Prison_Escaped_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Prison_PreventEscape_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Prison_NotEscaped_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Prison_Neutralized_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Target_Bombed_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Target_Saved_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Target_Defused_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
// Team extermination
bool Round_Cts_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Round_Ts_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Round_Draw_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Hostage_Rescue_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
bool Hostage_NotRescued_internal(int winStatus, ScenarioEventEndRound event, float tmDelay);
// Check various conditions to end the map.
bool CheckGameOver();
@ -563,6 +586,40 @@ public:
bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
void SendMOTDToClient(edict_t *client);
inline void TerminateRound(float tmDelay, int iWinStatus)
{
m_iRoundWinStatus = iWinStatus;
m_fTeamCount = gpGlobals->time + tmDelay;
m_bRoundTerminating = true;
}
inline float GetRoundRespawnTime() const
{
#ifdef REGAMEDLL_ADD
return roundrespawn_time.value;
#else
return ROUND_RESPAWN_TIME;
#endif
}
// allow the mode of fire on a friendly player (FFA)
inline bool IsFriendlyFireAttack() const
{
#ifdef REGAMEDLL_ADD
if (friendlyfire.string[0] == '2')
return true;
#endif
return false;
}
inline bool HasRoundInfinite(bool time_expired = false) const
{
#ifdef REGAMEDLL_ADD
if (round_infinite.string[0] == '1' || (time_expired && (UTIL_ReadFlags(round_infinite.string) & SCENARIO_BLOCK_TIME_EXPRIRED)))
return true;
#endif
return false;
}
private:
bool HasRoundTimeExpired();
bool IsBombPlanted();
@ -653,6 +710,10 @@ protected:
int m_iRoundWinDifference;
float m_fCareerMatchMenuTime;
bool m_bSkipSpawn;
// custom
bool m_bNeededPlayers;
float m_flEscapeRatio;
};
typedef struct mapcycle_item_s
@ -706,6 +767,7 @@ public:
extern CGameRules *g_pGameRules;
CGameRules *InstallGameRules();
CGameRules *InstallGameRules_();
inline CHalfLifeMultiplay *CSGameRules()
{

View File

@ -26,7 +26,7 @@ TYPEDESCRIPTION CGrenade::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(grenade, CGrenade);
LINK_ENTITY_TO_CLASS(grenade, CGrenade, CCSGrenade);
void CGrenade::Explode(Vector vecSrc, Vector vecAim)
{
@ -51,8 +51,10 @@ void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType)
}
int iContents = UTIL_PointContents(pev->origin);
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#endif
entvars_t *pevOwner = VARS(pev->owner);
if (TheBots != NULL)
@ -166,8 +168,10 @@ void CGrenade::Explode2(TraceResult *pTrace, int bitsDamageType)
// Sound! for everyone
EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/c4_explode1.wav", VOL_NORM, 0.25);
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#endif
entvars_t *pevOwner = VARS(pev->owner);
pev->owner = NULL;
@ -257,8 +261,9 @@ void CGrenade::Explode3(TraceResult *pTrace, int bitsDamageType)
WRITE_BYTE(TE_EXPLFLAG_NONE); // flags
MESSAGE_END();
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#endif
entvars_t *pevOwner = VARS(pev->owner);
if (TheBots != NULL)
@ -310,7 +315,10 @@ NOXREF void CGrenade::SG_Explode(TraceResult *pTrace, int bitsDamageType)
}
int iContents = UTIL_PointContents(pev->origin);
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3);
#endif
// can't traceline attack owner if this is set
pev->owner = NULL;
@ -517,7 +525,9 @@ void CGrenade::DetonateUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
void CGrenade::PreDetonate()
{
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin, 400, 0.3);
#endif
SetThink(&CGrenade::Detonate);
pev->nextthink = gpGlobals->time + 1.0f;
@ -626,7 +636,9 @@ void CGrenade::DangerSoundThink()
return;
}
#ifndef REGAMEDLL_FIXES
CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, pev->velocity.Length(), 0.2);
#endif
pev->nextthink = gpGlobals->time + 0.2f;
if (pev->waterlevel != 0)
@ -655,6 +667,7 @@ void CGrenade::BounceTouch(CBaseEntity *pOther)
vecTestVelocity = pev->velocity;
vecTestVelocity.z *= 0.7f;
#ifndef REGAMEDLL_FIXES
if (!m_fRegisteredSound && vecTestVelocity.Length() <= 60.0f)
{
// grenade is moving really slow. It's probably very close to where it will ultimately stop moving.
@ -664,7 +677,7 @@ void CGrenade::BounceTouch(CBaseEntity *pOther)
CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4f, 0.3);
m_fRegisteredSound = TRUE;
}
#endif
if (pev->flags & FL_ONGROUND)
{
// add a bit of static friction
@ -745,10 +758,12 @@ void CGrenade::TumbleThink()
StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1f;
#ifndef REGAMEDLL_FIXES
if (pev->dmgtime - 1 < gpGlobals->time)
{
CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * (pev->dmgtime - gpGlobals->time), 400, 0.1);
}
#endif
if (pev->dmgtime <= gpGlobals->time)
{
@ -783,10 +798,12 @@ void CGrenade::SG_TumbleThink()
StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1f;
#ifndef REGAMEDLL_FIXES
if (pev->dmgtime - 1 < gpGlobals->time)
{
CSoundEnt::InsertSound(bits_SOUND_DANGER, pev->origin + pev->velocity * (pev->dmgtime - gpGlobals->time), 400, 0.1);
}
#endif
if (pev->dmgtime <= gpGlobals->time)
{
@ -822,7 +839,7 @@ void CGrenade::__MAKE_VHOOK(Spawn)()
NOXREF CGrenade *CGrenade::ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity)
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)NULL);
pGrenade->Spawn();
// contact grenades arc lower
@ -850,7 +867,7 @@ NOXREF CGrenade *CGrenade::ShootContact(entvars_t *pevOwner, Vector vecStart, Ve
CGrenade *CGrenade::ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent)
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)NULL);
pGrenade->Spawn();
UTIL_SetOrigin(pGrenade->pev, vecStart);
@ -884,7 +901,7 @@ CGrenade *CGrenade::ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vec
CGrenade *CGrenade::ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time)
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)NULL);
pGrenade->Spawn();
UTIL_SetOrigin(pGrenade->pev, vecStart);
@ -928,7 +945,7 @@ void CGrenade::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
if (!m_bIsC4)
return;
CBasePlayer *player = GetClassPtr((CBasePlayer *)pActivator->pev);
CBasePlayer *player = GetClassPtr<CCSPlayer>((CBasePlayer *)pActivator->pev);
// For CTs to defuse the c4
if (player->m_iTeam != CT)
@ -1002,7 +1019,7 @@ void CGrenade::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecAngles)
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)NULL);
pGrenade->pev->movetype = MOVETYPE_TOSS;
MAKE_STRING_CLASS("grenade", pGrenade->pev);
@ -1056,7 +1073,7 @@ CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vec
CGrenade *CGrenade::ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent)
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)NULL);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)NULL);
pGrenade->Spawn();
UTIL_SetOrigin(pGrenade->pev, vecStart);

View File

@ -5,7 +5,7 @@
*/
#ifndef HOOK_GAMEDLL
const Vector g_vecZero = Vector(0, 0, 0);
const Vector g_vecZero(0, 0, 0);
NOXREF u_long g_ulFrameCount = 0;
#endif

View File

@ -17,7 +17,7 @@ TYPEDESCRIPTION CRecharge::m_SaveData[] =
#endif
IMPLEMENT_SAVERESTORE(CRecharge, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_recharge, CRecharge);
LINK_ENTITY_TO_CLASS(func_recharge, CRecharge, CCSRecharge);
void CRecharge::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{

View File

@ -31,8 +31,8 @@ void CGenericCycler::__MAKE_VHOOK(Spawn)()
GenericCyclerSpawn((char *)STRING(pev->model), Vector(-16, -16, 0), Vector(16, 16, 72));
}
LINK_ENTITY_TO_CLASS(cycler, CGenericCycler);
LINK_ENTITY_TO_CLASS(cycler_prdroid, CCyclerProbe);
LINK_ENTITY_TO_CLASS(cycler, CGenericCycler, CCSGenericCycler);
LINK_ENTITY_TO_CLASS(cycler_prdroid, CCyclerProbe, CCSCyclerProbe);
void CCyclerProbe::__MAKE_VHOOK(Spawn)()
{
@ -161,7 +161,7 @@ int CCycler::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAtt
return 0;
}
LINK_ENTITY_TO_CLASS(cycler_sprite, CCyclerSprite);
LINK_ENTITY_TO_CLASS(cycler_sprite, CCyclerSprite, CCSCyclerSprite);
IMPLEMENT_SAVERESTORE(CCyclerSprite, CBaseEntity);
void CCyclerSprite::__MAKE_VHOOK(Spawn)()
@ -242,7 +242,7 @@ void CCyclerSprite::Animate(float frames)
}
}
LINK_ENTITY_TO_CLASS(cycler_weapon, CWeaponCycler);
LINK_ENTITY_TO_CLASS(cycler_weapon, CWeaponCycler, CCSWeaponCycler);
void CWeaponCycler::__MAKE_VHOOK(Spawn)()
{
@ -303,7 +303,7 @@ void CWeaponCycler::__MAKE_VHOOK(SecondaryAttack)()
}
IMPLEMENT_SAVERESTORE(CWreckage, CBaseToggle);
LINK_ENTITY_TO_CLASS(cycler_wreckage, CWreckage);
LINK_ENTITY_TO_CLASS(cycler_wreckage, CWreckage, CCSWreckage);
void CWreckage::__MAKE_VHOOK(Spawn)()
{

View File

@ -16,7 +16,7 @@ TYPEDESCRIPTION CWallHealth::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(item_healthkit, CHealthKit);
LINK_ENTITY_TO_CLASS(item_healthkit, CHealthKit, CCSHealthKit);
void CHealthKit::__MAKE_VHOOK(Spawn)()
{
@ -54,7 +54,7 @@ BOOL CHealthKit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
}
IMPLEMENT_SAVERESTORE(CWallHealth, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_healthcharger, CWallHealth);
LINK_ENTITY_TO_CLASS(func_healthcharger, CWallHealth, CCSWallHealth);
void CWallHealth::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{

View File

@ -13,8 +13,8 @@ int g_iHostageNumber = 0;
#endif
LINK_ENTITY_TO_CLASS(hostage_entity, CHostage);
LINK_ENTITY_TO_CLASS(monster_scientist, CHostage);
LINK_ENTITY_TO_CLASS(hostage_entity, CHostage, CCSHostage);
LINK_ENTITY_TO_CLASS(monster_scientist, CHostage, CCSHostage);
void CHostage::__MAKE_VHOOK(Spawn)()
{
@ -229,7 +229,7 @@ void CHostage::IdleThink()
player = (CBasePlayer *)m_improv->GetFollowLeader();
}
else
player = GetClassPtr((CBasePlayer *)m_hTargetEnt->pev);
player = GetClassPtr<CCSPlayer>((CBasePlayer *)m_hTargetEnt->pev);
if (player == NULL || player->m_iTeam == CT)
{
@ -428,7 +428,7 @@ int CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAt
if (pevAttacker != NULL)
{
CBaseEntity *pAttackingEnt = GetClassPtr((CBaseEntity *)pevAttacker);
CBaseEntity *pAttackingEnt = GetClassPtr<CCSEntity>((CBaseEntity *)pevAttacker);
if (pAttackingEnt->Classify() == CLASS_VEHICLE)
{
@ -442,7 +442,7 @@ int CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAt
if (pAttackingEnt->IsPlayer())
{
pAttacker = GetClassPtr((CBasePlayer *)pevAttacker);
pAttacker = GetClassPtr<CCSPlayer>((CBasePlayer *)pevAttacker);
}
}
@ -820,7 +820,7 @@ void CHostage::DoFollow()
return;
}
pFollowing = GetClassPtr((CBaseEntity *)m_hTargetEnt->pev);
pFollowing = GetClassPtr<CCSEntity>((CBaseEntity *)m_hTargetEnt->pev);
m_LocalNav->SetTargetEnt(pFollowing);
vecDest = pFollowing->pev->origin;
@ -913,7 +913,7 @@ void CHostage::MoveToward(const Vector &vecLoc)
Vector vecAng;
float_precision flDist;
pFollowing = GetClassPtr((CBaseEntity *)m_hTargetEnt->pev);
pFollowing = GetClassPtr<CCSEntity>((CBaseEntity *)m_hTargetEnt->pev);
vecMove = vecLoc - pev->origin;
vecAng = UTIL_VecToAngles(vecMove);
vecAng = Vector(0, vecAng.y, 0);
@ -976,7 +976,7 @@ void CHostage::NavReady()
return;
}
pFollowing = GetClassPtr((CBaseEntity *)m_hTargetEnt->pev);
pFollowing = GetClassPtr<CCSEntity>((CBaseEntity *)m_hTargetEnt->pev);
vecDest = pFollowing->pev->origin;
if (!(pFollowing->pev->flags & FL_ONGROUND))
@ -1035,7 +1035,7 @@ void CHostage::SendHostagePositionMsg()
if (pEntity->pev->flags == FL_DORMANT)
continue;
CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pTempPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pTempPlayer->pev->deadflag == DEAD_NO && pTempPlayer->m_iTeam == CT)
{
@ -1065,7 +1065,7 @@ void CHostage::SendHostageEventMsg()
if (pEntity->pev->flags == FL_DORMANT)
continue;
CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pTempPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pTempPlayer->pev->deadflag == DEAD_NO && pTempPlayer->m_iTeam == CT)
{
@ -1082,7 +1082,7 @@ void CHostage::SendHostageEventMsg()
void CHostage::Wiggle()
{
TraceResult tr;
Vector vec = Vector(0, 0, 0);
Vector vec(0, 0, 0);
Vector wiggle_directions[] =
{
Vector(50, 0, 0),

View File

@ -1349,7 +1349,7 @@ void CHostageImprov::__MAKE_VHOOK(OnTouch)(CBaseEntity *other)
{
const float lookAheadRange = 30.0f;
float ground;
Vector normal = Vector(0, 0, 1);
Vector normal(0, 0, 1);
Vector alongFloor;
TraceResult result;
bool isStep = false;
@ -1385,7 +1385,7 @@ void CHostageImprov::__MAKE_VHOOK(OnTouch)(CBaseEntity *other)
if (isStep)
{
float stepAheadGround = pos.z;
Vector stepAheadNormal = Vector(0, 0, stepAheadGround);
Vector stepAheadNormal(0, 0, stepAheadGround);
m_inhibitObstacleAvoidance.Start(0.5);

View File

@ -33,7 +33,7 @@ CLocalNav::CLocalNav(CHostage *pOwner)
CLocalNav::~CLocalNav()
{
delete m_nodeArr;
delete[] m_nodeArr;
m_nodeArr = NULL;
}
@ -801,7 +801,7 @@ void CLocalNav::Think()
if (hCallback)
{
CHostage *pHostage = GetClassPtr((CHostage *)hCallback->pev);
CHostage *pHostage = GetClassPtr<CCSHostage>((CHostage *)hCallback->pev);
if (++qptr == MAX_HOSTAGES_NAV)
qptr = 0;
@ -830,7 +830,7 @@ void CLocalNav::RequestNav(CHostage *pCaller)
for (int i = 0; i < tot_inqueue; ++i)
{
CHostage *pQueueItem = GetClassPtr((CHostage *)_queue[curr]->pev);
CHostage *pQueueItem = GetClassPtr<CCSHostage>((CHostage *)_queue[curr]->pev);
if (pQueueItem == pCaller)
return;
@ -859,7 +859,7 @@ void CLocalNav::HostagePrethink()
{
if (hostages[ iCount ] != NULL)
{
GetClassPtr((CHostage *)hostages[ iCount ]->pev)->PreThink();
GetClassPtr<CCSHostage>((CHostage *)hostages[ iCount ]->pev)->PreThink();
}
}
}

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(world_items, CWorldItem);
LINK_ENTITY_TO_CLASS(world_items, CWorldItem, CCSWorldItem);
void CWorldItem::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -142,7 +142,7 @@ BOOL CItemSuit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_suit, CItemSuit);
LINK_ENTITY_TO_CLASS(item_suit, CItemSuit, CCSItemSuit);
void CItemBattery::__MAKE_VHOOK(Spawn)()
{
@ -189,7 +189,7 @@ BOOL CItemBattery::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return FALSE;
}
LINK_ENTITY_TO_CLASS(item_battery, CItemBattery);
LINK_ENTITY_TO_CLASS(item_battery, CItemBattery, CCSItemBattery);
void CItemAntidote::__MAKE_VHOOK(Spawn)()
{
@ -211,7 +211,7 @@ BOOL CItemAntidote::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_antidote, CItemAntidote);
LINK_ENTITY_TO_CLASS(item_antidote, CItemAntidote, CCSItemAntidote);
void CItemSecurity::__MAKE_VHOOK(Spawn)()
{
@ -231,7 +231,7 @@ BOOL CItemSecurity::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_security, CItemSecurity);
LINK_ENTITY_TO_CLASS(item_security, CItemSecurity, CCSItemSecurity);
void CItemLongJump::__MAKE_VHOOK(Spawn)()
{
@ -268,7 +268,7 @@ BOOL CItemLongJump::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return FALSE;
}
LINK_ENTITY_TO_CLASS(item_longjump, CItemLongJump);
LINK_ENTITY_TO_CLASS(item_longjump, CItemLongJump, CCSItemLongJump);
void CItemKevlar::__MAKE_VHOOK(Spawn)()
{
@ -306,7 +306,7 @@ BOOL CItemKevlar::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_kevlar, CItemKevlar);
LINK_ENTITY_TO_CLASS(item_kevlar, CItemKevlar, CCSItemKevlar);
void CItemAssaultSuit::__MAKE_VHOOK(Spawn)()
{
@ -343,7 +343,7 @@ BOOL CItemAssaultSuit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_assaultsuit, CItemAssaultSuit);
LINK_ENTITY_TO_CLASS(item_assaultsuit, CItemAssaultSuit, CCSItemAssaultSuit);
void CItemThighPack::__MAKE_VHOOK(Spawn)()
{
@ -386,4 +386,4 @@ BOOL CItemThighPack::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer)
return TRUE;
}
LINK_ENTITY_TO_CLASS(item_thighpack, CItemThighPack);
LINK_ENTITY_TO_CLASS(item_thighpack, CItemThighPack, CCSItemThighPack);

View File

@ -13,7 +13,7 @@ TYPEDESCRIPTION CLight::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(light, CLight);
LINK_ENTITY_TO_CLASS(light, CLight, CCSLight);
IMPLEMENT_SAVERESTORE(CLight, CPointEntity);
// Cache user-entity-field values until spawn is called.
@ -106,8 +106,8 @@ void CLight::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, US
}
}
LINK_ENTITY_TO_CLASS(light_spot, CLight);
LINK_ENTITY_TO_CLASS(light_environment, CEnvLight);
LINK_ENTITY_TO_CLASS(light_spot, CLight, CCSLight);
LINK_ENTITY_TO_CLASS(light_environment, CEnvLight, CCSEnvLight);
void CEnvLight::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{

View File

@ -39,9 +39,9 @@ class CLight: public CPointEntity
public:
virtual void Spawn();
virtual void Restart();
virtual void KeyValue(KeyValueData *pkvd);
virtual int Save(CSave &save);
virtual int Restore(CRestore &restore);
virtual void KeyValue(KeyValueData *pkvd);
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
#ifdef HOOK_GAMEDLL

View File

@ -73,7 +73,7 @@ void CRuleBrushEntity::__MAKE_VHOOK(Spawn)()
CRuleEntity::Spawn();
}
LINK_ENTITY_TO_CLASS(game_score, CGameScore);
LINK_ENTITY_TO_CLASS(game_score, CGameScore, CCSGameScore);
void CGameScore::__MAKE_VHOOK(Spawn)()
{
@ -110,7 +110,7 @@ void CGameScore::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller
}
}
LINK_ENTITY_TO_CLASS(game_end, CGameEnd);
LINK_ENTITY_TO_CLASS(game_end, CGameEnd, CCSGameEnd);
void CGameEnd::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -120,7 +120,7 @@ void CGameEnd::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
g_pGameRules->EndMultiplayerGame();
}
LINK_ENTITY_TO_CLASS(game_text, CGameText);
LINK_ENTITY_TO_CLASS(game_text, CGameText, CCSGameText);
IMPLEMENT_SAVERESTORE(CGameText, CRulePointEntity);
void CGameText::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -211,7 +211,7 @@ void CGameText::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller,
}
}
LINK_ENTITY_TO_CLASS(game_team_master, CGameTeamMaster);
LINK_ENTITY_TO_CLASS(game_team_master, CGameTeamMaster, CCSGameTeamMaster);
void CGameTeamMaster::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -301,7 +301,7 @@ BOOL CGameTeamMaster::TeamMatch(CBaseEntity *pActivator)
return UTIL_TeamsMatch(pActivator->TeamID(), TeamID());
}
LINK_ENTITY_TO_CLASS(game_team_set, CGameTeamSet);
LINK_ENTITY_TO_CLASS(game_team_set, CGameTeamSet, CCSGameTeamSet);
void CGameTeamSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -323,7 +323,7 @@ void CGameTeamSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCall
}
}
LINK_ENTITY_TO_CLASS(game_zone_player, CGamePlayerZone);
LINK_ENTITY_TO_CLASS(game_zone_player, CGamePlayerZone, CCSGamePlayerZone);
IMPLEMENT_SAVERESTORE(CGamePlayerZone, CRuleBrushEntity);
void CGamePlayerZone::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -410,7 +410,7 @@ void CGamePlayerZone::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
}
LINK_ENTITY_TO_CLASS(game_player_hurt, CGamePlayerHurt);
LINK_ENTITY_TO_CLASS(game_player_hurt, CGamePlayerHurt, CCSGamePlayerHurt);
void CGamePlayerHurt::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -433,7 +433,7 @@ void CGamePlayerHurt::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
}
}
LINK_ENTITY_TO_CLASS(game_counter, CGameCounter);
LINK_ENTITY_TO_CLASS(game_counter, CGameCounter, CCSGameCounter);
void CGameCounter::__MAKE_VHOOK(Spawn)()
{
@ -479,7 +479,7 @@ void CGameCounter::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCall
}
}
LINK_ENTITY_TO_CLASS(game_counter_set, CGameCounterSet);
LINK_ENTITY_TO_CLASS(game_counter_set, CGameCounterSet, CCSGameCounterSet);
void CGameCounterSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -494,7 +494,7 @@ void CGameCounterSet::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
}
}
LINK_ENTITY_TO_CLASS(game_player_equip, CGamePlayerEquip);
LINK_ENTITY_TO_CLASS(game_player_equip, CGamePlayerEquip, CCSGamePlayerEquip);
void CGamePlayerEquip::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -560,7 +560,7 @@ void CGamePlayerEquip::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *p
EquipPlayer(pActivator);
}
LINK_ENTITY_TO_CLASS(game_player_team, CGamePlayerTeam);
LINK_ENTITY_TO_CLASS(game_player_team, CGamePlayerTeam, CCSGamePlayerTeam);
const char *CGamePlayerTeam::TargetTeamName(const char *pszTargetName)
{

View File

@ -32,7 +32,7 @@
#pragma once
#endif
typedef struct
typedef struct MonsterEvent_s
{
int event;
char *options;

View File

@ -17,7 +17,7 @@ TYPEDESCRIPTION CFuncMortarField::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(func_mortar_field, CFuncMortarField);
LINK_ENTITY_TO_CLASS(func_mortar_field, CFuncMortarField, CCSFuncMortarField);
IMPLEMENT_SAVERESTORE(CFuncMortarField, CBaseToggle);
void CFuncMortarField::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -144,15 +144,16 @@ void CFuncMortarField::FieldUse(CBaseEntity *pActivator, CBaseEntity *pCaller, U
CBaseEntity *pMortar = Create("monster_mortar", tr.vecEndPos, Vector(0, 0, 0), pentOwner);
pMortar->pev->nextthink = gpGlobals->time + t;
t += RANDOM_FLOAT(0.2, 0.5);
#ifndef REGAMEDLL_FIXES
if (i == 0)
{
CSoundEnt::InsertSound(bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3);
}
#endif
}
}
LINK_ENTITY_TO_CLASS(monster_mortar, CMortar);
LINK_ENTITY_TO_CLASS(monster_mortar, CMortar, CCSMortar);
void CMortar::__MAKE_VHOOK(Spawn)()
{

View File

@ -149,7 +149,7 @@ void CBaseMonster::__MAKE_VHOOK(Look)(int iDistance)
CBaseEntity *pSightEnt = NULL;
CBaseEntity *pList[100];
Vector delta = Vector(iDistance, iDistance, iDistance);
Vector delta(iDistance, iDistance, 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));

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
#include "precompiled.h"
int GetForceCamera_api(CBasePlayer *pObserver)
LINK_HOOK_CHAIN(int, GetForceCamera, (CBasePlayer *pObserver), pObserver);
int __API_HOOK(GetForceCamera)(CBasePlayer *pObserver)
{
int retVal;
@ -17,27 +19,20 @@ int GetForceCamera_api(CBasePlayer *pObserver)
return retVal;
}
int GetForceCamera(CBasePlayer *pObserver)
{
return g_ReGameHookchains.m_GetForceCamera.callChain(GetForceCamera_api, pObserver);
}
LINK_HOOK_CLASS_CHAIN(CBaseEntity *, CBasePlayer, Observer_IsValidTarget, (int iPlayerIndex, bool bSameTeam), iPlayerIndex, bSameTeam);
CBasePlayer *Observer_IsValidTarget_api(CBasePlayer *pPlayer, CBasePlayer *pEntity, int iPlayerIndex, bool bSameTeam)
{
// Don't spec observers or players who haven't picked a class yet
if (!pEntity || pEntity == pPlayer || pEntity->has_disconnected || pEntity->IsObserver() || (pEntity->pev->effects & EF_NODRAW) || pEntity->m_iTeam == UNASSIGNED || (bSameTeam && pEntity->m_iTeam != pPlayer->m_iTeam))
return NULL;
return pEntity;
}
CBaseEntity *CBasePlayer::Observer_IsValidTarget(int iPlayerIndex, bool bSameTeam)
CBaseEntity *CBasePlayer::__API_HOOK(Observer_IsValidTarget)(int iPlayerIndex, bool bSameTeam)
{
if (iPlayerIndex > gpGlobals->maxClients || iPlayerIndex < 1)
return NULL;
CBasePlayer *pEnt = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(iPlayerIndex));
return g_ReGameHookchains.m_Observer_IsValidTarget.callChain(Observer_IsValidTarget_api, this, pEnt, iPlayerIndex, bSameTeam);
CBasePlayer *pPlayer = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(iPlayerIndex));
// Don't spec observers or players who haven't picked a class yet
if (!pPlayer || pPlayer == this || pPlayer->has_disconnected || pPlayer->IsObserver() || (pPlayer->pev->effects & EF_NODRAW) || pPlayer->m_iTeam == UNASSIGNED || (bSameTeam && pPlayer->m_iTeam != m_iTeam))
return NULL;
return pPlayer;
}
void UpdateClientEffects(CBasePlayer *pObserver, int oldMode)

View File

@ -37,6 +37,7 @@
#define CAMERA_MODE_SPEC_ONLY_FRIST_PERSON 2
int GetForceCamera(CBasePlayer *pObserver);
int GetForceCamera_(CBasePlayer *pObserver);
void UpdateClientEffects(CBasePlayer *pObserver, int oldMode);
#endif // OBSERVER_H

View File

@ -21,7 +21,7 @@ TYPEDESCRIPTION CPathTrack::m_SaveData[] =
#endif
LINK_ENTITY_TO_CLASS(path_corner, CPathCorner);
LINK_ENTITY_TO_CLASS(path_corner, CPathCorner, CCSPathCorner);
IMPLEMENT_SAVERESTORE(CPathCorner, CPointEntity);
void CPathCorner::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -41,7 +41,7 @@ void CPathCorner::__MAKE_VHOOK(Spawn)()
}
IMPLEMENT_SAVERESTORE(CPathTrack, CBaseEntity);
LINK_ENTITY_TO_CLASS(path_track, CPathTrack);
LINK_ENTITY_TO_CLASS(path_track, CPathTrack, CCSPathTrack);
void CPathTrack::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{

View File

@ -232,7 +232,7 @@ void CFuncPlat::CallHitBottom()
HitBottom();
}
LINK_ENTITY_TO_CLASS(func_plat, CFuncPlat);
LINK_ENTITY_TO_CLASS(func_plat, CFuncPlat, CCSFuncPlat);
#define noiseMovement noise
#define noiseStopMoving noise1
@ -325,7 +325,7 @@ void CFuncPlat::__MAKE_VHOOK(Spawn)()
void PlatSpawnInsideTrigger(entvars_t *pevPlatform)
{
GetClassPtr((CPlatTrigger *)NULL)->SpawnInsideTrigger(GetClassPtr((CFuncPlat *)pevPlatform));
GetClassPtr<CCSPlatTrigger>((CPlatTrigger *)NULL)->SpawnInsideTrigger(GetClassPtr<CCSFuncPlat>((CFuncPlat *)pevPlatform));
}
// Create a trigger entity for a platform.
@ -511,7 +511,7 @@ void CFuncPlat::__MAKE_VHOOK(Blocked)(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(func_platrot, CFuncPlatRot);
LINK_ENTITY_TO_CLASS(func_platrot, CFuncPlatRot, CCSFuncPlatRot);
IMPLEMENT_SAVERESTORE(CFuncPlatRot, CFuncPlat);
void CFuncPlatRot::SetupRotation()
@ -588,7 +588,7 @@ void CFuncPlatRot::RotMove(Vector &destAngle, float time)
}
}
LINK_ENTITY_TO_CLASS(func_train, CFuncTrain);
LINK_ENTITY_TO_CLASS(func_train, CFuncTrain, CCSFuncTrain);
IMPLEMENT_SAVERESTORE(CFuncTrain, CBasePlatTrain);
void CFuncTrain::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -885,7 +885,7 @@ void CFuncTrain::__MAKE_VHOOK(OverrideReset)()
}
IMPLEMENT_SAVERESTORE(CFuncTrackTrain, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_tracktrain, CFuncTrackTrain);
LINK_ENTITY_TO_CLASS(func_tracktrain, CFuncTrackTrain, CCSFuncTrackTrain);
void CFuncTrackTrain::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -1546,7 +1546,7 @@ void CFuncTrackTrain::__MAKE_VHOOK(Precache)()
m_usAdjustPitch = PRECACHE_EVENT(1, "events/train.sc");
}
LINK_ENTITY_TO_CLASS(func_traincontrols, CFuncTrainControls);
LINK_ENTITY_TO_CLASS(func_traincontrols, CFuncTrainControls, CCSFuncTrainControls);
void CFuncTrainControls::Find()
{
@ -1587,7 +1587,7 @@ BOOL CFuncTrackChange::__MAKE_VHOOK(IsTogglePlat)()
return TRUE;
}
LINK_ENTITY_TO_CLASS(func_trackchange, CFuncTrackChange);
LINK_ENTITY_TO_CLASS(func_trackchange, CFuncTrackChange, CCSFuncTrackChange);
IMPLEMENT_SAVERESTORE(CFuncTrackChange, CFuncPlatRot);
void CFuncTrackChange::__MAKE_VHOOK(Spawn)()
@ -1924,7 +1924,7 @@ void CFuncTrackChange::__MAKE_VHOOK(HitTop)()
EnableUse();
}
LINK_ENTITY_TO_CLASS(func_trackautochange, CFuncTrackAuto);
LINK_ENTITY_TO_CLASS(func_trackautochange, CFuncTrackAuto, CCSFuncTrackAuto);
// Auto track change
void CFuncTrackAuto::__MAKE_VHOOK(UpdateAutoTargets)(int toggleState)
@ -2015,7 +2015,7 @@ void CFuncTrackAuto::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCa
}
}
LINK_ENTITY_TO_CLASS(func_guntarget, CGunTarget);
LINK_ENTITY_TO_CLASS(func_guntarget, CGunTarget, CCSGunTarget);
IMPLEMENT_SAVERESTORE(CGunTarget, CBaseMonster);
void CGunTarget::__MAKE_VHOOK(Spawn)()

View File

@ -234,8 +234,8 @@ public:
virtual void EXPORT GoUp();
virtual void EXPORT GoDown();
virtual void HitBottom();
virtual void HitTop();
virtual void HitBottom();
virtual void UpdateAutoTargets(int toggleState);
#ifdef HOOK_GAMEDLL

View File

@ -140,46 +140,6 @@ TYPEDESCRIPTION CBasePlayer::m_playerSaveData[] =
DEFINE_FIELD(CBasePlayer, m_iJoiningState, FIELD_INTEGER),
};
WeaponStruct g_weaponStruct[ MAX_WEAPONS ] =
{
{ 0, 0, 0, 0, 0 },
{ WEAPON_P228, P228_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_357SIG_PRICE },
{ WEAPON_SCOUT, SCOUT_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_XM1014, XM1014_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_BUCKSHOT_PRICE },
{ WEAPON_MAC10, MAC10_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_45ACP_PRICE },
{ WEAPON_AUG, AUG_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_ELITE, ELITE_PRICE, CT, AUTOBUYCLASS_SECONDARY, AMMO_9MM_PRICE },
{ WEAPON_FIVESEVEN, FIVESEVEN_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_57MM_PRICE },
{ WEAPON_UMP45, UMP45_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_45ACP_PRICE },
{ WEAPON_SG550, SG550_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_USP, USP_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_45ACP_PRICE },
{ WEAPON_GLOCK18, GLOCK18_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_9MM_PRICE },
{ WEAPON_MP5N, MP5NAVY_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_9MM_PRICE },
{ WEAPON_AWP, AWP_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_338MAG_PRICE },
{ WEAPON_M249, M249_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_M3, M3_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_BUCKSHOT_PRICE },
{ WEAPON_M4A1, M4A1_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_TMP, TMP_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_9MM_PRICE },
{ WEAPON_G3SG1, G3SG1_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_DEAGLE, DEAGLE_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_50AE_PRICE },
{ WEAPON_SG552, SG552_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_AK47, AK47_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_P90, P90_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_57MM_PRICE },
{ WEAPON_FAMAS, FAMAS_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_GALIL, GALIL_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
// TODO: this have bug, the cost of galil $2000, but not $2250
{ WEAPON_SHIELDGUN, SHIELDGUN_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
char *CDeadHEV::m_szPoses[] =
{
"deadback",
@ -323,7 +283,7 @@ void WriteSigonMessages()
}
}
LINK_ENTITY_TO_CLASS(player, CBasePlayer);
LINK_ENTITY_TO_CLASS(player, CBasePlayer, CCSPlayer);
void SendItemStatus(CBasePlayer *pPlayer)
{
@ -481,7 +441,7 @@ CBasePlayer *CBasePlayer::GetNextRadioRecipient(CBasePlayer *pStartPlayer)
break;
bool bSend = false;
CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pEntity->IsPlayer())
{
@ -535,7 +495,7 @@ void CBasePlayer::Radio(const char *msg_id, const char *msg_verbose, short pitch
break;
bool bSend = false;
CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pPlayer == NULL)
continue;
@ -716,9 +676,11 @@ void CBasePlayer::DeathSound()
}
}
LINK_HOOK_CLASS_CHAIN(int, CBasePlayer, TakeHealth, (float flHealth, int bitsDamageType), flHealth, bitsDamageType);
// override takehealth
// bitsDamageType indicates type of damage healed.
int CBasePlayer::__MAKE_VHOOK(TakeHealth)(float flHealth, int bitsDamageType)
int CBasePlayer::__API_VHOOK(TakeHealth)(float flHealth, int bitsDamageType)
{
return CBaseMonster::TakeHealth(flHealth, bitsDamageType);
}
@ -742,7 +704,9 @@ bool CBasePlayer::IsHittingShield(Vector &vecDirection, TraceResult *ptr)
return false;
}
void CBasePlayer::__MAKE_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, TraceAttack, (entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType), pevAttacker, flDamage, vecDir, ptr, bitsDamageType);
void CBasePlayer::__API_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, VectorRef vecDir, TraceResult *ptr, int bitsDamageType)
{
bool bShouldBleed = true;
bool bShouldSpark = false;
@ -946,11 +910,13 @@ void LogAttack(CBasePlayer *pAttacker, CBasePlayer *pVictim, int teamAttack, int
}
}
LINK_HOOK_CLASS_CHAIN(int, CBasePlayer, TakeDamage, (entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType), pevInflictor, pevAttacker, flDamage, bitsDamageType);
// Take some damage.
// NOTE: each call to TakeDamage with bitsDamageType set to a time-based damage
// type will cause the damage time countdown to be reset. Thus the ongoing effects of poison, radiation
// etc are implemented with subsequent calls to TakeDamage using DMG_GENERIC.
int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
int CBasePlayer::__API_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
int fTookDamage;
float flRatio = ARMOR_RATIO;
@ -981,20 +947,15 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (bitsDamageType & DMG_EXPLOSION)
{
CBaseEntity *temp = GetClassPtr((CBaseEntity *)pevInflictor);
CBaseEntity *temp = GetClassPtr<CCSEntity>((CBaseEntity *)pevInflictor);
if (!Q_strcmp(STRING(temp->pev->classname), "grenade"))
{
CGrenade *pGrenade = GetClassPtr((CGrenade *)pevInflictor);
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)pevInflictor);
if (CVAR_GET_FLOAT("mp_friendlyfire"))
{
#ifdef REGAMEDLL_ADD
if (friendlyfire.string[0] == '2')
bTeamAttack = FALSE;
else
#endif
if (pGrenade->m_iTeam == m_iTeam)
if (!CSGameRules()->IsFriendlyFireAttack() && pGrenade->m_iTeam == m_iTeam)
bTeamAttack = TRUE;
pAttack = dynamic_cast<CBasePlayer *>(CBasePlayer::Instance(pevAttacker));
@ -1146,17 +1107,13 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (!IsAlive())
return 0;
pAttacker = GetClassPtr((CBaseEntity *)pevAttacker);
pAttacker = GetClassPtr<CCSEntity>((CBaseEntity *)pevAttacker);
if (pAttacker->IsPlayer())
{
pAttack = GetClassPtr((CBasePlayer *)pevAttacker);
pAttack = GetClassPtr<CCSPlayer>((CBasePlayer *)pevAttacker);
bool bAttackFFA = false;
#ifdef REGAMEDLL_ADD
if (friendlyfire.string[0] == '2')
bAttackFFA = true;
#endif
bool bAttackFFA = CSGameRules()->IsFriendlyFireAttack();
// warn about team attacks
if (pAttack != this && pAttack->m_iTeam == m_iTeam && !bAttackFFA)
@ -1185,7 +1142,7 @@ int CBasePlayer::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pe
if (FNullEnt(pBasePlayer->edict()))
break;
CBasePlayer *basePlayer = GetClassPtr((CBasePlayer *)pBasePlayer->pev);
CBasePlayer *basePlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pBasePlayer->pev);
if (basePlayer->m_iTeam == m_iTeam)
{
@ -1386,17 +1343,20 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
const char *modelName = GetCSModelName(pItem->m_iId);
if (modelName != NULL)
{
// create a box to pack the stuff into.
CWeaponBox *pWeaponBox = (CWeaponBox *)CBaseEntity::Create("weaponbox", pPlayer->pev->origin, pPlayer->pev->angles, ENT(pPlayer->pev));
// don't let weaponbox tilt.
pWeaponBox->pev->angles.x = 0;
pWeaponBox->pev->angles.z = 0;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75f;
pWeaponBox->SetThink(&CWeaponBox::Kill);
pWeaponBox->pev->nextthink = gpGlobals->time + 300.0f;
pWeaponBox->PackWeapon(pItem);
pWeaponBox->PackWeapon(pItem); // now pack all of the items in the lists
// pack the ammo
if (packAmmo)
{
pWeaponBox->PackAmmo(MAKE_STRING(IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[pItem->m_iId].pszAmmo1), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]);
@ -1405,8 +1365,64 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
}
}
#ifdef REGAMEDLL_ADD
void packPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
{
if (pItem == NULL)
return;
const char *modelName = GetCSModelName(pItem->m_iId);
if (modelName != NULL)
{
float flOffset = 0.0f;
switch (pItem->m_iId)
{
case WEAPON_HEGRENADE:
flOffset = 14.0f;
break;
case WEAPON_FLASHBANG:
flOffset = 0.0f;
break;
case WEAPON_SMOKEGRENADE:
flOffset = -14.0f;
break;
}
Vector vecAngles = pPlayer->pev->angles;
Vector dir(Q_cos(vecAngles.y) * flOffset, Q_sin(vecAngles.y) * flOffset, 0.0f);
vecAngles.x = 0.0f;
vecAngles.y += 45.0f;
// create a box to pack the stuff into.
CWeaponBox *pWeaponBox = (CWeaponBox *)CBaseEntity::Create("weaponbox", pPlayer->pev->origin + dir, vecAngles, ENT(pPlayer->pev));
// don't let weaponbox tilt.
pWeaponBox->pev->angles.x = 0;
pWeaponBox->pev->angles.z = 0;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75f;
pWeaponBox->SetThink(&CWeaponBox::Kill);
pWeaponBox->pev->nextthink = gpGlobals->time + 300.0f;
pWeaponBox->PackWeapon(pItem); // now pack all of the items in the lists
// pack the ammo
if (packAmmo)
{
pWeaponBox->PackAmmo(MAKE_STRING(IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[pItem->m_iId].pszAmmo1), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]);
}
SET_MODEL(ENT(pWeaponBox->pev), modelName);
}
}
#endif
// PackDeadPlayerItems - call this when a player dies to
// pack up the appropriate weapons and ammo items, and to
// destroy anything that shouldn't be packed.
void CBasePlayer::PackDeadPlayerItems()
{
// get the game rules
bool bPackGun = (g_pGameRules->DeadPlayerWeapons(this) != GR_PLR_DROP_GUN_NO);
bool bPackAmmo = (g_pGameRules->DeadPlayerAmmo(this) != GR_PLR_DROP_AMMO_NO);
@ -1422,8 +1438,9 @@ void CBasePlayer::PackDeadPlayerItems()
int nBestWeight = 0;
CBasePlayerItem *pBestItem = NULL;
for (int n = 0; n < MAX_ITEM_TYPES; n++)
for (int n = 0; n < MAX_ITEM_TYPES; ++n)
{
// there's a weapon here. Should I pack it?
CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[ n ];
while (pPlayerItem != NULL)
@ -1441,19 +1458,43 @@ void CBasePlayer::PackDeadPlayerItems()
}
}
// drop a grenade after death
else if (pPlayerItem->iItemSlot() == GRENADE_SLOT && g_bIsCzeroGame)
else if (pPlayerItem->iItemSlot() == GRENADE_SLOT)
{
if (g_bIsCzeroGame)
packPlayerItem(this, pPlayerItem, true);
#ifdef REGAMEDLL_ADD
else
{
switch ((int)nadedrops.value)
{
case 1:
packPlayerItem(this, pPlayerItem, true);
break;
case 2:
{
CBasePlayerItem *pNext = pPlayerItem->m_pNext;
packPlayerNade(this, pPlayerItem, true);
pPlayerItem = pNext;
continue;
}
}
}
#endif
}
pPlayerItem = pPlayerItem->m_pNext;
}
}
packPlayerItem(this, pBestItem, bPackAmmo);
}
RemoveAllItems(TRUE);
}
void CBasePlayer::GiveDefaultItems()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, GiveDefaultItems);
void CBasePlayer::__API_HOOK(GiveDefaultItems)()
{
RemoveAllItems(FALSE);
m_bHasPrimary = false;
@ -1605,7 +1646,7 @@ void CBasePlayer::SetProgressBarTime(int time)
if (FNullEnt(pPlayer->edict()))
break;
CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev);
CBasePlayer *player = GetClassPtr<CCSPlayer>((CBasePlayer *)pPlayer->pev);
if (player->IsObserver() == OBS_IN_EYE && player->pev->iuser2 == myIndex)
{
@ -1645,7 +1686,7 @@ void CBasePlayer::SetProgressBarTime2(int time, float timeElapsed)
if (FNullEnt(pPlayer->edict()))
break;
CBasePlayer *player = GetClassPtr((CBasePlayer *)pPlayer->pev);
CBasePlayer *player = GetClassPtr<CCSPlayer>((CBasePlayer *)pPlayer->pev);
if (player->IsObserver() == OBS_IN_EYE && player->pev->iuser2 == myIndex)
{
@ -1840,7 +1881,9 @@ void CBasePlayer::SendFOV(int fov)
MESSAGE_END();
}
void CBasePlayer::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, Killed, (entvars_t *pevAttacker, int iGib), pevAttacker, iGib);
void CBasePlayer::__API_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
{
m_canSwitchObserverModes = false;
@ -1937,13 +1980,14 @@ void CBasePlayer::__MAKE_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
m_pTank = NULL;
}
#ifndef REGAMEDLL_FIXES
CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict()));
if (pSound != NULL)
{
pSound->Reset();
}
#endif
SetAnimation(PLAYER_DIE);
if (m_pActiveItem != NULL && m_pActiveItem->m_pPlayer != NULL)
@ -2153,7 +2197,9 @@ BOOL CBasePlayer::IsBombGuy()
return m_bHasC4;
}
void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, SetAnimation, (PLAYER_ANIM playerAnim), playerAnim);
void CBasePlayer::__API_HOOK(SetAnimation)(PLAYER_ANIM playerAnim)
{
int animDesired;
float speed;
@ -2858,7 +2904,7 @@ NOXREF void CBasePlayer::ThrowWeapon(char *pszItemName)
}
}
LINK_ENTITY_TO_CLASS(weapon_shield, CWShield);
LINK_ENTITY_TO_CLASS(weapon_shield, CWShield, CCSShield);
void CWShield::__MAKE_VHOOK(Spawn)()
{
@ -2910,7 +2956,9 @@ void CWShield::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
}
}
void CBasePlayer::GiveShield(bool bDeploy)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, GiveShield, (bool bDeploy), bDeploy);
void CBasePlayer::__API_HOOK(GiveShield)(bool bDeploy)
{
m_bOwnsShield = true;
m_bHasPrimary = true;
@ -3023,7 +3071,9 @@ NOXREF void CBasePlayer::ThrowPrimary()
DropShield();
}
void CBasePlayer::AddAccount(int amount, bool bTrackChange)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddAccount, (int amount, bool bTrackChange), amount, bTrackChange);
void CBasePlayer::__API_HOOK(AddAccount)(int amount, bool bTrackChange)
{
m_iAccount += amount;
@ -3285,21 +3335,7 @@ void CBasePlayer::JoiningThink()
MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo);
WRITE_BYTE(entindex());
switch (m_iTeam)
{
case CT:
WRITE_STRING("CT");
break;
case TERRORIST:
WRITE_STRING("TERRORIST");
break;
case SPECTATOR:
WRITE_STRING("SPECTATOR");
break;
default:
WRITE_STRING("UNASSIGNED");
break;
}
WRITE_STRING(GetTeamName(m_iTeam));
MESSAGE_END();
MESSAGE_BEGIN(MSG_ALL, gmsgLocation);
@ -3366,12 +3402,14 @@ void CBasePlayer::Disappear()
m_pTank = NULL;
}
#ifndef REGAMEDLL_FIXES
CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict()));
if (pSound)
{
pSound->Reset();
}
#endif
m_fSequenceFinished = TRUE;
pev->modelindex = m_modelIndexPlayer;
@ -3517,7 +3555,9 @@ void CBasePlayer::PlayerDeathThink()
}
}
void CBasePlayer::__MAKE_VHOOK(RoundRespawn)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, RoundRespawn);
void CBasePlayer::__API_VHOOK(RoundRespawn)()
{
m_canSwitchObserverModes = true;
@ -3861,7 +3901,9 @@ void CBasePlayer::HostageUsed()
m_flDisplayHistory |= DHF_HOSTAGE_USED;
}
void CBasePlayer::__MAKE_VHOOK(Jump)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, Jump);
void CBasePlayer::__API_VHOOK(Jump)()
{
if (pev->flags & FL_WATERJUMP)
return;
@ -3931,19 +3973,32 @@ NOXREF void FixPlayerCrouchStuck(edict_t *pPlayer)
}
}
void CBasePlayer::__MAKE_VHOOK(Duck)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, Duck);
void CBasePlayer::__API_VHOOK(Duck)()
{
if (pev->button & IN_DUCK)
SetAnimation(PLAYER_WALK);
}
LINK_HOOK_CLASS_CHAIN2(int, CBasePlayer, ObjectCaps);
int CBasePlayer::__API_VHOOK(ObjectCaps)()
{
return (CBaseMonster::ObjectCaps() & ~FCAP_ACROSS_TRANSITION);
}
LINK_HOOK_CLASS_CHAIN2(int, CBasePlayer, Classify);
// ID's player as such.
int CBasePlayer::__MAKE_VHOOK(Classify)()
int CBasePlayer::__API_VHOOK(Classify)()
{
return CLASS_PLAYER;
}
void CBasePlayer::__MAKE_VHOOK(AddPoints)(int score, BOOL bAllowNegativeScore)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddPoints, (int score, BOOL bAllowNegativeScore), score, bAllowNegativeScore);
void CBasePlayer::__API_VHOOK(AddPoints)(int score, BOOL bAllowNegativeScore)
{
// Positive score always adds
if (score < 0 && !bAllowNegativeScore)
@ -3970,7 +4025,9 @@ void CBasePlayer::__MAKE_VHOOK(AddPoints)(int score, BOOL bAllowNegativeScore)
MESSAGE_END();
}
void CBasePlayer::__MAKE_VHOOK(AddPointsToTeam)(int score, BOOL bAllowNegativeScore)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddPointsToTeam, (int score, BOOL bAllowNegativeScore), score, bAllowNegativeScore);
void CBasePlayer::__API_VHOOK(AddPointsToTeam)(int score, BOOL bAllowNegativeScore)
{
int index = entindex();
@ -4058,7 +4115,9 @@ bool CBasePlayer::CanPlayerBuy(bool display)
return true;
}
void CBasePlayer::__MAKE_VHOOK(PreThink)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, PreThink);
void CBasePlayer::__API_VHOOK(PreThink)()
{
// These buttons have changed this frame
int buttonsChanged = (m_afButtonLast ^ pev->button);
@ -4529,9 +4588,8 @@ void CBasePlayer::UpdatePlayerSound()
{
int iBodyVolume;
int iVolume;
CSound *pSound;
pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict()));
CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(edict()));
if (!pSound)
{
@ -4633,7 +4691,9 @@ void CBasePlayer::UpdatePlayerSound()
gpGlobals->v_forward.z = 0;
}
void CBasePlayer::__MAKE_VHOOK(PostThink)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, PostThink);
void CBasePlayer::__API_VHOOK(PostThink)()
{
// intermission or finale
if (g_fGameOver)
@ -4703,10 +4763,12 @@ void CBasePlayer::__MAKE_VHOOK(PostThink)()
if (pev->flags & FL_ONGROUND)
{
#ifndef REGAMEDLL_FIXES
if (m_flFallVelocity > 64.0f && !g_pGameRules->IsMultiplayer())
{
CSoundEnt::InsertSound(bits_SOUND_PLAYER, pev->origin, m_flFallVelocity, 0.2);
}
#endif
m_flFallVelocity = 0;
}
@ -4724,7 +4786,11 @@ void CBasePlayer::__MAKE_VHOOK(PostThink)()
StudioFrameAdvance();
CheckPowerups();
// s1lent: this is useless for CS 1.6
#ifndef REGAMEDLL_FIXES
UpdatePlayerSound();
#endif
pt_end:
#ifdef CLIENT_WEAPONS
@ -4973,7 +5039,9 @@ void SetScoreAttrib(CBasePlayer *dest, CBasePlayer *src)
}
}
void CBasePlayer::__MAKE_VHOOK(Spawn)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, Spawn);
void CBasePlayer::__API_VHOOK(Spawn)()
{
int i;
@ -5258,21 +5326,7 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)()
MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo);
WRITE_BYTE(entindex());
switch (m_iTeam)
{
case CT:
WRITE_STRING("CT");
break;
case TERRORIST:
WRITE_STRING("TERRORIST");
break;
case SPECTATOR:
WRITE_STRING("SPECTATOR");
break;
default:
WRITE_STRING("UNASSIGNED");
break;
}
WRITE_STRING(GetTeamName(m_iTeam));
MESSAGE_END();
UpdateLocation(true);
@ -5314,8 +5368,11 @@ void CBasePlayer::__MAKE_VHOOK(Spawn)()
m_flLastCommandTime[i] = -1;
}
void CBasePlayer::__MAKE_VHOOK(Precache)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, Precache);
void CBasePlayer::__API_VHOOK(Precache)()
{
#ifndef REGAMEDLL_FIXES
// in the event that the player JUST spawned, and the level node graph
// was loaded, fix all of the node graph pointers before the game starts.
@ -5331,7 +5388,7 @@ void CBasePlayer::__MAKE_VHOOK(Precache)()
ALERT(at_console, "**Graph Pointers Set!\n");
}
}
#endif
// SOUNDS / MODELS ARE PRECACHED in ClientPrecache() (game specific)
// because they need to precache before any clients have connected
@ -5654,7 +5711,7 @@ void CSprayCan::Spawn(entvars_t *pevOwner)
pev->owner = ENT(pevOwner);
pev->frame = 0;
pev->nextthink = gpGlobals->time + 0.1;
pev->nextthink = gpGlobals->time + 0.1f;
EMIT_SOUND(ENT(pev), CHAN_VOICE, "player/sprayer.wav", VOL_NORM, ATTN_NORM);
}
@ -5692,7 +5749,7 @@ void CSprayCan::__MAKE_VHOOK(Think)()
UTIL_Remove(this);
}
pev->nextthink = gpGlobals->time + 0.1;
pev->nextthink = gpGlobals->time + 0.1f;
}
void CBloodSplat::Spawn(entvars_t *pevOwner)
@ -5702,7 +5759,7 @@ void CBloodSplat::Spawn(entvars_t *pevOwner)
pev->owner = ENT(pevOwner);
SetThink(&CBloodSplat::Spray);
pev->nextthink = gpGlobals->time + 0.1;
pev->nextthink = gpGlobals->time + 0.1f;
}
void CBloodSplat::Spray()
@ -5716,10 +5773,12 @@ void CBloodSplat::Spray()
}
SetThink(&CBloodSplat::SUB_Remove);
pev->nextthink = gpGlobals->time + 0.1;
pev->nextthink = gpGlobals->time + 0.1f;
}
void CBasePlayer::GiveNamedItem(const char *pszName)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, GiveNamedItem, (const char *pszName), pszName);
void CBasePlayer::__API_HOOK(GiveNamedItem)(const char *pszName)
{
string_t istr = MAKE_STRING(pszName);
edict_t *pent = CREATE_NAMED_ENTITY(istr);
@ -5803,7 +5862,9 @@ void CBasePlayer::ForceClientDllUpdate()
HandleSignals();
}
void CBasePlayer::__MAKE_VHOOK(ImpulseCommands)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, ImpulseCommands);
void CBasePlayer::__API_VHOOK(ImpulseCommands)()
{
TraceResult tr;
@ -5863,7 +5924,7 @@ void CBasePlayer::__MAKE_VHOOK(ImpulseCommands)()
{
// line hit something, so paint a decal
m_flNextDecalTime = gpGlobals->time + CVAR_GET_FLOAT("decalfrequency");
CSprayCan *pCan = GetClassPtr((CSprayCan *)NULL);
CSprayCan *pCan = GetClassPtr<CCSSprayCan>((CSprayCan *)NULL);
pCan->Spawn(pev);
}
break;
@ -5991,11 +6052,13 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse)
// show shortest paths for entire level to nearest node
Create("node_viewer_human", pev->origin, pev->angles);
break;
#ifndef REGAMEDLL_FIXES
case 199:
// show nearest node and all connections
ALERT(at_console, "%d\n", WorldGraph.FindNearestNode(pev->origin, bits_NODE_LAND));
WorldGraph.ShowNodeConnections(WorldGraph.FindNearestNode(pev->origin, bits_NODE_LAND));
break;
#endif
case 202:
{
// Random blood splatter
@ -6005,7 +6068,7 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse)
if (tr.flFraction != 1.0f)
{
// line hit something, so paint a decal
CBloodSplat *pBlood = GetClassPtr((CBloodSplat *)NULL);
CBloodSplat *pBlood = GetClassPtr<CCSBloodSplat>((CBloodSplat *)NULL);
pBlood->Spawn(pev);
}
break;
@ -6024,7 +6087,7 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse)
case 204:
{
TraceResult tr;
Vector dir = Vector(0, 0, 1);
Vector dir(0, 0, 1);
UTIL_BloodDrips(pev->origin, dir, BLOOD_COLOR_RED, 2000);
@ -6151,8 +6214,10 @@ void CBasePlayer::HandleSignals()
}
}
LINK_HOOK_CLASS_CHAIN(BOOL, CBasePlayer, AddPlayerItem, (CBasePlayerItem *pItem), pItem);
// Add a weapon to the player (Item == Weapon == Selectable Object)
BOOL CBasePlayer::__MAKE_VHOOK(AddPlayerItem)(CBasePlayerItem *pItem)
BOOL CBasePlayer::__API_VHOOK(AddPlayerItem)(CBasePlayerItem *pItem)
{
CBasePlayerItem *pInsert = m_rgpPlayerItems[ pItem->iItemSlot() ];
while (pInsert != NULL)
@ -6214,7 +6279,9 @@ BOOL CBasePlayer::__MAKE_VHOOK(AddPlayerItem)(CBasePlayerItem *pItem)
return FALSE;
}
BOOL CBasePlayer::__MAKE_VHOOK(RemovePlayerItem)(CBasePlayerItem *pItem)
LINK_HOOK_CLASS_CHAIN(BOOL, CBasePlayer, RemovePlayerItem, (CBasePlayerItem *pItem), pItem);
BOOL CBasePlayer::__API_VHOOK(RemovePlayerItem)(CBasePlayerItem *pItem)
{
if (m_pActiveItem == pItem)
{
@ -6249,8 +6316,10 @@ BOOL CBasePlayer::__MAKE_VHOOK(RemovePlayerItem)(CBasePlayerItem *pItem)
return FALSE;
}
LINK_HOOK_CLASS_CHAIN(int, CBasePlayer, GiveAmmo, (int iCount, char *szName, int iMax), iCount, szName, iMax);
// Returns the unique ID for the ammo, or -1 if error
int CBasePlayer::__MAKE_VHOOK(GiveAmmo)(int iCount, char *szName, int iMax)
int CBasePlayer::__API_VHOOK(GiveAmmo)(int iCount, char *szName, int iMax)
{
if (pev->flags & FL_SPECTATOR)
return -1;
@ -6460,12 +6529,14 @@ void CBasePlayer::SendWeatherInfo()
}
}
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, UpdateClientData);
// resends any changed player HUD info to the client.
// Called every frame by PlayerPreThink
// Also called at start of demo recording and playback by
// ForceClientDllUpdate to ensure the demo gets messages
// reflecting all of the HUD state info.
void CBasePlayer::__MAKE_VHOOK(UpdateClientData)()
void CBasePlayer::__API_VHOOK(UpdateClientData)()
{
if (m_fInitHUD)
{
@ -6757,7 +6828,7 @@ void CBasePlayer::__MAKE_VHOOK(UpdateClientData)()
m_tmNextRadarUpdate = gpGlobals->time + 1.0f;
#ifdef REGAMEDLL_ADD
if (friendlyfire.string[0] == '2')
if (CSGameRules()->IsFriendlyFireAttack())
vecOrigin = g_vecZero;
#endif
@ -6771,7 +6842,7 @@ void CBasePlayer::__MAKE_VHOOK(UpdateClientData)()
if (!pEntity || i == entindex())
continue;
CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pPlayer->pev->flags == FL_DORMANT)
continue;
@ -6832,7 +6903,9 @@ void CBasePlayer::EnableControl(BOOL fControl)
pev->flags &= ~FL_FROZEN;
}
void CBasePlayer::__MAKE_VHOOK(ResetMaxSpeed)()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, ResetMaxSpeed);
void CBasePlayer::__API_VHOOK(ResetMaxSpeed)()
{
float speed;
@ -6973,7 +7046,9 @@ int CBasePlayer::GetCustomDecalFrames()
return m_nCustomSprayFrames;
}
void CBasePlayer::__MAKE_VHOOK(Blind)(float duration, float holdTime, float fadeTime, int alpha)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, Blind, (float duration, float holdTime, float fadeTime, int alpha), duration, holdTime, fadeTime, alpha);
void CBasePlayer::__API_VHOOK(Blind)(float duration, float holdTime, float fadeTime, int alpha)
{
m_blindUntilTime = gpGlobals->time + duration;
m_blindStartTime = gpGlobals->time;
@ -7199,7 +7274,7 @@ void CBasePlayer::DropPlayerItem(const char *pszItemName)
if (pEntity->pev->flags != FL_DORMANT)
{
CBasePlayer *pOther = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pOther = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pOther->pev->deadflag == DEAD_NO && pOther->m_iTeam == TERRORIST)
{
@ -7379,21 +7454,7 @@ void CBasePlayer::SwitchTeam()
MESSAGE_BEGIN(MSG_ALL, gmsgTeamInfo);
WRITE_BYTE(entindex());
switch (m_iTeam)
{
case CT:
WRITE_STRING("CT");
break;
case TERRORIST:
WRITE_STRING("TERRORIST");
break;
case SPECTATOR:
WRITE_STRING("SPECTATOR");
break;
default:
WRITE_STRING("UNASSIGNED");
break;
}
WRITE_STRING(GetTeamName(m_iTeam));
MESSAGE_END();
if (TheBots != NULL)
@ -7544,7 +7605,7 @@ void CDeadHEV::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseMonster::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(monster_hevsuit_dead, CDeadHEV);
LINK_ENTITY_TO_CLASS(monster_hevsuit_dead, CDeadHEV, CCSDeadHEV);
void CDeadHEV::__MAKE_VHOOK(Spawn)()
{
@ -7571,7 +7632,7 @@ void CDeadHEV::__MAKE_VHOOK(Spawn)()
MonsterInitDead();
}
LINK_ENTITY_TO_CLASS(player_weaponstrip, CStripWeapons);
LINK_ENTITY_TO_CLASS(player_weaponstrip, CStripWeapons, CCSStripWeapons);
void CStripWeapons::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -7592,7 +7653,7 @@ void CStripWeapons::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCal
}
}
LINK_ENTITY_TO_CLASS(player_loadsaved, CRevertSaved);
LINK_ENTITY_TO_CLASS(player_loadsaved, CRevertSaved, CCSRevertSaved);
IMPLEMENT_SAVERESTORE(CRevertSaved, CPointEntity);
void CRevertSaved::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -7669,7 +7730,7 @@ void CInfoIntermission::__MAKE_VHOOK(Think)()
}
}
LINK_ENTITY_TO_CLASS(info_intermission, CInfoIntermission);
LINK_ENTITY_TO_CLASS(info_intermission, CInfoIntermission, CCSInfoIntermission);
void CBasePlayer::StudioEstimateGait()
{
@ -8222,12 +8283,14 @@ void CBasePlayer::AddAutoBuyData(const char *str)
if (len < sizeof(m_autoBuyString) - 1)
{
if (len > 0)
m_autoBuyString[ len ] = ' ';
{
Q_strncat(m_autoBuyString, " ", len);
}
#ifndef REGAMEDLL_FIXES
Q_strncat(m_autoBuyString, str, sizeof(m_autoBuyString) - len);
Q_strncat(m_autoBuyString, str, sizeof(m_autoBuyString) - Q_strlen(m_autoBuyString));
#else
Q_strncat(m_autoBuyString, str, sizeof(m_autoBuyString) - len - 1);
Q_strncat(m_autoBuyString, str, sizeof(m_autoBuyString) - Q_strlen(m_autoBuyString) - 1);
#endif
}
}
@ -8241,7 +8304,7 @@ void CBasePlayer::InitRebuyData(const char *str)
if (m_rebuyString != NULL)
{
delete m_rebuyString;
delete[] m_rebuyString;
m_rebuyString = NULL;
}

View File

@ -258,25 +258,9 @@ enum sbar_data
SBAR_END
};
typedef enum
{
SILENT,
CALM,
INTENSE
enum MusicState { SILENT, CALM, INTENSE };
} MusicState;
struct WeaponStruct
{
int m_type;
int m_price;
int m_side;
int m_slot;
int m_ammoPrice;
};
class CStripWeapons: public CPointEntity
{
class CStripWeapons: public CPointEntity {
public:
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
@ -288,8 +272,7 @@ public:
};
class CInfoIntermission: public CPointEntity
{
class CInfoIntermission: public CPointEntity {
public:
virtual void Spawn();
virtual void Think();
@ -303,8 +286,7 @@ public:
};
class CDeadHEV: public CBaseMonster
{
class CDeadHEV: public CBaseMonster {
public:
virtual void Spawn();
virtual void KeyValue(KeyValueData *pkvd);
@ -323,8 +305,7 @@ public:
static char *m_szPoses[4];
};
class CSprayCan: public CBaseEntity
{
class CSprayCan: public CBaseEntity {
public:
virtual void Think();
virtual int ObjectCaps()
@ -342,21 +323,19 @@ public:
void Spawn(entvars_t *pevOwner);
};
class CBloodSplat: public CBaseEntity
{
class CBloodSplat: public CBaseEntity {
public:
void Spawn(entvars_t *pevOwner);
void Spray();
};
class CBasePlayer: public CBaseMonster
{
class CBasePlayer: public CBaseMonster {
public:
virtual void Spawn();
virtual void Precache();
virtual int Save(CSave &save);
virtual int Restore(CRestore &restore);
virtual int ObjectCaps() { return (CBaseMonster::ObjectCaps() & ~FCAP_ACROSS_TRANSITION); }
virtual int ObjectCaps();
virtual int Classify();
virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
virtual int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
@ -392,14 +371,14 @@ public:
virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha);
virtual void OnTouchingWeapon(CWeaponBox *pWeapon) { }
#ifdef HOOK_GAMEDLL
#if defined(REGAMEDLL_API) || defined(HOOK_GAMEDLL)
void Spawn_();
void Precache_();
int ObjectCaps_();
int Classify_();
int Save_(CSave &save);
int Restore_(CRestore &restore);
int Classify_();
void TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
void TraceAttack_(entvars_t *pevAttacker, float flDamage, VectorRef vecDir, TraceResult *ptr, int bitsDamageType);
int TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
int TakeHealth_(float flHealth, int bitsDamageType);
void Killed_(entvars_t *pevAttacker, int iGib);
@ -408,27 +387,28 @@ public:
BOOL AddPlayerItem_(CBasePlayerItem *pItem);
BOOL RemovePlayerItem_(CBasePlayerItem *pItem);
int GiveAmmo_(int iAmount,char *szName,int iMax);
const char *TeamID_();
BOOL FBecomeProne_();
int Illumination_();
void ResetMaxSpeed_();
void Jump_();
void Duck_();
void PreThink_();
void PostThink_();
Vector GetGunPosition_();
void UpdateClientData_();
void ImpulseCommands_();
void RoundRespawn_();
Vector GetAutoaimVector_(float flDelta);
void Blind_(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha);
#endif // HOOK_GAMEDLL
const char *TeamID_();
BOOL FBecomeProne_();
int Illumination_();
Vector GetGunPosition_();
Vector GetAutoaimVector_(float flDelta);
#endif
public:
void SpawnClientSideCorpse();
void Observer_FindNextPlayer(bool bReverse, const char *name = NULL);
CBaseEntity *Observer_IsValidTarget(int iPlayerIndex, bool bSameTeam);
CBaseEntity *Observer_IsValidTarget_(int iPlayerIndex, bool bSameTeam);
void Observer_HandleButtons();
void Observer_SetMode(int iMode);
void Observer_CheckTarget();
@ -441,6 +421,7 @@ public:
void ThrowWeapon(char *pszItemName);
void ThrowPrimary();
void AddAccount(int amount, bool bTrackChange = true);
void AddAccount_(int amount, bool bTrackChange = true);
void Disappear();
void MakeVIP();
bool CanPlayerBuy(bool display = false);
@ -454,6 +435,7 @@ public:
void RenewItems();
void PackDeadPlayerItems();
void GiveDefaultItems();
void GiveDefaultItems_();
void RemoveAllItems(BOOL removeSuit);
void SetBombIcon(BOOL bFlash = FALSE);
void SetProgressBarTime(int time);
@ -480,6 +462,7 @@ public:
void UpdatePlayerSound();
void DeathSound();
void SetAnimation(PLAYER_ANIM playerAnim);
void SetAnimation_(PLAYER_ANIM playerAnim);
void SetWeaponAnimType(const char *szExtention) { Q_strcpy(m_szAnimExtention, szExtention); }
void CheatImpulseCommands(int iImpulse);
void StartDeathCam();
@ -496,6 +479,7 @@ public:
void ItemPreFrame();
void ItemPostFrame();
void GiveNamedItem(const char *pszName);
void GiveNamedItem_(const char *pszName);
void EnableControl(BOOL fControl);
bool HintMessage(const char *pMessage, BOOL bDisplayIfPlayerDead = FALSE, BOOL bOverride = FALSE);
void SendAmmoUpdate();
@ -543,6 +527,7 @@ public:
void RemoveShield();
void DropShield(bool bDeploy = true);
void GiveShield(bool bDeploy = true);
void GiveShield_(bool bDeploy = true);
bool IsHittingShield(Vector &vecDirection, TraceResult *ptr);
bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot);
bool IsReloading()

View File

@ -35,10 +35,10 @@
class CRevertSaved: public CPointEntity
{
public:
void KeyValue(KeyValueData *pkvd);
int Save(CSave &save);
int Restore(CRestore &restore);
void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
virtual void KeyValue(KeyValueData *pkvd);
virtual int Save(CSave &save);
virtual int Restore(CRestore &restore);
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
#ifdef HOOK_GAMEDLL

View File

@ -76,7 +76,7 @@ char grgchTextureType[ CTEXTURESMAX ];
int fTextureTypeInit;
int gcTextures;
LINK_ENTITY_TO_CLASS(ambient_generic, CAmbientGeneric);
LINK_ENTITY_TO_CLASS(ambient_generic, CAmbientGeneric, CCSAmbientGeneric);
IMPLEMENT_SAVERESTORE(CAmbientGeneric, CBaseEntity);
// -1 : "Default"
@ -851,7 +851,7 @@ void CAmbientGeneric::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseEntity::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(env_sound, CEnvSound);
LINK_ENTITY_TO_CLASS(env_sound, CEnvSound, CCSEnvSound);
IMPLEMENT_SAVERESTORE(CEnvSound, CBaseEntity);
void CEnvSound::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -872,7 +872,7 @@ void CEnvSound::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
// and can see the given player entity (pevTarget)
BOOL FEnvSoundInRange(entvars_t *pev, entvars_t *pevTarget, float *pflRange)
{
CEnvSound *pSound = GetClassPtr((CEnvSound *)pev);
CEnvSound *pSound = GetClassPtr<CCSEnvSound>((CEnvSound *)pev);
Vector vecSpot1 = pev->origin + pev->view_ofs;
Vector vecSpot2 = pevTarget->origin + pevTarget->view_ofs;
Vector vecRange;
@ -922,7 +922,7 @@ void CEnvSound::__MAKE_VHOOK(Think)()
goto env_sound_Think_slow;
}
CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)VARS(pentPlayer));
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)VARS(pentPlayer));
float flRange;
// check to see if this is the sound entity that is
@ -1809,7 +1809,7 @@ float TEXTURETYPE_PlaySound(TraceResult *ptr, Vector vecSrc, Vector vecEnd, int
return fvolbar;
}
LINK_ENTITY_TO_CLASS(speaker, CSpeaker);
LINK_ENTITY_TO_CLASS(speaker, CSpeaker, CCSSpeaker);
IMPLEMENT_SAVERESTORE(CSpeaker, CBaseEntity);
// ambient_generic - general-purpose user-defined static sound

View File

@ -1,8 +1,15 @@
#include "precompiled.h"
CSoundEnt *pSoundEnt;
/*
* Globals initialization
*/
#ifndef HOOK_GAMEDLL
LINK_ENTITY_TO_CLASS(soundent, CSoundEnt);
CSoundEnt *pSoundEnt = NULL;
#endif
LINK_ENTITY_TO_CLASS(soundent, CSoundEnt, CCSSoundEnt);
// CSound - Clear - zeros all fields for a sound
void CSound::Clear()

View File

@ -79,7 +79,6 @@ public:
class CSoundEnt: public CBaseEntity
{
public:
virtual void Spawn();
virtual void Precache();
virtual int ObjectCaps() { return FCAP_DONT_SAVE; }

View File

@ -50,15 +50,15 @@ void CNullEntity::__MAKE_VHOOK(Spawn)()
REMOVE_ENTITY(ENT(pev));
}
LINK_ENTITY_TO_CLASS(info_null, CNullEntity);
LINK_ENTITY_TO_CLASS(info_null, CNullEntity, CCSNullEntity);
// These are the new entry points to entities.
LINK_ENTITY_TO_CLASS(info_player_deathmatch, CBaseDMStart);
LINK_ENTITY_TO_CLASS(info_player_start, CPointEntity);
LINK_ENTITY_TO_CLASS(info_vip_start, CBaseDMStart);
LINK_ENTITY_TO_CLASS(info_landmark, CPointEntity);
LINK_ENTITY_TO_CLASS(info_hostage_rescue, CPointEntity);
LINK_ENTITY_TO_CLASS(info_bomb_target, CPointEntity);
LINK_ENTITY_TO_CLASS(info_player_deathmatch, CBaseDMStart, CCSDMStart);
LINK_ENTITY_TO_CLASS(info_player_start, CPointEntity, CCSPointEntity);
LINK_ENTITY_TO_CLASS(info_vip_start, CBaseDMStart, CCSDMStart);
LINK_ENTITY_TO_CLASS(info_landmark, CPointEntity, CCSPointEntity);
LINK_ENTITY_TO_CLASS(info_hostage_rescue, CPointEntity, CCSPointEntity);
LINK_ENTITY_TO_CLASS(info_bomb_target, CPointEntity, CCSPointEntity);
void CBaseDMStart::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -81,6 +81,7 @@ BOOL CBaseDMStart::__MAKE_VHOOK(IsTriggered)(CBaseEntity *pEntity)
// This updates global tables that need to know about entities being removed
void CBaseEntity::UpdateOnRemove()
{
#ifndef REGAMEDLL_FIXES
if (pev->flags & FL_GRAPHED)
{
// this entity was a LinkEnt in the world node graph, so we must remove it from
@ -94,6 +95,7 @@ void CBaseEntity::UpdateOnRemove()
}
}
}
#endif
if (pev->globalname)
{
@ -180,7 +182,7 @@ void FireTargets(const char *targetName, CBaseEntity *pActivator, CBaseEntity *p
}
}
LINK_ENTITY_TO_CLASS(DelayedUse, CBaseDelay);
LINK_ENTITY_TO_CLASS(DelayedUse, CBaseDelay, CCSDelay);
void CBaseDelay::SUB_UseTargets(CBaseEntity *pActivator, USE_TYPE useType, float value)
{
@ -192,7 +194,7 @@ void CBaseDelay::SUB_UseTargets(CBaseEntity *pActivator, USE_TYPE useType, float
if (m_flDelay != 0)
{
// create a temp object to fire at a later time
CBaseDelay *pTemp = GetClassPtr((CBaseDelay *)NULL);
CBaseDelay *pTemp = GetClassPtr<CCSDelay>((CBaseDelay *)NULL);
MAKE_STRING_CLASS("DelayedUse", pTemp->pev);

View File

@ -329,7 +329,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)()
}
IMPLEMENT_SAVERESTORE(CBaseGrenCatch, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_grencatch, CBaseGrenCatch);
LINK_ENTITY_TO_CLASS(func_grencatch, CBaseGrenCatch, CCSGrenCatch);
void CBaseGrenCatch::__MAKE_VHOOK(Spawn)()
{
@ -458,7 +458,7 @@ void CFuncWeaponCheck::__MAKE_VHOOK(Spawn)()
}
IMPLEMENT_SAVERESTORE(CFuncWeaponCheck, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_weaponcheck, CFuncWeaponCheck);
LINK_ENTITY_TO_CLASS(func_weaponcheck, CFuncWeaponCheck, CCSFuncWeaponCheck);
void CFuncWeaponCheck::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
{

View File

@ -36,7 +36,6 @@ class CHalfLifeTraining: public CHalfLifeMultiplay
{
public:
CHalfLifeTraining();
virtual BOOL IsMultiplayer() { return FALSE; }
virtual BOOL IsDeathmatch();
virtual void InitHUD(CBasePlayer *pl);

View File

@ -68,7 +68,7 @@ TYPEDESCRIPTION CTriggerCamera::m_SaveData[] =
char st_szNextMap[cchMapNameMost];
char st_szNextSpot[cchMapNameMost];
LINK_ENTITY_TO_CLASS(func_friction, CFrictionModifier);
LINK_ENTITY_TO_CLASS(func_friction, CFrictionModifier, CCSFrictionModifier);
IMPLEMENT_SAVERESTORE(CFrictionModifier, CBaseEntity);
void CFrictionModifier::__MAKE_VHOOK(Spawn)()
@ -103,7 +103,7 @@ void CFrictionModifier::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseEntity::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(trigger_auto, CAutoTrigger);
LINK_ENTITY_TO_CLASS(trigger_auto, CAutoTrigger, CCSAutoTrigger);
IMPLEMENT_SAVERESTORE(CAutoTrigger, CBaseDelay);
void CAutoTrigger::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -157,7 +157,7 @@ void CAutoTrigger::__MAKE_VHOOK(Think)()
}
}
LINK_ENTITY_TO_CLASS(trigger_relay, CTriggerRelay);
LINK_ENTITY_TO_CLASS(trigger_relay, CTriggerRelay, CCSTriggerRelay);
IMPLEMENT_SAVERESTORE(CTriggerRelay, CBaseDelay);
void CTriggerRelay::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -197,7 +197,7 @@ void CTriggerRelay::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCal
}
}
LINK_ENTITY_TO_CLASS(multi_manager, CMultiManager);
LINK_ENTITY_TO_CLASS(multi_manager, CMultiManager, CCSMultiManager);
IMPLEMENT_SAVERESTORE(CMultiManager, CBaseToggle);
void CMultiManager::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -336,7 +336,7 @@ void CMultiManager::ManagerThink()
CMultiManager *CMultiManager::Clone()
{
CMultiManager *pMulti = GetClassPtr((CMultiManager *)NULL);
CMultiManager *pMulti = GetClassPtr<CCSMultiManager>((CMultiManager *)NULL);
edict_t *pEdict = pMulti->pev->pContainingEntity;
Q_memcpy(pMulti->pev, pev, sizeof(*pev));
@ -374,7 +374,7 @@ void CMultiManager::ManagerUse(CBaseEntity *pActivator, CBaseEntity *pCaller, US
pev->nextthink = gpGlobals->time;
}
LINK_ENTITY_TO_CLASS(env_render, CRenderFxManager);
LINK_ENTITY_TO_CLASS(env_render, CRenderFxManager, CCSRenderFxManager);
void CRenderFxManager::__MAKE_VHOOK(Spawn)()
{
@ -408,7 +408,7 @@ void CRenderFxManager::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *p
}
}
LINK_ENTITY_TO_CLASS(trigger, CBaseTrigger);
LINK_ENTITY_TO_CLASS(trigger, CBaseTrigger, CCSTrigger);
void CBaseTrigger::InitTrigger()
{
@ -453,8 +453,8 @@ void CBaseTrigger::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseToggle::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(trigger_hurt, CTriggerHurt);
LINK_ENTITY_TO_CLASS(trigger_monsterjump, CTriggerMonsterJump);
LINK_ENTITY_TO_CLASS(trigger_hurt, CTriggerHurt, CCSTriggerHurt);
LINK_ENTITY_TO_CLASS(trigger_monsterjump, CTriggerMonsterJump, CCSTriggerMonsterJump);
void CTriggerMonsterJump::__MAKE_VHOOK(Spawn)()
{
@ -511,7 +511,7 @@ void CTriggerMonsterJump::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
pev->nextthink = gpGlobals->time;
}
LINK_ENTITY_TO_CLASS(trigger_cdaudio, CTriggerCDAudio);
LINK_ENTITY_TO_CLASS(trigger_cdaudio, CTriggerCDAudio, CCSTriggerCDAudio);
// Changes tracks or stops CD when player touches
// HACK: overloaded HEALTH to avoid adding new field
@ -575,7 +575,7 @@ void CTriggerCDAudio::PlayTrack()
UTIL_Remove(this);
}
LINK_ENTITY_TO_CLASS(target_cdaudio, CTargetCDAudio);
LINK_ENTITY_TO_CLASS(target_cdaudio, CTargetCDAudio, CCSTargetCDAudio);
void CTargetCDAudio::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -693,7 +693,7 @@ void CTriggerHurt::RadiationThink()
// reset origin
if (!FNullEnt(pentPlayer))
{
pPlayer = GetClassPtr((CBasePlayer *)VARS(pentPlayer));
pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)VARS(pentPlayer));
pevTarget = VARS(pentPlayer);
@ -852,7 +852,7 @@ void CBaseTrigger::HurtTouch(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(trigger_multiple, CTriggerMultiple);
LINK_ENTITY_TO_CLASS(trigger_multiple, CTriggerMultiple, CCSTriggerMultiple);
void CTriggerMultiple::__MAKE_VHOOK(Spawn)()
{
@ -886,7 +886,7 @@ void CTriggerMultiple::__MAKE_VHOOK(Spawn)()
}
}
LINK_ENTITY_TO_CLASS(trigger_once, CTriggerOnce);
LINK_ENTITY_TO_CLASS(trigger_once, CTriggerOnce, CCSTriggerOnce);
void CTriggerOnce::__MAKE_VHOOK(Spawn)()
{
@ -1007,7 +1007,7 @@ void CBaseTrigger::CounterUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE
ActivateMultiTrigger(m_hActivator);
}
LINK_ENTITY_TO_CLASS(trigger_counter, CTriggerCounter);
LINK_ENTITY_TO_CLASS(trigger_counter, CTriggerCounter, CCSTriggerCounter);
void CTriggerCounter::__MAKE_VHOOK(Spawn)()
{
@ -1023,7 +1023,7 @@ void CTriggerCounter::__MAKE_VHOOK(Spawn)()
SetUse(&CTriggerCounter::CounterUse);
}
LINK_ENTITY_TO_CLASS(trigger_transition, CTriggerVolume);
LINK_ENTITY_TO_CLASS(trigger_transition, CTriggerVolume, CCSTriggerVolume);
// Define space that travels across a level transition
void CTriggerVolume::__MAKE_VHOOK(Spawn)()
@ -1038,7 +1038,7 @@ void CTriggerVolume::__MAKE_VHOOK(Spawn)()
pev->modelindex = 0;
}
LINK_ENTITY_TO_CLASS(fireanddie, CFireAndDie);
LINK_ENTITY_TO_CLASS(fireanddie, CFireAndDie, CCSFireAndDie);
void CFireAndDie::__MAKE_VHOOK(Spawn)()
{
@ -1057,7 +1057,7 @@ void CFireAndDie::__MAKE_VHOOK(Think)()
UTIL_Remove(this);
}
LINK_ENTITY_TO_CLASS(trigger_changelevel, CChangeLevel);
LINK_ENTITY_TO_CLASS(trigger_changelevel, CChangeLevel, CCSChangeLevel);
IMPLEMENT_SAVERESTORE(CChangeLevel, CBaseTrigger);
// Cache user-entity-field values until spawn is called.
@ -1184,7 +1184,7 @@ void CChangeLevel::ChangeLevelNow(CBaseEntity *pActivator)
// Create an entity to fire the changetarget
if (m_changeTarget)
{
CFireAndDie *pFireAndDie = GetClassPtr((CFireAndDie *)NULL);
CFireAndDie *pFireAndDie = GetClassPtr<CCSFireAndDie>((CFireAndDie *)NULL);
if (pFireAndDie)
{
@ -1324,7 +1324,7 @@ int CChangeLevel::ChangeList(LEVELLIST *pLevelList, int maxList)
while (!FNullEnt(pentChangelevel))
{
CChangeLevel *pTrigger = GetClassPtr((CChangeLevel *)VARS(pentChangelevel));
CChangeLevel *pTrigger = GetClassPtr<CCSChangeLevel>((CChangeLevel *)VARS(pentChangelevel));
if (pTrigger != NULL)
{
@ -1426,11 +1426,11 @@ NOXREF void NextLevel()
if (FNullEnt(pent))
{
gpGlobals->mapname = ALLOC_STRING("start");
pChange = GetClassPtr((CChangeLevel *)NULL);
pChange = GetClassPtr<CCSChangeLevel>((CChangeLevel *)NULL);
Q_strcpy(pChange->m_szMapName, "start");
}
else
pChange = GetClassPtr((CChangeLevel *)VARS(pent));
pChange = GetClassPtr<CCSChangeLevel>((CChangeLevel *)VARS(pent));
Q_strcpy(st_szNextMap, pChange->m_szMapName);
g_fGameOver = TRUE;
@ -1442,7 +1442,7 @@ NOXREF void NextLevel()
}
}
LINK_ENTITY_TO_CLASS(func_ladder, CLadder);
LINK_ENTITY_TO_CLASS(func_ladder, CLadder, CCSLadder);
void CLadder::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -1474,7 +1474,7 @@ void CLadder::__MAKE_VHOOK(Spawn)()
pev->movetype = MOVETYPE_PUSH;
}
LINK_ENTITY_TO_CLASS(trigger_push, CTriggerPush);
LINK_ENTITY_TO_CLASS(trigger_push, CTriggerPush, CCSTriggerPush);
void CTriggerPush::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -1615,7 +1615,7 @@ void CBaseTrigger::TeleportTouch(CBaseEntity *pOther)
pevToucher->velocity = pevToucher->basevelocity = g_vecZero;
}
LINK_ENTITY_TO_CLASS(trigger_teleport, CTriggerTeleport);
LINK_ENTITY_TO_CLASS(trigger_teleport, CTriggerTeleport, CCSTriggerTeleport);
void CTriggerTeleport::__MAKE_VHOOK(Spawn)()
{
@ -1623,8 +1623,8 @@ void CTriggerTeleport::__MAKE_VHOOK(Spawn)()
SetTouch(&CTriggerTeleport::TeleportTouch);
}
LINK_ENTITY_TO_CLASS(info_teleport_destination, CPointEntity);
LINK_ENTITY_TO_CLASS(func_buyzone, CBuyZone);
LINK_ENTITY_TO_CLASS(info_teleport_destination, CPointEntity, CCSPointEntity);
LINK_ENTITY_TO_CLASS(func_buyzone, CBuyZone, CCSBuyZone);
void CBuyZone::__MAKE_VHOOK(Spawn)()
{
@ -1651,7 +1651,7 @@ void CBuyZone::BuyTouch(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(func_bomb_target, CBombTarget);
LINK_ENTITY_TO_CLASS(func_bomb_target, CBombTarget, CCSBombTarget);
void CBombTarget::__MAKE_VHOOK(Spawn)()
{
@ -1680,7 +1680,7 @@ void CBombTarget::BombTargetUse(CBaseEntity *pActivator, CBaseEntity *pCaller, U
SUB_UseTargets(NULL, USE_TOGGLE, 0);
}
LINK_ENTITY_TO_CLASS(func_hostage_rescue, CHostageRescue);
LINK_ENTITY_TO_CLASS(func_hostage_rescue, CHostageRescue, CCSHostageRescue);
void CHostageRescue::__MAKE_VHOOK(Spawn)()
{
@ -1701,7 +1701,7 @@ void CHostageRescue::HostageRescueTouch(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(func_escapezone, CEscapeZone);
LINK_ENTITY_TO_CLASS(func_escapezone, CEscapeZone, CCSEscapeZone);
void CEscapeZone::__MAKE_VHOOK(Spawn)()
{
@ -1746,7 +1746,7 @@ void CEscapeZone::EscapeTouch(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(func_vip_safetyzone, CVIP_SafetyZone);
LINK_ENTITY_TO_CLASS(func_vip_safetyzone, CVIP_SafetyZone, CCSVIP_SafetyZone);
void CVIP_SafetyZone::__MAKE_VHOOK(Spawn)()
{
@ -1774,7 +1774,7 @@ void CVIP_SafetyZone::VIP_SafetyTouch(CBaseEntity *pOther)
}
}
LINK_ENTITY_TO_CLASS(trigger_autosave, CTriggerSave);
LINK_ENTITY_TO_CLASS(trigger_autosave, CTriggerSave, CCSTriggerSave);
void CTriggerSave::__MAKE_VHOOK(Spawn)()
{
@ -1802,7 +1802,7 @@ void CTriggerSave::SaveTouch(CBaseEntity *pOther)
SERVER_COMMAND("autosave\n");
}
LINK_ENTITY_TO_CLASS(trigger_endsection, CTriggerEndSection);
LINK_ENTITY_TO_CLASS(trigger_endsection, CTriggerEndSection, CCSTriggerEndSection);
void CTriggerEndSection::EndSectionUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
@ -1864,7 +1864,7 @@ void CTriggerEndSection::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseTrigger::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(trigger_gravity, CTriggerGravity);
LINK_ENTITY_TO_CLASS(trigger_gravity, CTriggerGravity, CCSTriggerGravity);
void CTriggerGravity::__MAKE_VHOOK(Spawn)()
{
@ -1881,7 +1881,7 @@ void CTriggerGravity::GravityTouch(CBaseEntity *pOther)
pOther->pev->gravity = pev->gravity;
}
LINK_ENTITY_TO_CLASS(trigger_changetarget, CTriggerChangeTarget);
LINK_ENTITY_TO_CLASS(trigger_changetarget, CTriggerChangeTarget, CCSTriggerChangeTarget);
IMPLEMENT_SAVERESTORE(CTriggerChangeTarget, CBaseDelay);
void CTriggerChangeTarget::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
@ -1917,7 +1917,7 @@ void CTriggerChangeTarget::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntit
}
}
LINK_ENTITY_TO_CLASS(trigger_camera, CTriggerCamera);
LINK_ENTITY_TO_CLASS(trigger_camera, CTriggerCamera, CCSTriggerCamera);
IMPLEMENT_SAVERESTORE(CTriggerCamera, CBaseDelay);
void CTriggerCamera::__MAKE_VHOOK(Spawn)()
@ -2185,10 +2185,10 @@ void CTriggerCamera::Move()
pev->velocity = ((pev->movedir * pev->speed) * fraction) + (pev->velocity * (1 - fraction));
}
LINK_ENTITY_TO_CLASS(env_snow, CWeather);
LINK_ENTITY_TO_CLASS(func_snow, CWeather);
LINK_ENTITY_TO_CLASS(env_rain, CWeather);
LINK_ENTITY_TO_CLASS(func_rain, CWeather);
LINK_ENTITY_TO_CLASS(env_snow, CWeather, CCSWeather);
LINK_ENTITY_TO_CLASS(func_snow, CWeather, CCSWeather);
LINK_ENTITY_TO_CLASS(env_rain, CWeather, CCSWeather);
LINK_ENTITY_TO_CLASS(func_rain, CWeather, CCSWeather);
void CWeather::__MAKE_VHOOK(Spawn)()
{
@ -2231,4 +2231,4 @@ void CClientFog::__MAKE_VHOOK(Spawn)()
pev->rendermode = kRenderTransTexture;
}
LINK_ENTITY_TO_CLASS(env_fog, CClientFog);
LINK_ENTITY_TO_CLASS(env_fog, CClientFog, CCSClientFog);

View File

@ -744,7 +744,7 @@ public:
};
void PlayCDTrack(int iTrack);
int BuildChangeList(LEVELLIST * pLevelList, int maxList);
int BuildChangeList(LEVELLIST *pLevelList, int maxList);
void NextLevel();
#endif // TRIGGERS_H

View File

@ -409,7 +409,7 @@ CBaseEntity *UTIL_FindEntityByString_Old(CBaseEntity *pStartEntity, const char *
return NULL;
}
CBaseEntity *UTIL_FindEntityByString(CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue)
CBaseEntity *EXT_FUNC UTIL_FindEntityByString(CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue)
{
edict_t *pentEntity;
int startEntityIndex;
@ -421,7 +421,7 @@ CBaseEntity *UTIL_FindEntityByString(CBaseEntity *pStartEntity, const char *szKe
startEntityIndex = ENTINDEX(pentEntity);
//it best each entity list
// it best each entity list
if (*szKeyword == 'c')
{
int hash;
@ -1456,7 +1456,7 @@ void UTIL_PrecacheOther(const char *szClassname)
REMOVE_ENTITY(pent);
}
void UTIL_LogPrintf(char *fmt, ...)
void UTIL_LogPrintf(const char *fmt, ...)
{
va_list argptr;
static char string[1024];
@ -1938,7 +1938,7 @@ void CSave::BufferData(const char *pdata, int size)
int CRestore::ReadField(void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount, int startField, int size, char *pName, void *pData)
{
float time = 0.0f;
Vector position = Vector(0, 0, 0);
Vector position(0, 0, 0);
if (m_pdata)
{

View File

@ -158,75 +158,15 @@ extern globalvars_t *gpGlobals;
#endif
#define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName)\
#define REGAMEDLL_ALLOC_FUNC
#define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName, DLLClassWrapName)\
C_DLLEXPORT void EXT_FUNC mapClassName(entvars_t *pev);\
void mapClassName(entvars_t *pev)\
{\
GetClassPtr((DLLClassName *)pev);\
REGAMEDLL_ALLOC_FUNC\
GetClassPtr<DLLClassWrapName>((DLLClassName *)pev);\
}
typedef enum
{
ignore_monsters = 1,
dont_ignore_monsters = 0,
missile = 2
} IGNORE_MONSTERS;
typedef enum
{
ignore_glass = 1,
dont_ignore_glass = 0
} IGNORE_GLASS;
enum
{
point_hull = 0,
human_hull = 1,
large_hull = 2,
head_hull = 3
};
typedef enum
{
MONSTERSTATE_NONE = 0,
MONSTERSTATE_IDLE,
MONSTERSTATE_COMBAT,
MONSTERSTATE_ALERT,
MONSTERSTATE_HUNT,
MONSTERSTATE_PRONE,
MONSTERSTATE_SCRIPT,
MONSTERSTATE_PLAYDEAD,
MONSTERSTATE_DEAD
} MONSTERSTATE;
// Things that toggle (buttons/triggers/doors) need this
typedef enum
{
TS_AT_TOP,
TS_AT_BOTTOM,
TS_GOING_UP,
TS_GOING_DOWN,
} TOGGLE_STATE;
typedef struct hudtextparms_s
{
float x;
float y;
int effect;
byte r1,g1,b1,a1;
byte r2,g2,b2,a2;
float fadeinTime;
float fadeoutTime;
float holdTime;
float fxTime;
int channel;
} hudtextparms_t;
class UTIL_GroupTrace
{
public:
@ -237,35 +177,14 @@ private:
int m_oldgroupop;
};
inline edict_t *FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, const char *pszName)
{
return FIND_ENTITY_BY_STRING(entStart, "classname", pszName);
}
// Inlines
inline edict_t *FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, const char *pszName) { return FIND_ENTITY_BY_STRING(entStart, "classname", pszName); }
inline edict_t *FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, const char *pszName) { return FIND_ENTITY_BY_STRING(entStart, "targetname", pszName); }
inline edict_t *FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, const char *pszName)
{
return FIND_ENTITY_BY_STRING(entStart, "targetname", pszName);
}
inline edict_t *ENT(const entvars_t *pev)
{
return pev->pContainingEntity;
}
inline edict_t *ENT(EOFFSET eoffset)
{
return (*g_engfuncs.pfnPEntityOfEntOffset)(eoffset);
}
inline EOFFSET OFFSET(const edict_t *pent)
{
return (*g_engfuncs.pfnEntOffsetOfPEntity)(pent);
}
inline EOFFSET OFFSET(const entvars_t *pev)
{
return OFFSET(ENT(pev));
}
inline edict_t *ENT(const entvars_t *pev) { return pev->pContainingEntity; }
inline edict_t *ENT(EOFFSET eoffset) { return (*g_engfuncs.pfnPEntityOfEntOffset)(eoffset); }
inline EOFFSET OFFSET(const edict_t *pent) { return (*g_engfuncs.pfnEntOffsetOfPEntity)(pent); }
inline EOFFSET OFFSET(const entvars_t *pev) { return OFFSET(ENT(pev)); }
inline entvars_t *VARS(edict_t *pent)
{
@ -275,69 +194,26 @@ inline entvars_t *VARS(edict_t *pent)
return &pent->v;
}
inline entvars_t *VARS(EOFFSET eoffset)
{
return VARS(ENT(eoffset));
}
inline int ENTINDEX(const edict_t *pEdict)
{
return (*g_engfuncs.pfnIndexOfEdict)(pEdict);
}
inline edict_t *INDEXENT(int iEdictNum)
{
return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum);
}
inline void MESSAGE_BEGIN(int msg_dest, int msg_type, const float *pOrigin, entvars_t *ent)
{
MESSAGE_BEGIN(msg_dest, msg_type, pOrigin, ENT(ent));
}
inline BOOL FNullEnt(EOFFSET eoffset)
{
return (eoffset == 0);
}
inline BOOL FNullEnt(entvars_t *pev)
{
return (pev == NULL || FNullEnt(OFFSET(pev)));
}
inline BOOL FNullEnt(const edict_t *pent)
{
return (pent == NULL || FNullEnt(OFFSET(pent)));
}
inline BOOL FStringNull(int iString)
{
return (iString == iStringNull);
}
inline BOOL FStrEq(const char *sz1, const char *sz2)
{
return (Q_strcmp(sz1, sz2) == 0);
}
inline BOOL FClassnameIs(entvars_t *pev, const char *szClassname)
{
return FStrEq(STRING(pev->classname), szClassname);
}
inline BOOL FClassnameIs(edict_t *pent, const char *szClassname)
{
// TODO: check is null?
return FStrEq(STRING(VARS(pent)->classname), szClassname);
}
inline void UTIL_MakeVectorsPrivate(Vector vecAngles, float *p_vForward, float *p_vRight, float *p_vUp)
{
g_engfuncs.pfnAngleVectors(vecAngles, p_vForward, p_vRight, p_vUp);
}
inline entvars_t *VARS(EOFFSET eoffset) { return VARS(ENT(eoffset)); }
inline int ENTINDEX(const edict_t *pEdict) { return (*g_engfuncs.pfnIndexOfEdict)(pEdict); }
inline edict_t *INDEXENT(int iEdictNum) { return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum); }
inline void MESSAGE_BEGIN(int msg_dest, int msg_type, const float *pOrigin, entvars_t *ent) { MESSAGE_BEGIN(msg_dest, msg_type, pOrigin, ENT(ent)); }
inline BOOL FNullEnt(EOFFSET eoffset) { return (eoffset == 0); }
inline BOOL FNullEnt(entvars_t *pev) { return (pev == NULL || FNullEnt(OFFSET(pev))); }
inline BOOL FNullEnt(const edict_t *pent) { return (pent == NULL || FNullEnt(OFFSET(pent))); }
inline BOOL FStringNull(int iString) { return (iString == iStringNull); }
inline BOOL FStrEq(const char *sz1, const char *sz2) { return (Q_strcmp(sz1, sz2) == 0); }
inline BOOL FClassnameIs(entvars_t *pev, const char *szClassname) { return FStrEq(STRING(pev->classname), szClassname); }
inline BOOL FClassnameIs(edict_t *pent, const char *szClassname) { return FStrEq(STRING(VARS(pent)->classname), szClassname); }
inline void UTIL_MakeVectorsPrivate(Vector vecAngles, float *p_vForward, float *p_vRight, float *p_vUp) { g_engfuncs.pfnAngleVectors(vecAngles, p_vForward, p_vRight, p_vUp); }
extern void EMIT_SOUND_DYN(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int flags, int pitch);
// NOTE: use EMIT_SOUND_DYN to set the pitch of a sound. Pitch of 100
// is no pitch shift. Pitch > 100 up to 255 is a higher pitch, pitch < 100
// down to 1 is a lower pitch. 150 to 70 is the realistic range.
// EMIT_SOUND_DYN with pitch != 100 should be used sparingly, as it's not quite as
// fast as EMIT_SOUND (the pitchshift mixer is not native coded).
inline void EMIT_SOUND(edict_t *entity, int channel, const char *sample, float volume, float attenuation)
{
EMIT_SOUND_DYN(entity, channel, sample, volume, attenuation, 0, PITCH_NORM);
@ -436,7 +312,7 @@ void UTIL_BubbleTrail(Vector from, Vector to, int count);
void UTIL_Remove(CBaseEntity *pEntity);
BOOL UTIL_IsValidEntity(edict_t *pent);
void UTIL_PrecacheOther(const char *szClassname);
void UTIL_LogPrintf(char *fmt, ...);
void UTIL_LogPrintf(const char *fmt, ...);
float UTIL_DotPoints(const Vector &vecSrc, const Vector &vecCheck, const Vector &vecDir);
void UTIL_StripToken(const char *pKey, char *pDest);
void EntvarsKeyvalue(entvars_t *pev, KeyValueData *pkvd);

View File

@ -42,7 +42,7 @@ void FixupAngles2(Vector &v)
}
IMPLEMENT_SAVERESTORE(CFuncVehicle, CBaseEntity);
LINK_ENTITY_TO_CLASS(func_vehicle, CFuncVehicle);
LINK_ENTITY_TO_CLASS(func_vehicle, CFuncVehicle, CCSFuncVehicle);
void CFuncVehicle::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
{
@ -943,7 +943,7 @@ void CFuncVehicle::__MAKE_VHOOK(Precache)()
m_usAdjustPitch = PRECACHE_EVENT(1, "events/vehicle.sc");
}
LINK_ENTITY_TO_CLASS(func_vehiclecontrols, CFuncVehicleControls);
LINK_ENTITY_TO_CLASS(func_vehiclecontrols, CFuncVehicleControls, CCSFuncVehicleControls);
void CFuncVehicleControls::Find()
{

View File

@ -63,27 +63,32 @@ MULTIDAMAGE gMultiDamage;
// MaxAmmoCarry - pass in a name and this function will tell
// you the maximum amount of that type of ammunition that a
// player can carry.
int MaxAmmoCarry(int iszName)
int MaxAmmoCarry(const char *szName)
{
for (int i = 0; i < MAX_WEAPONS; ++i)
{
ItemInfo *info = &IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[ i ];
if (info->pszAmmo1 && !Q_strcmp(STRING(iszName), info->pszAmmo1))
if (info->pszAmmo1 && !Q_strcmp(szName, info->pszAmmo1))
{
return info->iMaxAmmo1;
}
if (info->pszAmmo2 && !Q_strcmp(STRING(iszName), info->pszAmmo2))
if (info->pszAmmo2 && !Q_strcmp(szName, info->pszAmmo2))
{
return info->iMaxAmmo2;
}
}
ALERT(at_console, "MaxAmmoCarry() doesn't recognize '%s'!\n", STRING(iszName));
ALERT(at_console, "MaxAmmoCarry() doesn't recognize '%s'!\n", szName);
return -1;
}
int MaxAmmoCarry(int iszName)
{
return MaxAmmoCarry(STRING(iszName));
}
// ClearMultiDamage - resets the global multi damage accumulator
void ClearMultiDamage()
{
@ -309,7 +314,9 @@ void W_Precache()
{
Q_memset(IMPL_CLASS(CBasePlayerItem, ItemInfoArray), 0, sizeof(IMPL_CLASS(CBasePlayerItem, ItemInfoArray)));
Q_memset(IMPL_CLASS(CBasePlayerItem, AmmoInfoArray), 0, sizeof(IMPL_CLASS(CBasePlayerItem, AmmoInfoArray)));
giAmmoIndex = 0;
WeaponInfoReset();
// custom items...
@ -1491,6 +1498,7 @@ void CBasePlayerWeapon::__MAKE_VHOOK(RetireWeapon)()
// GetNextAttackDelay - An accurate way of calcualting the next attack time.
float CBasePlayerWeapon::GetNextAttackDelay(float delay)
{
#ifndef REGAMEDLL_FIXES
if (m_flLastFireTime == 0.0f || m_flNextPrimaryAttack == -1.0f)
{
// At this point, we are assuming that the client has stopped firing
@ -1498,6 +1506,7 @@ float CBasePlayerWeapon::GetNextAttackDelay(float delay)
m_flPrevPrimaryAttack = delay;
m_flLastFireTime = gpGlobals->time;
}
#endif
#ifdef REGAMEDLL_BUILD_6153
@ -1529,7 +1538,7 @@ float CBasePlayerWeapon::GetNextAttackDelay(float delay)
return flNextAttack;
}
LINK_ENTITY_TO_CLASS(weaponbox, CWeaponBox);
LINK_ENTITY_TO_CLASS(weaponbox, CWeaponBox, CCSWeaponBox);
IMPLEMENT_SAVERESTORE(CWeaponBox, CBaseEntity);
void CWeaponBox::__MAKE_VHOOK(Precache)()
@ -1566,7 +1575,7 @@ void CWeaponBox::BombThink()
if (!pEntity->IsPlayer() || pEntity->IsDormant())
continue;
CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pTempPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pTempPlayer->pev->deadflag == DEAD_NO && pTempPlayer->m_iTeam == TERRORIST)
{
@ -1716,7 +1725,7 @@ void CWeaponBox::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
if (pEntity->pev->flags == FL_DORMANT)
continue;
CBasePlayer *pTempPlayer = GetClassPtr((CBasePlayer *)pEntity->pev);
CBasePlayer *pTempPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pTempPlayer->pev->deadflag == DEAD_NO && pTempPlayer->m_iTeam == TERRORIST)
{
@ -1814,6 +1823,11 @@ void CWeaponBox::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
{
if (!FStringNull(m_rgiszAmmo[n]))
{
#ifdef REGAMEDLL_FIXES
if (m_rgAmmo[n] < MaxAmmoCarry(m_rgiszAmmo[n]))
continue;
#endif
// there's some ammo of this type.
pPlayer->GiveAmmo(m_rgAmmo[n], (char *)STRING(m_rgiszAmmo[n]), MaxAmmoCarry(m_rgiszAmmo[n]));
@ -1923,9 +1937,9 @@ int CWeaponBox::GiveAmmo(int iCount, char *szName, int iMax, int *pIndex)
if (iCount == 0 || iAdd > 0)
{
m_rgAmmo[i] += iAdd;
return i;
}
return -1;
}
}
@ -1995,6 +2009,29 @@ void CWeaponBox::__MAKE_VHOOK(SetObjectCollisionBox)()
pev->absmax = pev->origin + Vector(16, 16, 16);
}
char *armouryItemModels[] = {
"models/w_mp5.mdl",
"models/w_tmp.mdl",
"models/w_p90.mdl",
"models/w_mac10.mdl",
"models/w_ak47.mdl",
"models/w_sg552.mdl",
"models/w_m4a1.mdl",
"models/w_aug.mdl",
"models/w_scout.mdl",
"models/w_g3sg1.mdl",
"models/w_awp.mdl",
"models/w_m3.mdl",
"models/w_xm1014.mdl",
"models/w_m249.mdl",
"models/w_flashbang.mdl",
"models/w_hegrenade.mdl",
"models/w_kevlar.mdl",
"models/w_assault.mdl",
"models/w_smokegrenade.mdl",
"models/w_kevlar.mdl",
};
void CArmoury::__MAKE_VHOOK(Spawn)()
{
Precache();
@ -2003,31 +2040,9 @@ void CArmoury::__MAKE_VHOOK(Spawn)()
UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16));
UTIL_SetOrigin(pev, pev->origin);
SetTouch(&CArmoury::ArmouryTouch);
switch (m_iItem)
{
case ARMOURY_MP5NAVY: SET_MODEL(ENT(pev), "models/w_mp5.mdl"); break;
case ARMOURY_TMP: SET_MODEL(ENT(pev), "models/w_tmp.mdl"); break;
case ARMOURY_P90: SET_MODEL(ENT(pev), "models/w_p90.mdl"); break;
case ARMOURY_MAC10: SET_MODEL(ENT(pev), "models/w_mac10.mdl"); break;
case ARMOURY_AK47: SET_MODEL(ENT(pev), "models/w_ak47.mdl"); break;
case ARMOURY_SG552: SET_MODEL(ENT(pev), "models/w_sg552.mdl"); break;
case ARMOURY_M4A1: SET_MODEL(ENT(pev), "models/w_m4a1.mdl"); break;
case ARMOURY_AUG: SET_MODEL(ENT(pev), "models/w_aug.mdl"); break;
case ARMOURY_SCOUT: SET_MODEL(ENT(pev), "models/w_scout.mdl"); break;
case ARMOURY_G3SG1: SET_MODEL(ENT(pev), "models/w_g3sg1.mdl"); break;
case ARMOURY_AWP: SET_MODEL(ENT(pev), "models/w_awp.mdl"); break;
case ARMOURY_M3: SET_MODEL(ENT(pev), "models/w_m3.mdl"); break;
case ARMOURY_XM1014: SET_MODEL(ENT(pev), "models/w_xm1014.mdl"); break;
case ARMOURY_M249: SET_MODEL(ENT(pev), "models/w_m249.mdl"); break;
case ARMOURY_FLASHBANG: SET_MODEL(ENT(pev), "models/w_flashbang.mdl"); break;
case ARMOURY_HEGRENADE: SET_MODEL(ENT(pev), "models/w_hegrenade.mdl"); break;
case ARMOURY_KEVLAR: SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); break;
case ARMOURY_ASSAULT: SET_MODEL(ENT(pev), "models/w_assault.mdl"); break;
case ARMOURY_SMOKEGRENADE: SET_MODEL(ENT(pev), "models/w_smokegrenade.mdl"); break;
default: SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); break;
}
SetTouch(&CArmoury::ArmouryTouch);
SET_MODEL(ENT(pev), armouryItemModels[m_iItem]);
if (m_iCount <= 0)
{
@ -2093,31 +2108,32 @@ void CArmoury::__MAKE_VHOOK(Restart)()
void CArmoury::__MAKE_VHOOK(Precache)()
{
switch (m_iItem)
{
case ARMOURY_MP5NAVY: PRECACHE_MODEL("models/w_mp5.mdl"); break;
case ARMOURY_TMP: PRECACHE_MODEL("models/w_tmp.mdl"); break;
case ARMOURY_P90: PRECACHE_MODEL("models/w_p90.mdl"); break;
case ARMOURY_MAC10: PRECACHE_MODEL("models/w_mac10.mdl"); break;
case ARMOURY_AK47: PRECACHE_MODEL("models/w_ak47.mdl"); break;
case ARMOURY_SG552: PRECACHE_MODEL("models/w_sg552.mdl"); break;
case ARMOURY_M4A1: PRECACHE_MODEL("models/w_m4a1.mdl"); break;
case ARMOURY_AUG: PRECACHE_MODEL("models/w_aug.mdl"); break;
case ARMOURY_SCOUT: PRECACHE_MODEL("models/w_scout.mdl"); break;
case ARMOURY_G3SG1: PRECACHE_MODEL("models/w_g3sg1.mdl"); break;
case ARMOURY_AWP: PRECACHE_MODEL("models/w_awp.mdl"); break;
case ARMOURY_M3: PRECACHE_MODEL("models/w_m3.mdl"); break;
case ARMOURY_XM1014: PRECACHE_MODEL("models/w_xm1014.mdl"); break;
case ARMOURY_M249: PRECACHE_MODEL("models/w_m249.mdl"); break;
case ARMOURY_FLASHBANG: PRECACHE_MODEL("models/w_flashbang.mdl"); break;
case ARMOURY_HEGRENADE: PRECACHE_MODEL("models/w_hegrenade.mdl"); break;
case ARMOURY_KEVLAR: PRECACHE_MODEL("models/w_kevlar.mdl"); break;
case ARMOURY_ASSAULT: PRECACHE_MODEL("models/w_assault.mdl"); break;
case ARMOURY_SMOKEGRENADE: PRECACHE_MODEL("models/w_smokegrenade.mdl"); break;
default: PRECACHE_MODEL("models/w_kevlar.mdl"); break;
}
PRECACHE_MODEL(armouryItemModels[m_iItem]);
}
struct ArmouryItemStruct
{
const char *entityName;
char *ammoName;
int giveAmount;
MaxAmmoType maxRounds;
} armouryItemInfo[] = {
{ "weapon_mp5navy", "9mm", 60, MAX_AMMO_9MM }, // ARMOURY_MP5NAVY
{ "weapon_tmp", "9mm", 60, MAX_AMMO_9MM }, // ARMOURY_TMP
{ "weapon_p90", "57mm", 50, MAX_AMMO_57MM }, // ARMOURY_P90
{ "weapon_mac10", "45acp", 60, MAX_AMMO_45ACP }, // ARMOURY_MAC10
{ "weapon_ak47", "762Nato", 60, MAX_AMMO_762NATO }, // ARMOURY_AK47
{ "weapon_sg552", "556Nato", 60, MAX_AMMO_556NATO }, // ARMOURY_SG552
{ "weapon_m4a1", "556Nato", 60, MAX_AMMO_556NATO }, // ARMOURY_M4A1
{ "weapon_aug", "556Nato", 60, MAX_AMMO_556NATO }, // ARMOURY_AUG
{ "weapon_scout", "762Nato", 30, MAX_AMMO_762NATO }, // ARMOURY_SCOUT
{ "weapon_g3sg1", "762Nato", 30, MAX_AMMO_762NATO }, // ARMOURY_G3SG1
{ "weapon_awp", "338Magnum", 20, MAX_AMMO_338MAGNUM }, // ARMOURY_AWP
{ "weapon_m3", "buckshot", 24, MAX_AMMO_BUCKSHOT }, // ARMOURY_M3
{ "weapon_xm1014", "buckshot", 24, MAX_AMMO_BUCKSHOT }, // ARMOURY_XM1014
{ "weapon_m249", "556NatoBox", 60, MAX_AMMO_556NATOBOX }, // ARMOURY_M249
};
void CArmoury::ArmouryTouch(CBaseEntity *pOther)
{
if (!pOther->IsPlayer())
@ -2128,80 +2144,26 @@ void CArmoury::ArmouryTouch(CBaseEntity *pOther)
if (p->m_bIsVIP)
return;
// weapons
if (m_iCount > 0 && m_iItem <= ARMOURY_M249)
{
if (p->m_bHasPrimary)
return;
m_iCount--;
auto item = &armouryItemInfo[m_iItem];
switch (m_iItem)
{
case ARMOURY_MP5NAVY:
p->GiveNamedItem("weapon_mp5navy");
p->GiveAmmo(60, "9mm", MAX_AMMO_9MM);
break;
case ARMOURY_TMP:
p->GiveNamedItem("weapon_tmp");
p->GiveAmmo(60, "9mm", MAX_AMMO_9MM);
break;
case ARMOURY_P90:
p->GiveNamedItem("weapon_p90");
p->GiveAmmo(50, "57mm", MAX_AMMO_57MM);
break;
case ARMOURY_MAC10:
p->GiveNamedItem("weapon_mac10");
p->GiveAmmo(60, "45acp", MAX_AMMO_45ACP);
break;
case ARMOURY_AK47:
p->GiveNamedItem("weapon_ak47");
p->GiveAmmo(60, "762Nato", MAX_AMMO_762NATO);
break;
case ARMOURY_SG552:
p->GiveNamedItem("weapon_sg552");
p->GiveAmmo(60, "556Nato", MAX_AMMO_556NATO);
break;
case ARMOURY_M4A1:
p->GiveNamedItem("weapon_m4a1");
p->GiveAmmo(60, "556Nato", MAX_AMMO_556NATO);
break;
case ARMOURY_AUG:
p->GiveNamedItem("weapon_aug");
p->GiveAmmo(60, "556Nato", MAX_AMMO_556NATO);
break;
case ARMOURY_SCOUT:
p->GiveNamedItem("weapon_scout");
p->GiveAmmo(30, "762Nato", MAX_AMMO_762NATO);
break;
case ARMOURY_G3SG1:
p->GiveNamedItem("weapon_g3sg1");
p->GiveAmmo(30, "762Nato", MAX_AMMO_762NATO);
break;
case ARMOURY_AWP:
p->GiveNamedItem("weapon_awp");
p->GiveAmmo(20, "338Magnum", MAX_AMMO_338MAGNUM);
break;
case ARMOURY_M3:
p->GiveNamedItem("weapon_m3");
p->GiveAmmo(24, "buckshot", MAX_AMMO_BUCKSHOT);
break;
case ARMOURY_XM1014:
p->GiveNamedItem("weapon_xm1014");
p->GiveAmmo(24, "buckshot", MAX_AMMO_BUCKSHOT);
break;
case ARMOURY_M249:
p->GiveNamedItem("weapon_m249");
p->GiveAmmo(60, "556NatoBox", MAX_AMMO_556NATOBOX);
break;
}
p->GiveNamedItem(item->entityName);
p->GiveAmmo(item->giveAmount, item->ammoName, item->maxRounds);
}
// items & grenades
else if (m_iCount > 0 && m_iItem >= ARMOURY_FLASHBANG)
{
switch (m_iItem)
{
case ARMOURY_FLASHBANG:
{
if (p->AmmoInventory(p->GetAmmoIndex("Flashbang")) >= 2)
if (p->AmmoInventory(p->GetAmmoIndex("Flashbang")) >= MaxAmmoCarry("Flashbang"))
return;
p->GiveNamedItem("weapon_flashbang");
@ -2210,7 +2172,7 @@ void CArmoury::ArmouryTouch(CBaseEntity *pOther)
}
case ARMOURY_HEGRENADE:
{
if (p->AmmoInventory(p->GetAmmoIndex("HEGrenade")) >= 1)
if (p->AmmoInventory(p->GetAmmoIndex("HEGrenade")) >= MaxAmmoCarry("HEGrenade"))
return;
p->GiveNamedItem("weapon_hegrenade");
@ -2237,7 +2199,7 @@ void CArmoury::ArmouryTouch(CBaseEntity *pOther)
}
case ARMOURY_SMOKEGRENADE:
{
if (p->AmmoInventory(p->GetAmmoIndex("SmokeGrenade")) >= 1)
if (p->AmmoInventory(p->GetAmmoIndex("SmokeGrenade")) >= MaxAmmoCarry("SmokeGrenade"))
return;
p->GiveNamedItem("weapon_smokegrenade");
@ -2269,4 +2231,4 @@ void CArmoury::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd)
CBaseEntity::KeyValue(pkvd);
}
LINK_ENTITY_TO_CLASS(armoury_entity, CArmoury);
LINK_ENTITY_TO_CLASS(armoury_entity, CArmoury, CCSArmoury);

View File

@ -32,9 +32,6 @@
#pragma once
#endif
#include "weapontype.h"
#include "wpn_shared.h"
class CBasePlayer;
#define MAX_WEAPONS 32
@ -73,6 +70,9 @@ class CBasePlayer;
// spawn flags
#define SF_DETONATE 0x0001 // Grenades flagged with this will be triggered when the owner calls detonateSatchelCharges
#include "weapontype.h"
#include "wpn_shared.h"
// custom enum
enum ArmouryItemPack
{
@ -95,6 +95,7 @@ enum ArmouryItemPack
ARMOURY_KEVLAR,
ARMOURY_ASSAULT,
ARMOURY_SMOKEGRENADE,
ARMOURY_END
};
struct ItemInfo
@ -400,17 +401,17 @@ public:
int m_iPlayEmptySound;
int m_fFireOnEmpty;
float m_flNextPrimaryAttack;
float m_flNextSecondaryAttack;
float m_flTimeWeaponIdle;
int m_iPrimaryAmmoType;
int m_iSecondaryAmmoType;
int m_iClip;
int m_iClientClip;
int m_iClientWeaponState;
int m_fInReload;
int m_fInSpecialReload;
int m_iDefaultAmmo;
float m_flNextPrimaryAttack; // soonest time ItemPostFrame will call PrimaryAttack
float m_flNextSecondaryAttack; // soonest time ItemPostFrame will call SecondaryAttack
float m_flTimeWeaponIdle; // soonest time ItemPostFrame will call WeaponIdle
int m_iPrimaryAmmoType; // "primary" ammo index into players m_rgAmmo[]
int m_iSecondaryAmmoType; // "secondary" ammo index into players m_rgAmmo[]
int m_iClip; // number of shots left in the primary weapon clip, -1 it not used
int m_iClientClip; // the last version of m_iClip sent to hud dll
int m_iClientWeaponState; // the last version of the weapon state sent to hud dll (is current weapon, is on target)
int m_fInReload; // Are we in the middle of a reload;
int m_fInSpecialReload; // Are we in the middle of a reload for the shotguns
int m_iDefaultAmmo; // how much ammo you get when you pick up this weapon as placed by a level designer.
int m_iShellId;
float m_fMaxSpeed;
bool m_bDelayFire;
@ -431,6 +432,8 @@ public:
float m_flDecreaseShotsFired;
unsigned short m_usFireGlock18;
unsigned short m_usFireFamas;
// hle time creep vars
float m_flPrevPrimaryAttack;
float m_flLastFireTime;
};
@ -553,7 +556,7 @@ public:
virtual int GetItemInfo(ItemInfo *p);
virtual BOOL Deploy();
virtual float GetMaxSpeed() { return MP5N_MAX_SPEED; }
int iItemSlot() { return PRIMARY_WEAPON_SLOT; }
virtual int iItemSlot() { return PRIMARY_WEAPON_SLOT; }
virtual void PrimaryAttack();
virtual void Reload();
virtual void WeaponIdle();
@ -1584,6 +1587,7 @@ public:
public:
int m_iShell;
private:
unsigned short m_usFireELITE_LEFT;
unsigned short m_usFireELITE_RIGHT;
};
@ -1672,7 +1676,6 @@ public:
public:
void UMP45Fire(float flSpread, float flCycleTime, BOOL fUseAutoAim);
public:
int m_iShell;
int iShellOn;
@ -1718,8 +1721,6 @@ public:
public:
void SG550Fire(float flSpread, float flCycleTime, BOOL fUseAutoAim);
public:
int m_iShell;
private:
@ -1840,6 +1841,8 @@ void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, fl
void AnnounceFlashInterval(float interval, float offset = 0);
int MaxAmmoCarry(int iszName);
int MaxAmmoCarry(const char *szName);
void ClearMultiDamage();
void ApplyMultiDamage(entvars_t *pevInflictor, entvars_t *pevAttacker);
void AddMultiDamage(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType);

View File

@ -5,6 +5,46 @@
*/
#ifndef HOOK_GAMEDLL
WeaponStruct g_weaponStruct[ MAX_WEAPONS ] =
{
{ 0, 0, 0, 0, 0 },
{ WEAPON_P228, P228_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_357SIG_PRICE },
{ WEAPON_SCOUT, SCOUT_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_XM1014, XM1014_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_BUCKSHOT_PRICE },
{ WEAPON_MAC10, MAC10_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_45ACP_PRICE },
{ WEAPON_AUG, AUG_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_ELITE, ELITE_PRICE, CT, AUTOBUYCLASS_SECONDARY, AMMO_9MM_PRICE },
{ WEAPON_FIVESEVEN, FIVESEVEN_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_57MM_PRICE },
{ WEAPON_UMP45, UMP45_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_45ACP_PRICE },
{ WEAPON_SG550, SG550_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_USP, USP_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_45ACP_PRICE },
{ WEAPON_GLOCK18, GLOCK18_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_9MM_PRICE },
{ WEAPON_MP5N, MP5NAVY_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_9MM_PRICE },
{ WEAPON_AWP, AWP_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_338MAG_PRICE },
{ WEAPON_M249, M249_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_M3, M3_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_BUCKSHOT_PRICE },
{ WEAPON_M4A1, M4A1_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_TMP, TMP_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_9MM_PRICE },
{ WEAPON_G3SG1, G3SG1_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_DEAGLE, DEAGLE_PRICE, TERRORIST|CT, AUTOBUYCLASS_SECONDARY, AMMO_50AE_PRICE },
{ WEAPON_SG552, SG552_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_AK47, AK47_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_762MM_PRICE },
{ WEAPON_P90, P90_PRICE, TERRORIST|CT, AUTOBUYCLASS_PRIMARY, AMMO_57MM_PRICE },
{ WEAPON_FAMAS, FAMAS_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
{ WEAPON_GALIL, GALIL_PRICE, CT, AUTOBUYCLASS_PRIMARY, AMMO_556MM_PRICE },
// TODO: this have bug, the cost of galil $2000, but not $2250
{ WEAPON_SHIELDGUN, SHIELDGUN_PRICE, TERRORIST, AUTOBUYCLASS_PRIMARY, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
AutoBuyInfoStruct g_autoBuyInfo[] =
{
{ AUTOBUYCLASS_PRIMARY|AUTOBUYCLASS_RIFLE, "galil", "weapon_galil" },
@ -184,35 +224,36 @@ WeaponClassAliasInfo weaponClassAliasInfo[] =
{ NULL, WEAPONCLASS_NONE }
};
WeaponInfoStruct weaponInfo[] =
WeaponInfoStruct weaponInfo[27];
WeaponInfoStruct weaponInfo_default[] =
{
{ WEAPON_P228, P228_PRICE, AMMO_357SIG_PRICE, AMMO_357SIG_BUY, P228_MAX_CLIP, MAX_AMMO_357SIG, AMMO_357SIG, "weapon_p228" },
{ WEAPON_GLOCK, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" },
{ WEAPON_GLOCK18, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18" },
{ WEAPON_SCOUT, SCOUT_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, SCOUT_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_scout" },
{ WEAPON_XM1014, XM1014_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, XM1014_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_xm1014" },
{ WEAPON_MAC10, MAC10_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, MAC10_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_mac10" },
{ WEAPON_AUG, AUG_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, AUG_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_aug" },
{ WEAPON_ELITE, ELITE_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, ELITE_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_elite" },
{ WEAPON_FIVESEVEN, FIVESEVEN_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, FIVESEVEN_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_fiveseven" },
{ WEAPON_UMP45, UMP45_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, UMP45_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_ump45" },
{ WEAPON_SG550, SG550_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG550_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg550" },
{ WEAPON_GALIL, GALIL_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, GALIL_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_galil" },
{ WEAPON_FAMAS, FAMAS_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, FAMAS_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_famas" },
{ WEAPON_USP, USP_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, USP_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_usp" },
{ WEAPON_AWP, AWP_PRICE, AMMO_338MAG_PRICE, AMMO_338MAG_BUY, AWP_MAX_CLIP, MAX_AMMO_338MAGNUM, AMMO_338MAGNUM, "weapon_awp" },
{ WEAPON_MP5N, MP5NAVY_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, MP5N_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_mp5navy" },
{ WEAPON_M249, M249_PRICE, AMMO_556MM_PRICE, AMMO_556NATOBOX_BUY, M249_MAX_CLIP, MAX_AMMO_556NATOBOX, AMMO_556NATOBOX, "weapon_m249" },
{ WEAPON_M3, M3_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, M3_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_m3" },
{ WEAPON_M4A1, M4A1_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, M4A1_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_m4a1" },
{ WEAPON_TMP, TMP_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, TMP_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_tmp" },
{ WEAPON_G3SG1, G3SG1_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, G3SG1_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_g3sg1" },
{ WEAPON_DEAGLE, DEAGLE_PRICE, AMMO_50AE_PRICE, AMMO_50AE_BUY, DEAGLE_MAX_CLIP, MAX_AMMO_50AE, AMMO_50AE, "weapon_deagle" },
{ WEAPON_SG552, SG552_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG552_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg552" },
{ WEAPON_AK47, AK47_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, AK47_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_ak47" },
{ WEAPON_P90, P90_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, P90_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_p90" },
{ WEAPON_SHIELDGUN, SHIELDGUN_PRICE, 0, 0, 0, 0, -1, NULL },
{ 0, 0, 0, 0, 0, 0, -1, NULL }
{ WEAPON_P228, P228_PRICE, AMMO_357SIG_PRICE, AMMO_357SIG_BUY, P228_MAX_CLIP, MAX_AMMO_357SIG, AMMO_357SIG, "weapon_p228", "ammo_357sig" },
{ WEAPON_GLOCK, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18", "ammo_9mm" },
{ WEAPON_GLOCK18, GLOCK18_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, GLOCK18_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_glock18", "ammo_9mm" },
{ WEAPON_SCOUT, SCOUT_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, SCOUT_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_scout", "ammo_762nato" },
{ WEAPON_XM1014, XM1014_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, XM1014_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_xm1014", "ammo_buckshot" },
{ WEAPON_MAC10, MAC10_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, MAC10_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_mac10", "ammo_45acp" },
{ WEAPON_AUG, AUG_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, AUG_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_aug", "ammo_556nato" },
{ WEAPON_ELITE, ELITE_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, ELITE_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_elite", "ammo_ammo_9mm" },
{ WEAPON_FIVESEVEN, FIVESEVEN_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, FIVESEVEN_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_fiveseven", "ammo_57mm" },
{ WEAPON_UMP45, UMP45_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, UMP45_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_ump45", "ammo_45acp" },
{ WEAPON_SG550, SG550_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG550_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg550", "ammo_556nato" },
{ WEAPON_GALIL, GALIL_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, GALIL_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_galil", "ammo_556nato" },
{ WEAPON_FAMAS, FAMAS_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, FAMAS_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_famas", "ammo_556nato" },
{ WEAPON_USP, USP_PRICE, AMMO_45ACP_PRICE, AMMO_45ACP_BUY, USP_MAX_CLIP, MAX_AMMO_45ACP, AMMO_45ACP, "weapon_usp", "ammo_45acp" },
{ WEAPON_AWP, AWP_PRICE, AMMO_338MAG_PRICE, AMMO_338MAG_BUY, AWP_MAX_CLIP, MAX_AMMO_338MAGNUM, AMMO_338MAGNUM, "weapon_awp", "ammo_338magnum" },
{ WEAPON_MP5N, MP5NAVY_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, MP5N_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_mp5navy", "ammo_9mm" },
{ WEAPON_M249, M249_PRICE, AMMO_556MM_PRICE, AMMO_556NATOBOX_BUY, M249_MAX_CLIP, MAX_AMMO_556NATOBOX, AMMO_556NATOBOX, "weapon_m249", "ammo_556natobox" },
{ WEAPON_M3, M3_PRICE, AMMO_BUCKSHOT_PRICE, AMMO_BUCKSHOT_BUY, M3_MAX_CLIP, MAX_AMMO_BUCKSHOT, AMMO_BUCKSHOT, "weapon_m3", "ammo_buckshot" },
{ WEAPON_M4A1, M4A1_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, M4A1_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_m4a1", "ammo_556nato" },
{ WEAPON_TMP, TMP_PRICE, AMMO_9MM_PRICE, AMMO_9MM_BUY, TMP_MAX_CLIP, MAX_AMMO_9MM, AMMO_9MM, "weapon_tmp", "ammo_9mm" },
{ WEAPON_G3SG1, G3SG1_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, G3SG1_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_g3sg1", "ammo_762nato" },
{ WEAPON_DEAGLE, DEAGLE_PRICE, AMMO_50AE_PRICE, AMMO_50AE_BUY, DEAGLE_MAX_CLIP, MAX_AMMO_50AE, AMMO_50AE, "weapon_deagle", "ammo_50ae" },
{ WEAPON_SG552, SG552_PRICE, AMMO_556MM_PRICE, AMMO_556NATO_BUY, SG552_MAX_CLIP, MAX_AMMO_556NATO, AMMO_556NATO, "weapon_sg552", "ammo_556nato" },
{ WEAPON_AK47, AK47_PRICE, AMMO_762MM_PRICE, AMMO_762NATO_BUY, AK47_MAX_CLIP, MAX_AMMO_762NATO, AMMO_762NATO, "weapon_ak47", "ammo_762nato" },
{ WEAPON_P90, P90_PRICE, AMMO_57MM_PRICE, AMMO_57MM_BUY, P90_MAX_CLIP, MAX_AMMO_57MM, AMMO_57MM, "weapon_p90", "ammo_57mm" },
{ WEAPON_SHIELDGUN, SHIELDGUN_PRICE, 0, 0, 0, 0, AMMO_NONE, "weapon_shield", nullptr },
{ 0, 0, 0, 0, 0, 0, AMMO_NONE, nullptr, nullptr }
};
#endif // HOOK_GAMEDLL
@ -332,7 +373,7 @@ bool IsSecondaryWeapon(int id)
return false;
}
WeaponInfoStruct *GetWeaponInfo(int weaponID)
WeaponInfoStruct *EXT_FUNC GetWeaponInfo(int weaponID)
{
for (int i = 0; weaponInfo[i].id != 0; ++i)
{
@ -343,6 +384,13 @@ WeaponInfoStruct *GetWeaponInfo(int weaponID)
return NULL;
}
void WeaponInfoReset()
{
#ifndef HOOK_GAMEDLL
Q_memcpy(weaponInfo, weaponInfo_default, sizeof(weaponInfo));
#endif
}
bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasinationRestrictions)
{
if (useAssasinationRestrictions)

View File

@ -256,6 +256,7 @@ enum MaxAmmoType
enum AmmoType
{
AMMO_NONE = -1,
AMMO_BUCKSHOT,
AMMO_9MM,
AMMO_556NATO,
@ -359,6 +360,15 @@ enum Bullet
BULLET_PLAYER_357SIG,
};
struct WeaponStruct
{
int m_type;
int m_price;
int m_side;
int m_slot;
int m_ammoPrice;
};
struct AutoBuyInfoStruct
{
AutoBuyClassType m_class;
@ -393,11 +403,17 @@ struct WeaponInfoStruct
int buyClipSize;
int gunClipSize;
int maxRounds;
int ammoType;
AmmoType ammoType;
char *entityName;
#ifndef HOOK_GAMEDLL
const char *ammoName;
#endif
};
extern AutoBuyInfoStruct g_autoBuyInfo[35];
extern WeaponStruct g_weaponStruct[MAX_WEAPONS];
extern WeaponInfoStruct weaponInfo[27];
// WeaponType
WeaponIdType AliasToWeaponID(const char *alias);
@ -409,5 +425,6 @@ bool IsPrimaryWeapon(int id);
bool IsSecondaryWeapon(int id);
WeaponInfoStruct *GetWeaponInfo(int weaponID);
bool CanBuyWeaponByMaptype(int playerTeam, WeaponIdType weaponID, bool useAssasinationRestrictions);
void WeaponInfoReset();
#endif // WEAPONTYPE_H

View File

@ -80,7 +80,7 @@ public:
void EXPORT TriggerDecal(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
};
LINK_ENTITY_TO_CLASS(infodecal, CDecal);
LINK_ENTITY_TO_CLASS(infodecal, CDecal, CCSDecal);
void CDecal::Spawn()
{
@ -173,7 +173,7 @@ public:
virtual int ObjectCaps() { return FCAP_DONT_SAVE; }
};
LINK_ENTITY_TO_CLASS(bodyque, CCorpse);
LINK_ENTITY_TO_CLASS(bodyque, CCorpse, CCSCorpse);
static void InitBodyQue()
{
@ -410,7 +410,12 @@ void EXT_FUNC ResetGlobalState()
gInitHUD = TRUE;
}
LINK_ENTITY_TO_CLASS(worldspawn, CWorld);
#pragma push_macro("REGAMEDLL_ALLOC_FUNC")
#define REGAMEDLL_ALLOC_FUNC Regamedll_AllocEntities(gpGlobals->maxEntities);
LINK_ENTITY_TO_CLASS(worldspawn, CWorld, CCSWorld);
#pragma pop_macro("REGAMEDLL_ALLOC_FUNC")
void CWorld::__MAKE_VHOOK(Spawn)()
{
@ -425,7 +430,7 @@ void CWorld::__MAKE_VHOOK(Spawn)()
int flength = 0;
char *pFile = (char *)LOAD_FILE_FOR_ME(UTIL_VarArgs("maps/%s.txt", STRING(gpGlobals->mapname)), &flength);
if (pFile && flength != NULL)
if (pFile != NULL && flength)
{
Q_strncpy(g_szMapBriefingText, pFile, ARRAYSIZE(g_szMapBriefingText) - 2);
@ -475,11 +480,13 @@ void CWorld::__MAKE_VHOOK(Precache)()
g_pGameRules = InstallGameRules();
// s1lent: What is the essence of soundent in CS 1.6? I think this is for NPC monsters.
#ifndef REGAMEDLL_FIXES
// UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here
// LATER - do we want a sound ent in deathmatch? (sjb)
//pSoundEnt = CBaseEntity::Create("soundent", g_vecZero, g_vecZero, edict());
pSoundEnt = GetClassPtr((CSoundEnt *)NULL);
pSoundEnt = GetClassPtr<CCSSoundEnt>((CSoundEnt *)NULL);
if (pSoundEnt == NULL)
{
@ -489,7 +496,7 @@ void CWorld::__MAKE_VHOOK(Precache)()
{
pSoundEnt->Spawn();
}
#endif
InitBodyQue();
// init sentence group playback stuff from sentences.txt.
@ -593,6 +600,7 @@ void CWorld::__MAKE_VHOOK(Precache)()
for (int i = 0; i < ARRAYSIZE(gDecals); ++i)
gDecals[i].index = DECAL_INDEX(gDecals[i].name);
#ifndef REGAMEDLL_FIXES
// init the WorldGraph.
WorldGraph.InitGraph();
@ -616,6 +624,7 @@ void CWorld::__MAKE_VHOOK(Precache)()
ALERT(at_console, "\n*Graph Loaded!\n");
}
}
#endif
if (pev->speed > 0)
CVAR_SET_FLOAT("sv_zmax", pev->speed);

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_ak47, CAK47);
LINK_ENTITY_TO_CLASS(weapon_ak47, CAK47, CCSAK47);
void CAK47::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_aug, CAUG);
LINK_ENTITY_TO_CLASS(weapon_aug, CAUG, CCSAUG);
void CAUG::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_awp, CAWP);
LINK_ENTITY_TO_CLASS(weapon_awp, CAWP, CCSAWP);
void CAWP::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_c4, CC4);
LINK_ENTITY_TO_CLASS(weapon_c4, CC4, CCSC4);
void CC4::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_deagle, CDEAGLE);
LINK_ENTITY_TO_CLASS(weapon_deagle, CDEAGLE, CCSDEAGLE);
void CDEAGLE::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_elite, CELITE);
LINK_ENTITY_TO_CLASS(weapon_elite, CELITE, CCSELITE);
void CELITE::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_famas, CFamas);
LINK_ENTITY_TO_CLASS(weapon_famas, CFamas, CCSFamas);
void CFamas::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_fiveseven, CFiveSeven);
LINK_ENTITY_TO_CLASS(weapon_fiveseven, CFiveSeven, CCSFiveSeven);
void CFiveSeven::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_flashbang, CFlashbang);
LINK_ENTITY_TO_CLASS(weapon_flashbang, CFlashbang, CCSFlashbang);
void CFlashbang::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_g3sg1, CG3SG1);
LINK_ENTITY_TO_CLASS(weapon_g3sg1, CG3SG1, CCSG3SG1);
void CG3SG1::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_galil, CGalil);
LINK_ENTITY_TO_CLASS(weapon_galil, CGalil, CCSGalil);
void CGalil::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_glock18, CGLOCK18);
LINK_ENTITY_TO_CLASS(weapon_glock18, CGLOCK18, CCSGLOCK18);
void CGLOCK18::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_hegrenade, CHEGrenade);
LINK_ENTITY_TO_CLASS(weapon_hegrenade, CHEGrenade, CCSHEGrenade);
void CHEGrenade::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_knife, CKnife);
LINK_ENTITY_TO_CLASS(weapon_knife, CKnife, CCSKnife);
void CKnife::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_m249, CM249);
LINK_ENTITY_TO_CLASS(weapon_m249, CM249, CCSM249);
void CM249::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_m3, CM3);
LINK_ENTITY_TO_CLASS(weapon_m3, CM3, CCSM3);
void CM3::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_m4a1, CM4A1);
LINK_ENTITY_TO_CLASS(weapon_m4a1, CM4A1, CCSM4A1);
void CM4A1::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_mac10, CMAC10);
LINK_ENTITY_TO_CLASS(weapon_mac10, CMAC10, CCSMAC10);
void CMAC10::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_mp5navy, CMP5N);
LINK_ENTITY_TO_CLASS(weapon_mp5navy, CMP5N, CCSMP5N);
void CMP5N::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_p228, CP228);
LINK_ENTITY_TO_CLASS(weapon_p228, CP228, CCSP228);
void CP228::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_p90, CP90);
LINK_ENTITY_TO_CLASS(weapon_p90, CP90, CCSP90);
void CP90::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_scout, CSCOUT);
LINK_ENTITY_TO_CLASS(weapon_scout, CSCOUT, CCSSCOUT);
void CSCOUT::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_sg550, CSG550);
LINK_ENTITY_TO_CLASS(weapon_sg550, CSG550, CCSSG550);
void CSG550::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_sg552, CSG552);
LINK_ENTITY_TO_CLASS(weapon_sg552, CSG552, CCSSG552);
void CSG552::__MAKE_VHOOK(Spawn)()
{

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(weapon_smokegrenade, CSmokeGrenade);
LINK_ENTITY_TO_CLASS(weapon_smokegrenade, CSmokeGrenade, CCSSmokeGrenade);
void CSmokeGrenade::__MAKE_VHOOK(Spawn)()
{

Some files were not shown because too many files have changed in this diff Show More