diff --git a/modeldef.eightball b/modeldef.eightball index c29badd..53ef201 100644 --- a/modeldef.eightball +++ b/modeldef.eightball @@ -81,8 +81,9 @@ Model "UTRocketLauncher" SurfaceSkin 0 3 "Eight_t4.png" SurfaceSkin 0 4 "miniammoledbase.png" Scale -0.24 0.12 0.24 - Offset 2.0 -11.0 -9.5 + Offset 2.0 -12.0 -10.5 AngleOffset 90 + RollOffset -3 // Select FrameIndex EBLS A 0 0 diff --git a/modeldef.flak b/modeldef.flak index 9d4ba85..9b1bc2f 100644 --- a/modeldef.flak +++ b/modeldef.flak @@ -742,7 +742,7 @@ Model "FlakCannon" AngleOffset 90 PitchOffset 90 Scale 0.08 0.08 0.08 - Offset 7.4 -25.0 -7.5 + Offset 7.4 -25.0 -8.5 FrameIndex FMUZ A 2 0 } @@ -758,9 +758,9 @@ Model "FlakCannon" SurfaceSkin 0 4 "flakammoledbase.png" AngleOffset 90 PitchOffset 180 - RollOffset 174.375 + RollOffset 178 Scale 0.28 -0.14 0.28 - Offset 8.6 -10.4 -12.8 + Offset 8.6 -10.4 -13.8 // select FrameIndex FLKS A 0 0 diff --git a/modeldef.ges b/modeldef.ges index b14b865..0812f81 100644 --- a/modeldef.ges +++ b/modeldef.ges @@ -16,7 +16,7 @@ Model "BioGel" Path "models" Model 0 "BioGelm_d.3d" Skin 0 "Jgreen.png" - Scale 0.08 0.096 0.08 + Scale 0.096 0.08 0.08 PitchOffset -90 USEACTORPITCH USEACTORROLL @@ -88,7 +88,7 @@ Model "BioSplash" Path "models" Model 0 "BioGelm_d.3d" Skin 0 "Jgreen.png" - Scale 0.08 0.096 0.08 + Scale 0.096 0.08 0.08 PitchOffset -90 USEACTORPITCH USEACTORROLL @@ -160,7 +160,7 @@ Model "BioGlob" Path "models" Model 0 "BioGelm_d.3d" Skin 0 "Jgreen.png" - Scale 0.08 0.096 0.08 + Scale 0.096 0.08 0.08 PitchOffset -90 USEACTORPITCH USEACTORROLL diff --git a/modeldef.pulse b/modeldef.pulse index 34c85a4..b3d6076 100644 --- a/modeldef.pulse +++ b/modeldef.pulse @@ -181,7 +181,7 @@ Model "PulseGun" AngleOffset 90 PitchOffset 90 Scale 0.08 0.08 0.08 - Offset 8.5 -25.0 -4.5 + Offset 8.5 -25.0 -3.5 FrameIndex PMUZ A 2 0 } @@ -195,7 +195,7 @@ Model "PulseGun" SurfaceSkin 0 2 "JPulseGun_03.png" AngleOffset 90 Scale 0.26 -0.195 0.26 - Offset 0.0 -7.5 -8.0 + Offset 0.0 -7.5 -7.0 // Select FrameIndex PGNS A 0 2 diff --git a/modeldef.ripper b/modeldef.ripper index 79b4ec0..5aff58e 100644 --- a/modeldef.ripper +++ b/modeldef.ripper @@ -28,7 +28,7 @@ Model "Ripper2" Skin 1 "JRazorw.png" Scale 0.2 0.2 0.24 AngleOffset 90 - ZOffset 6 + ZOffset 10 FrameIndex RZRP B 1 0 } @@ -86,7 +86,7 @@ Model "Ripper2" SurfaceSkin 0 3 "JRazor5.png" SurfaceSkin 0 4 "JRazor3.png" Scale 0.16 -0.08 0.16 - Offset 6.4 -9.8 -7.9 + Offset 6.4 -9.8 -8.4 AngleOffset 90 // Select diff --git a/modeldef.transloc b/modeldef.transloc index 15d86da..622ce32 100644 --- a/modeldef.transloc +++ b/modeldef.transloc @@ -33,7 +33,7 @@ Model "Translocator" SurfaceSkin 1 1 "tloc2_.png" Scale 0.046 0.046 0.0552 AngleOffset -90 - ZOffset 6 + ZOffset 1 FrameIndex TLCP B 1 0 } @@ -48,8 +48,9 @@ Model "Translocator" SurfaceSkin 0 3 "tloc4.png" Scale 0.11 -0.055 0.11 Offset -19.8 -22.8 -31.2 - AngleOffset -94.21875 - PitchOffset 3.55555555556 + AngleOffset -95 + PitchOffset 5 + RollOffset -5 // select FrameIndex TLCS A 0 18 diff --git a/sndinfo.txt b/sndinfo.txt index 11c233d..2d156dc 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -120,6 +120,14 @@ misc/gibbed5 gib5 $random misc/gibbed { misc/gibbed1 misc/gibbed2 misc/gibbed3 misc/gibbed4 misc/gibbed5 } // universal gibs compat $alias UniversalGibs/Gib misc/gibbed +// droplets compat +misc/gibp1 gibp1 +misc/gibp2 gibp3 +misc/gibp3 gibp4 +misc/gibp4 gibp5 +misc/gibp5 gibp6 +$random misc/gibp { misc/gibp1 misc/gibp2 misc/gibp3 misc/gibp4 misc/gibp5 } +$alias blood/hit misc/gibp impact/select imppick impact/pull impaltst diff --git a/sounds/gibP1.ogg b/sounds/gibP1.ogg new file mode 100644 index 0000000..73af865 Binary files /dev/null and b/sounds/gibP1.ogg differ diff --git a/sounds/gibP3.ogg b/sounds/gibP3.ogg new file mode 100644 index 0000000..8dec54c Binary files /dev/null and b/sounds/gibP3.ogg differ diff --git a/sounds/gibP4.ogg b/sounds/gibP4.ogg new file mode 100644 index 0000000..55a046d Binary files /dev/null and b/sounds/gibP4.ogg differ diff --git a/sounds/gibP5.ogg b/sounds/gibP5.ogg new file mode 100644 index 0000000..69cdf3a Binary files /dev/null and b/sounds/gibP5.ogg differ diff --git a/sounds/gibP6.ogg b/sounds/gibP6.ogg new file mode 100644 index 0000000..470c6bc Binary files /dev/null and b/sounds/gibP6.ogg differ diff --git a/zscript/biorifle.zsc b/zscript/biorifle.zsc index 2c63897..be8a375 100644 --- a/zscript/biorifle.zsc +++ b/zscript/biorifle.zsc @@ -255,11 +255,12 @@ Class BioGel : Actor atside = 0; normal *= -1; } + Vector3 orig = (BlockingLine.v1.p.x,BlockingLine.v1.p.y,0); + Vector3 onwall = pos-(normal dot (pos-orig))*normal; + SetOrigin(onwall+normal*0.5,false); angle = atan2(normal.y,normal.x); pitch = 0; roll = 180; // otherwise it slides upwards (UT changes roll like this too) - LineTrace(angle+180,172,0,TRF_THRUACTORS,data:d); - SetOrigin(d.HitLocation+normal*0.5,false); if ( waterlevel > 0 ) hittype = HIT_FLOOR; else hittype = HIT_WALL; } @@ -345,6 +346,7 @@ Class BioGel : Actor +SKYEXPLODE; +FORCERADIUSDMG; +FORCEXYBILLBOARD; + +MOVEWITHSECTOR; } States { diff --git a/zscript/eightball.zsc b/zscript/eightball.zsc index 773bda6..bbc8be1 100644 --- a/zscript/eightball.zsc +++ b/zscript/eightball.zsc @@ -38,6 +38,10 @@ Class UTRocketAmmo2 : UTRocketAmmo Class UTRocket : Actor { + Default + { + Obituary "%o was smacked down by %k's Rocket Launcher."; + } States { Spawn: @@ -48,6 +52,10 @@ Class UTRocket : Actor Class UTGrenade : Actor { + Default + { + Obituary "%o was smacked down by %k's Rocket Launcher."; + } States { Spawn: @@ -58,12 +66,49 @@ Class UTGrenade : Actor Class UTRocketLauncher : UTWeapon { - int loaded; + Actor LockedTarget; + + // consumes 1 ammo + action void A_LoadRocket() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + } + + // refire that is ignored if there's no ammo + action void A_LoadedRefire( statelabel flash = null ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + A_Refire(flash); + } + + // fire all the rockets (or grenades) + action void A_FireRockets( int num ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.bAltFire ) A_PlaySound("utrl/altfire",CHAN_WEAPON); + else A_PlaySound("utrl/fire",CHAN_WEAPON); + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(64,255,0,0),1); + A_AlertMonsters(); + A_QuakeEx(2+num,2+num,2+num,6+num,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1+num*0.05); + // TODO + } + + // lock-on check (TODO) + Actor CheckTarget() + { + return null; + } Default { Tag "Rocket Launcher"; - //Obituary "%o was smacked down by %k's Rocket Launcher."; Inventory.PickupMessage "You got the Rocket Launcher."; Weapon.UpSound "utrl/select"; Weapon.SlotNumber 9; @@ -94,23 +139,253 @@ Class UTRocketLauncher : UTWeapon } Wait; Fire: - EBF1 ABCDEFGH 1; - EBF2 ABCDEFGHIJK 1; - EBF3 ABCDEFGHIJ 1; - EBF4 ABCDEFGHIJK 1; - EBF5 ABCDEFGHIJKLM 1; - EBF6 ABCDEFGHIJKLMNOP 1; - EBR1 ABCDEFG 1; - EBR2 ABCDEFG 1; - EBR3 ABCDEFG 1; - EBR4 ABCDEFG 1; - EBR5 ABCDEFG 1; - EBL1 ABCDEFG 1; - EBL2 ABCDEFG 1; - EBL3 ABCDEFG 1; - EBL4 ABCDEFG 1; - EBL5 ABCDEFG 1; - EBL6 ABCDEF 1; + AltFire: + // one is loaded already + EBLI A 3 A_LoadRocket(); + EBLI A 0 A_LoadedRefire(1); + Goto FireOne; + // load two + EBLI A 2; + EBL1 A 0; + EBR1 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1); + EBR1 B 0 A_Refire(1); + Goto FireOne; + EBR1 B 2; + EBR1 C 0 A_Refire(1); + Goto FireOne; + EBR1 C 2; + EBR1 D 0 A_Refire(1); + Goto FireOne; + EBR1 D 2; + EBR1 E 0 A_Refire(1); + Goto FireOne; + EBR1 E 2; + EBR1 F 0 A_Refire(1); + Goto FireOne; + EBR1 F 2; + EBR1 G 0 A_Refire(1); + Goto FireOne; + EBR1 G 2; + EBL2 A 0 A_Refire(1); + Goto FireOne; + EBL2 A 3 A_PlaySound("utrl/load",CHAN_WEAPON); + EBL2 B 0 A_Refire(1); + Goto FireOne; + EBL2 B 3; + EBL2 C 0 A_Refire(1); + Goto FireOne; + EBL2 C 3; + EBL2 D 0 A_Refire(1); + Goto FireOne; + EBL2 D 3; + EBL2 E 0 A_Refire(1); + Goto FireOne; + EBL2 E 3; + EBL2 F 0 A_Refire(1); + Goto FireOne; + EBL2 F 3; + EBL2 G 0 A_Refire(1); + Goto FireOne; + EBL2 G 3 A_LoadRocket(); + EBR2 A 0 A_LoadedRefire(1); + Goto FireTwo; + // load three + EBR2 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1); + EBR2 B 0 A_Refire(1); + Goto FireTwo; + EBR2 B 2; + EBR2 C 0 A_Refire(1); + Goto FireTwo; + EBR2 C 2; + EBR2 D 0 A_Refire(1); + Goto FireTwo; + EBR2 D 2; + EBR2 E 0 A_Refire(1); + Goto FireTwo; + EBR2 E 2; + EBR2 F 0 A_Refire(1); + Goto FireTwo; + EBR2 F 2; + EBR2 G 0 A_Refire(1); + Goto FireTwo; + EBR2 G 2; + EBL3 A 0 A_Refire(1); + Goto FireTwo; + EBL3 A 3 A_PlaySound("utrl/load",CHAN_WEAPON); + EBL3 B 0 A_Refire(1); + Goto FireTwo; + EBL3 B 3; + EBL3 C 0 A_Refire(1); + Goto FireTwo; + EBL3 C 3; + EBL3 D 0 A_Refire(1); + Goto FireTwo; + EBL3 D 3; + EBL3 E 0 A_Refire(1); + Goto FireTwo; + EBL3 E 3; + EBL3 F 0 A_Refire(1); + Goto FireTwo; + EBL3 F 3; + EBL3 G 0 A_Refire(1); + Goto FireTwo; + EBL3 G 3 A_LoadRocket(); + EBR3 A 0 A_LoadedRefire(1); + Goto FireThree; + // load four + EBR3 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1); + EBR3 B 0 A_Refire(1); + Goto FireThree; + EBR3 B 2; + EBR3 C 0 A_Refire(1); + Goto FireThree; + EBR3 C 2; + EBR3 D 0 A_Refire(1); + Goto FireThree; + EBR3 D 2; + EBR3 E 0 A_Refire(1); + Goto FireThree; + EBR3 E 2; + EBR3 F 0 A_Refire(1); + Goto FireThree; + EBR3 F 2; + EBR3 G 0 A_Refire(1); + Goto FireThree; + EBR3 G 2; + EBL4 A 0 A_Refire(1); + Goto FireThree; + EBL4 A 3 A_PlaySound("utrl/load",CHAN_WEAPON); + EBL4 B 0 A_Refire(1); + Goto FireThree; + EBL4 B 3; + EBL4 C 0 A_Refire(1); + Goto FireThree; + EBL4 C 3; + EBL4 D 0 A_Refire(1); + Goto FireThree; + EBL4 D 3; + EBL4 E 0 A_Refire(1); + Goto FireThree; + EBL4 E 3; + EBL4 F 0 A_Refire(1); + Goto FireThree; + EBL4 F 3; + EBL4 G 0 A_Refire(1); + Goto FireThree; + EBL4 G 3 A_LoadRocket(); + EBR4 A 0 A_LoadedRefire(1); + Goto FireFour; + // load five + EBR4 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1); + EBR4 B 0 A_Refire(1); + Goto FireFour; + EBR4 B 2; + EBR4 C 0 A_Refire(1); + Goto FireFour; + EBR4 C 2; + EBR4 D 0 A_Refire(1); + Goto FireFour; + EBR4 D 2; + EBR4 E 0 A_Refire(1); + Goto FireFour; + EBR4 E 2; + EBR4 F 0 A_Refire(1); + Goto FireFour; + EBR4 F 2; + EBR4 G 0 A_Refire(1); + Goto FireFour; + EBR4 G 2; + EBL5 A 0 A_Refire(1); + Goto FireFour; + EBL5 A 3 A_PlaySound("utrl/load",CHAN_WEAPON); + EBL5 B 0 A_Refire(1); + Goto FireFour; + EBL5 B 3; + EBL5 C 0 A_Refire(1); + Goto FireFour; + EBL5 C 3; + EBL5 D 0 A_Refire(1); + Goto FireFour; + EBL5 D 3; + EBL5 E 0 A_Refire(1); + Goto FireFour; + EBL5 E 3; + EBL5 F 0 A_Refire(1); + Goto FireFour; + EBL5 F 3; + EBL5 G 0 A_Refire(1); + Goto FireFour; + EBL5 G 3 A_LoadRocket(); + EBR5 A 0 A_LoadedRefire(1); + Goto FireFive; + // load six + EBR5 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1); + EBR5 B 0 A_Refire(1); + Goto FireFive; + EBR5 B 2; + EBR5 C 0 A_Refire(1); + Goto FireFive; + EBR5 C 2; + EBR5 D 0 A_Refire(1); + Goto FireFive; + EBR5 D 2; + EBR5 E 0 A_Refire(1); + Goto FireFive; + EBR5 E 2; + EBR5 F 0 A_Refire(1); + Goto FireFive; + EBR5 F 2; + EBR5 G 0 A_Refire(1); + Goto FireFive; + EBR5 G 2; + EBL6 A 0 A_Refire(1); + Goto FireFive; + EBL6 A 3 A_PlaySound("utrl/load",CHAN_WEAPON); + EBL6 B 0 A_Refire(1); + Goto FireFive; + EBL6 B 3; + EBL6 C 0 A_Refire(1); + Goto FireFive; + EBL6 C 3; + EBL6 D 0 A_Refire(1); + Goto FireFive; + EBL6 D 3; + EBL6 E 0 A_Refire(1); + Goto FireFive; + EBL6 E 3; + EBL6 F 0 A_Refire(1); + Goto FireFive; + EBL6 F 3 A_LoadRocket(); + Goto FireSix; + FireOne: + EBF1 A 0 A_FireRockets(1); + EBF1 ABCDEFGH 2; + EBLI A 2; + Goto Idle; + FireTwo: + EBF2 A 0 A_FireRockets(2); + EBF2 ABCDEFGHIJK 2; + EBLI A 2; + Goto Idle; + FireThree: + EBF3 A 0 A_FireRockets(3); + EBF3 ABCDEFGHIJ 2; + EBLI A 2; + Goto Idle; + FireFour: + EBF4 A 0 A_FireRockets(4); + EBF4 ABCDEFGHIJK 2; + EBLI A 2; + Goto Idle; + FireFive: + EBF5 A 0 A_FireRockets(5); + EBF5 ABCDEFGHIJKLM 2; + EBLI A 2; + Goto Idle; + FireSix: + EBF6 A 0 A_FireRockets(6); + EBF6 ABCDEFGHIJKLMNOP 2; + EBLI A 2; Goto Idle; Deselect: EBLD ABCDEFGHIJK 1; diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index 33ff75c..a63365e 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -482,7 +482,7 @@ Class FlakCannon : UTWeapon action void A_Loading( bool first = false ) { if ( first ) A_PlaySound("flak/load",CHAN_WEAPON); - else A_PlaySound("flak/reload",CHAN_5); + else A_PlaySound("flak/reload",CHAN_6); } action void A_FireChunks() { diff --git a/zscript/minigun.zsc b/zscript/minigun.zsc index b1f94bd..d31f373 100644 --- a/zscript/minigun.zsc +++ b/zscript/minigun.zsc @@ -105,7 +105,7 @@ Class Minigun : UTWeapon invoker.bcnt = alt?3:5; if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; invoker.FireEffect(); - UTMainHandler.DoFlash(self,Color(64,255,255,0),1); + UTMainHandler.DoFlash(self,Color(32,255,255,0),1); A_AlertMonsters(); if ( alt ) A_QuakeEx(3,3,3,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12); else A_QuakeEx(2,2,2,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08); @@ -407,7 +407,8 @@ Class Minigun : UTWeapon MGU2 ABCDEFGHIJKLM 1; Goto Idle; Deselect: - MGND ABCDEFGHIJ 2; + MGND A 2 A_StopSound(CHAN_WEAPON); + MGND BCDEFGHIJ 2; MGND J 1 A_Lower(int.max); Wait; MuzzleFlash: diff --git a/zscript/powerups.zsc b/zscript/powerups.zsc index c0a1e3e..0692935 100644 --- a/zscript/powerups.zsc +++ b/zscript/powerups.zsc @@ -61,7 +61,7 @@ Class DamageAmplifier : Powerup Default { - Powerup.Duration -30; + Powerup.Duration -60; Powerup.Color "EE00FF", 0.15; } @@ -219,11 +219,6 @@ Class PowerUTInvisibility : PowerInvisibility Super.EndEffect(); PrintPickupMessage(true,"Invisibility has worn off."); } - override bool isBlinking() - { - // don't cause blinking, it bugs out models - return false; - } } Class UTInvisibility : PowerupGiver replaces BlurSphere @@ -347,6 +342,11 @@ Class UTJumpBoots : Inventory replaces RadSuit Owner.TakeInventory("PowerJumpBoots_HighJump",1); Owner.TakeInventory("PowerJumpBoots_IronFeet",1); } + override void OwnerDied() + { + Super.OwnerDied(); + DepleteOrDestroy(); + } States { Spawn: diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 0625a41..0ca5b6e 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -197,7 +197,7 @@ Class PulseBoltCap : Actor +NOGRAVITY; +NOCLIP; +DONTSPLASH; - Scale 0.25; + Scale 0.15; } States { @@ -217,7 +217,7 @@ Class PulseBoltHit : Actor +NOGRAVITY; +NOCLIP; +DONTSPLASH; - Scale 0.25; + Scale 0.15; } States { @@ -293,8 +293,8 @@ Class PulseBolt : Actor weffect.Destroy(); weffect = null; } - if ( !weffect ) weffect = Spawn("PulseBoltHit",t.Results.HitPos); - else weffect.SetOrigin(t.Results.HitPos,true); + if ( !weffect ) weffect = Spawn("PulseBoltHit",t.Results.HitPos-t.Results.HitVector); + else weffect.SetOrigin(t.Results.HitPos-t.Results.HitVector,true); A_SprayDecal("BoltScorch",beamsize+8); if ( next ) { @@ -325,8 +325,8 @@ Class PulseBolt : Actor weffect.Destroy(); weffect = null; } - if ( !weffect ) weffect = Spawn("PulseBoltCap",t.Results.HitPos); - else weffect.SetOrigin(t.Results.HitPos,true); + if ( !weffect ) weffect = Spawn("PulseBoltCap",t.Results.HitPos-t.Results.HitVector); + else weffect.SetOrigin(t.Results.HitPos-t.Results.HitVector,true); } else { @@ -350,8 +350,8 @@ Class PulseBolt : Actor { frame = parent.frame; SetOrigin(parent.Vec3Offset(x.x*beamsize,x.y*beamsize,x.z*beamsize),true); - A_SetAngle(parent.angle,SPF_INTERPOLATE); - A_SetPitch(parent.pitch,SPF_INTERPOLATE); + A_SetAngle(parent.angle); + A_SetPitch(parent.pitch); CheckBeam(x); } Default @@ -363,6 +363,7 @@ Class PulseBolt : Actor +NOGRAVITY; +NOCLIP; +DONTSPLASH; + +INTERPOLATEANGLES; } States { @@ -390,12 +391,12 @@ Class StarterBolt : PulseBolt if ( target.player ) { [x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll); - origin = (0,0,target.player.viewz-target.pos.z)+5.0*x+3.0*y-1.5*z; + origin = (0,0,target.player.viewz-target.pos.z)+5.0*x+3.0*y-1.0*z; } else origin = (0,0,target.missileheight); SetOrigin(target.Vec3Offset(origin.x,origin.y,origin.z),true); - A_SetAngle(target.angle,SPF_INTERPOLATE); - A_SetPitch(target.BulletSlope(),SPF_INTERPOLATE); + A_SetAngle(target.angle); + A_SetPitch(target.BulletSlope()); frame++; if ( frame > 4 ) frame = 0; CheckBeam(x); @@ -436,7 +437,7 @@ Class PulseGun : UTWeapon A_AlertMonsters(); Vector3 x, y, z; [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); - Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+4.5*y-2.4*z; + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+4.5*y-1.9*z; int numpt = Random[Pulse](2,5); for ( int i=0; i