208 lines
5.6 KiB
Ucode
208 lines
5.6 KiB
Ucode
class stub_Pipe extends PipeBombProjectile;
|
|
|
|
|
|
var sound BoomSound;
|
|
|
|
|
|
static function PreloadAssets()
|
|
{
|
|
UpdateDefaultStaticMesh(StaticMesh(DynamicLoadObject(default.StaticMeshRef, class'StaticMesh', true)));
|
|
}
|
|
|
|
|
|
static function bool UnloadAssets()
|
|
{
|
|
UpdateDefaultStaticMesh(none);
|
|
return true;
|
|
}
|
|
|
|
|
|
// fix insane damage while being triggered with m1 spam
|
|
function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
|
|
{
|
|
// added bTriggered check and moved damage check for siren scream
|
|
if ( bTriggered || Damage < 5 || damageType == class'DamTypePipeBomb' ||
|
|
ClassIsChildOf(damageType, class'DamTypeMelee') ||
|
|
(Damage < 25 && damageType.IsA('SirenScreamDamage')) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Don't let our own explosives blow this up!!!
|
|
if ( InstigatedBy == none || InstigatedBy != none &&
|
|
InstigatedBy.PlayerReplicationInfo != none &&
|
|
InstigatedBy.PlayerReplicationInfo.Team != none &&
|
|
InstigatedBy.PlayerReplicationInfo.Team.TeamIndex == PlacedTeam &&
|
|
Class<KFWeaponDamageType>(damageType) != none &&
|
|
(Class<KFWeaponDamageType>(damageType).default.bIsExplosive ||
|
|
InstigatedBy != Instigator) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( damageType == class'SirenScreamDamage')
|
|
{
|
|
Disintegrate(HitLocation, vect(0,0,1));
|
|
}
|
|
else
|
|
{
|
|
Explode(HitLocation, vect(0,0,1));
|
|
}
|
|
}
|
|
|
|
|
|
// NPC, dead players trigger fix
|
|
function Timer()
|
|
{
|
|
local Pawn CheckPawn;
|
|
local float ThreatLevel;
|
|
// still not sure about creating new local vars
|
|
// but welp, it works fine
|
|
local vector DetectLocation;
|
|
|
|
// raise a detection poin half a meter up to prevent small objects on the ground bloking the trace
|
|
DetectLocation = Location;
|
|
DetectLocation.Z += 25;
|
|
|
|
if( !bHidden && !bTriggered )
|
|
{
|
|
if( ArmingCountDown >= 0 )
|
|
{
|
|
ArmingCountDown -= 0.1;
|
|
if( ArmingCountDown <= 0 )
|
|
{
|
|
SetTimer(1.0, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Check for enemies
|
|
if( !bEnemyDetected )
|
|
{
|
|
bAlwaysRelevant = false;
|
|
PlaySound(BeepSound,,0.5,,50.0);
|
|
|
|
foreach VisibleCollidingActors( class 'Pawn', CheckPawn, DetectionRadius, DetectLocation )
|
|
{
|
|
// don't trigger pipes on NPC -- PooSH
|
|
if( CheckPawn == Instigator || KF_StoryNPC(CheckPawn) != none && KFGameType(Level.Game).FriendlyFireScale > 0 &&
|
|
CheckPawn.PlayerReplicationInfo != none &&
|
|
CheckPawn.PlayerReplicationInfo.Team.TeamIndex == PlacedTeam )
|
|
{
|
|
// Make the thing beep if someone on our team is within the detection radius
|
|
// This gives them a chance to get out of the way
|
|
ThreatLevel += 0.001;
|
|
}
|
|
else
|
|
{
|
|
// don't trigger pipes by dead bodies -- PooSH
|
|
if( CheckPawn.Health > 0 && CheckPawn != Instigator && (CheckPawn.Role == ROLE_Authority) &&
|
|
((CheckPawn.PlayerReplicationInfo != none && CheckPawn.PlayerReplicationInfo.Team.TeamIndex != PlacedTeam) ||
|
|
CheckPawn.GetTeamNum() != PlacedTeam))
|
|
{
|
|
if( KFMonster(CheckPawn) != none )
|
|
{
|
|
ThreatLevel += KFMonster(CheckPawn).MotionDetectorThreat;
|
|
if( ThreatLevel >= ThreatThreshhold )
|
|
{
|
|
bEnemyDetected = true;
|
|
SetTimer(0.15, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bEnemyDetected = true;
|
|
SetTimer(0.15, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( ThreatLevel >= ThreatThreshhold )
|
|
{
|
|
bEnemyDetected = true;
|
|
SetTimer(0.15, true);
|
|
}
|
|
else if( ThreatLevel > 0 )
|
|
{
|
|
SetTimer(0.5, true);
|
|
}
|
|
else
|
|
{
|
|
SetTimer(1.0, true);
|
|
}
|
|
}
|
|
|
|
// Play some fast beeps and blow up
|
|
else
|
|
{
|
|
bAlwaysRelevant = true;
|
|
Countdown--;
|
|
|
|
if ( CountDown > 0 )
|
|
{
|
|
PlaySound(BeepSound, SLOT_Misc, 2.0,, 150.0);
|
|
}
|
|
else
|
|
{
|
|
Explode(DetectLocation, vector(Rotation));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Destroy();
|
|
}
|
|
}
|
|
|
|
|
|
// explode sounds none fix
|
|
simulated function Explode(vector HitLocation, vector HitNormal)
|
|
{
|
|
local PlayerController LocalPlayer;
|
|
local Projectile P;
|
|
local byte i;
|
|
|
|
bHasExploded = true;
|
|
BlowUp(HitLocation);
|
|
|
|
bTriggered = true;
|
|
|
|
if ( Role == ROLE_Authority )
|
|
{
|
|
SetTimer(0.1, false);
|
|
NetUpdateTime = Level.TimeSeconds - 1;
|
|
}
|
|
|
|
PlaySound(class'stub_Pipe'.default.BoomSound,,2.0);
|
|
|
|
// Shrapnel
|
|
for( i=Rand(6); i<10; i++ )
|
|
{
|
|
P = Spawn(ShrapnelClass,,,,RotRand(true));
|
|
if( P!=None )
|
|
P.RemoteRole = ROLE_None;
|
|
}
|
|
if ( EffectIsRelevant(Location,false) )
|
|
{
|
|
Spawn(Class'KFMod.KFNadeLExplosion',,, HitLocation, rotator(vect(0,0,1)));
|
|
Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
|
|
}
|
|
|
|
// Shake nearby players screens
|
|
LocalPlayer = Level.GetLocalPlayerController();
|
|
if ( (LocalPlayer != None) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5)) )
|
|
LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime);
|
|
|
|
if( Role < ROLE_Authority )
|
|
{
|
|
Destroy();
|
|
}
|
|
}
|
|
|
|
|
|
defaultproperties
|
|
{
|
|
BoomSound=SoundGroup'Inf_Weapons.antitankmine.antitankmine_explode01'
|
|
} |