2020-08-31 00:15:53 +02:00
|
|
|
/***
|
|
|
|
*
|
|
|
|
* Copyright (c) 1996-2002, 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.
|
|
|
|
*
|
|
|
|
****/
|
|
|
|
//
|
|
|
|
// teamplay_gamerules.cpp
|
|
|
|
//
|
|
|
|
#include "extdll.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "cbase.h"
|
|
|
|
#include "player.h"
|
|
|
|
#include "weapons.h"
|
|
|
|
#include "gamerules.h"
|
|
|
|
#include "skill.h"
|
|
|
|
#include "items.h"
|
|
|
|
|
|
|
|
extern DLL_GLOBAL CGameRules *g_pGameRules;
|
|
|
|
extern DLL_GLOBAL BOOL g_fGameOver;
|
|
|
|
extern int gmsgDeathMsg; // client dll messages
|
|
|
|
extern int gmsgScoreInfo;
|
|
|
|
extern int gmsgMOTD;
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
CHalfLifeRules::CHalfLifeRules( void )
|
|
|
|
{
|
|
|
|
RefreshSkillData();
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules::Think ( void )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::IsMultiplayer( void )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::IsDeathmatch ( void )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::IsCoOp( void )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
if ( !pPlayer->m_pActiveItem )
|
|
|
|
{
|
|
|
|
// player doesn't have an active item!
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !pPlayer->m_pActiveItem->CanHolster() )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
2020-08-31 18:50:41 +02:00
|
|
|
//=========================================================
|
2020-08-31 18:55:47 +02:00
|
|
|
// buz: скопировано из MultiplayerRules
|
2020-08-31 00:15:53 +02:00
|
|
|
BOOL CHalfLifeRules :: GetNextBestWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon )
|
|
|
|
{
|
2020-08-31 18:50:41 +02:00
|
|
|
CBasePlayerItem *pCheck;
|
|
|
|
CBasePlayerItem *pBest;// this will be used in the event that we don't find a weapon in the same category.
|
|
|
|
int iBestWeight;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
iBestWeight = -1;// no weapon lower than -1 can be autoswitched to
|
|
|
|
pBest = NULL;
|
|
|
|
|
|
|
|
if ( !pCurrentWeapon->CanHolster() )
|
|
|
|
{
|
|
|
|
// can't put this gun away right now, so can't switch.
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( i = 0 ; i < MAX_ITEM_TYPES ; i++ )
|
|
|
|
{
|
|
|
|
pCheck = pPlayer->m_rgpPlayerItems[ i ];
|
|
|
|
|
|
|
|
while ( pCheck )
|
|
|
|
{
|
|
|
|
if ( pCheck->iWeight() > -1 && pCheck->iWeight() == pCurrentWeapon->iWeight() && pCheck != pCurrentWeapon )
|
|
|
|
{
|
|
|
|
// this weapon is from the same category.
|
|
|
|
if ( pCheck->CanDeploy() )
|
|
|
|
{
|
|
|
|
if ( pPlayer->SwitchWeapon( pCheck ) )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( pCheck->iWeight() > iBestWeight && pCheck != pCurrentWeapon )// don't reselect the weapon we're trying to get rid of
|
|
|
|
{
|
|
|
|
//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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pCheck = pCheck->m_pNext;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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 null, we didn't find ANYTHING. Shouldn't be possible- should always
|
|
|
|
// at least get the crowbar, but ya never know.
|
|
|
|
if ( !pBest )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
pPlayer->SwitchWeapon( pBest );
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
2020-08-31 00:15:53 +02:00
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules :: ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CHalfLifeRules :: InitHUD( CBasePlayer *pl )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules :: ClientDisconnected( edict_t *pClient )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules::FlPlayerFallDamage( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
// subtract off the speed at which a player is allowed to fall without being hurt,
|
|
|
|
// so damage will be based on speed beyond that, not the entire fall
|
|
|
|
pPlayer->m_flFallVelocity -= PLAYER_MAX_SAFE_FALL_SPEED;
|
|
|
|
return pPlayer->m_flFallVelocity * DAMAGE_FOR_FALL_SPEED;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules :: PlayerSpawn( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
CBaseEntity *pWeaponEntity = NULL;
|
|
|
|
|
|
|
|
// LRC what's wrong with allowing "game_player_equip" entities in single player? (The
|
|
|
|
// level designer is God: if he wants the player to start with a weapon, we should allow it!)
|
2020-09-01 18:30:02 +02:00
|
|
|
while (( pWeaponEntity = UTIL_FindEntityByClassname( pWeaponEntity, "game_player_equip" )))
|
2020-08-31 00:15:53 +02:00
|
|
|
{
|
|
|
|
pWeaponEntity->Touch( pPlayer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules :: AllowAutoTargetCrosshair( void )
|
|
|
|
{
|
|
|
|
return ( g_iSkillLevel == SKILL_EASY );
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules :: PlayerThink( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules :: FPlayerCanRespawn( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules :: FlPlayerSpawnTime( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
return gpGlobals->time;//now!
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// IPointsForKill - how many points awarded to anyone
|
|
|
|
// that kills this player?
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules :: IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled )
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// PlayerKilled - someone/something killed this player
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules :: PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// Deathnotice
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// PlayerGotWeapon - player has grabbed a weapon that was
|
|
|
|
// sitting in the world
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules :: PlayerGotWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// FlWeaponRespawnTime - what is the time in the future
|
|
|
|
// at which this weapon may spawn?
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules :: FlWeaponRespawnTime( CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// FlWeaponRespawnTime - Returns 0 if the weapon can respawn
|
|
|
|
// now, otherwise it returns the time at which it can try
|
|
|
|
// to spawn again.
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules :: FlWeaponTryRespawn( CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// VecWeaponRespawnSpot - where should this weapon spawn?
|
|
|
|
// Some game variations may choose to randomize spawn locations
|
|
|
|
//=========================================================
|
|
|
|
Vector CHalfLifeRules :: VecWeaponRespawnSpot( CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
return pWeapon->pev->origin;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// WeaponShouldRespawn - any conditions inhibiting the
|
|
|
|
// respawning of this weapon?
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules :: WeaponShouldRespawn( CBasePlayerItem *pWeapon )
|
|
|
|
{
|
|
|
|
return GR_WEAPON_RESPAWN_NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::CanHaveItem( CBasePlayer *pPlayer, CItem *pItem )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules::PlayerGotItem( CBasePlayer *pPlayer, CItem *pItem )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules::ItemShouldRespawn( CItem *pItem )
|
|
|
|
{
|
|
|
|
return GR_ITEM_RESPAWN_NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// At what time in the future may this Item respawn?
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules::FlItemRespawnTime( CItem *pItem )
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
// Where should this item respawn?
|
|
|
|
// Some game variations may choose to randomize spawn locations
|
|
|
|
//=========================================================
|
|
|
|
Vector CHalfLifeRules::VecItemRespawnSpot( CItem *pItem )
|
|
|
|
{
|
|
|
|
return pItem->pev->origin;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules::IsAllowedToSpawn( CBaseEntity *pEntity )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
void CHalfLifeRules::PlayerGotAmmo( CBasePlayer *pPlayer, char *szName, int iCount )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules::AmmoShouldRespawn( CBasePlayerAmmo *pAmmo )
|
|
|
|
{
|
|
|
|
return GR_AMMO_RESPAWN_NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules::FlAmmoRespawnTime( CBasePlayerAmmo *pAmmo )
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
Vector CHalfLifeRules::VecAmmoRespawnSpot( CBasePlayerAmmo *pAmmo )
|
|
|
|
{
|
|
|
|
return pAmmo->pev->origin;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
float CHalfLifeRules::FlHealthChargerRechargeTime( void )
|
|
|
|
{
|
|
|
|
return 0;// don't recharge
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules::DeadPlayerWeapons( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
return GR_PLR_DROP_GUN_NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules::DeadPlayerAmmo( CBasePlayer *pPlayer )
|
|
|
|
{
|
|
|
|
return GR_PLR_DROP_AMMO_NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
int CHalfLifeRules::PlayerRelationship( CBaseEntity *pPlayer, CBaseEntity *pTarget )
|
|
|
|
{
|
|
|
|
// why would a single player in half life need this?
|
|
|
|
return GR_NOTTEAMMATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
BOOL CHalfLifeRules :: FAllowMonsters( void )
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|