Beta 4 Hotfix 1:
- Nerfed Fireblaster, damage was too high for its speed (30/60 → 10/20), to compensate for the dramatic alt projectile nerf, its embers now deal short radius splash damage. - Nerfed Impaler altfire, no longer an instant "I win" weapon (damage interval raised from 5 to 15 tics, also beam becomes weaker at low charge, starting to drop from 100% at half-charge to 50% at zero charge). - Fixed Impaler crash when shooter dies while firing beam. - Updated the reload code of the SMP, I forgot about it. - Increased the Detector range again, 1024 is more reasonable. - Fixed Minigun altfire not triggering if player was holding primary fire. - Removed pistols from Super Shotgun replacement pool. - Increased spawn chance of Flamethrower, since it almost never appears in practice. - Capped maximum Flamethrower damage (75 → 20), this was way too high and made the weapon too overpowered.
This commit is contained in:
parent
a54f1495c7
commit
5db3f32274
7 changed files with 58 additions and 27 deletions
|
|
@ -53,7 +53,7 @@ Class UFireball : Actor
|
|||
Default
|
||||
{
|
||||
DamageType 'Fire';
|
||||
DamageFunction 30;
|
||||
DamageFunction 10;
|
||||
Radius 4;
|
||||
Height 4;
|
||||
Speed 15;
|
||||
|
|
@ -121,7 +121,12 @@ Class UFireball : Actor
|
|||
{
|
||||
A_SetRenderStyle(1.,STYLE_Add);
|
||||
A_NoGravity();
|
||||
if ( !bAMBUSH )
|
||||
if ( bAMBUSH )
|
||||
{
|
||||
A_Explode(GetMissileDamage(0,0),20);
|
||||
UTMainHandler.DoBlast(self,20,3000);
|
||||
}
|
||||
else
|
||||
{
|
||||
A_PlaySound("flamegun/exp",CHAN_VOICE,pitch:1.2);
|
||||
Spawn("UFireLight",pos);
|
||||
|
|
@ -177,7 +182,7 @@ Class UFireball2 : UFireball
|
|||
{
|
||||
Radius 8;
|
||||
Height 8;
|
||||
DamageFunction 60;
|
||||
DamageFunction 20;
|
||||
Speed 5;
|
||||
UFireball.SpreadFactor 0.35;
|
||||
UFireball.NumSmokes 2;
|
||||
|
|
@ -388,7 +393,16 @@ Class FlameGun : UnrealWeapon
|
|||
}
|
||||
FGNF G 0 A_ClearRefire();
|
||||
FGNF GHIJ 2;
|
||||
FGNT A 0 A_PlaySound("flamegun/end",CHAN_6,Dampener.Active(self)?.1:1.);
|
||||
FGNT A 0
|
||||
{
|
||||
if ( invoker.CheckAmmo(0,false,true) && (waterlevel < 2) )
|
||||
A_Refire("Fire");
|
||||
}
|
||||
FGNT A 0
|
||||
{
|
||||
A_PlaySound("flamegun/end",CHAN_6,Dampener.Active(self)?.1:1.);
|
||||
A_ClearRefire();
|
||||
}
|
||||
FGNT ABCDEFGHIJKLM 2;
|
||||
Goto Idle;
|
||||
Refire:
|
||||
|
|
|
|||
|
|
@ -220,6 +220,11 @@ Class ImpalerBoltHit : Actor
|
|||
+NOTELEPORT;
|
||||
Scale 0.3;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !master ) Destroy();
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
|
|
@ -264,16 +269,16 @@ Class ImpalerBolt : Actor
|
|||
t.Trace(pos,cursector,x,beamsize,0);
|
||||
for ( int i=0; i<t.HitList.Size(); i++ )
|
||||
{
|
||||
if ( !(GetAge()%5) )
|
||||
if ( !(GetAge()%15) )
|
||||
{
|
||||
UTMainHandler.DoKnockback(t.hitlist[i].hitactor,t.hitlist[i].x,500*specialf1**2);
|
||||
t.hitlist[i].hitactor.DamageMobj(self,target,int(10*specialf1**1.5),'Impaler',DMG_THRUSTLESS);
|
||||
t.hitlist[i].hitactor.DamageMobj(self,target,int(max(5,10*specialf1**1.5)),'Impaler',DMG_THRUSTLESS);
|
||||
}
|
||||
if ( start.Hitlist.Find(t.HitList[i].HitActor) == start.HitList.Size() )
|
||||
if ( start && (start.Hitlist.Find(t.HitList[i].HitActor) == start.HitList.Size()) )
|
||||
start.Hitlist.Push(t.HitList[i].HitActor);
|
||||
}
|
||||
// seeking
|
||||
double closest = 500*specialf1;
|
||||
double closest = max(200,500*specialf1);
|
||||
if ( tracer )
|
||||
{
|
||||
double tdist = Distance3D(tracer);
|
||||
|
|
@ -284,7 +289,7 @@ Class ImpalerBolt : Actor
|
|||
while ( bt.Next() )
|
||||
{
|
||||
let a = bt.Thing;
|
||||
if ( !a || !a.bSHOOTABLE || !a.bISMONSTER || (a.Health <= 0) || target.IsFriend(a) || !CheckSight(a) || (start.Hitlist.Find(a) < start.HitList.Size()) ) continue;
|
||||
if ( !a || !a.bSHOOTABLE || !a.bISMONSTER || (a.Health <= 0) || target.IsFriend(a) || !CheckSight(a) || (start && (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;
|
||||
|
|
@ -341,7 +346,7 @@ Class ImpalerBolt : Actor
|
|||
s.scale *= .4;
|
||||
s.vel = (FRandom[Impaler](-1,1),FRandom[Impaler](-1,1),FRandom[Impaler](-1,1)).unit()*FRandom[Impaler](.2,.8);
|
||||
}
|
||||
if ( (special1 < int(10*specialf1)) && (special2 < int(40*specialf1**.5)) && (start.hitlist.Size() < int(4*specialf1)) && (waterlevel <= 0) )
|
||||
if ( (special1 < int(max(5,10*specialf1))) && (special2 < int(max(20,40*specialf1**.5))) && (start && (start.hitlist.Size() < int(max(4,4*specialf1)))) && (waterlevel <= 0) )
|
||||
{
|
||||
if ( !next )
|
||||
{
|
||||
|
|
@ -353,7 +358,7 @@ Class ImpalerBolt : Actor
|
|||
next.tracer = tracer;
|
||||
next.special1 = special1+1;
|
||||
next.special2 = special2+1;
|
||||
next.specialf1 = max(1.,specialf1);
|
||||
next.specialf1 = specialf1;
|
||||
next.oldx = dir;
|
||||
next.bHITOWNER = !sting_impself;
|
||||
}
|
||||
|
|
@ -361,20 +366,28 @@ Class ImpalerBolt : Actor
|
|||
{
|
||||
next.tracer = tracer;
|
||||
next.special1 = special1+1;
|
||||
next.specialf1 = max(1.,specialf1);
|
||||
next.specialf1 = specialf1;
|
||||
next.bHITOWNER = !sting_impself;
|
||||
next.UpdateBeam(self,t.Results.HitPos+normal,dir);
|
||||
}
|
||||
if ( t.Results.HitType != TRACE_HitNone )
|
||||
{
|
||||
if ( !weffect ) weffect = Spawn("ImpalerBoltHit",t.Results.HitPos+normal*4);
|
||||
if ( !weffect )
|
||||
{
|
||||
weffect = Spawn("ImpalerBoltHit",t.Results.HitPos+normal*4);
|
||||
weffect.master = self;
|
||||
}
|
||||
weffect.SetOrigin(t.Results.HitPos+normal*4,true);
|
||||
weffect.sprite = weffect.GetSpriteIndex('IHIT');
|
||||
}
|
||||
else if ( weffect ) weffect.Destroy();
|
||||
return;
|
||||
}
|
||||
if ( !weffect ) weffect = Spawn("ImpalerBoltHit",t.Results.HitPos+normal*4);
|
||||
if ( !weffect )
|
||||
{
|
||||
weffect = Spawn("ImpalerBoltHit",t.Results.HitPos+normal*4);
|
||||
weffect.master = self;
|
||||
}
|
||||
if ( t.Results.HitType != TRACE_HitNone ) weffect.sprite = weffect.GetSpriteIndex('IHIT');
|
||||
else weffect.sprite = weffect.GetSpriteIndex('ICAP');
|
||||
weffect.SetOrigin(t.Results.HitPos+normal*4,true);
|
||||
|
|
@ -738,7 +751,10 @@ Class Impaler : UnrealWeapon
|
|||
if ( invoker.ClipCount <= 0 ) return;
|
||||
double mul = Amplifier.GetMult(self,10);
|
||||
if ( invoker.beam )
|
||||
{
|
||||
invoker.beam.specialf1 = mul;
|
||||
invoker.beam.specialf1 *= .5+clamp(invoker.clipcount/double(invoker.default.clipcount),.0,.5);
|
||||
}
|
||||
invoker.clipcount = max(0,invoker.clipcount-int(mul));
|
||||
}
|
||||
invoker.FireEffect();
|
||||
|
|
@ -897,7 +913,7 @@ Class Impaler : UnrealWeapon
|
|||
{
|
||||
let weap = Weapon(invoker);
|
||||
int flags = 0;
|
||||
if ( weap.Ammo1.Amount > 0 ) flags |= WRF_ALLOWRELOAD;
|
||||
if ( (weap.Ammo1.Amount > 0) || (invoker.ClipCount > 0) ) flags |= WRF_ALLOWRELOAD;
|
||||
if ( invoker.HasGem && ((invoker.ClipCount <= 0) || (waterlevel >= 2)) ) flags |= WRF_NOSECONDARY;
|
||||
A_WeaponReady(flags);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ Class OnFire : Thinker
|
|||
{
|
||||
cnt = 10;
|
||||
if ( victim.bSHOOTABLE && (victim.Health > 0) && (amount > 0) )
|
||||
victim.DamageMobj(instigator.FindInventory("UFlamethrower"),instigator,max(1,int(amount*(victim.bBOSS?0.05:0.15))),'Fire',DMG_THRUSTLESS);
|
||||
victim.DamageMobj(instigator.FindInventory("UFlamethrower"),instigator,clamp(int(amount*(victim.bBOSS?0.05:0.15)),1,20),'Fire',DMG_THRUSTLESS);
|
||||
if ( !victim )
|
||||
{
|
||||
Destroy();
|
||||
|
|
|
|||
|
|
@ -65,12 +65,13 @@ Class OLSMP : UnrealWeapon
|
|||
{
|
||||
int ClipCount;
|
||||
double AltAccuracy;
|
||||
bool ClipOut;
|
||||
|
||||
property ClipCount : ClipCount;
|
||||
|
||||
override int, int, bool, bool GetClipAmount()
|
||||
{
|
||||
return ClipCount, -1, (ClipCount<35), false;
|
||||
return ClipOut?-1:ClipCount, -1, (ClipCount<35), false;
|
||||
}
|
||||
override bool TryPickup( in out Actor toucher )
|
||||
{
|
||||
|
|
@ -323,8 +324,7 @@ Class OLSMP : UnrealWeapon
|
|||
AUTR A 0 A_JumpIf(invoker.clipcount>=min(invoker.default.clipcount,invoker.Ammo1.Amount),"Idle");
|
||||
AUTR A 0
|
||||
{
|
||||
invoker.special1 = min(invoker.default.clipcount,invoker.Ammo1.Amount)-invoker.clipcount;
|
||||
invoker.clipcount = -1;
|
||||
invoker.clipout = true;
|
||||
A_Overlay(-9999,null);
|
||||
A_WeaponOffset(0,32); // fix sudden psprite lowering
|
||||
A_PlaySound("automag/click",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
|
||||
|
|
@ -333,9 +333,10 @@ Class OLSMP : UnrealWeapon
|
|||
AUTD ABCD 1;
|
||||
AUTD E 30
|
||||
{
|
||||
|
||||
invoker.clipcount = Min(invoker.default.clipcount,invoker.Ammo1.Amount);
|
||||
invoker.Ammo1.Amount -= invoker.special1;
|
||||
invoker.clipout = false;
|
||||
let aadd = min(invoker.Ammo1.Amount,invoker.default.clipcount-invoker.clipcount);
|
||||
invoker.clipcount += aadd;
|
||||
invoker.Ammo1.Amount -= aadd;
|
||||
A_PlaySound("automag/reload",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
|
||||
if ( self is 'UTPlayer' )
|
||||
UTPlayer(self).PlayReloading();
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ Class UMinigun : UnrealWeapon
|
|||
A_PlaySound("umini/fire",CHAN_WEAPON,Dampener.Active(self)?.1:1.,true);
|
||||
}
|
||||
MGNF ABCDEFGHIJKLMNO 1 A_FireBullet(false);
|
||||
MGNF A 0 A_JumpIf(invoker.bAltFire,1);
|
||||
MGNF A 0 A_JumpIf(player.cmd.buttons&BT_ALTATTACK,1);
|
||||
Goto Hold+1;
|
||||
AltHold:
|
||||
MGNA A 0
|
||||
|
|
|
|||
|
|
@ -919,7 +919,7 @@ Class UnrealMainHandler : EventHandler
|
|||
}
|
||||
else if ( (e.Replacee == 'Shotgun') || (e.Replacee == 'SuperShotgun') || (e.Replacee == 'Crossbow') )
|
||||
{
|
||||
if ( !Random[Replacements](0,3) )
|
||||
if ( !Random[Replacements](0,3) && (e.Replacee != 'SuperShotgun') )
|
||||
{
|
||||
if ( !Random[Replacements](0,2) ) e.Replacement = 'Betamag';
|
||||
else e.Replacement = 'Automag';
|
||||
|
|
@ -946,7 +946,7 @@ Class UnrealMainHandler : EventHandler
|
|||
{
|
||||
if ( !Random[Replacements](0,3) )
|
||||
{
|
||||
if ( !Random[Replacements](0,2) ) e.Replacement = 'UFlamethrower';
|
||||
if ( Random[Replacements](0,1) ) e.Replacement = 'UFlamethrower';
|
||||
else e.Replacement = 'FlameGun';
|
||||
}
|
||||
else if ( Random[Replacements](0,1) ) e.Replacement = 'UFlakCannon';
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ Class MotionDetector : UnrealInventory
|
|||
for ( int i=0; i<nearscan.Size(); i++ )
|
||||
{
|
||||
Vector2 absofs = level.Vec2Diff(Owner.pos.xy,nearscan[i].pos.xy);
|
||||
absofs *= (96./512.);
|
||||
absofs *= (96./1024.);
|
||||
double ang = Owner.angle-90;
|
||||
Vector2 relofs = (absofs.x*cos(ang)+absofs.y*sin(ang),-absofs.y*cos(ang)+absofs.x*sin(ang));
|
||||
if ( max(abs(relofs.x),abs(relofs.y)) > 48. ) continue;
|
||||
|
|
@ -389,7 +389,7 @@ Class MotionDetector : UnrealInventory
|
|||
else if ( !bActive && tracer ) tracer.Destroy();
|
||||
if ( !bActive ) return;
|
||||
nearscan.Clear();
|
||||
let bi = BlockThingsIterator.Create(Owner,512);
|
||||
let bi = BlockThingsIterator.Create(Owner,1024);
|
||||
while ( bi.Next() )
|
||||
{
|
||||
if ( !bi.Thing || (bi.Thing == Owner) || !bi.Thing.bISMONSTER || bi.Thing.Health <= 0 ) continue;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue