Implemented Enforcer (with dual option). Tweaked some offsets on junk. Added clip count displays.

Only 4 weapons remaining...
This commit is contained in:
Marisa the Magician 2018-05-27 17:13:58 +02:00
commit bef29efba3
15 changed files with 1210 additions and 88 deletions

View file

@ -58,7 +58,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw
LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
if ( d.HitType == TRACE_HitActor )
{
d.HitActor.DamageMobj(invoker,self,20,'slashed');
int dmg = Random[Chainsaw](16,22);
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed');
d.HitActor.vel -= x*(500/d.HitActor.mass);
vel += x*(100/mass);
if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25);
@ -70,8 +71,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw
}
else
{
d.HitActor.TraceBleed(20,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),20);
d.HitActor.TraceBleed(dmg,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
}
}
else if ( d.HitType != TRACE_HitNone )
@ -94,7 +95,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw
LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
if ( d.HitType == TRACE_HitActor )
{
d.HitActor.DamageMobj(invoker,self,110,'Decapitated');
int dmg = Random[Chainsaw](100,110);
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Decapitated');
d.HitActor.vel = -y*(1200/d.HitActor.mass);
vel += x*(100/mass);
if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25);
@ -106,8 +108,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw
}
else
{
d.HitActor.TraceBleed(110,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),110);
d.HitActor.TraceBleed(dmg,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
}
}
else if ( d.HitType != TRACE_HitNone )

View file

