Quadravol level 2 projectile + melee tweaks.

This commit is contained in:
Mari the Deer 2022-08-21 12:44:40 +02:00
commit 0b93a01401
30 changed files with 316 additions and 43 deletions

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r353 \cu(Sat 20 Aug 19:59:18 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r353 \cu(2022-08-20 19:59:18)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r354 \cu(Sun 21 Aug 12:44:40 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r354 \cu(2022-08-21 12:44:40)\c-";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Before After
Before After

BIN
sprites/XRG8A0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
sprites/XRG8B0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
sprites/XRG8C0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
sprites/XRG8D0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
sprites/XRG8E0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sprites/XRG8F0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sprites/XRG8G0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/XRG8H0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/XRG8I0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/XRG8J0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
sprites/XRG8K0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
sprites/XRG8L0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
sprites/XRG8M0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sprites/XRG8N0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sprites/XRG8O0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sprites/XRG8P0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sprites/XRG8Q0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
sprites/XRG8R0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/XRG8S0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sprites/XRG8T0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sprites/XRG8U0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
sprites/XRG8V0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
sprites/XRG8W0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

BIN
sprites/XRG8X0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

View file

@ -115,7 +115,7 @@ Class Quadravol : SWWMWeapon
Actor p;
switch ( idx )
{
case 0:
default:
A_QuakeEx(3,3,3,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4);
A_BumpFOV(.98);
A_SWWMFlash();
@ -131,30 +131,35 @@ Class Quadravol : SWWMWeapon
{
p.tracer = self;
p.master = fool;
p.special1 = bMelee?100:50;
p.special2 = bMelee?120000:40000;
p.special1 += bMelee?100:50;
p.special2 += bMelee?120000:40000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
self.DamageMobj(invoker,self,bAMBUSH?20:40,'Fire',DMG_EXPLOSION);
}
for ( int i=0; i<4; i++ )
{
let s = Spawn("SWWMSmoke",origin);
s.special1 = 1;
s.scale *= 1.3;
s.alpha *= .2;
s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5);
}
for ( int i=0; i<10; i++ )
{
let s = Spawn("SWWMSpark",origin);
s.scale *= .3;
s.alpha *= .4;
s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.);
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
}
break;
case 1:
A_Log("\cg// TODO - Fire Level 2\c-");
A_QuakeEx(4,4,4,18,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5);
A_BumpFOV(.97);
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),7);
A_AlertMonsters(swwm_uncapalert?0:3000);
SWWMUtility.DoKnockback(self,-x,2500.);
p = Spawn("QuadProj2",origin);
p.target = self;
p.angle = atan2(x2.y,x2.x);
p.pitch = asin(-x2.z);
p.vel = x2*p.speed;
if ( pointblank || bMelee )
{
p.tracer = self;
p.master = fool;
p.special1 = bMelee?150:80;
p.special2 = bMelee?150000:60000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
}
break;
case 2:
A_Log("\cg// TODO - Fire Level 3\c-");
@ -167,6 +172,23 @@ Class Quadravol : SWWMWeapon
else A_Log("\cg// TODO - Fire Level 5\c-");
break;
}
for ( int i=0; i<(4+idx); i++ )
{
let s = Spawn("SWWMSmoke",origin);
s.special1 = 1;
s.scale *= 1.3;
s.alpha *= .2;
s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5);
s.vel *= 1.+.1*idx;
}
for ( int i=0; i<(10+2*idx); i++ )
{
let s = Spawn("SWWMSpark",origin);
s.scale *= .3;
s.alpha *= .4;
s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.);
s.vel *= 1.+.1*idx;
}
invoker.chargelevel = 0;
invoker.charged = true; // eat it up
if ( bMelee ) return ResolveState(null);
@ -248,7 +270,7 @@ Class Quadravol : SWWMWeapon
action void A_FireBayonet()
{
A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP);
A_Melee(50,"spreadgun/slug",1.5,.8,-.5,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse);
A_Melee(60,"spreadgun/slug",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null);
Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch);
vel += dir*4.;
A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75);
@ -465,14 +487,18 @@ Class Quadravol : SWWMWeapon
XZW2 A 2
{
A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerMelee();
return A_JumpIf(invoker.onehand,"User11H");
}
XZW7 BCDEF 2;
XZW7 G 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
XZW7 BCD 2;
XZW7 E 2
{
A_PlayerMelee();
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW7 FG 2;
XZW7 H 2 A_Parry(6);
XZW7 I 1;
XZW7 J 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet");
XZW7 J 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet");
XZW7 KLM 1;
XZW7 NOPQRST 2;
XZW7 UVWX 3;
@ -602,11 +628,16 @@ Class Quadravol : SWWMWeapon
User11H:
XZW9 G 2;
XZWC Z 2;
XZWD ABCD 2;
XZWD E 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
XZWD AB 2;
XZWD C 2
{
A_PlayerMelee();
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
}
XZWD DE 2;
XZWD F 2 A_Parry(6);
XZWD G 1;
XZWD H 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet1H");
XZWD H 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet1H");
XZWD IJK 1;
XZWD LMNOPQR 2;
XZWD STUV 3;

View file

@ -22,6 +22,15 @@ Class QuadExplLight : PaletteLight
ReactionTime 20;
}
}
Class QuadExplLight2 : PaletteLight
{
Default
{
Tag "QuadExpl";
Args 0,0,0,250;
ReactionTime 25;
}
}
Class QuadFlare : Actor
{
@ -198,6 +207,39 @@ Class QuadEmber : Actor
}
}
Class QuadExplRing : Actor
{
Default
{
RenderStyle "Add";
Scale 1.2;
Radius .1;
Height 0;
+NOGRAVITY;
+NOBLOCKMAP;
+FORCEXYBILLBOARD;
+NOTELEPORT;
+NOINTERACTION;
}
override void Tick()
{
if ( isFrozen() ) return;
if ( !CheckNoDelay() || (tics == -1) ) return;
if ( tics > 0 ) tics--;
while ( !tics )
{
if ( !SetState(CurState.NextState) )
return;
}
}
States
{
Spawn:
XRG8 ACEGIKMOQSUW 1 Bright A_SetScale(scale.x*1.05);
Stop;
}
}
Class QuadProj : Actor
{
double drift, accelrate, maxspeed;
@ -252,7 +294,7 @@ Class QuadProj : Actor
{
A_StopSound(CHAN_BODY);
Scale *= 2.;
A_SprayDecal("ShockMarkBig",50);
A_SprayDecal("ShockMark",50);
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) )
{
@ -261,14 +303,16 @@ Class QuadProj : Actor
SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000+special2);
}
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000);
A_QuakeEx(3,3,3,20,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.6);
SWWMUtility.DoExplosion(self,0,80000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,100+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
if ( SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target )
SWWMUtility.AchievementProgressInc("roast",1,target.player);
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.8);
A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.6);
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.6);
A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.4);
A_AlertMonsters(swwm_uncapalert?0:1500);
Spawn("QuadExplLight",pos);
Spawn("QuadExplRing",pos);
int numpt = Random[Quadravol](12,18);
for ( int i=0; i<numpt; i++ )
{
@ -336,6 +380,200 @@ Class QuadProj : Actor
}
}
Class QuadExplArm : Actor
{
Default
{
PROJECTILE;
+THRUACTORS;
+BOUNCEONWALLS;
+BOUNCEONFLOORS;
+BOUNCEONCEILINGS;
+CANBOUNCEWATER;
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
Gravity .35;
BounceFactor 1.;
Radius 2;
Height 4;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
reactiontime = Random[ExploS](4,8);
double ang, pt;
ang = FRandom[ExploS](0,360);
pt = FRandom[ExploS](-90,90);
vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](12.,32.);
}
States
{
Spawn:
TNT1 A 1
{
Spawn("QuadExplTrail",pos);
if ( !(ReactionTime%2) )
SWWMUtility.DoExplosion(self,8+reactiontime*3,0,40+5*reactiontime,20,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5);
let s = Spawn("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.3;
s.special1 = Random[ExploS](1,3);
s.scale *= 3.;
s.alpha *= .1+.4*(ReactionTime/8.);
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
}
A_CountDown();
}
Wait;
}
}
Class QuadExplTrail : Actor
{
Default
{
RenderStyle "Add";
+NOBLOCKMAP;
+NOGRAVITY;
+FORCEXYBILLBOARD;
+NOTELEPORT;
+NOINTERACTION;
Scale 1.2;
}
override void Tick()
{
if ( isFrozen() ) return;
if ( !CheckNoDelay() || (tics == -1) ) return;
if ( tics > 0 ) tics--;
while ( !tics )
{
if ( !SetState(CurState.NextState) )
return;
}
}
States
{
Spawn:
XEX0 ACEGIKMOQS 1 Bright A_SetScale(scale.x*1.03);
Stop;
}
}
Class QuadExplRing2 : QuadExplRing
{
Default
{
Scale 1.6;
}
States
{
Spawn:
XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.03);
Stop;
}
}
Class QuadProj2 : QuadProj
{
Default
{
Scale .85;
Radius 8;
Height 8;
Speed 40;
QuadProj.Drift .25;
QuadProj.AccelRate 20;
QuadProj.MaxSpeed 80;
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .8;
s.vel = vel*.3;
s = Spawn("SWWMHalfSmoke",pos);
s.vel = (FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4));
s.vel += vel*.4;
s.alpha *= .6;
int numpt = Random[Quadravol](5,25);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
}
}
override void A_QuadExplode()
{
A_StopSound(CHAN_BODY);
Scale *= 2.4;
A_SprayDecal("ShockMarkBig",50);
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) )
{
Vector3 rel = level.Vec3Diff(master.pos,pos);
double hdiff = 1.-2.*clamp((rel.z-4.)/master.height,0.,.5);
SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),250000+special2);
}
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?160000:600000);
A_QuakeEx(5,5,5,25,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:400,rollintensity:.8);
SWWMUtility.DoExplosion(self,0,100000+special2,480,120,DE_BLAST|DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,200+special1,0,480,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
if ( SWWMUtility.DoExplosion(self,300+special1,0,400,120,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target )
SWWMUtility.AchievementProgressInc("roast",1,target.player);
A_StartSound("quadshot/twohit",CHAN_WEAPON,attenuation:.5);
A_StartSound("quadshot/twohit",CHAN_VOICE,attenuation:.25);
A_AlertMonsters(swwm_uncapalert?0:2500);
Spawn("QuadExplLight2",pos);
Spawn("QuadExplRing2",pos);
int numpt = Random[Quadravol](20,30);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](2,12);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.special1 = Random[Quadravol](2,3);
s.scale *= 4.;
s.alpha *= .3;
}
numpt = Random[Quadravol](15,20);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](4,16);
let s = Spawn("SWWMSpark",pos);
s.vel = pvel;
}
numpt = Random[Quadravol](8,12);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](6,12);
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
s.scale *= FRandom[Quadravol](0.9,1.8);
}
numpt = Random[Quadravol](12,16);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("QuadExplArm",pos);
s.target = target;
s.tracer = tracer;
}
if ( swwm_omnibust ) BusterWall.ProjectileBust(self,300,SWWMUtility.Vec3FromAngles(angle,pitch));
}
States
{
Death:
TNT1 A 0 A_QuadExplode();
XEX0 ABCDEFGHIJKLMNOPQRS 1 Bright A_SetScale(scale.x*1.065);
Stop;
}
}
Class OnFireLight : PointLightFlickerRandomAttenuated
{
OnFire of;

View file

@ -177,6 +177,7 @@ Class PunchImpact : Actor
{
Default
{
Tag "WallCrack";
Radius 0.1;
Height 0;
+NOGRAVITY;
@ -189,7 +190,7 @@ Class PunchImpact : Actor
Super.PostBeginPlay();
A_QuakeEx(2,2,2,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3);
A_StartSound("demolitionist/punch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
A_SprayDecal("WallCrack",-20);
A_SprayDecal(GetTag(),-20);
int numpt = Random[Ponch](5,10);
if ( bAMBUSH ) numpt /= 3;
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);

View file

@ -390,7 +390,7 @@ extend Class SWWMWeapon
GiveInventory("ParryDamageChecker",1); // need this so parried projectiles deal extra damage
}
// multi-hit cone rather than the usual one-hit arc, more fun
private action bool TryMelee( double spread, int dmg, String hitsound, double rangemul, double kickmul, int flags )
private action bool TryMelee( double spread, int dmg, String hitsound, double rangemul, double kickmul, int flags, Class<Actor> impactclass )
{
Vector3 x, y, z, dir;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
@ -446,9 +446,9 @@ extend Class SWWMWeapon
mt.hits[i].a.TraceBleed(newdmg,invoker);
mt.hits[i].a.SpawnBlood(mt.hits[i].pos,atan2(mt.hits[i].dir.y,mt.hits[i].dir.x)+180,newdmg);
}
else
else if ( impactclass )
{
let p = Spawn(raging?"BigPunchImpact":"PunchImpact",mt.hits[i].pos);
let p = Spawn(raging?(Class<Actor>)("BigPunchImpact"):impactclass,mt.hits[i].pos);
p.angle = atan2(mt.hits[i].dir.y,mt.hits[i].dir.x);
}
if ( (flags&MELEE_HammerHit) && (mt.hits[i].a.Health <= mt.hits[i].a.GetGibHealth()) )
@ -498,7 +498,7 @@ extend Class SWWMWeapon
A_BumpFOV(.96);
return true;
}
action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0 )
action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0, Class<Actor> impactclass = "PunchImpact" )
{
let raging = RagekitPower(FindInventory("RagekitPower"));
if ( flags&MELEE_NoRage ) raging = null;
@ -535,7 +535,7 @@ extend Class SWWMWeapon
// check for shootables
SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0);
}
bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags);
bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags,impactclass);
if ( res && !(flags&MELEE_Rip) ) return res;
// check for walls instead
FTranslatedLineTarget t;
@ -560,10 +560,13 @@ extend Class SWWMWeapon
if ( !d.LineSide ) HitNormal *= -1;
if ( !(flags&MELEE_NoUse) ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
}
let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4);
p.angle = atan2(HitNormal.y,HitNormal.x);
p.pitch = asin(-HitNormal.z);
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
if ( impactclass )
{
let p = Spawn(raging?(Class<Actor>)("BigPunchImpact"):impactclass,d.HitLocation+HitNormal*4);
p.angle = atan2(HitNormal.y,HitNormal.x);
p.pitch = asin(-HitNormal.z);
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
}
if ( raging )
{
let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4);