diff --git a/Readme.md b/Readme.md index dfe73fe..5207a41 100644 --- a/Readme.md +++ b/Readme.md @@ -3,7 +3,7 @@ The Unreal 1 counterpart to Doom Tournament. Adds Unreal 1 weapons and items (including dummied out stuff and others). -This mod requires GZDoom g4.3pre-79-gbcef44051 or later, and runs on top of +This mod requires GZDoom g4.3pre-125-g021e548db or later, and runs on top of Doom Tournament (currently the devel branch is required). ## Currently Implemented @@ -38,6 +38,7 @@ Doom Tournament (currently the devel branch is required). - Stunner (slot 4) (replaces chainsaw) - Fireblaster (slot 5) (replaces rocket launcher) - Flamethrower (slot 6) (replaces plasma rifle) + - Impaler (slot 7) (replaces plasma rifle) - Peacemaker (slot 8) (rare spawn in backpacks) - Demolisher (slot 9) (replaces bfg9000) - Autocannon (slot 0) (replaces bfg9000) @@ -73,7 +74,7 @@ Doom Tournament (currently the devel branch is required). ## In progress - - Impaler (slot 7) (replaces plasma rifle) + - Beta testing ## Planned diff --git a/gldefs.txt b/gldefs.txt index c863887..3f4c4dc 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -411,6 +411,35 @@ Object UFireballEmber Frame "FIRB" { light "UFLAMGLIGHT3" } } +PointLight IMPALERLIGHT +{ + Color 1.0 0.2 0.8 + Size 50 + Attenuate 1 +} +Object ImpalerProjectile +{ + Frame "TPRJA" { light "IMPALERLIGHT" } +} + +FlickerLight2 IBOLTLIGHT +{ + Color 0.5 0.1 0.5 + Size 40 + SecondarySize 48 + Interval 0.1 + Offset 0 0 20 + Attenuate 1 +} +Object ImpalerBolt +{ + Frame "PBLT" { light "IBOLTLIGHT" } +} +Object StarterImpalerBolt +{ + Frame "PBLT" { light "IBOLTLIGHT" } +} + // Shaders / Brightmaps HardwareShader Texture "graphics/MenuBarr.png" { diff --git a/maps/TITLEMAP.wad b/maps/TITLEMAP.wad index 76cccd0..a09f5d1 100644 Binary files a/maps/TITLEMAP.wad and b/maps/TITLEMAP.wad differ diff --git a/modeldef.impaler b/modeldef.impaler index f30c6cd..c5436c2 100644 --- a/modeldef.impaler +++ b/modeldef.impaler @@ -21,12 +21,80 @@ Model "ImpalerAmmo2" FrameIndex IAMO A 0 0 } +Model "ImpalerBurstBolt" +{ + Path "models" + Model 0 "PBolt_d.3d" + Offset 5.0125 0 0 + Scale 0.050125 0.1025 0.123 + AngleOffset 90 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + Skin 0 "ibolt0.png" + FrameIndex PBLT A 0 0 + Skin 0 "ibolt1.png" + FrameIndex PBLT B 0 0 + Skin 0 "ibolt2.png" + FrameIndex PBLT C 0 0 + Skin 0 "ibolt3.png" + FrameIndex PBLT D 0 0 + Skin 0 "ibolt4.png" + FrameIndex PBLT E 0 0 +} + +Model "ImpalerBolt" +{ + Path "models" + Model 0 "PBolt_d.3d" + Offset 10.125 0 0 + Scale 0.10125 0.2025 0.243 + AngleOffset 90 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + Skin 0 "ibolt0.png" + FrameIndex PBLT A 0 0 + Skin 0 "ibolt1.png" + FrameIndex PBLT B 0 0 + Skin 0 "ibolt2.png" + FrameIndex PBLT C 0 0 + Skin 0 "ibolt3.png" + FrameIndex PBLT D 0 0 + Skin 0 "ibolt4.png" + FrameIndex PBLT E 0 0 +} + +Model "StarterImpalerBolt" +{ + Path "models" + Model 0 "SBolt_d.3d" + Offset 10.125 0 0 + Scale 0.10125 0.2025 0.243 + AngleOffset 90 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + Skin 0 "sibolt0.png" + FrameIndex PBLT A 0 0 + Skin 0 "sibolt1.png" + FrameIndex PBLT B 0 0 + Skin 0 "sibolt2.png" + FrameIndex PBLT C 0 0 + Skin 0 "sibolt3.png" + FrameIndex PBLT D 0 0 + Skin 0 "sibolt4.png" + FrameIndex PBLT E 0 0 +} Model "ImpalerChunk" { Path "models" Model 0 "burstx_d.3d" Skin 0 "JIBurst1.png" - Scale 0.2 0.2 0.24 + Scale 0.4 0.4 0.48 USEACTORPITCH USEACTORROLL diff --git a/models/Jiburst1.png b/models/Jiburst1.png index 461625b..d498266 100644 Binary files a/models/Jiburst1.png and b/models/Jiburst1.png differ diff --git a/sndinfo.txt b/sndinfo.txt index f9658da..cf0fe8c 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -284,6 +284,7 @@ impaler/flesh impflesh impaler/wall impwall impaler/altfire impboltl impaler/hit imphit +impaler/fly impfly impaler/beam ele04 big/select bigmsel diff --git a/sprites/impaler/ICAPA0.png b/sprites/impaler/ICAPA0.png new file mode 100644 index 0000000..d1219b7 Binary files /dev/null and b/sprites/impaler/ICAPA0.png differ diff --git a/sprites/impaler/ICAPB0.png b/sprites/impaler/ICAPB0.png new file mode 100644 index 0000000..3307382 Binary files /dev/null and b/sprites/impaler/ICAPB0.png differ diff --git a/sprites/impaler/ICAPC0.png b/sprites/impaler/ICAPC0.png new file mode 100644 index 0000000..4210a37 Binary files /dev/null and b/sprites/impaler/ICAPC0.png differ diff --git a/sprites/impaler/ICAPD0.png b/sprites/impaler/ICAPD0.png new file mode 100644 index 0000000..c4cfb6d Binary files /dev/null and b/sprites/impaler/ICAPD0.png differ diff --git a/models/ImpMuz.png b/sprites/impaler/IFLAA0.png similarity index 98% rename from models/ImpMuz.png rename to sprites/impaler/IFLAA0.png index 4998f11..fb31f9b 100644 Binary files a/models/ImpMuz.png and b/sprites/impaler/IFLAA0.png differ diff --git a/sprites/impaler/IHITA0.png b/sprites/impaler/IHITA0.png new file mode 100644 index 0000000..eacfe54 Binary files /dev/null and b/sprites/impaler/IHITA0.png differ diff --git a/sprites/impaler/IHITB0.png b/sprites/impaler/IHITB0.png new file mode 100644 index 0000000..c795153 Binary files /dev/null and b/sprites/impaler/IHITB0.png differ diff --git a/sprites/impaler/IHITC0.png b/sprites/impaler/IHITC0.png new file mode 100644 index 0000000..e1413b3 Binary files /dev/null and b/sprites/impaler/IHITC0.png differ diff --git a/sprites/impaler/IHITD0.png b/sprites/impaler/IHITD0.png new file mode 100644 index 0000000..152f232 Binary files /dev/null and b/sprites/impaler/IHITD0.png differ diff --git a/sprites/impaler/ISPKA0.png b/sprites/impaler/ISPKA0.png new file mode 100644 index 0000000..865dd8e Binary files /dev/null and b/sprites/impaler/ISPKA0.png differ diff --git a/textures.umisc b/textures.umisc index 2ba867c..3624fe1 100644 --- a/textures.umisc +++ b/textures.umisc @@ -1,10 +1,3 @@ -Texture "BLKNESS",64,64 -{ - Patch "MFLR8_1",0,0 - { - Blend "#000000",1.0 - } -} Sprite "UARMA0",1,1{} Sprite "ASBSA0",1,1{} Sprite "TOXSA0",1,1{} diff --git a/zscript/flamegun.zsc b/zscript/flamegun.zsc index bba4987..30ead6c 100644 --- a/zscript/flamegun.zsc +++ b/zscript/flamegun.zsc @@ -175,6 +175,8 @@ Class UFireball2 : UFireball { Default { + Radius 8; + Height 8; DamageFunction 50; Speed 5; UFireball.SpreadFactor 0.35; diff --git a/zscript/impaler.zsc b/zscript/impaler.zsc index 5ca8b1a..aa51843 100644 --- a/zscript/impaler.zsc +++ b/zscript/impaler.zsc @@ -4,7 +4,7 @@ Class ImpalerAmmo : Ammo { Tag "$T_IMPAMMO"; Inventory.Icon "I_Impale"; - Inventory.PickupMessage "$T_IMPAMMO"; + Inventory.PickupMessage "$I_IMPAMMO"; Inventory.Amount 3; Inventory.MaxAmount 15; Ammo.BackpackAmount 3; @@ -24,13 +24,37 @@ Class ImpalerAmmo2 : ImpalerAmmo Default { Tag "$T_IMPAMMO2"; - Inventory.PickupMessage "$T_IMPAMMO2"; + Inventory.PickupMessage "$I_IMPAMMO2"; Inventory.Amount 1; Ammo.DropAmount 1; +INVENTORY.IGNORESKILL; } } +Class ImpalerSpark : PulseSpark +{ + States + { + Spawn: + ISPK A 1 Bright + { + A_FadeOut(FRandom[Pulse](0.,.15)); + vel *= .96; + } + Wait; + } +} + +Class ViewImpalerSpark : ViewPulseSpark +{ + States + { + Spawn: + ISPK A 1 Bright A_FadeOut(FRandom[Pulse](0.,.15)); + Wait; + } +} + Class ImpalerChunk : StingerChunk { override void Tick() @@ -56,6 +80,444 @@ Class ImpalerBurstLight : PaletteLight } } +Class ImpalerBoltTracer : LineTracer +{ + Actor ignoreme; + Array hitlist; + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignoreme ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) + { + let ent = new("HitListEntry"); + ent.hitactor = Results.HitActor; + ent.hitlocation = Results.HitPos; + ent.x = Results.HitVector; + hitlist.Push(ent); + } + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) + return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class ImpalerBurstBolt : Actor +{ + Vector3 nextpos, nextdir; + + override void Tick() + { + Super.Tick(); + frame++; + if ( frame >= 5 ) frame = 0; + } + action void A_Trace() + { + let t = new("ImpalerBoltTracer"); + t.hitlist.Clear(); + Vector3 x, y, z; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + t.Trace(pos,CurSector,x,11.125,0); + for ( int i=0; i 5 ) return; + let b = Spawn("ImpalerBurstBolt",invoker.nextpos); + b.angle = atan2(invoker.nextdir.y,invoker.nextdir.x); + b.pitch = asin(-invoker.nextdir.z); + b.target = target; + b.special1 = special1+1; + b.frame = frame; + } + Default + { + RenderStyle "Add"; + Obituary "$O_IMPALER1"; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +INTERPOLATEANGLES; + +NOTELEPORT; + } + States + { + Spawn: + PBLT A 1 Bright; + PBLT A 1 Bright A_Trace(); + PBLT # 1 Bright A_Spread(); + PBLT # 1 Bright A_FadeOut(); + Wait; + Dummy: + PBLT ABCDE -1; + Stop; + } +} + +Class ImpalerBoltHit : Actor +{ + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +FORCEXYBILLBOARD; + +NOTELEPORT; + Scale 0.3; + } + States + { + Spawn: + #### ABCD 1 Bright; + Loop; + Dummy: + IHIT ABCD -1; + ICAP ABCD -1; + Stop; + } +} + +Class ImpalerBolt : Actor +{ + const beamsize = 20.25; + + ImpalerBoltTracer t; + ImpalerBolt next; + StarterImpalerBolt start; + Vector3 oldx; + Actor weffect; + + override void OnDestroy() + { + Super.OnDestroy(); + if ( next ) next.Destroy(); + if ( weffect ) weffect.Destroy(); + A_StopSound(CHAN_BODY); + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + t = new("ImpalerBoltTracer"); + if ( !(GetClass() is 'StarterImpalerBolt') ) + A_PlaySound("impaler/beam",CHAN_BODY,.2,true,2.,pitch:.75); + } + void CheckBeam( Vector3 x ) + { + t.HitList.Clear(); + if ( bHITOWNER ) t.ignoreme = null; + else t.ignoreme = target; + t.Trace(pos,cursector,x,beamsize,0); + for ( int i=0; i 500) || (tracer.Health <= 0) ) + { + tracer = null; + closest = 500; + } + } + let bt = BlockThingsIterator.Create(self,closest); + while ( bt.Next() ) + { + let a = bt.Thing; + if ( !a || !a.bSHOOTABLE || !a.bISMONSTER || (a.Health <= 0) || !CheckSight(a) || (start.Hitlist.Find(a) < start.HitList.Size()) ) continue; + Vector3 dirto = level.Vec3Diff(pos,a.Vec3Offset(0,0,a.height/2)); + double dist = dirto.length(); + dirto /= dist; + if ( dirto dot x < .5 ) continue; + if ( dist > closest ) continue; + tracer = a; + closest = dist; + } + if ( tracer ) special1 = 0; + Vector3 normal = -t.Results.HitVector, dir = t.Results.HitVector; + if ( t.Results.HitType == TRACE_HitWall ) + { + normal = (t.Results.HitLine.delta.y,-t.Results.HitLine.delta.x,0).unit(); + if ( t.Results.Side ) normal *= -1; + t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); + dir -= 2*normal*(dir dot normal); + } + else if ( t.Results.HitType == TRACE_HitFloor ) + { + if ( t.Results.ffloor ) normal = -t.Results.ffloor.top.Normal; + else normal = t.Results.HitSector.floorplane.Normal; + dir -= 2*normal*(dir dot normal); + } + else if ( t.Results.HitType == TRACE_HitCeiling ) + { + if ( t.Results.ffloor ) normal = -t.Results.ffloor.bottom.Normal; + else normal = t.Results.HitSector.ceilingplane.Normal; + dir -= 2*normal*(dir dot normal); + } + else + { + // why the fuck + t.Results.HitPos = level.Vec3Offset(pos,x*beamsize); + normal *= 0; + } + if ( t.Results.HitType != TRACE_HitNone ) + { + A_SprayDecal("BoltScorch",beamsize+8); + int numpt = Random[Impaler](10,20)*!Random[Impaler](0,2); + for ( int i=0; i 1) ) + { + dirto = level.Vec3Diff(pos,tracer.Vec3Offset(0,0,tracer.height/2)); + distto = dirto.length(); + dirto /= distto; + distto = 1.-clamp(distto*0.1,0.,.9); + } + dir = (x+y*cos(a)*s+z*sin(a)*s+dirto*distto).unit(); + dir = dir*.5+oldx*.5; + oldx = dir; + A_SetAngle(atan2(dir.y,dir.x)); + A_SetPitch(asin(-dir.z)); + CheckBeam(dir); + } + Default + { + RenderStyle "Add"; + Obituary "$O_IMPALER2"; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +INTERPOLATEANGLES; + +NOTELEPORT; + } + States + { + Spawn: + PBLT # -1 Bright; + Stop; + Dummy: + PBLT ABCDE -1; + Stop; + } +} + +Class ImpalerFlare : Actor +{ + Default + { + RenderStyle "Add"; + Scale 0.02; + Alpha 0.5; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +INTERPOLATEANGLES; + +NOTELEPORT; + +FORCEXYBILLBOARD; + +ROLLSPRITE; + } + States + { + Spawn: + IFLA A -1 Bright; + Stop; + } +} + +Class StarterImpalerBolt : ImpalerBolt +{ + Array hitlist; + Actor flares[2]; + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + start = self; + flares[0] = Spawn("ImpalerFlare",pos); + flares[1] = Spawn("ImpalerFlare",pos); + oldx = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + } + override void OnDestroy() + { + Super.OnDestroy(); + if ( flares[0] ) flares[0].Destroy(); + if ( flares[1] ) flares[1].Destroy(); + } + override void Tick() + { + Super.Tick(); + frame++; + if ( frame > 4 ) frame = 0; + if ( isFrozen() ) return; + if ( !target ) + { + Destroy(); + return; + } + Vector3 x, y, z, origin; + bRELATIVETOFLOOR = (target.pos.z <= target.floorz); // hack, but kinda works + if ( target.player ) + { + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); + origin = target.Vec2OffsetZ(0,0,target.player.viewz)+15*x+2*y-2.5*z; + } + else origin = target.Vec3Offset(0,0,target.missileheight); + SetOrigin(origin,true); + if ( !flares[0] ) flares[0] = Spawn("ImpalerFlare",pos); + if ( !flares[1] ) flares[1] = Spawn("ImpalerFlare",pos); + flares[1].bRELATIVETOFLOOR = flares[0].bRELATIVETOFLOOR = bRELATIVETOFLOOR; + flares[0].SetOrigin(pos,true); + flares[1].SetOrigin(pos,true); + flares[0].roll += 15.; + flares[1].roll += 5.; + flares[0].A_SetScale(0.01+cos(gametic*8)*0.002); + flares[1].A_SetScale(0.02+cos(gametic*8)*0.004); + double a = FRandom[Impaler](0,360), s = FRandom[Impaler](0.,.1); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); + Vector3 dir = (x+cos(a)*y*s+sin(a)*z*s).unit(); + dir = oldx*.5+dir*.5; + oldx = dir; + A_SetAngle(atan2(dir.y,dir.x)); + A_SetPitch(asin(-dir.z)); + hitlist.Clear(); + CheckBeam((cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch))); + } +} + Class ImpalerProjectile : Actor { Default @@ -70,20 +532,28 @@ Class ImpalerProjectile : Actor +EXPLODEONWATER; +FORCERADIUSDMG; +NODAMAGETHRUST; + +INTERPOLATEANGLES; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_PlaySound("impaler/fly",CHAN_BODY,1.,true,2.); } action void A_ImpalerHit() { + A_StopSound(CHAN_BODY); bFORCEXYBILLBOARD = true; scale *= 2.+special1*0.01; A_AlertMonsters(); A_SetRenderStyle(1.,STYLE_Add); A_NoGravity(); - A_Explode(90+special1,120+special1/2); - UTMainHandler.DoBlast(self,120+special1/2,40000); - A_QuakeEx(2,2,2,5,0,250+special1/2,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120+special1/2,rollintensity:0.2); + A_Explode(50+special1/2,120+special1/5); + UTMainHandler.DoBlast(self,120+special1/5,40000); + A_QuakeEx(2,2,2,5,0,250+special1/5,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120+special1/2,rollintensity:0.2); A_PlaySound("impaler/hit",CHAN_VOICE); - A_SprayDecal("WallCrack",20); - Spawn("ImpalerBurstLight",pos); + A_SprayDecal("ShockMark",20); + let l = Spawn("ImpalerBurstLight",pos); + l.Args[3] += special1/5; double ang, pt; int numpt = Random[Impaler](4,8); for ( int i=0; i 80 ) + { + numpt = special1/90; + for ( int i=0; i 120 ) + { + numpt = special1/120; + for ( int i=0; i 0) ) { weap.DepleteAmmo(false,true,1); invoker.ClipCount = invoker.default.ClipCount; } A_Overlay(-3,"GemUp"); A_Overlay(-2,"ZapUp"); - A_OverlayFlags(-2,PSPF_RenderStyle|PSPF_Alpha,true); + A_OverlayFlags(-2,PSPF_RenderStyle|PSPF_ForceStyle|PSPF_Alpha|PSPF_ForceAlpha,true); A_OverlayRenderStyle(-2,STYLE_Add); A_PlaySound("impaler/gem",CHAN_WEAPON,looping:true); } else { - A_Overlay(-3,"GemDown"); - A_Overlay(-2,"ZapDown"); + player.SetPSprite(-3,invoker.FindState("GemDown")); + player.SetPSprite(-2,invoker.FindState("ZapDown")); A_PlaySound("impaler/gemdown",CHAN_WEAPON); } if ( self is 'UTPlayer' ) UTPlayer(self).PlayReloading(); @@ -372,8 +991,8 @@ Class Impaler : UnrealWeapon IMPG A 0 { invoker.HasGem = false; - A_Overlay(-3,"GemDown"); - A_Overlay(-2,"ZapDown"); + player.SetPSprite(-3,invoker.FindState("GemDown")); + player.SetPSprite(-2,invoker.FindState("ZapDown")); A_PlaySound("impaler/gemdown",CHAN_WEAPON); } IMPG ABCDE 2; @@ -418,12 +1037,5 @@ Class Impaler : UnrealWeapon ZapAltRelease: IMZA QRSTUVWX 2 Bright; Goto ZapIdle; - MuzzleFlash: - IMFF A 3 Bright - { - let l = Spawn("ImpalerLight",pos); - l.target = self; - } - Stop; } } diff --git a/zscript/napalm.zsc b/zscript/napalm.zsc index 595509b..5386458 100644 --- a/zscript/napalm.zsc +++ b/zscript/napalm.zsc @@ -213,9 +213,9 @@ Class UFlame : Actor { let s = Spawn("UTSmoke",pos); s.vel = (FRandom[FlameT](-0.2,0.2),FRandom[FlameT](-0.2,0.2),FRandom[FlameT](-0.2,0.2)); - s.vel += vel*0.6; + s.vel += vel*0.3; s.alpha *= alpha*4; - s.scale = scale*(.5+GetAge()/6.); + s.scale *= 0.5+abs(scale.x)*(.5+GetAge()/6.); Destroy(); return; } @@ -223,9 +223,9 @@ Class UFlame : Actor { let s = Spawn("UTSmoke",pos); s.vel = (FRandom[FlameT](-0.2,0.2),FRandom[FlameT](-0.2,0.2),FRandom[FlameT](-0.2,0.2)); - s.vel += vel*0.6; + s.vel += vel*0.3; s.alpha *= alpha*4; - s.scale = scale*(.5+GetAge()/6.); + s.scale *= 0.5+abs(scale.x)*(.5+GetAge()/6.); } if ( bAMBUSH ) return; if ( Random[FlameT](0,int(20*((default.alpha+0.1)-alpha))) ) return; diff --git a/zscript/stinger.zsc b/zscript/stinger.zsc index c359e4e..d4d2a88 100644 --- a/zscript/stinger.zsc +++ b/zscript/stinger.zsc @@ -277,7 +277,7 @@ Class TarydiumDebuff : Thinker void BlowUp() { reentrant = true; - let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(0,0,victim.height/2)); + let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(0,0,victim.default.height/2)); b.target = instigator; b.special1 = amount; b.scale *= 1.+min(1.5,amount*0.02); diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index 633958d..2907fd4 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -196,7 +196,7 @@ Class UPlayer : UTPlayer let dsp = DispersionPistol(FindInventory('DispersionPistol')); if ( dsp ) { - dsp.Ammo1.MaxAmount = 90; + dsp.Ammo1.Amount = dsp.Ammo1.MaxAmount = 90; if ( (player.ReadyWeapon == dsp) && (player.PendingWeapon == WP_NOCHANGE) ) dsp.pendingupgrade = 4; else