@ -15,23 +15,154 @@ Class EClip : MiniAmmo replaces Clip
}
}
Class EnforcerLight : DynamicLight
{
int cnt;
Default
{
DynamicLight.Type "Point";
args 255,224,64,150;
}
override void Tick()
{
Super.Tick();
if ( !target )
{
Destroy();
return;
}
if ( target.player ) SetOrigin(target.Vec2OffsetZ(0,0,target.player.viewz),true);
else SetOrigin(target.pos,true);
if ( cnt++ > 2 ) Destroy();
}
}
Class BulletImpact : Actor
{
Default
{
Radius 0.1;
Height 0;
+NOGRAVITY;
+NOCLIP;
+DONTSPLASH;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_SprayDecal("Pock",20);
int numpt = Random[Enforcer](5,10);
Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (-x+(FRandom[Enforcer](-.8,.8),FRandom[Enforcer](-.8,.8),FRandom[Enforcer](-.8,.8))).unit()*FRandom[Enforcer](0.1,1.2);
let s = Spawn("UTSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[Enforcer](128,192));
}
numpt = Random[Enforcer](3,8);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Enforcer](-1,1),FRandom[Enforcer](-1,1),FRandom[Enforcer](-1,1)).unit()*FRandom[Enforcer](2,8);
let s = Spawn("UTSpark",pos);
s.vel = pvel;
}
numpt = Random[Enforcer](2,5);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Enforcer](-1,1),FRandom[Enforcer](-1,1),FRandom[Enforcer](-1,1)).unit()*FRandom[Enforcer](2,8);
let s = Spawn("UTChip",pos);
s.vel = pvel;
}
A_PlaySound("bullet/hit",CHAN_VOICE,attenuation:4.0);
Destroy();
}
}
Class UTCasing : Actor
{
int deadtimer;
double pitchvel, anglevel;
Default
{
Radius 2;
Height 0;
+NOBLOCKMAP;
+MISSILE;
+MOVEWITHSECTOR;
+THRUACTORS;
+USEBOUNCESTATE;
BounceType "Doom";
BounceFactor 0.65;
BounceSound "bullet/casing";
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
deadtimer = 0;
pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1);
anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1);
}
override void Tick()
{
Super.Tick();
if ( InStateSequence(CurState,ResolveState("Death")) )
{
deadtimer++;
if ( deadtimer > 300 ) A_FadeOut(0.05);
return;
}
}
States
{
Spawn:
PCAS A 1
{
A_SetAngle(angle+anglevel,SPF_INTERPOLATE);
A_SetPitch(pitch+pitchvel,SPF_INTERPOLATE);
}
Loop;
Bounce:
PCAS A 0
{
pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1);
anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1);
vel = (vel.unit()+(FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2))).unit()*vel.length();
}
Goto Spawn;
Death:
PCAS A -1
{
A_SetPitch(0);
A_SetRoll(FRandom[Junk](0,360));
}
Stop;
}
}
Class Enforcer : UTWeapon replaces Pistol
{
bool Akimbo;
int ClipCount, SlaveClipCount;
bool SlaveActive, SlaveDown, SlaveReload, SlaveAltFire;
int SlaveRefire;
override string PickupMessage()
property ClipCount : ClipCount;
property SlaveClipCount : SlaveClipCount;
override void PostRender()
{
if ( Owner.CountInv(GetClass()) ) return "You picked up another Enforcer!";
else return PickupMsg;
if ( !CVar.GetCVar('flak_enforcerreload').GetBool() ) return;
if ( Amount > 1 ) Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("L Clip: % 2d / 20\nR Clip: % 2d / 20",slaveclipcount,clipcount));
else Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 20",clipcount));
}
override bool HandlePickup (Inventory item)
{
if (item.GetClass() == GetClass())
if ( item.GetClass() == GetClass() )
{
if ( !Enforcer(item).Akimbo )
if ( item.Amount == 1 )
{
Enforcer(item).Akimbo = true;
item.bPickupGood = true;
item.SetTag("Dual Enforcers");
}
@ -42,15 +173,183 @@ Class Enforcer : UTWeapon replaces Pistol
override Inventory CreateTossable( int amt )
{
// TODO separate drops
return Super.CreateTossable(amt);
Inventory inv = Super.CreateTossable(amt);
if ( inv )
{
SetTag("Enforcer");
inv.SetTag("Enforcer");
if ( Owner && (Owner.player.ReadyWeapon == self) )
{
// delete the slave overlay
PSprite psp;
for ( psp = Owner.player.psprites; psp; psp = psp.next )
{
if ( (psp.Caller == self) && (psp.id == 2) ) psp.Destroy();
slaveactive = false;
slavedown = false;
}
}
}
return inv;
}
action void A_EnforcerRefire( statelabel flash = null, bool slave = false )
{
Weapon weap = Weapon(invoker);
if ( !weap || !player ) return;
if ( slave )
{
if ( invoker.slaveclipcount < 5 ) A_PlaySound("enforcer/click",CHAN_7);
if ( (invoker.slaveclipcount <= 0) || (weap.Ammo1.Amount <= 0) )
{
invoker.slaverefire = 0;
return;
}
bool pending = (player.PendingWeapon != WP_NOCHANGE) && (player.WeaponState & WF_REFIRESWITCHOK);
if ( (player.cmd.buttons&BT_ATTACK) && !invoker.slavealtfire && !pending && (player.health > 0) )
{
invoker.slaverefire++;
if ( player.ReadyWeapon.CheckAmmo(Weapon.PrimaryFire,true) )
player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftHold"));
}
else if ( (player.cmd.buttons&BT_ALTATTACK) && invoker.slavealtfire && !pending && (player.health > 0) )
{
invoker.slaverefire++;
if ( player.ReadyWeapon.CheckAmmo(Weapon.AltFire,true) )
player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftAltHold"));
}
else
{
invoker.slaverefire = 0;
player.ReadyWeapon.CheckAmmo(invoker.slavealtfire?Weapon.AltFire:Weapon.PrimaryFire,true);
}
}
else
{
if ( invoker.clipcount < 5 ) A_PlaySound("enforcer/click",CHAN_WEAPON);
if ( (invoker.clipcount <= 0) || (weap.Ammo1.Amount <= 0) )
{
A_ClearRefire();
return;
}
A_Refire(flash);
}
}
action void A_LeftWeaponReady()
{
Weapon weap = Weapon(invoker);
if ( !weap || !player ) return;
if ( player.cmd.buttons&BT_ATTACK && !player.ReadyWeapon.bAltFire )
{
invoker.slaverefire = 0;
invoker.slavealtfire = false;
player.setpsprite(2,ResolveState("LeftFire"));
}
else if ( player.cmd.buttons&BT_ALTATTACK && player.ReadyWeapon.bAltFire )
{
invoker.slaverefire = 0;
invoker.slavealtfire = true;
player.setpsprite(2,ResolveState("LeftAltFire"));
}
}
action void A_EnforcerFire( bool alt = false, bool slave = false )
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
if ( weap.Ammo1.Amount <= 0 ) return;
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
if ( slave )
{
invoker.slaveclipcount--;
if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slaveclipcount <=0) ) invoker.slaveclipcount = Min(20,weap.Ammo1.Amount);
}
else
{
invoker.clipcount--;
if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.clipcount <=0) ) invoker.clipcount = Min(20,weap.Ammo1.Amount);
}
invoker.FireEffect();
UTMainHandler.DoFlash(self,Color(32,255,128,0),1);
A_PlaySound("enforcer/shoot",slave?CHAN_7:CHAN_WEAPON);
A_AlertMonsters();
A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08);
if ( slave )
{
if ( alt ) A_Overlay(-3,"LeftAltMuzzleFlash");
else A_Overlay(-3,"LeftMuzzleFlash");
A_OverlayFlags(-3,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
A_OverlayRenderstyle(-3,STYLE_Add);
}
else
{
if ( alt ) A_Overlay(-2,"AltMuzzleFlash");
else A_Overlay(-2,"MuzzleFlash");
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
A_OverlayRenderstyle(-2,STYLE_Add);
}
Vector3 x, y, z;
double a;
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
Vector3 origin = pos+(0,0,player.viewheight)+10.0*x;
int ydir = slave?-1:1;
if ( alt ) origin = origin-z*9.0+ydir*y*1.0;
else origin = origin-z*2.0+ydir*y*6.0;
double ang = angle;
double pt = BulletSlope();
if ( alt )
{
ang += FRandom[Enforcer](-3,3);
pt += FRandom[Enforcer](-3,3);
}
else
{
ang += FRandom[Enforcer](-0.4,0.4);
pt += FRandom[Enforcer](-0.4,0.4);
}
FLineTraceData d;
LineTrace(ang,10000,pt,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
if ( d.HitType == TRACE_HitActor )
{
int dmg = Random[Enforcer](15,20);
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot');
if ( d.HitActor.bNOBLOOD )
{
let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4);
p.angle = atan2(d.HitDir.y,d.HitDir.x);
p.pitch = asin(-d.HitDir.z);
}
else
{
d.HitActor.TraceBleed(dmg,self);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
}
}
else if ( d.HitType != TRACE_HitNone )
{
let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4);
p.angle = atan2(d.HitDir.y,d.HitDir.x);
p.pitch = asin(-d.HitDir.z);
if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
}
origin += x*8.0+ydir*y*6.0-z*2.0;
let c = Spawn("UTCasing",origin);
c.vel = x*FRandom[Junk](-2,2)+y*ydir*FRandom[Junk](3,6)+z*FRandom[Junk](3,5);
}
override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack )
{
if ( Amount > 1 ) return "%k riddled %o full of holes with the Dual Enforcers.";
return "%k riddled %o full of holes with the Enforcer.";
}
Default
{
Tag "Enforcer";
Inventory.PickupMessage "You picked up an Enforcer.";
Weapon.UpSound "";
Inventory.PickupMessage "You picked up another Enforcer!";
Inventory.MaxAmount 2;
Weapon.UpSound "enforcer/select";
Weapon.SlotNumber 2;
Weapon.SelectionOrder 8;
Weapon.AmmoType "MiniAmmo";
@ -58,6 +357,8 @@ Class Enforcer : UTWeapon replaces Pistol
Weapon.AmmoType2 "MiniAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 30;
Enforcer.ClipCount 20;
Enforcer.SlaveClipCount 20;
}
States
{
@ -66,5 +367,168 @@ Class Enforcer : UTWeapon replaces Pistol
Stop;
ENFP B -1;
Stop;
Select:
ENFS A 1 A_Raise(int.max);
Ready:
ENFS A 0
{
invoker.slavedown = false;
if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) )
A_Overlay(2,"LeftReady");
}
ENFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
Idle:
ENFI A 0 A_Overlay(-9999,"Dummy");
ENFI AB 30;
ENFI A 0 A_Jump(50,"Twiddle");
Goto Idle+1;
LeftReady:
2NFS A 0
{
A_PlaySound("enforcer/select",CHAN_7);
invoker.slaveactive = true;
}
2NFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
LeftIdle:
2NFI A 0 A_Overlay(-9998,"LeftDummy");
2NFI AB 30;
2NFI A 0 A_Jump(50,"LeftTwiddle");
Goto LeftIdle+1;
Twiddle:
ENFT ABCDEFGHIJKLMNOPQRSTUVWXY 2;
Goto Idle+1;
LeftTwiddle:
2NFT ABCDEFGHIJKLMNOPQRSTUVWXY 2;
Goto LeftIdle+1;
Dummy:
TNT1 A 1
{
if ( (invoker.clipcount <= 0) && (invoker.Ammo1.Amount > 0) ) A_Overlay(PSP_WEAPON,"Reload");
if ( CVar.GetCVar('flak_enforcerreload').GetBool() && ((invoker.clipcount < min(20,invoker.Ammo1.Amount)) || (invoker.slaveclipcount < min(20,invoker.Ammo1.Amount))) ) A_WeaponReady(WRF_ALLOWRELOAD);
else A_WeaponReady();
if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) ) A_Overlay(2,"LeftReady");
}
Wait;
LeftDummy:
TNT1 A 1
{
if ( health <= 0 )
{
invoker.slaveactive = false;
A_Overlay(2,"LeftDeselect");
}
if ( CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slavereload || (invoker.slaveclipcount < 0)) ) A_Overlay(2,"LeftReload");
if ( invoker.slavedown ) A_Overlay(2,"LeftDeselect");
A_LeftWeaponReady();
}
Wait;
Fire:
ENFF A 0 A_Overlay(-9999,"Null");
Hold:
ENFF A 0 A_EnforcerFire();
ENFF ABCDEFGHI 1;
ENFF J 3 A_EnforcerRefire();
Goto Idle;
LeftFire:
2NFI A 0 A_Overlay(-9998,"Null");
2NFI A 1 A_SetTics(Random[Enforcer](0,5));
LeftHold:
2NFF A 0 A_EnforcerFire(false,true);
2NFF ABCDEFGHI 1;
2NFF J 3 A_EnforcerRefire("LeftHold",true);
Goto LeftIdle;
AltFire:
ENFA A 0 A_Overlay(-9999,"Null");
ENFA ABCDEF 1;
AltHold:
ENFA G 0 A_EnforcerFire(true);
ENFA GHIJKLMN 1;
ENFA G 0 A_EnforcerRefire();
ENFA OPQRSTU 1;
Goto Idle;
LeftAltFire:
2NFI A 0 A_Overlay(-9998,"Null");
2NFI A 1 A_SetTics(Random[Enforcer](0,5));
2NFI A 0;
2NFA ABCDEF 1;
LeftAltHold:
2NFA G 0 A_EnforcerFire(true,true);
2NFA GHIJKLMN 1;
2NFA G 0 A_EnforcerRefire("LeftAltHold",true);
2NFA OPQRSTU 1;
Goto LeftIdle;
Reload:
ENFR A 0
{
invoker.slavereload = ((player.cmd.buttons&BT_RELOAD)&&(invoker.slaveclipcount < min(20,invoker.Ammo1.Amount)))||(invoker.slaveclipcount <= 0);
return A_JumpIf(invoker.clipcount>=min(20,invoker.Ammo1.Amount),"Idle");
}
ENFR A 0
{
invoker.clipcount = Min(20,invoker.Ammo1.Amount);
A_Overlay(-9999,"Null");
A_PlaySound("enforcer/click",CHAN_WEAPON);
}
ENFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
ENR2 AB 1;
ENR2 B 30 A_PlaySound("enforcer/reload",CHAN_WEAPON);
ENFS A 0 A_PlaySound("enforcer/select",CHAN_WEAPON);
Goto Ready;
LeftReload:
2NFR A 0
{
invoker.slaveclipcount = Min(20,invoker.Ammo1.Amount);
invoker.slavereload = false;
A_Overlay(-9998,"Null");
A_PlaySound("enforcer/click",CHAN_7);
}
2NFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
2NR2 AB 1;
2NR2 B 30 A_PlaySound("enforcer/reload",CHAN_7);
2NFS A 0 A_PlaySound("enforcer/select",CHAN_7);
Goto LeftReady;
Deselect:
ENFI A 1 { invoker.slavedown = true; }
ENFD A 0 A_Overlay(-9999,"Null");
ENFD A 0 A_JumpIf(invoker.slaveactive,"Deselect");
ENFD ABCDEFGHIJKL 1;
ENFD L 1 A_Lower(int.max);
Wait;
LeftDeselect:
2NFD A 0
{
A_Overlay(-9998,"Null");
invoker.slaveactive = false;
}
2NFD ABCDEFGHIJKL 1;
Stop;
MuzzleFlash:
EMUZ A 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AltMuzzleFlash:
EMUZ B 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
LeftMuzzleFlash:
EMUZ C 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
LeftAltMuzzleFlash:
EMUZ D 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
}
}

