ReGameDLL_CS/regamedll/dlls/gamerules.cpp
2024-09-13 06:43:27 +07:00

154 lines
3.2 KiB
C++

#include "precompiled.h"
CGameRules *g_pGameRules = nullptr;
CGameRules::CGameRules()
{
m_bFreezePeriod = FALSE;
m_bBombDropped = FALSE;
m_bGameOver = false;
const char *pszGameDesc = AreRunningCZero() ? "Condition Zero" : "Counter-Strike";
m_GameDesc = CloneString(pszGameDesc);
}
CGameRules::~CGameRules()
{
delete[] m_GameDesc;
m_GameDesc = nullptr;
}
// this is the game name that gets seen in the server browser
const char *CGameRules::GetGameDescription()
{
#ifdef REGAMEDLL_ADD
return m_GameDesc;
#else
return "Counter-Strike";
#endif
}
BOOL CGameRules::CanHaveAmmo(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry)
{
if (pszAmmoName)
{
auto iAmmoIndex = pPlayer->GetAmmoIndex(pszAmmoName);
if (iAmmoIndex > -1)
{
if (pPlayer->AmmoInventory(iAmmoIndex) < iMaxCarry)
{
// player has room for more of this type of ammo
return TRUE;
}
}
}
return FALSE;
}
edict_t *CGameRules::GetPlayerSpawnSpot(CBasePlayer *pPlayer)
{
// gat valid spawn point
edict_t *pentSpawnSpot = pPlayer->EntSelectSpawnPoint();
// Move the player to the place it said.
#ifndef PLAY_GAMEDLL
pPlayer->pev->origin = pentSpawnSpot->v.origin + Vector(0, 0, 1);
#else
// TODO: fix test demo
pPlayer->pev->origin = pentSpawnSpot->v.origin;
pPlayer->pev->origin.z += 1;
#endif
pPlayer->pev->v_angle = g_vecZero;
pPlayer->pev->velocity = g_vecZero;
pPlayer->pev->angles = pentSpawnSpot->v.angles;
pPlayer->pev->punchangle = g_vecZero;
pPlayer->pev->fixangle = 1;
return pentSpawnSpot;
}
BOOL CGameRules::CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon)
{
// only living players can have items
if (pPlayer->pev->deadflag != DEAD_NO)
{
return FALSE;
}
if (pPlayer->IsBot() && TheCSBots() && !TheCSBots()->IsWeaponUseable(pWeapon))
{
return FALSE;
}
if (pWeapon->pszAmmo1())
{
if (!CanHaveAmmo(pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1()))
{
// we can't carry anymore ammo for this gun. We can only
// have the gun if we aren't already carrying one of this type
if (pPlayer->HasPlayerItem(pWeapon))
{
return FALSE;
}
}
}
else
{
// weapon doesn't use ammo, don't take another if you already have it.
if (pPlayer->HasPlayerItem(pWeapon))
{
return FALSE;
}
}
// note: will fall through to here if GetItemInfo doesn't fill the struct!
return TRUE;
}
void CGameRules::RefreshSkillData()
{
int iSkill = int(CVAR_GET_FLOAT("skill"));
if (iSkill < 1)
iSkill = 1;
else if (iSkill > 3)
iSkill = 3;
gSkillData.iSkillLevel = iSkill;
ALERT(at_console, "\nGAME SKILL LEVEL:%d\n", iSkill);
gSkillData.monDmg12MM = 8;
gSkillData.monDmgMP5 = 3;
gSkillData.monDmg9MM = 5;
gSkillData.suitchargerCapacity = 75;
gSkillData.batteryCapacity = 15;
gSkillData.healthchargerCapacity = 50;
gSkillData.healthkitCapacity = 15;
}
LINK_HOOK_CHAIN2(CGameRules *, InstallGameRules)
CGameRules *EXT_FUNC __API_HOOK(InstallGameRules)()
{
SERVER_COMMAND("exec game.cfg\n");
SERVER_EXECUTE();
if (!gpGlobals->deathmatch)
return new CHalfLifeTraining;
return new CHalfLifeMultiplay;
}
LINK_HOOK_VOID_CHAIN(FreeGameRules, (CGameRules **pGameRules), pGameRules)
void EXT_FUNC __API_HOOK(FreeGameRules)(CGameRules **pGameRules)
{
if (!pGameRules || !(*pGameRules))
return;
delete (*pGameRules);
}