Merge branch 'devel' into experimental
This commit is contained in:
commit
ab5652a9e3
14 changed files with 74 additions and 44 deletions
|
|
@ -39,3 +39,5 @@ server bool flak_radboots = true; // jump boots protect against damaging floor
|
|||
server bool flak_blood = true; // [WIP] use doom tournament blood (disable if using another gore mod)
|
||||
server bool flak_gibs = false; // [WIP/UNSTABLE] use doom tournament gibbing (disable if using another gore mod)
|
||||
server bool flak_doomtest = false; // made toggleable due to loud complaints
|
||||
server bool flak_dmsshock = false; // allow enhanced shock rifle on deathmatch (otherwise they are replaced with udamage)
|
||||
server noarchive bool flak_instagib = false; // instagib mode (only for dm) - this cvar has to be set from the command line
|
||||
|
|
@ -32,6 +32,7 @@ OptionMenu "UTOptionMenu"
|
|||
StaticText " "
|
||||
StaticText "Item Options", "Gold"
|
||||
Option "Jump Boots Act Like Radsuit", "flak_radboots", "YesNo"
|
||||
Option "Allow Enh. Shock Rifle in DM", "flak_dmsshock", "YesNo"
|
||||
StaticText " "
|
||||
StaticText "Translocator (Potentially Game-Breaking)", "Gold"
|
||||
Option "Prevent Boss Telefrag", "flak_nobosstelefrag", "YesNo"
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ Model "SuperShockRifleWave"
|
|||
Path "models"
|
||||
Model 0 "shockrwm_d.3d"
|
||||
Skin 0 "sshocktt1.png"
|
||||
Scale 0.6 0.5 1.5
|
||||
Scale 0.6 0.5 0.5
|
||||
PitchOffset 90
|
||||
|
||||
FrameIndex SWAV A 0 0
|
||||
|
|
|
|||
|
|
@ -514,7 +514,7 @@ Class BioGel : Actor
|
|||
invoker.deadtimer = -2;
|
||||
if ( invoker.atline ) invoker.atline.RemoteActivate(target,invoker.atside,SPAC_Impact,pos);
|
||||
UTMainHandler.DoBlast(self,Min(175,int(Scale.x*50)),20000*Scale.x);
|
||||
A_Explode(int(Random[GES](18,26)*Scale.x),Min(175,int(Scale.x*50)));
|
||||
A_Explode(int(20*Scale.x),Min(175,int(Scale.x*50)));
|
||||
A_PlaySound("ges/explode",CHAN_VOICE);
|
||||
int numpt = Min(300,int(Scale.x*30))+Random[GES](-10,10);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Class UTChainsaw : UTWeapon
|
|||
LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Chainsaw](20,30);
|
||||
int dmg = 20;
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
d.HitActor.vel -= x*(500/d.HitActor.mass);
|
||||
vel += x*(100/mass);
|
||||
|
|
@ -98,9 +98,9 @@ Class UTChainsaw : UTWeapon
|
|||
LineTrace(ang,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Chainsaw](20,30);
|
||||
int dmg = 20;
|
||||
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.8) )
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg*2,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg*3,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
else dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
d.HitActor.vel = -y*(1200/d.HitActor.mass);
|
||||
vel += x*(100/mass);
|
||||
|
|
@ -164,6 +164,7 @@ Class UTChainsaw : UTWeapon
|
|||
Weapon.SelectionOrder 9;
|
||||
+WEAPON.MELEEWEAPON;
|
||||
+FORCEPAIN;
|
||||
+NOEXTREMEDEATH;
|
||||
}
|
||||
States
|
||||
{
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ Class UTRocket : Actor
|
|||
}
|
||||
Wait;
|
||||
Death:
|
||||
TNT1 A 0 A_RocketExplode(Random[Eightball](90,120),160);
|
||||
TNT1 A 0 A_RocketExplode(100,160);
|
||||
SSMX ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
|
|
@ -278,7 +278,7 @@ Class UTGrenade : UTRocket
|
|||
}
|
||||
Goto Spawn;
|
||||
Death:
|
||||
TNT1 A 0 A_RocketExplode(Random[Eightball](100,150),140);
|
||||
TNT1 A 0 A_RocketExplode(120,140);
|
||||
Goto Super::Death+1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ Class Enforcer : UTWeapon
|
|||
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Enforcer](12,17);
|
||||
int dmg = 17;
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
double mm = 3000;
|
||||
if ( FRandom[Enforcer](0,1) < 0.2 ) mm *= 5;
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ Class FlakChunk : Actor
|
|||
Radius 2;
|
||||
Height 2;
|
||||
Speed 32;
|
||||
DamageFunction Random[Flak](15,20);
|
||||
DamageFunction 16;
|
||||
DamageType 'Shredded';
|
||||
BounceType "Hexen";
|
||||
BounceFactor 1.0;
|
||||
|
|
@ -475,7 +475,7 @@ Class FlakSlug : Actor
|
|||
A_NoGravity();
|
||||
A_SetScale(1.2);
|
||||
UTMainHandler.DoBlast(self,120,75000);
|
||||
A_Explode(Random[Flak](70,80),120);
|
||||
A_Explode(70,120);
|
||||
A_QuakeEx(4,4,4,8,0,170,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120,rollIntensity:0.2);
|
||||
A_PlaySound("flak/explode",CHAN_VOICE);
|
||||
A_AlertMonsters();
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ Class ImpactHammer : UTWeapon
|
|||
LineTrace(angle,60,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = int(Random[Impact](90,120)*realcharge);
|
||||
int dmg = int(60*realcharge);
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
d.HitActor.vel = x*(8000/d.HitActor.mass)*realcharge;
|
||||
if ( d.HitActor.bNOBLOOD )
|
||||
|
|
@ -95,7 +95,7 @@ Class ImpactHammer : UTWeapon
|
|||
else if ( d.HitType != TRACE_HitNone )
|
||||
{
|
||||
realcharge = max(1.0,realcharge);
|
||||
int dmg = int(Random[Impact](16,24)*realcharge); // It's a flat damage of 36 on UT, but I think it's more fair for it to scale
|
||||
int dmg = int(24*realcharge); // It's a flat damage on UT, but I think it's more fair for it to scale
|
||||
dmg = DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
TraceBleed(dmg,invoker);
|
||||
vel -= x*(1200/mass)*realcharge;
|
||||
|
|
@ -140,13 +140,13 @@ Class ImpactHammer : UTWeapon
|
|||
double dscale = d.Distance/120.;
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = int(Random[Impact](25,35)*dscale);
|
||||
int dmg = int(20*dscale);
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
d.HitActor.vel = x*(4000/d.HitActor.mass)*dscale;
|
||||
}
|
||||
else if ( d.HitType != TRACE_HitNone )
|
||||
{
|
||||
int dmg = int(Random[Impact](16,24)*dscale);
|
||||
int dmg = int(24*dscale);
|
||||
dmg = DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
vel -= x*(600/mass)*dscale;
|
||||
if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4);
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ Class PulseBall : Actor
|
|||
Obituary "%o ate %k's burning plasma death.";
|
||||
DamageType 'Pulsed';
|
||||
RenderStyle "Add";
|
||||
DamageFunction Random[Pulse](20,30);
|
||||
DamageFunction 20;
|
||||
PROJECTILE;
|
||||
+EXPLODEONWATER;
|
||||
+SKYEXPLODE;
|
||||
|
|
@ -373,12 +373,12 @@ Class PulseBolt : Actor
|
|||
if ( !damagedactor )
|
||||
{
|
||||
accdamage = min(0.5*(level.time-lasthit),0.1);
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
else if ( t.Results.HitActor != damagedactor )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
lasthit = level.time;
|
||||
|
|
@ -386,7 +386,7 @@ Class PulseBolt : Actor
|
|||
accdamage += 1./TICRATE;
|
||||
if ( accdamage > 0.17 )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -436,7 +436,7 @@ Class PulseBolt : Actor
|
|||
}
|
||||
else if ( damagedactor )
|
||||
{
|
||||
damagedactor.DamageMobj(self,target,int(Random[Pulse](65,75)*accdamage),'zapped');
|
||||
damagedactor.DamageMobj(self,target,int(72*accdamage),'zapped');
|
||||
accdamage = 0;
|
||||
damagedactor = null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Class Razor2 : Actor
|
|||
Radius 2;
|
||||
Height 2;
|
||||
Speed 25;
|
||||
DamageFunction (Random[Ripper](20,25)*((DamageType=='Decapitated')?3:1.0));
|
||||
DamageFunction (int(30*((DamageType=='Decapitated')?3.5:1.0)));
|
||||
DamageType 'Shredded';
|
||||
Obituary "%k ripped a chunk of meat out of %o with the Ripper.";
|
||||
BounceType "Hexen";
|
||||
|
|
@ -200,7 +200,7 @@ Class Razor2Alt : Razor2
|
|||
A_AlertMonsters();
|
||||
A_SprayDecal("RazorBlast",20);
|
||||
UTMainHandler.DoBlast(self,90,87000);
|
||||
A_Explode(Random[Ripper](30,50),90,damagetype:'RipperAltDeath');
|
||||
A_Explode(34,90,damagetype:'RipperAltDeath');
|
||||
A_QuakeEx(3,3,3,10,0,140,"",QF_RELATIVE|QF_SCALEDOWN,falloff:90,rollIntensity:0.1);
|
||||
int numpt = Random[Ripper](10,20);
|
||||
Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
|
||||
|
|
|
|||
|
|
@ -342,7 +342,7 @@ Class ShockBeam : Actor
|
|||
let b = t.Results.HitActor.target;
|
||||
UTMainHandler.DoBlast(b,250,70000);
|
||||
b.ExplodeMissile(null,self);
|
||||
b.A_Explode(Random[ASMD](150,180),250);
|
||||
b.A_Explode(165,250);
|
||||
b.A_QuakeEx(6,6,6,60,0,1200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:250,rollIntensity:0.2);
|
||||
b.A_SprayDecal("BigShockMark1",100);
|
||||
b.A_SprayDecal("BigShockMark2",100);
|
||||
|
|
@ -362,7 +362,7 @@ Class ShockBeam : Actor
|
|||
}
|
||||
else
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,Random[ASMD](35,50),'jolted',DMG_USEANGLE,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,40,'jolted',DMG_USEANGLE,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
UTMainHandler.DoKnockback(t.Results.HitActor,t.Results.HitVector,60000);
|
||||
let r = Spawn("ShockBeamRing",pos);
|
||||
r.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x);
|
||||
|
|
@ -575,7 +575,7 @@ Class SuperShockBeam : Actor
|
|||
let b = t.Results.HitActor.target;
|
||||
UTMainHandler.DoBlast(b,400,70000);
|
||||
b.ExplodeMissile(null,self);
|
||||
b.A_Explode(Random[ASMD](15000,16000),400);
|
||||
b.A_Explode(int.max,400);
|
||||
b.A_QuakeEx(9,9,9,60,0,2400,"",QF_RELATIVE|QF_SCALEDOWN,falloff:400,rollIntensity:0.4);
|
||||
b.A_SprayDecal("BigShockMark1",100);
|
||||
b.A_SprayDecal("SBigShockMark2",100);
|
||||
|
|
@ -599,7 +599,10 @@ Class SuperShockBeam : Actor
|
|||
// the actor may "cease to exist" if it dies after the call to ExplodeMissile, so guard against that
|
||||
if ( t.Results.HitActor )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,Random[ASMD](3500,5000),'joltedX',DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
// damage was 1000 in UT but it's meant to be instakill and players couldn't reach that health legitimately anyway, so rather than
|
||||
// some absurd number they settled for that
|
||||
// we ain't goin' that way here
|
||||
t.Results.HitActor.DamageMobj(self,target,int.max,'joltedX',DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
UTMainHandler.DoKnockback(t.Results.HitActor,t.Results.HitVector,60000);
|
||||
}
|
||||
let r = Spawn("SuperShockBeamRing",pos);
|
||||
|
|
@ -644,7 +647,7 @@ Class SuperShockBeam : Actor
|
|||
if ( !flak_classicsshock )
|
||||
{
|
||||
UTMainHandler.DoBlast(self,50,60000);
|
||||
A_Explode(Random[ASMD](500,800),50);
|
||||
A_Explode(int.max,50);
|
||||
}
|
||||
A_QuakeEx(6,6,6,5,0,100,"",QF_RELATIVE|QF_SCALEDOWN,falloff:50,rollIntensity:0.2);
|
||||
A_PlaySound("shock/hit",CHAN_VOICE,attenuation:0.5);
|
||||
|
|
@ -853,7 +856,7 @@ Class ShockBall : Actor
|
|||
action void A_BallExplode()
|
||||
{
|
||||
UTMainHandler.DoBlast(self,70,70000);
|
||||
A_Explode(Random[ASMD](50,60),70);
|
||||
A_Explode(55,70);
|
||||
A_SprayDecal("ShockMarkBig",16);
|
||||
Spawn("ShockExplLight",pos);
|
||||
A_SetScale(1.0);
|
||||
|
|
@ -917,7 +920,7 @@ Class SuperShockBall : Actor
|
|||
action void A_BallExplode()
|
||||
{
|
||||
UTMainHandler.DoBlast(self,120,70000);
|
||||
A_Explode(Random[ASMD](4000,5000),120);
|
||||
A_Explode(int.max,120);
|
||||
A_SprayDecal("ShockMarkBig",16);
|
||||
Spawn("SuperShockExplLight",pos);
|
||||
A_SetScale(1.5);
|
||||
|
|
@ -1141,24 +1144,24 @@ Class EnhancedShockAmmo : Ammo
|
|||
{
|
||||
int ticcnt;
|
||||
|
||||
override void BeginPlay()
|
||||
{
|
||||
Super.BeginPlay();
|
||||
if ( deathmatch )
|
||||
{
|
||||
MaxAmount /= 2;
|
||||
BackpackMaxAmount /= 2;
|
||||
}
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !Owner ) return;
|
||||
ticcnt++;
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
if ( ticcnt < 35 ) return;
|
||||
ticcnt = 0;
|
||||
if ( Amount < MaxAmount ) Amount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ticcnt < 105 ) return;
|
||||
ticcnt = 0;
|
||||
if ( Amount > 0 ) Amount--;
|
||||
}
|
||||
}
|
||||
Default
|
||||
{
|
||||
Tag "Enhanced Shock Core";
|
||||
|
|
|
|||
|
|
@ -102,10 +102,10 @@ Class SniperRifle : UTWeapon
|
|||
LineTrace(angle,10000,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Sniper](45,60);
|
||||
int dmg = 45;
|
||||
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.81) )
|
||||
{
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg+70,'Decapitated',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,100,'Decapitated',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
UTMainHandler.DoKnockback(d.HitActor,d.HitDir,35000);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1549,7 +1549,7 @@ Class UTMainHandler : EventHandler
|
|||
else if ( e.Replacee == 'BFG9000' ) e.Replacement = 'WarheadLauncher';
|
||||
else if ( e.Replacee == 'Mace' )
|
||||
{
|
||||
if ( !Random[Replacements](0,6) ) e.Replacement = 'EnhancedShockRifle';
|
||||
if ( (!deathmatch || flak_dmsshock) && !Random[Replacements](0,6) ) e.Replacement = 'EnhancedShockRifle';
|
||||
else e.Replacement = 'WarheadLauncher';
|
||||
}
|
||||
else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) e.Replacement = 'EClip';
|
||||
|
|
@ -1605,7 +1605,7 @@ Class UTMainHandler : EventHandler
|
|||
else if ( Random[Replacements](0,1) ) e.Replacement = 'MiniAmmo';
|
||||
else e.Replacement = 'RifleAmmo';
|
||||
}
|
||||
else if ( e.Replacee == 'InvulnerabilitySphere' ) e.Replacement = 'EnhancedShockRifle';
|
||||
else if ( e.Replacee == 'InvulnerabilitySphere' ) e.Replacement = (!deathmatch||flak_dmsshock)?'EnhancedShockRifle':'UDamage';
|
||||
else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiEgg') ) e.Replacement = 'UDamage';
|
||||
else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'UTHealthPack';
|
||||
else if ( (e.Replacee == 'Megasphere') || (e.Replacee == 'ArtiInvulnerability') ) e.Replacement = 'UTShieldBelt';
|
||||
|
|
@ -1877,15 +1877,38 @@ Class UTMainHandler : EventHandler
|
|||
override void WorldThingSpawned( WorldEvent e )
|
||||
{
|
||||
if ( flak_nobosstelefrag && e.Thing.bBOSS ) e.Thing.bNOTELEFRAG = true;
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
if ( (e.Thing is 'EnhancedShockRifle') || (e.Thing is 'EnhancedShockAmmo') ) return;
|
||||
if ( e.Thing is 'Inventory' ) e.Thing.Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
override void PlayerEntered( PlayerEvent e )
|
||||
{
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
players[e.playernumber].mo.GiveInventory("EnhancedShockRifle",1);
|
||||
if ( players[e.playernumber].bot )
|
||||
{
|
||||
// fix bots not having the weapon raised when changing map
|
||||
let ess = Weapon(players[e.playernumber].mo.FindInventory("EnhancedShockRifle"));
|
||||
players[e.playernumber].ReadyWeapon = ess;
|
||||
players[e.playernumber].PendingWeapon = WP_NOCHANGE;
|
||||
players[e.playernumber].mo.BringUpWeapon();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( flak_translocator )
|
||||
players[e.playernumber].mo.GiveInventory("Translocator",1);
|
||||
}
|
||||
override void PlayerRespawned( PlayerEvent e )
|
||||
{
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
players[e.playernumber].mo.GiveInventory("EnhancedShockRifle",1);
|
||||
return;
|
||||
}
|
||||
if ( flak_translocator )
|
||||
players[e.playernumber].mo.GiveInventory("Translocator",1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue