From dd7f429335138d8fb9b4a6dd868d8f9499b7180d Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Wed, 9 Oct 2019 12:28:56 +0200 Subject: [PATCH] "Bullet Trail" effect implemented. Mainly for underwater bubbles, but also has the side effect of allowing hitscan weapons to activate shoot-through lines. SIGIL players rejoice. Shock Rifle and Pulsegun beams can also do this now. Depleted armors remove themselves from inventory. --- zscript/armoritems.zsc | 1 + zscript/enforcer.zsc | 1 + zscript/minigun.zsc | 1 + zscript/pulsegun.zsc | 5 +++++ zscript/shockrifle.zsc | 8 ++++++++ zscript/sniperrifle.zsc | 4 +++- zscript/utcommon.zsc | 43 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 62 insertions(+), 1 deletion(-) diff --git a/zscript/armoritems.zsc b/zscript/armoritems.zsc index 81aa962..d26b1a8 100644 --- a/zscript/armoritems.zsc +++ b/zscript/armoritems.zsc @@ -21,6 +21,7 @@ Class UTArmor : Armor newdamage -= saved; amount -= saved; damage = newdamage; + if ( (amount <= 0) ) DepleteOrDestroy(); } if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage); } diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index 389c4d9..ff5ff10 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -335,6 +335,7 @@ Class Enforcer : UTWeapon Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); FLineTraceData d; LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + UTBulletTrail.DoTrail(self,origin,dir,10000,int((invoker.Amount+alt)**2)); if ( d.HitType == TRACE_HitActor ) { int dmg = 17; diff --git a/zscript/minigun.zsc b/zscript/minigun.zsc index 83a9b80..ecb5073 100644 --- a/zscript/minigun.zsc +++ b/zscript/minigun.zsc @@ -109,6 +109,7 @@ Class Minigun : UTWeapon Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); FLineTraceData d; LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + UTBulletTrail.DoTrail(self,origin,dir,10000,alt?5:3); if ( d.HitType == TRACE_HitActor ) { int dmg = Random[Minigun](9,18); // fun fact: the Minigun is one of the few weapons that has actual RNG damage in UT diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 6ab5aae..59f7da0 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -226,6 +226,7 @@ Class PulseBoltLight : DynamicLight Class PulseBoltTracer : LineTracer { Actor ignore; + Array ShootThroughList; override ETraceStatus TraceCallback() { @@ -239,6 +240,7 @@ Class PulseBoltTracer : LineTracer { if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); return TRACE_Skip; } return TRACE_Stop; @@ -352,7 +354,10 @@ Class PulseBolt : Actor } void CheckBeam( Vector3 x ) { + t.ShootThroughList.Clear(); t.Trace(pos,cursector,x,beamsize,0); + for ( int i=0; i ShootThroughList; override ETraceStatus TraceCallback() { @@ -51,6 +52,7 @@ Class ShockBeamTracer : LineTracer { if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); return TRACE_Skip; } return TRACE_Stop; @@ -304,7 +306,10 @@ Class ShockBeam : Actor if ( !moving ) return; // step trace tracedir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + t.ShootThroughList.Clear(); t.Trace(pos,cursector,tracedir,1000,0); + for ( int i=0; i ShootThroughList; + Actor ignoreme; + + static play void DoTrail( Actor target, Vector3 pos, Vector3 dir, int dist, int bubblechance ) + { + let t = new("UTBulletTrail"); + t.ignoreme = target; + t.ShootThroughList.Clear(); + t.Trace(pos,level.PointInSector(pos.xy),dir,dist,0); + for ( int i=0; i