Fix wacky-ass water physics for projectiles.

This commit is contained in:
Mari the Deer 2022-11-11 01:46:39 +01:00
commit 31ea4f73b1
19 changed files with 61 additions and 6 deletions

View file

@ -960,6 +960,8 @@ Class TargetTracer : LineTracer
Class MisterGrenade : Actor
{
Mixin SWWMMissileFix;
Vector3 oldvel;
Default

View file

@ -330,6 +330,7 @@ Class QuadProj : Actor
+FORCERADIUSDMG;
+NODAMAGETHRUST;
+HITMASTER;
+NOFRICTION;
RenderStyle "Add";
}
@ -358,6 +359,7 @@ Class QuadExplArm : Actor
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
+NOFRICTION;
Gravity .35;
BounceFactor 1.;
Radius 2;

View file

@ -1394,6 +1394,7 @@ Class ChanceboxTop : Actor
Species "Chancebox";
PROJECTILE;
+THRUSPECIES;
+NOFRICTION;
}
override void PostBeginPlay()
{
@ -1430,6 +1431,7 @@ Class ChanceboxSide : Actor
Species "Chancebox";
PROJECTILE;
+THRUSPECIES;
+NOFRICTION;
}
override void PostBeginPlay()
{

View file

@ -3645,6 +3645,8 @@ Class BallImpact : SWWMNonInteractiveActor
Class TheBall : Actor
{
Mixin SWWMMissileFix;
double heat;
int deadtimer;
Vector3 oldvel;

View file

@ -450,6 +450,8 @@ Class mkBloodSmoke2 : mkBloodSmoke
// inspired by Lud's Universal Gibs
Class mkFlyingGib : Actor
{
Mixin SWWMMissileFix;
bool killme;
int lastbleed;
color shadecol;
@ -503,8 +505,7 @@ Class mkFlyingGib : Actor
roll += rollvel;
if ( waterlevel > 0 )
{
rollvel *= .98;
vel.xy *= .98;
rollvel *= .99;
return;
}
if ( !bleeding ) return;

View file

@ -118,6 +118,21 @@ Class SWWMNothing : SWWMNonInteractiveActor
}
}
// mixins for gravity-affected missiles that need correct water behavior
Mixin Class SWWMMissileFix
{
Default
{
+NOFRICTION;
}
override void FallAndSink( double grav, double oldfloorz )
{
if ( bNOGRAVITY || (waterlevel < 1) ) return;
vel *= .99;
if ( pos.z > floorz ) vel.z -= grav*.01;
}
}
Class SWWMDamageAccumulator : Inventory
{
Actor inflictor, source;

View file

@ -705,7 +705,8 @@ Class SWWMChip : SWWMNonInteractiveActor
if ( killme ) A_FadeOut(.01);
if ( waterlevel > 0 )
{
vel *= .98;
vel *= .99;
if ( pos.z > floorz ) vel.z -= gravity*.01;
anglevel *= .98;
pitchvel *= .98;
rollvel *= .98;

View file

@ -98,6 +98,7 @@ Class LoveHeart : Actor
+FOILINVUL;
+PAINLESS;
+NODAMAGETHRUST;
+NOFRICTION;
}
override int DoSpecialDamage( Actor target, int damage, Name damagetype )

View file

@ -162,6 +162,7 @@ Class SWWMBossBrainExplArm : Actor
+BOUNCEONFLOORS;
+BOUNCEONCEILINGS;
-NOGRAVITY;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 4;

View file

@ -162,6 +162,7 @@ Class DemolitionistRadiusShockwave : Actor
+RIPPER;
+BLOODLESSIMPACT;
-NOGRAVITY;
+NOFRICTION;
}
override int DoSpecialDamage( Actor target, int damage, Name damagetype )
{

View file

@ -2,6 +2,8 @@
Class SWWMCasing : Actor abstract
{
Mixin SWWMMissileFix;
SWWMCasing prevcasing, nextcasing;
bool killme;
int numbounces;
@ -23,6 +25,7 @@ Class SWWMCasing : Actor abstract
+ROLLSPRITE;
+ROLLCENTER;
+SYNCHRONIZED;
+CANBOUNCEWATER;
Mass 1;
Gravity 0.35;
BounceType "Hexen";
@ -51,7 +54,6 @@ Class SWWMCasing : Actor abstract
if ( killme ) A_FadeOut(.01);
if ( waterlevel > 0 )
{
vel.xy *= .98;
anglevel *= .98;
pitchvel *= .98;
}
@ -89,6 +91,9 @@ Class SWWMCasing : Actor abstract
bINTERPOLATEANGLES = false;
pitch = roll = 0;
angle = FRandom[Junk](0,360);
// disappear if we fell into a terrain with floor clip
if ( GetFloorTerrain().footclip > 0 )
Destroy();
}
Stop;
}

View file

@ -82,6 +82,7 @@ Class HellblazerArm : Actor
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 4;
@ -179,6 +180,8 @@ Class HellblazerFlare : SWWMNonInteractiveActor
// rockets
Class HellblazerMissile : Actor
{
Mixin SWWMMissileFix;
int deto;
Actor seektarget;
Vector3 InitialDir, Acceleration;

View file

@ -121,6 +121,8 @@ Class EvisceratorChunkTrail : SWWMNonInteractiveActor
Class EvisceratorChunk : Actor
{
Mixin SWWMMissileFix;
Actor lasthit;
double anglevel, pitchvel, rollvel;
double lifetime, lifespeed;
@ -424,6 +426,8 @@ Class EvisceratorProjLight : PaletteLight
Class EvisceratorProj : Actor
{
Mixin SWWMMissileFix;
double heat;
Vector3 startpos;
Default

View file

@ -220,6 +220,7 @@ Class YnykronImpactArm : Actor
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 2;
@ -1927,6 +1928,7 @@ Class YnykronSingularityExplosionArm : Actor
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 2;

View file

@ -17,6 +17,7 @@ Class AirBullet : FastProjectile
+FORCERADIUSDMG;
+NODAMAGETHRUST;
+RIPPER;
+NOFRICTION;
}
override void PostBeginPlay()
{

View file

@ -372,6 +372,7 @@ Class BigBiospark : Actor
+BOUNCEONFLOORS;
+BOUNCEONCEILINGS;
+CANBOUNCEWATER;
+NOFRICTION;
}
States
{
@ -408,6 +409,7 @@ Class BiosparkBall : Actor
+NODAMAGETHRUST;
+EXPLODEONWATER;
+FORCEXYBILLBOARD;
+NOFRICTION;
}
override void PostBeginPlay()
{
@ -1574,6 +1576,8 @@ Class BiosparkSpark : SWWMNonInteractiveActor
Class BiosparkCore : Actor
{
Mixin SWWMMissileFix;
Vector3 oldvel;
double anglevel, pitchvel, rollvel;

View file

@ -45,6 +45,7 @@ Class ExplodiumMagArm : Actor
+NODAMAGETHRUST;
+FORCERADIUSDMG;
-NOGRAVITY;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 2;
@ -102,6 +103,8 @@ Class ExplodiumMagTrail : SWWMNonInteractiveActor
Class ExplodiumMagProj : Actor
{
Mixin SWWMMissileFix;
double pitchvel, anglevel;
Vector3 cvel;

View file

@ -325,6 +325,7 @@ Class CandyMagArm : Actor
+FORCERADIUSDMG;
-NOGRAVITY;
+FOILINVUL;
+NOFRICTION;
Gravity 0.35;
BounceFactor 1.0;
Radius 2;
@ -463,6 +464,8 @@ Class CandyMagArmBig : CandyMagArm
Class CandyGunProj : Actor
{
Mixin SWWMMissileFix;
double pitchvel, anglevel;
Vector3 cvel;
@ -600,6 +603,8 @@ Class CandyGunProj : Actor
Class CandyMagProj : Actor
{
Mixin SWWMMissileFix;
double pitchvel, anglevel;
Vector3 cvel;