diff --git a/zscript/biorifle.zsc b/zscript/biorifle.zsc index caff9cd..926ffd8 100644 --- a/zscript/biorifle.zsc +++ b/zscript/biorifle.zsc @@ -303,6 +303,7 @@ Class BioGel : Actor // align self to what surface was hit, currently does not support 3d floors + slopes properly virtual void AlignSelf() { + bHITOWNER = true; A_NoGravity(); A_Stop(); if ( bAMBUSH ) diff --git a/zscript/eightball.zsc b/zscript/eightball.zsc index 45a7753..ae23399 100644 --- a/zscript/eightball.zsc +++ b/zscript/eightball.zsc @@ -192,6 +192,7 @@ Class UTGrenade : UTRocket Default { DamageType 'GrenadeDeath'; + Damage 1; // needs to be nonzero for self-hit to work (might send a PR to fix this later) -NOGRAVITY; +USEBOUNCESTATE; -BOUNCEAUTOOFF; @@ -229,6 +230,7 @@ Class UTGrenade : UTRocket rollvel = FRandom[Eightball](-16,16); pitchvel = FRandom[Eightball](-16,16); anglevel = FRandom[Eightball](-16,16); + bHITOWNER = true; } Goto Spawn; Death: diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index 27fe626..82f41e2 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -209,6 +209,7 @@ Class FlakChunk : Actor } action void A_HandleBounce() { + bHITOWNER = true; A_SprayDecal("WallCrack",-8); int numpt = Random[Flak](2,3); if ( frame < 10 ) @@ -399,6 +400,7 @@ Class FlakSlug : Actor for ( int i=0; i<6; i++ ) { p = Spawn("FlakChunk",pos); + p.bHITOWNER = true; a = FRandom[Flak](0,360); s = FRandom[Flak](0,0.2); Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit(); diff --git a/zscript/ripper.zsc b/zscript/ripper.zsc index 28aaf4c..ade10bf 100644 --- a/zscript/ripper.zsc +++ b/zscript/ripper.zsc @@ -136,6 +136,7 @@ Class Razor2 : Actor Bounce: RAZB A 0 { + bHITOWNER = true; Vector3 dir = vel.unit(); A_SetAngle(atan2(dir.y,dir.x)); A_SetPitch(asin(-dir.z)); diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index dc68027..61f946e 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -933,7 +933,7 @@ Class UTMainHandler : StaticEventHandler while ( bi.Next() ) { Actor a = bi.Thing; - if ( !a || !a.bSHOOTABLE || !Source.CheckSight(a,0xf) || (a == Source) ) + if ( !a || !a.bSHOOTABLE || !Source.CheckSight(a,0xf) || (a == Source) || (Source.Distance3D(a) > ExplosionRadius) ) continue; Vector3 midpoint = a.Vec3Offset(0,0,a.height*0.5); a.vel += Level.Vec3Diff(Source.pos,midpoint).unit()*(MomentumTransfer/(Thinker.TICRATE*a.mass)); diff --git a/zscript/warheadlauncher.zsc b/zscript/warheadlauncher.zsc index 4a0c89d..6ff2efa 100644 --- a/zscript/warheadlauncher.zsc +++ b/zscript/warheadlauncher.zsc @@ -357,15 +357,22 @@ Class GuidedWarShell : WarShell { double lagangle, lagpitch, lagroll, lagangle2, lagpitch2, lagroll2, guideangle, guidepitch, guideroll; + bool justleft; override void PostBeginPlay() { Super.PostBeginPlay(); if ( target && target.player ) target.player.camera = self; + justleft = true; } override void Tick() { Actor.Tick(); + if ( justleft && (Distance3D(target) > (2*max(target.radius,target.height))) ) + { + justleft = false; + bHITOWNER = true; + } if ( globalfreeze || level.frozen ) return; if ( !bMISSILE ) return; if ( !target || !target.player || (target.Health <= 0) )