sin-2015/reactiveshields.cpp
1999-04-22 00:00:00 +00:00

127 lines
2.8 KiB
C++

// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// DESCRIPTION:
// Reactive Shields
#include "inventoryitem.h"
Event EV_Item_ReactiveShields_PowerDown( "shields_powerdown" );
class EXPORT_FROM_DLL ReactiveShields : public InventoryItem
{
public:
CLASS_PROTOTYPE( ReactiveShields );
ReactiveShields();
void Use( Event *ev );
void PowerDown( Event *ev );
};
CLASS_DECLARATION( InventoryItem, ReactiveShields, "powerup_shield" )
ResponseDef ReactiveShields::Responses[] =
{
{ &EV_InventoryItem_Use, ( Response )ReactiveShields::Use },
{ &EV_Item_ReactiveShields_PowerDown,( Response )ReactiveShields::PowerDown },
{ NULL, NULL }
};
ReactiveShields::ReactiveShields
(
)
{
setModel( "shield.def" );
Set( 1 );
setRespawnTime( 180 + G_Random( 60 ) );
}
void ReactiveShields::Use
(
Event *ev
)
{
Event *event;
str realname;
if(!owner)
{
CancelPendingEvents();
PostEvent(EV_Remove, 0);
return;
}
if ( owner->PowerupActive() )
{
return;
}
// Make sure there is a reactive shield available
assert( amount );
amount--;
if (amount <= 0)
{
owner->RemoveItem( this );
}
owner->flags |= FL_SHIELDS;
PostEvent( EV_Item_ReactiveShields_PowerDown, 30 );
realname = GetRandomAlias( "snd_activate" );
if ( realname.length() )
owner->sound( realname, 1, CHAN_ITEM, ATTN_NORM );
owner->edict->s.renderfx |= RF_DLIGHT;
owner->edict->s.color_r = 0;
owner->edict->s.color_g = 0;
owner->edict->s.color_b = 1;
owner->edict->s.radius = 120;
//### remove the player's heat signature
owner->edict->s.effects &= ~EF_WARM;
//###
event = new Event( "poweruptimer" );
event->AddInteger( 30 );
event->AddInteger( P_SHIELDS );
owner->ProcessEvent ( event );
}
void ReactiveShields::PowerDown
(
Event *ev
)
{
if ( !owner )
{
CancelPendingEvents();
PostEvent( EV_Remove, 0 );
return;
}
if ( owner->flags & FL_SHIELDS )
{
str realname;
owner->flags &= ~FL_SHIELDS;
realname = GetRandomAlias( "snd_deactivate" );
if ( realname.length() )
owner->sound( realname, 1, CHAN_ITEM, ATTN_NORM );
owner->edict->s.renderfx &= ~RF_DLIGHT;
owner->edict->s.color_r = 0;
owner->edict->s.color_g = 0;
owner->edict->s.color_b = 0;
owner->edict->s.radius = 0;
//### replace owners heat signature if alive
if(!owner->deadflag)
owner->edict->s.effects |= EF_WARM;
//###
}
CancelPendingEvents();
PostEvent( EV_Remove, 0 );
}