Implemented Enforcer (with dual option). Tweaked some offsets on junk. Added clip count displays.
Only 4 weapons remaining...
This commit is contained in:
parent
a14e43481b
commit
bef29efba3
15 changed files with 1210 additions and 88 deletions
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue