From d69eaa682f3668232fa6c8d8127744df2378fc1c Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 8 Feb 2019 14:43:39 +0100 Subject: [PATCH] Backported changes from experimental branch. Fixed crash on screen flashes due to misuse of StaticEventHandler.Find instead of EventHandler.Find (oops). --- zscript.txt | 6 +- zscript/biorifle.zsc | 4 +- .../{mk_coordutil.zsc => dt_coordutil.zsc} | 0 zscript/{mk_matrix.zsc => dt_matrix.zsc} | 0 .../{mk_quaternion.zsc => dt_quaternion.zsc} | 0 zscript/eightball.zsc | 9 ++- zscript/flakcannon.zsc | 57 +++++++++++++++---- zscript/utcommon.zsc | 2 +- 8 files changed, 60 insertions(+), 18 deletions(-) rename zscript/{mk_coordutil.zsc => dt_coordutil.zsc} (100%) rename zscript/{mk_matrix.zsc => dt_matrix.zsc} (100%) rename zscript/{mk_quaternion.zsc => dt_quaternion.zsc} (100%) diff --git a/zscript.txt b/zscript.txt index e2ceb1f..28e94b9 100644 --- a/zscript.txt +++ b/zscript.txt @@ -1,8 +1,8 @@ version "3.7" -#include "zscript/mk_matrix.zsc" -#include "zscript/mk_coordutil.zsc" -#include "zscript/mk_quaternion.zsc" +#include "zscript/dt_matrix.zsc" +#include "zscript/dt_coordutil.zsc" +#include "zscript/dt_quaternion.zsc" #include "zscript/utgore.zsc" #include "zscript/utcommon.zsc" #include "zscript/impacthammer.zsc" diff --git a/zscript/biorifle.zsc b/zscript/biorifle.zsc index e13cf01..a8e6e6b 100644 --- a/zscript/biorifle.zsc +++ b/zscript/biorifle.zsc @@ -264,10 +264,10 @@ Class BioGel : Actor for ( int i=0; i 0 ) @@ -228,8 +231,39 @@ Class FlakChunk : Actor pitch += pitchvel; angle += pitchvel; } - action void A_HandleBounce() + void A_HandleBounce() { + // chunks in vanilla have a special variation on the standard reflect formula that causes them to bounce differently when hitting a surface head-on + // (0.5 to 0.8 reduction perpendicular to the surface normal, to be specific) + Vector3 HitNormal = -vel.unit(); + if ( BlockingFloor ) HitNormal = BlockingFloor.floorplane.Normal; + else if ( BlockingCeiling ) HitNormal = BlockingCeiling.ceilingplane.Normal; + else if ( BlockingLine ) + { + HitNormal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit(); + if ( !BlockingLine.sidedef[1] || (CurSector == BlockingLine.frontsector) ) + HitNormal *= -1; + } + else if ( BlockingMobj ) + { + Vector3 diff = level.Vec3Diff(pos,BlockingMobj.pos); + if ( (pos.x+radius) <= (BlockingMobj.pos.x-BlockingMobj.radius) ) + HitNormal = (-1,0,0); + else if ( (pos.x-radius) >= (BlockingMobj.pos.x+BlockingMobj.radius) ) + HitNormal = (1,0,0); + else if ( (pos.y+radius) <= (BlockingMobj.pos.y-BlockingMobj.radius) ) + HitNormal = (0,-1,0); + else if ( (pos.y-radius) >= (BlockingMobj.pos.y+BlockingMobj.radius) ) + HitNormal = (0,1,0); + else if ( pos.z >= (BlockingMobj.pos.z+BlockingMobj.height) ) + HitNormal = (0,0,1); + else if ( (pos.z+height) <= BlockingMobj.pos.z ) + HitNormal = (0,0,-1); + } + // undo the bounce, we need to hook in our own + vel = oldvel; + // re-do the bounce with our formula + vel = 0.8*((vel dot HitNormal)*HitNormal*(-1.8+FRandom[Flak](0.0,0.8))+vel); bHITOWNER = true; int numpt = Random[Flak](2,3); if ( (frame < 10) && Random[Flak](0,1) ) @@ -244,13 +278,9 @@ Class FlakChunk : Actor else A_SprayDecal("WallCrack",-8); A_Gravity(); gravity = 0.35; - invoker.rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); - invoker.pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); - invoker.yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); - vel = (vel.unit()+(FRandom[Flak](-0.2,0.2),FRandom[Flak](-0.2,0.2),FRandom[Flak](-0.2,0.2))).unit()*vel.length(); - // TODO chunks in vanilla have a special variation on the standard reflect formula that causes them to bounce differently when hitting a surface head-on - // (0.5 to 0.8 reduction perpendicular to the surface normal, to be specific) - // I have no idea how I'll even implement this reduction reliably + rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); + pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); + yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); A_PlaySound("flak/bounce",volume:0.3); A_AlertMonsters(); if ( vel.length() < 5.0 ) ExplodeMissile(); @@ -302,7 +332,12 @@ Class FlakChunk : Actor Crash: TNT1 A 0 { - Spawn("BulletPuff",pos); + let l = Spawn("BulletImpact",pos); + Vector3 dir; + if ( tracer ) dir = level.Vec3Diff(pos,tracer.Vec3Offset(0,0,tracer.height/2)).unit(); + else dir = vel.unit(); + l.angle = atan2(dir.y,dir.x); + l.pitch = asin(-dir.z); A_PlaySound("flak/hit",volume:0.3); A_AlertMonsters(); } diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index 983b16a..c5432ac 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -1964,7 +1964,7 @@ Class UTMainHandler : EventHandler qf.c = c; qf.tic = gametic; qf.cam = camera; - let hnd = UTMainHandler(StaticEventHandler.Find("UTMainHandler")); + let hnd = UTMainHandler(EventHandler.Find("UTMainHandler")); hnd.flashes.push(qf); }