// 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, 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 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 }