You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
4.7 KiB
201 lines
4.7 KiB
/*** |
|
* |
|
* 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. |
|
* |
|
****/ |
|
//========================================================= |
|
// GameRules.cpp |
|
//========================================================= |
|
|
|
#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" |
|
|
|
extern Vector g_vecTeleMins[MAX_TELES]; |
|
extern Vector g_vecTeleMaxs[MAX_TELES]; |
|
extern int g_iTeleNum; |
|
|
|
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer ); |
|
|
|
DLL_GLOBAL CGameRules *g_pGameRules = NULL; |
|
extern DLL_GLOBAL BOOL g_fGameOver; |
|
extern int gmsgDeathMsg; // client dll messages |
|
extern int gmsgMOTD; |
|
|
|
int g_teamplay = 0; |
|
|
|
//========================================================= |
|
//========================================================= |
|
BOOL CGameRules::CanHaveAmmo( CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry ) |
|
{ |
|
int iAmmoIndex; |
|
|
|
if( pszAmmoName ) |
|
{ |
|
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 ) |
|
{ |
|
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer ); |
|
|
|
pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 ); |
|
pPlayer->pev->v_angle = g_vecZero; |
|
pPlayer->pev->velocity = g_vecZero; |
|
pPlayer->pev->angles = VARS( pentSpawnSpot )->angles; |
|
pPlayer->pev->punchangle = g_vecZero; |
|
pPlayer->pev->fixangle = TRUE; |
|
|
|
return pentSpawnSpot; |
|
} |
|
|
|
//========================================================= |
|
//========================================================= |
|
BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon ) |
|
{ |
|
// only living players can have items |
|
if( pPlayer->pev->deadflag != DEAD_NO ) |
|
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; |
|
} |
|
|
|
//========================================================= |
|
// load the SkillData struct with the proper values based on the skill level. |
|
//========================================================= |
|
void CGameRules::RefreshSkillData ( void ) |
|
{ |
|
int iSkill; |
|
|
|
iSkill = (int)CVAR_GET_FLOAT( "skill" ); |
|
g_iSkillLevel = iSkill; |
|
|
|
if( iSkill < 1 ) |
|
{ |
|
iSkill = 1; |
|
} |
|
else if( iSkill > 3 ) |
|
{ |
|
iSkill = 3; |
|
} |
|
|
|
gSkillData.iSkillLevel = iSkill; |
|
} |
|
|
|
//========================================================= |
|
// instantiate the proper game rules object |
|
//========================================================= |
|
|
|
CGameRules *InstallGameRules( void ) |
|
{ |
|
SERVER_COMMAND( "exec game.cfg\n" ); |
|
SERVER_EXECUTE(); |
|
|
|
//Clear all the teleporters |
|
for( int i = 0; i < MAX_TELES; i++ ) |
|
{ |
|
g_vecTeleMins[i].x = 0.0; |
|
g_vecTeleMins[i].y = 0.0; |
|
g_vecTeleMins[i].z = 0.0; |
|
|
|
g_vecTeleMaxs[i].x = 0.0; |
|
g_vecTeleMaxs[i].y = 0.0; |
|
g_vecTeleMaxs[i].z = 0.0; |
|
} |
|
|
|
g_iTeleNum = 0; |
|
|
|
if( !gpGlobals->deathmatch ) |
|
{ |
|
// generic half-life |
|
g_teamplay = 0; |
|
return new CHalfLifeRules; |
|
} |
|
else |
|
{ |
|
if( CVAR_GET_FLOAT( "mp_teamplay" ) >= LTS ) |
|
{ |
|
// lts |
|
return new CHalfLifeTeamplay; |
|
} |
|
else if( CVAR_GET_FLOAT( "mp_teamplay" ) == LMS ) |
|
{ |
|
// lms |
|
return new CHalfLifeMultiplay; |
|
} |
|
else if( CVAR_GET_FLOAT( "mp_teamplay" ) == ARENA ) |
|
{ |
|
// arena |
|
return new CHalfLifeMultiplay; |
|
} |
|
else if( teamplay.value > 0 ) |
|
{ |
|
// teamplay |
|
g_teamplay = 1; |
|
return new CHalfLifeTeamplay; |
|
} |
|
else if( (int)gpGlobals->deathmatch == 1 ) |
|
{ |
|
// vanilla deathmatch |
|
g_teamplay = 0; |
|
return new CHalfLifeMultiplay; |
|
} |
|
else |
|
{ |
|
// vanilla deathmatch?? |
|
g_teamplay = 0; |
|
return new CHalfLifeMultiplay; |
|
} |
|
} |
|
}
|
|
|