2022-12-17 13:32:43 +01:00
|
|
|
/***
|
2013-08-30 13:34:05 -07:00
|
|
|
*
|
|
|
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
|
|
|
*
|
|
|
|
* This product contains software technology licensed from Id
|
|
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
|
|
* without written permission from Valve LLC.
|
|
|
|
*
|
|
|
|
****/
|
|
|
|
//=========================================================
|
|
|
|
// GameRules.cpp
|
|
|
|
//=========================================================
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
#include "extdll.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "cbase.h"
|
|
|
|
#include "player.h"
|
|
|
|
#include "weapons.h"
|
|
|
|
#include "gamerules.h"
|
|
|
|
#include "teamplay_gamerules.h"
|
|
|
|
#include "skill.h"
|
|
|
|
#include "game.h"
|
2021-02-17 17:10:14 +01:00
|
|
|
#include "UserMessages.h"
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
extern edict_t* EntSelectSpawnPoint(CBaseEntity* pPlayer);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2022-03-13 21:38:34 +01:00
|
|
|
CBasePlayerItem* CGameRules::FindNextBestWeapon(CBasePlayer* pPlayer, CBasePlayerItem* pCurrentWeapon)
|
|
|
|
{
|
2022-03-13 21:51:28 +01:00
|
|
|
if (pCurrentWeapon != nullptr && !pCurrentWeapon->CanHolster())
|
2022-03-13 21:38:34 +01:00
|
|
|
{
|
|
|
|
// can't put this gun away right now, so can't switch.
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2022-03-13 21:51:28 +01:00
|
|
|
const int currentWeight = pCurrentWeapon != nullptr ? pCurrentWeapon->iWeight() : -1;
|
|
|
|
|
2022-03-13 21:38:34 +01:00
|
|
|
CBasePlayerItem* pBest = nullptr; // this will be used in the event that we don't find a weapon in the same category.
|
|
|
|
|
|
|
|
int iBestWeight = -1; // no weapon lower than -1 can be autoswitched to
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_ITEM_TYPES; i++)
|
|
|
|
{
|
|
|
|
for (auto pCheck = pPlayer->m_rgpPlayerItems[i]; pCheck; pCheck = pCheck->m_pNext)
|
|
|
|
{
|
|
|
|
// don't reselect the weapon we're trying to get rid of
|
|
|
|
if (pCheck == pCurrentWeapon)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2024-08-29 17:32:44 +10:00
|
|
|
if ((pCheck->iFlags() & ITEM_FLAG_NOAUTOSWITCHTO) != 0)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2022-03-13 21:51:28 +01:00
|
|
|
if (pCheck->iWeight() > -1 && pCheck->iWeight() == currentWeight)
|
2022-03-13 21:38:34 +01:00
|
|
|
{
|
|
|
|
// this weapon is from the same category.
|
|
|
|
if (pCheck->CanDeploy())
|
|
|
|
{
|
|
|
|
if (pPlayer->SwitchWeapon(pCheck))
|
|
|
|
{
|
|
|
|
return pCheck;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (pCheck->iWeight() > iBestWeight)
|
|
|
|
{
|
|
|
|
//ALERT ( at_console, "Considering %s\n", STRING( pCheck->pev->classname ) );
|
|
|
|
// we keep updating the 'best' weapon just in case we can't find a weapon of the same weight
|
|
|
|
// that the player was using. This will end up leaving the player with his heaviest-weighted
|
|
|
|
// weapon.
|
|
|
|
if (pCheck->CanDeploy())
|
|
|
|
{
|
|
|
|
// if this weapon is useable, flag it as the best
|
|
|
|
iBestWeight = pCheck->iWeight();
|
|
|
|
pBest = pCheck;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if we make it here, we've checked all the weapons and found no useable
|
|
|
|
// weapon in the same catagory as the current weapon.
|
|
|
|
|
|
|
|
// if pBest is nullptr, we didn't find ANYTHING. Shouldn't be possible- should always
|
|
|
|
// at least get the crowbar, but ya never know.
|
|
|
|
|
|
|
|
return pBest;
|
|
|
|
}
|
|
|
|
|
2022-03-13 21:51:28 +01:00
|
|
|
bool CGameRules::GetNextBestWeapon(CBasePlayer* pPlayer, CBasePlayerItem* pCurrentWeapon, bool alwaysSearch)
|
2022-03-13 21:38:34 +01:00
|
|
|
{
|
|
|
|
if (auto pBest = FindNextBestWeapon(pPlayer, pCurrentWeapon); pBest != nullptr)
|
|
|
|
{
|
|
|
|
pPlayer->SwitchWeapon(pBest);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-08-30 13:34:05 -07:00
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
2021-11-28 16:54:48 +01:00
|
|
|
bool CGameRules::CanHaveAmmo(CBasePlayer* pPlayer, const char* pszAmmoName, int iMaxCarry)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
int iAmmoIndex;
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pszAmmoName)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
iAmmoIndex = pPlayer->GetAmmoIndex(pszAmmoName);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
if (iAmmoIndex > -1)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pPlayer->AmmoInventory(iAmmoIndex) < iMaxCarry)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
// player has room for more of this type of ammo
|
2021-11-19 13:45:16 +01:00
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-19 13:43:33 +01:00
|
|
|
return false;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
2021-11-29 20:31:17 +01:00
|
|
|
edict_t* CGameRules::GetPlayerSpawnSpot(CBasePlayer* pPlayer)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
edict_t* pentSpawnSpot = EntSelectSpawnPoint(pPlayer);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
pPlayer->pev->origin = VARS(pentSpawnSpot)->origin + Vector(0, 0, 1);
|
|
|
|
pPlayer->pev->v_angle = g_vecZero;
|
2013-08-30 13:34:05 -07:00
|
|
|
pPlayer->pev->velocity = g_vecZero;
|
|
|
|
pPlayer->pev->angles = VARS(pentSpawnSpot)->angles;
|
|
|
|
pPlayer->pev->punchangle = g_vecZero;
|
2021-11-28 15:32:26 +01:00
|
|
|
pPlayer->pev->fixangle = 1;
|
2021-11-28 16:54:48 +01:00
|
|
|
|
2013-08-30 13:34:05 -07:00
|
|
|
return pentSpawnSpot;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
2021-11-28 16:54:48 +01:00
|
|
|
bool CGameRules::CanHavePlayerItem(CBasePlayer* pPlayer, CBasePlayerItem* pWeapon)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
// only living players can have items
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pPlayer->pev->deadflag != DEAD_NO)
|
2021-11-19 13:43:33 +01:00
|
|
|
return false;
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pWeapon->pszAmmo1())
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
if (!CanHaveAmmo(pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1()))
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
// we can't carry anymore ammo for this gun. We can only
|
2013-08-30 13:34:05 -07:00
|
|
|
// have the gun if we aren't already carrying one of this type
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pPlayer->HasPlayerItem(pWeapon))
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-19 13:43:33 +01:00
|
|
|
return false;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// weapon doesn't use ammo, don't take another if you already have it.
|
2021-11-28 16:54:48 +01:00
|
|
|
if (pPlayer->HasPlayerItem(pWeapon))
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-19 13:43:33 +01:00
|
|
|
return false;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// note: will fall through to here if GetItemInfo doesn't fill the struct!
|
2021-11-19 13:45:16 +01:00
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// load the SkillData struct with the proper values based on the skill level.
|
|
|
|
//=========================================================
|
2021-11-28 16:54:48 +01:00
|
|
|
void CGameRules::RefreshSkillData()
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
int iSkill;
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
iSkill = (int)CVAR_GET_FLOAT("skill");
|
|
|
|
g_iSkillLevel = iSkill;
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
if (iSkill < 1)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
iSkill = 1;
|
|
|
|
}
|
2021-11-28 16:54:48 +01:00
|
|
|
else if (iSkill > 3)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
iSkill = 3;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
gSkillData.iSkillLevel = iSkill;
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
ALERT(at_console, "\nGAME SKILL LEVEL:%d\n", iSkill);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
//Agrunt
|
|
|
|
gSkillData.agruntHealth = GetSkillCvar("sk_agrunt_health");
|
|
|
|
gSkillData.agruntDmgPunch = GetSkillCvar("sk_agrunt_dmg_punch");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
// Apache
|
|
|
|
gSkillData.apacheHealth = GetSkillCvar("sk_apache_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Barney
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.barneyHealth = GetSkillCvar("sk_barney_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Big Momma
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.bigmommaHealthFactor = GetSkillCvar("sk_bigmomma_health_factor");
|
|
|
|
gSkillData.bigmommaDmgSlash = GetSkillCvar("sk_bigmomma_dmg_slash");
|
|
|
|
gSkillData.bigmommaDmgBlast = GetSkillCvar("sk_bigmomma_dmg_blast");
|
|
|
|
gSkillData.bigmommaRadiusBlast = GetSkillCvar("sk_bigmomma_radius_blast");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Bullsquid
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.bullsquidHealth = GetSkillCvar("sk_bullsquid_health");
|
|
|
|
gSkillData.bullsquidDmgBite = GetSkillCvar("sk_bullsquid_dmg_bite");
|
|
|
|
gSkillData.bullsquidDmgWhip = GetSkillCvar("sk_bullsquid_dmg_whip");
|
|
|
|
gSkillData.bullsquidDmgSpit = GetSkillCvar("sk_bullsquid_dmg_spit");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Gargantua
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.gargantuaHealth = GetSkillCvar("sk_gargantua_health");
|
|
|
|
gSkillData.gargantuaDmgSlash = GetSkillCvar("sk_gargantua_dmg_slash");
|
|
|
|
gSkillData.gargantuaDmgFire = GetSkillCvar("sk_gargantua_dmg_fire");
|
|
|
|
gSkillData.gargantuaDmgStomp = GetSkillCvar("sk_gargantua_dmg_stomp");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Hassassin
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.hassassinHealth = GetSkillCvar("sk_hassassin_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Headcrab
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.headcrabHealth = GetSkillCvar("sk_headcrab_health");
|
|
|
|
gSkillData.headcrabDmgBite = GetSkillCvar("sk_headcrab_dmg_bite");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
// Hgrunt
|
|
|
|
gSkillData.hgruntHealth = GetSkillCvar("sk_hgrunt_health");
|
|
|
|
gSkillData.hgruntDmgKick = GetSkillCvar("sk_hgrunt_kick");
|
|
|
|
gSkillData.hgruntShotgunPellets = GetSkillCvar("sk_hgrunt_pellets");
|
|
|
|
gSkillData.hgruntGrenadeSpeed = GetSkillCvar("sk_hgrunt_gspeed");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Houndeye
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.houndeyeHealth = GetSkillCvar("sk_houndeye_health");
|
|
|
|
gSkillData.houndeyeDmgBlast = GetSkillCvar("sk_houndeye_dmg_blast");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// ISlave
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.slaveHealth = GetSkillCvar("sk_islave_health");
|
|
|
|
gSkillData.slaveDmgClaw = GetSkillCvar("sk_islave_dmg_claw");
|
|
|
|
gSkillData.slaveDmgClawrake = GetSkillCvar("sk_islave_dmg_clawrake");
|
|
|
|
gSkillData.slaveDmgZap = GetSkillCvar("sk_islave_dmg_zap");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Icthyosaur
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.ichthyosaurHealth = GetSkillCvar("sk_ichthyosaur_health");
|
|
|
|
gSkillData.ichthyosaurDmgShake = GetSkillCvar("sk_ichthyosaur_shake");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Leech
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.leechHealth = GetSkillCvar("sk_leech_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.leechDmgBite = GetSkillCvar("sk_leech_dmg_bite");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Controller
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.controllerHealth = GetSkillCvar("sk_controller_health");
|
|
|
|
gSkillData.controllerDmgZap = GetSkillCvar("sk_controller_dmgzap");
|
|
|
|
gSkillData.controllerSpeedBall = GetSkillCvar("sk_controller_speedball");
|
|
|
|
gSkillData.controllerDmgBall = GetSkillCvar("sk_controller_dmgball");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Nihilanth
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.nihilanthHealth = GetSkillCvar("sk_nihilanth_health");
|
|
|
|
gSkillData.nihilanthZap = GetSkillCvar("sk_nihilanth_zap");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Scientist
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.scientistHealth = GetSkillCvar("sk_scientist_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Snark
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.snarkHealth = GetSkillCvar("sk_snark_health");
|
|
|
|
gSkillData.snarkDmgBite = GetSkillCvar("sk_snark_dmg_bite");
|
|
|
|
gSkillData.snarkDmgPop = GetSkillCvar("sk_snark_dmg_pop");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Zombie
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.zombieHealth = GetSkillCvar("sk_zombie_health");
|
|
|
|
gSkillData.zombieDmgOneSlash = GetSkillCvar("sk_zombie_dmg_one_slash");
|
|
|
|
gSkillData.zombieDmgBothSlash = GetSkillCvar("sk_zombie_dmg_both_slash");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
//Turret
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.turretHealth = GetSkillCvar("sk_turret_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// MiniTurret
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.miniturretHealth = GetSkillCvar("sk_miniturret_health");
|
|
|
|
|
2013-08-30 13:34:05 -07:00
|
|
|
// Sentry Turret
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.sentryHealth = GetSkillCvar("sk_sentry_health");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
// PLAYER WEAPONS
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Crowbar whack
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgCrowbar = GetSkillCvar("sk_plr_crowbar");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Glock Round
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmg9MM = GetSkillCvar("sk_plr_9mm_bullet");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// 357 Round
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmg357 = GetSkillCvar("sk_plr_357_bullet");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// MP5 Round
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgMP5 = GetSkillCvar("sk_plr_9mmAR_bullet");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// M203 grenade
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgM203Grenade = GetSkillCvar("sk_plr_9mmAR_grenade");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Shotgun buckshot
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgBuckshot = GetSkillCvar("sk_plr_buckshot");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Crossbow
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgCrossbowClient = GetSkillCvar("sk_plr_xbow_bolt_client");
|
|
|
|
gSkillData.plrDmgCrossbowMonster = GetSkillCvar("sk_plr_xbow_bolt_monster");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// RPG
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgRPG = GetSkillCvar("sk_plr_rpg");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Gauss gun
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgGauss = GetSkillCvar("sk_plr_gauss");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Egon Gun
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgEgonNarrow = GetSkillCvar("sk_plr_egon_narrow");
|
|
|
|
gSkillData.plrDmgEgonWide = GetSkillCvar("sk_plr_egon_wide");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Hand Grendade
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgHandGrenade = GetSkillCvar("sk_plr_hand_grenade");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Satchel Charge
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgSatchel = GetSkillCvar("sk_plr_satchel");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// Tripmine
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrDmgTripmine = GetSkillCvar("sk_plr_tripmine");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// MONSTER WEAPONS
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.monDmg12MM = GetSkillCvar("sk_12mm_bullet");
|
|
|
|
gSkillData.monDmgMP5 = GetSkillCvar("sk_9mmAR_bullet");
|
|
|
|
gSkillData.monDmg9MM = GetSkillCvar("sk_9mm_bullet");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// MONSTER HORNET
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.monDmgHornet = GetSkillCvar("sk_hornet_dmg");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// PLAYER HORNET
|
2021-04-15 16:15:45 +02:00
|
|
|
gSkillData.plrDmgHornet = GetSkillCvar("sk_plr_hornet_dmg");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
// HEALTH/CHARGE
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.suitchargerCapacity = GetSkillCvar("sk_suitcharger");
|
|
|
|
gSkillData.batteryCapacity = GetSkillCvar("sk_battery");
|
|
|
|
gSkillData.healthchargerCapacity = GetSkillCvar("sk_healthcharger");
|
|
|
|
gSkillData.healthkitCapacity = GetSkillCvar("sk_healthkit");
|
|
|
|
gSkillData.scientistHeal = GetSkillCvar("sk_scientist_heal");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// monster damage adj
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.monHead = GetSkillCvar("sk_monster_head");
|
|
|
|
gSkillData.monChest = GetSkillCvar("sk_monster_chest");
|
|
|
|
gSkillData.monStomach = GetSkillCvar("sk_monster_stomach");
|
|
|
|
gSkillData.monLeg = GetSkillCvar("sk_monster_leg");
|
|
|
|
gSkillData.monArm = GetSkillCvar("sk_monster_arm");
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
// player damage adj
|
2021-11-28 16:54:48 +01:00
|
|
|
gSkillData.plrHead = GetSkillCvar("sk_player_head");
|
|
|
|
gSkillData.plrChest = GetSkillCvar("sk_player_chest");
|
|
|
|
gSkillData.plrStomach = GetSkillCvar("sk_player_stomach");
|
|
|
|
gSkillData.plrLeg = GetSkillCvar("sk_player_leg");
|
|
|
|
gSkillData.plrArm = GetSkillCvar("sk_player_arm");
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// instantiate the proper game rules object
|
|
|
|
//=========================================================
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
CGameRules* InstallGameRules()
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
SERVER_COMMAND("exec game.cfg\n");
|
|
|
|
SERVER_EXECUTE();
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2024-08-28 15:33:25 +02:00
|
|
|
if (1 == sv_busters.value)
|
|
|
|
{
|
|
|
|
g_teamplay = false;
|
|
|
|
return new CMultiplayBusters;
|
|
|
|
}
|
|
|
|
else if (0 == gpGlobals->deathmatch)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
// generic half-life
|
2021-11-28 15:32:26 +01:00
|
|
|
g_teamplay = false;
|
2013-08-30 13:34:05 -07:00
|
|
|
return new CHalfLifeRules;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
if (teamplay.value > 0)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
// teamplay
|
|
|
|
|
2021-11-28 15:32:26 +01:00
|
|
|
g_teamplay = true;
|
2013-08-30 13:34:05 -07:00
|
|
|
return new CHalfLifeTeamplay;
|
|
|
|
}
|
|
|
|
if ((int)gpGlobals->deathmatch == 1)
|
|
|
|
{
|
|
|
|
// vanilla deathmatch
|
2021-11-28 15:32:26 +01:00
|
|
|
g_teamplay = false;
|
2013-08-30 13:34:05 -07:00
|
|
|
return new CHalfLifeMultiplay;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// vanilla deathmatch??
|
2021-11-28 15:32:26 +01:00
|
|
|
g_teamplay = false;
|
2013-08-30 13:34:05 -07:00
|
|
|
return new CHalfLifeMultiplay;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|