View file

@ -461,14 +461,7 @@ Class FlakLight : DynamicLight
Default
{
DynamicLight.Type "Point";
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
args[LIGHT_INTENSITY] = 150;
args[LIGHT_RED] = 255;
args[LIGHT_GREEN] = 224;
args[LIGHT_BLUE] = 128;
args 255,224,128,150;
}
override void Tick()
{

View file

@ -75,7 +75,8 @@ Class ImpactHammer : UTWeapon replaces Fist
LineTrace(angle,80,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
if ( d.HitType == TRACE_HitActor )
{
d.HitActor.DamageMobj(invoker,self,60*realcharge,'impact');
int dmg = Random[Impact](50,60)*realcharge;
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact');
d.HitActor.vel = x*(1000/d.HitActor.mass)*realcharge;
if ( d.HitActor.bNOBLOOD )
{
@ -85,15 +86,16 @@ Class ImpactHammer : UTWeapon replaces Fist
}
else
{
d.HitActor.TraceBleed(60*realcharge,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),60*realcharge);
d.HitActor.TraceBleed(dmg,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
}
}
else if ( d.HitType != TRACE_HitNone )
{
realcharge = max(1.0,realcharge);
DamageMobj(invoker,self,24*realcharge,'impact'); // It's a flat damage of 36 on UT, but I think it's more fair for it to scale
TraceBleed(24*realcharge,invoker);
int dmg = 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
dmg = DamageMobj(invoker,self,dmg,'impact');
TraceBleed(dmg,invoker);
vel -= x*(1200/mass)*realcharge;
let p = Spawn("HammerImpact",d.HitLocation-d.HitDir*4);
p.angle = atan2(d.HitDir.y,d.HitDir.x);
@ -135,12 +137,14 @@ Class ImpactHammer : UTWeapon replaces Fist
double dscale = d.Distance/180.;
if ( d.HitType == TRACE_HitActor )
{
d.HitActor.DamageMobj(invoker,self,20*dscale,'impact');
int dmg = Random[Impact](16,20)*dscale;
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact');
d.HitActor.vel = x*(500/d.HitActor.mass)*dscale;
}
else if ( d.HitType != TRACE_HitNone )
{
DamageMobj(invoker,self,24*dscale,'impact');
int dmg = Random[Impact](16,24)*dscale;
dmg = DamageMobj(invoker,self,dmg,'impact');
vel -= x*(600/mass)*dscale;
if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4);
}

View file

@ -330,6 +330,12 @@ Class PulseGun : UTWeapon
Property ClipCount : clipcount;
override void PostRender()
{
if ( !CVar.GetCVar('flak_pulsereload').GetBool() ) return;
Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 50",clipcount));
}
action void A_Reloading()
{
Weapon weap = Weapon(invoker);

View file

@ -2,9 +2,10 @@ Class UTPlayer : DoomPlayer
{
Default
{
Player.StartItem "ImpactHammer";
Player.StartItem "Translocator";
Player.StartItem "MiniAmmo", 30;
Player.StartItem "Enforcer";
Player.StartItem "Translocator";
Player.StartItem "ImpactHammer";
}
// Have to modify the give cheat to handle UT armor