Code:
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SOLG extends IonCannon
placeable;
#exec OBJ LOAD FILE=OutdoorAmbience.uax
#EXEC OBJ LOAD FILE=WeaponSounds.uax
var() class<SOLGEffect> SOLGEffectClass;
function PostBeginPlay()
{
local SOLG S;
Super.PostBeginPlay();
if ( bDeleteMe )
return;
ForEach DynamicActors(Class'SOLG',S)
{
if ( S != self )
S.Destroy();
}
}
auto state Ready
{
function bool SOLGCheckMark(Pawn Aimer, Vector TestMark, bool bFire)
{
local Actor Other;
local Vector HitLocation, HitNormal,Top;
if (IsFiring())
return false;
Top = TestMark;
Top.Z = Location.Z;
Other = Trace(HitLocation, HitNormal, Top, TestMark, false);
if ( Other != None )
return false;
if (bFire)
{
Instigator = Aimer;
MarkLocation = TestMark;
GotoState('FireSequence');
}
return true;
}
}
function bool SOLGCheckMark(Pawn Aimer, Vector TestMark, bool bFire)
{
return false;
}
function RemoveFear()
{
if ( Fear != None )
Fear.Destroy();
}
state FireSequence
{
function RemoveFear();
function bool IsFiring()
{
return true;
}
function BeginState()
{
BeamDirection = vect(0,0,-1);
DamageLocation = MarkLocation - BeamDirection * 200.0;
}
function SpawnEffect()
{
local SOLGEffect SOLGBeamEffect;
local Actor Other;
local Vector HitLocation, HitNormal, Top, CP;
Other = Trace(HitLocation, HitNormal, MarkLocation + vect(0,0,10000), MarkLocation, false);
Top = MarkLocation;
Top.Z = FMax(HitLocation.Z,Location.Z);
SOLGBeamEffect = Spawn(SOLGEffectClass,,, Top);
if (SOLGBeamEffect != None)
SOLGBeamEffect.AimAt(MarkLocation, Vect(0,0,1));
if ( Instigator != None )
CP = Normal(vect(0,0,1) Cross (Location - Instigator.Location));
else
CP = vect(1,0,0);
CP *= 0.5 * (Location.Z - MarkLocation.Z);
Other = Trace(HitLocation, HitNormal, Top + CP, MarkLocation, false);
if ( Other == None )
{
SOLGBeamEffect = Spawn(SOLGEffectClass,,, Top + CP);
if (SOLGBeamEffect != None)
SOLGBeamEffect.AimAt(MarkLocation, Vect(0,0,1));
}
Other = Trace(HitLocation, HitNormal, Top - CP, MarkLocation, false);
if ( Other == None )
{
SOLGBeamEffect = Spawn(SOLGEffectClass,,, Top - CP);
if (SOLGBeamEffect != None)
SOLGBeamEffect.AimAt(MarkLocation, Vect(0,0,1));
}
}
function ShakeView()
{
local Controller C;
local PlayerController PC;
local float Dist, Scale;
for ( C=Level.ControllerList; C!=None; C=C.NextController )
{
PC = PlayerController(C);
if ( PC != None && PC.ViewTarget != None && PC.ViewTarget.Base != None )
{
Dist = VSize(DamageLocation - PC.ViewTarget.Location);
if ( Dist < DamageRadius * 2.0)
{
if (Dist < DamageRadius)
Scale = 1.0;
else
Scale = (DamageRadius*2.0 - Dist) / (DamageRadius);
C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime);
}
}
}
}
function PlayGlobalSound(sound S)
{
local PlayerController P;
ForEach DynamicActors(class'PlayerController', P)
P.ClientPlaySound(S);
}
function EndState()
{
if ( (Instigator != None) && (SOLGPainter(Instigator.Weapon) != None) )
Instigator.Weapon.CheckOutOfAmmo();
if ( Fear != None )
Fear.Destroy();
}
Begin:
if ( Fear == None )
Fear = Spawn(class'AvoidMarker',,,MarkLocation);
Fear.SetCollisionSize(DamageRadius,200);
if ( (Instigator != None) && (Instigator.PlayerReplicationInfo != None) && (Instigator.PlayerReplicationInfo.Team != None) )
Fear.TeamNum = Instigator.PlayerReplicationInfo.Team.TeamIndex;
Fear.StartleBots();
Sleep(0.5);
SpawnEffect();
PlayGlobalSound(FireSound);
Sleep(0.5);
ShakeView();
HurtRadius(Damage, DamageRadius*0.125, DamageType, MomentumTransfer, DamageLocation);
Sleep(0.5);
PlayGlobalSound(Sound'OutdoorAmbience.BThunder.BThunder5');
HurtRadius(Damage, DamageRadius*0.300, DamageType, MomentumTransfer, DamageLocation);
Sleep(0.2);
HurtRadius(Damage, DamageRadius*0.475, DamageType, MomentumTransfer, DamageLocation);
PlayGlobalSound(sound'OutdoorAmbience.lightning4');
Sleep(0.2);
HurtRadius(Damage, DamageRadius*0.650, DamageType, MomentumTransfer, DamageLocation);
Sleep(0.2);
HurtRadius(Damage, DamageRadius*0.825, DamageType, MomentumTransfer, DamageLocation);
Sleep(0.2);
HurtRadius(Damage, DamageRadius*1.000, DamageType, MomentumTransfer, DamageLocation);
GotoState('Ready');
}
DefaultProperties
{
SOLGEffectClass=class'SOLGEffect'
FireSound=Sound'WeaponSounds.TAGRifle.IonCannonBlast'
ShakeRotMag=(Z=250.000000)
ShakeRotRate=(Z=25000.000000)
ShakeRotTime=60.000000
ShakeOffsetMag=(Z=100.000000)
ShakeOffsetRate=(Z=20000.000000)
ShakeOffsetTime=60.000000
Damage=1500
DamageType=Class'SOLGPainter.DamTypeSOLG'
MomentumTransfer=300000.000000
DamageRadius=4000.000000
}
Bookmarks