/*** * * 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" #include "threewave_gamerules.h" extern Vector g_vecTeleMins[MAX_TELES]; extern Vector g_vecTeleMaxs[MAX_TELES]; extern int g_iTeleNum; extern bool g_bIsThreeWave; extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer, bool bCheckDM ); 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, TRUE ); 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; } void CGameRules::ClientUserInfoChanged( CBasePlayer *pPlayer, char *infobuffer ) { pPlayer->SetPrefsFromUserinfo( infobuffer ); } //========================================================= // 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( g_bIsThreeWave ) { return new CThreeWave; } 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; } } }