130 lines
3.3 KiB
Ucode
130 lines
3.3 KiB
Ucode
//=============================================================================
|
|
// PressureZone.
|
|
//=============================================================================
|
|
class PressureVolume extends PhysicsVolume;
|
|
|
|
var() float KillTime; // How long to kill the player?
|
|
var() float StartFlashScale; // Fog values for client death sequence
|
|
var() Vector StartFlashFog;
|
|
var() float EndFlashScale;
|
|
var() Vector EndFlashFog;
|
|
var float DieFOV; // Field of view when dead (interpolates)
|
|
var float DieDrawScale; // Drawscale when dead
|
|
var float TimePassed;
|
|
var bool bTriggered; // Ensure that it doesn't update until it should
|
|
var bool bScreamed;
|
|
|
|
function Trigger( actor Other, pawn EventInstigator )
|
|
{
|
|
local Controller P;
|
|
|
|
// The pressure zone has been triggered to kill something
|
|
|
|
Instigator = EventInstigator;
|
|
|
|
if ( (Instigator.Controller != None) && Instigator.Controller.IsA('Bot') )
|
|
{
|
|
// taunt the victim
|
|
for ( P=Level.ControllerList; P!=None; P=P.NextController )
|
|
if( (P.Pawn != None) && (P.Pawn.PhysicsVolume == self) && (P.Pawn.Health > 0) )
|
|
{
|
|
Instigator.Controller.Target = P.Pawn;
|
|
Instigator.Controller.GotoState('VictoryDance');
|
|
}
|
|
}
|
|
|
|
// Engage Tick so that death may be slow and dramatic
|
|
TimePassed = 0;
|
|
bTriggered = true;
|
|
bScreamed = false;
|
|
Disable('Trigger');
|
|
Enable('Tick');
|
|
}
|
|
|
|
function Tick( float DeltaTime )
|
|
{
|
|
local float ratio, curScale;
|
|
local vector curFog;
|
|
local PlayerController PC;
|
|
local Controller P, Killer;
|
|
local bool bActive;
|
|
|
|
if( !bTriggered )
|
|
{
|
|
Disable('Tick');
|
|
return;
|
|
}
|
|
|
|
TimePassed += DeltaTime;
|
|
ratio = TimePassed/KillTime;
|
|
if( ratio > 1.0 ) ratio = 1.0;
|
|
|
|
for ( P=Level.ControllerList; P!=None; P=P.NextController )
|
|
{
|
|
// Ensure player hasn't been dispatched through other means already (suicide?)
|
|
if( (P.Pawn.PhysicsVolume == self) && (P.Pawn.Health > 0) && !P.Pawn.IsA('Spectator') )
|
|
{
|
|
bActive = true;
|
|
P.Pawn.SetDrawScale(1 + (DieDrawScale-1) * ratio);
|
|
|
|
// Maybe scream?
|
|
if( !bScreamed && P.bIsPlayer && (Ratio > 0.2) && (FRand() < 2 * DeltaTime) )
|
|
{
|
|
// Scream now (from the terrible pain)
|
|
bScreamed = true;
|
|
P.Pawn.PlayDyingSound();
|
|
}
|
|
|
|
// Fog & Field of view
|
|
PC = PlayerController(P);
|
|
if( PC != None )
|
|
{
|
|
curScale = (EndFlashScale-StartFlashScale)*ratio + StartFlashScale;
|
|
curFog = (EndFlashFog -StartFlashFog )*ratio + StartFlashFog;
|
|
PC.ClientFlash( curScale, 1000 * curFog );
|
|
|
|
PC.SetFOVAngle( (DieFOV-PC.default.FOVAngle)*ratio + PC.default.FOVAngle);
|
|
}
|
|
if ( ratio == 1.0 )
|
|
{
|
|
if ( Instigator != None )
|
|
Killer = Instigator.Controller;
|
|
P.Pawn.Died(Killer, class'Depressurized', P.Pawn.Location);
|
|
MakeNormal(P.Pawn);
|
|
}
|
|
}
|
|
}
|
|
|
|
if( !bActive && (TimePassed >= KillTime) )
|
|
{
|
|
Disable('Tick');
|
|
Enable('Trigger');
|
|
bTriggered = false;
|
|
}
|
|
}
|
|
|
|
function MakeNormal(Pawn P)
|
|
{
|
|
local PlayerController PC;
|
|
|
|
P.SetDrawScale(P.Default.DrawScale);
|
|
PC = PlayerController(P.Controller);
|
|
if( PC != None )
|
|
PC.SetFOVAngle( PC.Default.FOVAngle );
|
|
}
|
|
|
|
// When an actor leaves this zone.
|
|
event PawnLeavingVolume(Pawn Other)
|
|
{
|
|
MakeNormal(Other);
|
|
Super.PawnLeavingVolume(Other);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
bTriggered=false
|
|
DamageType=class'Depressurized'
|
|
DieFOV=150
|
|
}
|
|
|