221 lines
6.4 KiB
Ucode
221 lines
6.4 KiB
Ucode
// The Nice, nasty barf we'll be using for the Bloat's ranged attack.
|
|
class NiceSickVomit extends BioGlob;
|
|
simulated function PostBeginPlay()
|
|
{
|
|
SetOwner(none);
|
|
if (Role == ROLE_Authority)
|
|
{
|
|
Velocity = Vector(Rotation) * Speed;
|
|
Velocity.Z += TossZ;
|
|
}
|
|
if (Role == ROLE_Authority)
|
|
Rand3 = Rand(3);
|
|
if ( (Level.NetMode != NM_DedicatedServer) && ((Level.DetailMode == DM_Low) || Level.bDropDetail) )
|
|
{
|
|
bDynamicLight = false;
|
|
LightType = LT_none;
|
|
}
|
|
// Difficulty Scaling
|
|
if (Level.Game != none)
|
|
{
|
|
BaseDamage = Max((DifficultyDamageModifer() * BaseDamage),1);
|
|
Damage = Max((DifficultyDamageModifer() * Damage),1);
|
|
}
|
|
}
|
|
// Scales the damage this Zed deals by the difficulty level
|
|
function float DifficultyDamageModifer()
|
|
{
|
|
local float AdjustedDamageModifier;
|
|
if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal
|
|
damage = default.damage * 2.5;
|
|
else
|
|
damage = default.damage * 1.5;
|
|
return AdjustedDamageModifier;
|
|
}
|
|
state OnGround
|
|
{
|
|
simulated function BeginState()
|
|
{
|
|
SetTimer(RestTime, false);
|
|
BlowUp(Location);
|
|
}
|
|
simulated function Timer()
|
|
{
|
|
if (bDrip)
|
|
{
|
|
bDrip = false;
|
|
SetCollisionSize(default.CollisionHeight, default.CollisionRadius);
|
|
Velocity = PhysicsVolume.Gravity * 0.2;
|
|
SetPhysics(PHYS_Falling);
|
|
bCollideWorld = true;
|
|
bCheckedsurface = false;
|
|
bProjTarget = false;
|
|
GotoState('Flying');
|
|
}
|
|
else BlowUp(Location);
|
|
}
|
|
simulated function ProcessTouch(Actor Other, Vector HitLocation)
|
|
{
|
|
if ( Other != none )
|
|
BlowUp(Location);
|
|
}
|
|
function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
|
|
{
|
|
if (DamageType.default.bDetonatesGoop)
|
|
{
|
|
bDrip = false;
|
|
SetTimer(0.1, false);
|
|
}
|
|
}
|
|
simulated function AnimEnd(int Channel)
|
|
{
|
|
local float DotProduct;
|
|
|
|
if (!bCheckedSurface)
|
|
{
|
|
DotProduct = SurfaceNormal dot Vect(0,0,-1);
|
|
if (DotProduct > 0.7)
|
|
{
|
|
bDrip = true;
|
|
SetTimer(DripTime, false);
|
|
if (bOnMover)
|
|
BlowUp(Location);
|
|
}
|
|
else if (DotProduct > -0.5)
|
|
{
|
|
if (bOnMover)
|
|
BlowUp(Location);
|
|
}
|
|
bCheckedSurface = true;
|
|
}
|
|
}
|
|
simulated function MergeWithGlob(int AdditionalGoopLevel)
|
|
{
|
|
local int NewGoopLevel, ExtraSplash;
|
|
NewGoopLevel = AdditionalGoopLevel + GoopLevel;
|
|
if (NewGoopLevel > MaxGoopLevel)
|
|
{
|
|
Rand3 = (Rand3 + 1) % 3;
|
|
ExtraSplash = Rand3;
|
|
if (Role == ROLE_Authority)
|
|
SplashGlobs(NewGoopLevel - MaxGoopLevel + ExtraSplash);
|
|
NewGoopLevel = MaxGoopLevel - ExtraSplash;
|
|
}
|
|
SetGoopLevel(NewGoopLevel);
|
|
SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0);
|
|
PlaySound(ImpactSound, SLOT_Misc);
|
|
bCheckedSurface = false;
|
|
SetTimer(RestTime, false);
|
|
}
|
|
}
|
|
singular function SplashGlobs(int NumGloblings)
|
|
{
|
|
local int g;
|
|
local NiceSickVomit NewGlob;
|
|
local Vector VNorm;
|
|
for (g=0; g<NumGloblings; g++)
|
|
{
|
|
NewGlob = Spawn(Class, self,, Location+GoopVolume*(CollisionHeight+4.0)*SurfaceNormal);
|
|
if (NewGlob != none)
|
|
{
|
|
NewGlob.Velocity = (GloblingSpeed + FRand()*150.0) * (SurfaceNormal + VRand()*0.8);
|
|
if (Physics == PHYS_Falling)
|
|
{
|
|
VNorm = (Velocity dot SurfaceNormal) * SurfaceNormal;
|
|
NewGlob.Velocity += (-VNorm + (Velocity - VNorm)) * 0.1;
|
|
}
|
|
NewGlob.InstigatorController = InstigatorController;
|
|
}
|
|
//else log("unable to spawn globling");
|
|
}
|
|
}
|
|
simulated function Destroyed()
|
|
{
|
|
if ( !bNoFX && EffectIsRelevant(Location,false) )
|
|
{
|
|
//Spawn(class'xEffects.GoopSmoke');
|
|
Spawn(class'KFmod.VomGroundSplash');
|
|
}
|
|
if ( Fear != none )
|
|
Fear.Destroy();
|
|
if (Trail != none)
|
|
Trail.Destroy();
|
|
//Super.Destroyed();
|
|
}
|
|
|
|
auto state Flying
|
|
{
|
|
simulated function Landed( Vector HitNormal )
|
|
{
|
|
local Rotator NewRot;
|
|
local int CoreGoopLevel;
|
|
|
|
if ( Level.NetMode != NM_DedicatedServer )
|
|
{
|
|
PlaySound(ImpactSound, SLOT_Misc);
|
|
// explosion effects
|
|
}
|
|
|
|
SurfaceNormal = HitNormal;
|
|
|
|
// spawn globlings
|
|
CoreGoopLevel = Rand3 + MaxGoopLevel - 3;
|
|
if (GoopLevel > CoreGoopLevel)
|
|
{
|
|
if (Role == ROLE_Authority)
|
|
SplashGlobs(GoopLevel - CoreGoopLevel);
|
|
SetGoopLevel(CoreGoopLevel);
|
|
}
|
|
spawn(class'KFMod.VomitDecal',,,, rotator(-HitNormal));
|
|
|
|
bCollideWorld = false;
|
|
SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0);
|
|
bProjTarget = true;
|
|
|
|
NewRot = Rotator(HitNormal);
|
|
NewRot.Roll += 32768;
|
|
SetRotation(NewRot);
|
|
SetPhysics(PHYS_none);
|
|
bCheckedsurface = false;
|
|
Fear = Spawn(class'AvoidMarker');
|
|
GotoState('OnGround');
|
|
}
|
|
simulated function HitWall( Vector HitNormal, Actor Wall )
|
|
{
|
|
Landed(HitNormal);
|
|
if ( !Wall.bStatic && !Wall.bWorldGeometry )
|
|
{
|
|
bOnMover = true;
|
|
SetBase(Wall);
|
|
if (Base == none)
|
|
BlowUp(Location);
|
|
}
|
|
}
|
|
simulated function ProcessTouch(Actor Other, Vector HitLocation)
|
|
{
|
|
if( ExtendedZCollision(Other)!=none )
|
|
Return;
|
|
if (Other != Instigator && (Other.IsA('Pawn') || Other.IsA('DestroyableObjective') || Other.bProjTarget))
|
|
HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
|
|
else if ( Other != Instigator && Other.bBlockActors )
|
|
HitWall( Normal(HitLocation-Location), Other );
|
|
}
|
|
}
|
|
defaultproperties
|
|
{
|
|
BaseDamage=4
|
|
TouchDetonationDelay=0.000000
|
|
Speed=600.000000
|
|
Damage=5.000000
|
|
MomentumTransfer=3500.000000
|
|
MyDamageType=Class'KFMod.DamTypeVomit'
|
|
ImpactSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_AcidSplash'
|
|
DrawType=DT_StaticMesh
|
|
StaticMesh=StaticMesh'kf_gore_trip_sm.puke.puke_chunk'
|
|
bDynamicLight=False
|
|
LifeSpan=8.000000
|
|
Skins(0)=Combiner'kf_fx_trip_t.Gore.intestines_cmb'
|
|
bUseCollisionStaticMesh=False
|
|
bBlockHitPointTraces=False
|
|
}
|