/* Copyright (c) 1999, Cold Ice Modification. This code has been written by SlimShady ( darcuri@optonline.net ) 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 and from the Cold Ice team. Please if you use this code in any public form, please give us credit. */ #include "extdll.h" #include "decals.h" #include "util.h" #include "cbase.h" #include "monsters.h" #include "weapons.h" #include "nodes.h" #include "player.h" #include "soundent.h" #include "shake.h" #include "gamerules.h" /*************************************************** Runes (runes.cpp) Adds Randomly spawned Runes to deathmatch. Each runes gives the player a different This code can be used freely in any mod, but give credit to where it came from. Phantasiere (nrich@iinet.net.au) http://www.iinet.net.au/~nrich/ ***************************************************/ class CBaseRune : public CBaseEntity { public: char *m_szModel; char *m_szClassName; int m_iNextRespawn; int m_iRuneFlag; int m_iShellRed; int m_iShellGreen; int m_iShellBlue; void Spawn( ); void Precache( ); void RuneTouch( CBaseEntity * ); void RuneThink( ); }; void CBaseRune::Spawn( ) { Precache( ); SET_MODEL( ENT(pev), m_szModel ); pev->movetype = MOVETYPE_TOSS; pev->solid = SOLID_TRIGGER; pev->rendermode = kRenderNormal; pev->renderamt = 255; UTIL_SetSize( pev, Vector(-5, -5, -5), Vector(5, 5, 5) ); UTIL_SetOrigin( pev, pev->origin ); pev->classname = MAKE_STRING( m_szClassName ); SetThink( &CBaseRune::RuneThink ); SetTouch( &CBaseRune::RuneTouch ); pev->velocity.z = RANDOM_LONG( 100,500 ); pev->velocity.x = RANDOM_LONG( 100,500 ); pev->rendermode = kRenderNormal; pev->scale = 2; pev->rendercolor.x = m_iShellRed; pev->rendercolor.y = m_iShellGreen; pev->rendercolor.z = m_iShellBlue; pev->renderamt = 255; pev->renderfx = kRenderFxGlowShell; pev->gravity = 0; pev->nextthink = gpGlobals->time + 10.0; } void CBaseRune::Precache( ) { PRECACHE_MODEL( "models/items/w_battery.mdl" ); PRECACHE_SOUND( "items/gunpickup2.wav" ); } void CBaseRune::RuneTouch( CBaseEntity *pOther) { if ( !pOther->IsPlayer() ) { return; } CBasePlayer *pPlayer = (CBasePlayer *)pOther; if( pPlayer->m_iPlayerRune == 0 ) { EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/gunpickup2.wav", 0.5, ATTN_NORM); pPlayer->m_iPlayerRune |= m_iRuneFlag; if ( m_iRuneFlag == RUNE_SPEED ) ShowMenu (pPlayer, 0x1, 5, 0, "Obtained Rune:\n\n -Speed-\nIncreases your speed X3" ); else if ( m_iRuneFlag == RUNE_RESIST ) ShowMenu (pPlayer, 0x1, 5, 0, "Obtained Rune:\n\n -Resist-\nResist attacks by % 25" ); else if ( m_iRuneFlag == RUNE_STRENGTH ) ShowMenu (pPlayer, 0x1, 5, 0, "Obtained Rune:\n\n -Strength-\n2x infliction damage" ); else if ( m_iRuneFlag == RUNE_HEALTH ) ShowMenu (pPlayer, 0x1, 5, 0, "Obtained Rune:\n\n -Regeneration-\nSlowly increases health and armor" ); else if ( m_iRuneFlag == RUNE_ROCKETARENA ) ShowMenu (pPlayer, 0x1, 5, 0, "Obtained Rune:\n\n -Rocket Arena Special-\nGained Special Abilities on the Rocket Launcher" ); SUB_Remove( ); return; } } void CBaseRune::RuneThink( ) { } //========================================================= //========================================================= class CSpeedRune : public CBaseRune { void Spawn( ); }; LINK_ENTITY_TO_CLASS( rune_speed, CSpeedRune ); void CSpeedRune::Spawn( ) { m_iRuneFlag = RUNE_SPEED; m_iShellRed = 255; m_iShellGreen = 0; m_iShellBlue = 0; m_szModel = "models/items/w_battery.mdl"; m_szClassName = "rune_speed"; CBaseRune::Spawn( ); } //========================================================= //========================================================= class CStrengthRune : public CBaseRune { void Spawn( ); }; LINK_ENTITY_TO_CLASS( rune_strength, CStrengthRune ); void CStrengthRune::Spawn( ) { m_iRuneFlag = RUNE_STRENGTH; m_iShellRed = 0; m_iShellGreen = 0; m_iShellBlue = 255; m_szModel = "models/items/w_battery.mdl"; m_szClassName = "rune_strength"; CBaseRune::Spawn( ); } //========================================================= //========================================================= class CResistRune : public CBaseRune { void Spawn( ); }; LINK_ENTITY_TO_CLASS( rune_resist, CResistRune ); void CResistRune::Spawn( ) { m_iRuneFlag = RUNE_RESIST; m_iShellRed = 0; m_iShellGreen = 255; m_iShellBlue = 0; m_szModel = "models/items/w_battery.mdl"; m_szClassName = "rune_resist"; CBaseRune::Spawn( ); } //========================================================= //========================================================= class CHealthRune : public CBaseRune { void Spawn( ); }; LINK_ENTITY_TO_CLASS( rune_health, CHealthRune ); void CHealthRune::Spawn( ) { m_iRuneFlag = RUNE_HEALTH; m_iShellRed = 255; m_iShellGreen = 0; m_iShellBlue = 150; m_szModel = "models/items/w_battery.mdl"; m_szClassName = "rune_health"; CBaseRune::Spawn( ); } //========================================================= //========================================================= class CRocketArenaRune : public CBaseRune { void Spawn( ); }; LINK_ENTITY_TO_CLASS( rune_rocketarena, CRocketArenaRune ); void CRocketArenaRune::Spawn( ) { m_iRuneFlag = RUNE_ROCKETARENA; m_iShellRed = 0; m_iShellGreen = 113; m_iShellBlue = 230; m_szModel = "models/items/w_battery.mdl"; m_szClassName = "rune_rocketarena"; CBaseRune::Spawn( ); } //========================================================= //========================================================= void CWorldRunes::Spawn( ) { m_pSpot = NULL; Precache( ); SetThink( &CWorldRunes::SpawnRunes ); pev->nextthink = gpGlobals->time + 5.0; } void CWorldRunes::Precache( ) { UTIL_PrecacheOther("rune_health"); UTIL_PrecacheOther("rune_speed"); UTIL_PrecacheOther("rune_strength"); UTIL_PrecacheOther("rune_resist"); UTIL_PrecacheOther("rune_rocketarena"); } CBaseEntity *CWorldRunes::SelectSpawnPoint(CBaseEntity *pSpot) { for ( int i = RANDOM_LONG(1,5); i > 0; i-- ) pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" ); return pSpot; } void CWorldRunes::CreateRune(char *sz_RuneClass) { m_pSpot = SelectSpawnPoint( m_pSpot ); if( m_pSpot == NULL ) { ALERT ( at_console, "Error Creating Runes\n" ); return; } CBaseEntity *CRune = CBaseEntity::Create(sz_RuneClass, m_pSpot->pev->origin, Vector(0, 0,0), NULL ); } void CWorldRunes::SpawnRunes( ) { int m_iNextRespawn = 0; if ( g_pGameRules->IsRocketArena() == 0 ) { if ( CVAR_GET_FLOAT( "mp_runes" ) > 0 ) { ALERT ( at_console, "Creating Runes\n" ); CreateRune("rune_speed"); CreateRune("rune_strength"); CreateRune("rune_resist"); CreateRune("rune_health"); } } else { if ( CVAR_GET_FLOAT( "mp_runes" ) > 0 ) { ALERT ( at_console, "Creating Runes\n" ); CreateRune("rune_health"); CreateRune("rune_rocketarena"); } } m_iNextRespawn++; SetThink( &CWorldRunes::SpawnRunes ); if ( m_iNextRespawn < 2 ) pev->nextthink = gpGlobals->time + 75.0; else if ( m_iNextRespawn == 2 ) { pev->nextthink = gpGlobals->time + 300.0; // 5 minute delay m_iNextRespawn = 0; } } CWorldRunes *CWorldRunes::Create( ) { CWorldRunes* WorldRunes = GetClassPtr( (CWorldRunes*)NULL ); WorldRunes->Spawn( ); return WorldRunes; }