Dispersion Pistol fully implemented.
Jump boots (mostly) implemented (replacement feature not done yet). Various adjustments. DamNums coloring support.
This commit is contained in:
parent
442dfd818c
commit
ce68db4b36
22 changed files with 822 additions and 36 deletions
|
|
@ -222,7 +222,6 @@ Class ASMDSpark : Actor
|
|||
+FORCEXYBILLBOARD;
|
||||
+THRUACTORS;
|
||||
+ROLLSPRITE;
|
||||
+ROLLCENTER;
|
||||
+NOTELEPORT;
|
||||
+DONTSPLASH;
|
||||
+CANBOUNCEWATER;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ Class WeaponPowerUp : Inventory
|
|||
override bool TryPickup( in out Actor toucher )
|
||||
{
|
||||
if ( !toucher.FindInventory("DispersionPistol") ) return false;
|
||||
let damo = DispersionAmmo(toucher.FindInventory("DispersionAmmo"));
|
||||
let damo = DefaultAmmo(toucher.FindInventory("DefaultAmmo"));
|
||||
if ( damo )
|
||||
{
|
||||
damo.BackpackMaxAmount = damo.MaxAmount = min(90,damo.MaxAmount+10);
|
||||
|
|
@ -60,7 +60,7 @@ Class WeaponPowerUpX : ASMDAmmoX
|
|||
}
|
||||
}
|
||||
|
||||
Class DispersionAmmo : Ammo
|
||||
Class DefaultAmmo : Ammo
|
||||
{
|
||||
double rechargephase, rechargespeed;
|
||||
|
||||
|
|
@ -85,6 +85,361 @@ Class DispersionAmmo : Ammo
|
|||
}
|
||||
}
|
||||
|
||||
Class DispExLight1 : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "DBlue";
|
||||
Args 0,0,0,80;
|
||||
ReactionTime 25;
|
||||
}
|
||||
}
|
||||
Class DispExLight2 : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "DGreen";
|
||||
Args 0,0,0,80;
|
||||
ReactionTime 25;
|
||||
}
|
||||
}
|
||||
Class DispExLight3 : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "DYellow";
|
||||
Args 0,0,0,80;
|
||||
ReactionTime 25;
|
||||
}
|
||||
}
|
||||
Class DispExLight4 : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "DOrange";
|
||||
Args 0,0,0,80;
|
||||
ReactionTime 25;
|
||||
}
|
||||
}
|
||||
Class DispExLight5 : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "DRed";
|
||||
Args 0,0,0,80;
|
||||
ReactionTime 25;
|
||||
}
|
||||
}
|
||||
|
||||
Class DispBurst1 : ASMDSpark
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFB ABCDEFG 1 Bright
|
||||
{
|
||||
A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
vel *= 0.95;
|
||||
}
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class DispBurst2 : DispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFG ABCDEFG 1 Bright
|
||||
{
|
||||
A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
vel *= 0.95;
|
||||
}
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class DispBurst3 : DispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFY ABCDEFG 1 Bright
|
||||
{
|
||||
A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
vel *= 0.95;
|
||||
}
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class DispBurst4 : DispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFO ABCDEFG 1 Bright
|
||||
{
|
||||
A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
vel *= 0.95;
|
||||
}
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class DispBurst5 : DispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFR ABCDEFG 1 Bright
|
||||
{
|
||||
A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
vel *= 0.95;
|
||||
}
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class ViewDispBurst1 : ViewASMDSpark
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFB ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class ViewDispBurst2 : ViewDispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFG ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class ViewDispBurst3 : ViewDispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFY ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class ViewDispBurst4 : ViewDispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFO ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
Class ViewDispBurst5 : ViewDispBurst1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DEFR ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
|
||||
Loop;
|
||||
}
|
||||
}
|
||||
|
||||
Class DispExplo1 : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
RenderStyle "Add";
|
||||
Scale 0.4;
|
||||
+NOGRAVITY;
|
||||
+NOBLOCKMAP;
|
||||
Radius 0.1;
|
||||
Height 0;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
Scale.x *= RandomPick[DPistol](-1,1);
|
||||
Scale.y *= RandomPick[DPistol](-1,1);
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DSEB ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DispExplo2 : DispExplo1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DISE ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DispExplo3 : DispExplo1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DSEY ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DispExplo4 : DispExplo1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DSEO ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DispExplo5 : DispExplo1
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DSER ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
// yes this is the projectile class name, blame Epic
|
||||
Class DispersionAmmo : Actor
|
||||
{
|
||||
Class<Actor> LightClass, BurstClass, ExploClass;
|
||||
double mult;
|
||||
|
||||
Property LightClass : LightClass;
|
||||
Property BurstClass : BurstClass;
|
||||
Property ExploClass : ExploClass;
|
||||
|
||||
action void A_DispTrail()
|
||||
{
|
||||
Vector3 x, y, z, dir;
|
||||
double a, s;
|
||||
Actor p;
|
||||
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
a = FRandom[DPistol](0,360);
|
||||
s = FRandom[ASMD](0,0.35);
|
||||
dir = (-x+y*cos(a)*s+z*sin(a)*s).unit();
|
||||
p = Spawn(invoker.BurstClass,level.Vec3Offset(pos,scale.x*(dir*16.+x*32.)));
|
||||
p.A_SetScale(0.1*min(0.8+invoker.mult*0.75,1.5));
|
||||
p.vel = vel*0.5+dir*FRandom[DPistol](3,8);
|
||||
}
|
||||
}
|
||||
action void A_DispExpl()
|
||||
{
|
||||
UTMainHandler.DoKnockback(tracer,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)),6000);
|
||||
A_AlertMonsters();
|
||||
A_SprayDecal("RazorBlast",20);
|
||||
Spawn(invoker.LightClass,pos);
|
||||
Actor a;
|
||||
double ang, pt;
|
||||
int numpt = int(Random[DPistol](12,18)*invoker.mult);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
a = Spawn(invoker.BurstClass,pos);
|
||||
a.A_SetScale(0.2*min(0.8+invoker.mult*0.75,1.5));
|
||||
ang = FRandom[DPistol](0,360);
|
||||
pt = FRandom[DPistol](-90,90);
|
||||
a.vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[DPistol](6,16);
|
||||
a.alpha *= 2.;
|
||||
}
|
||||
a = Spawn(invoker.ExploClass,pos);
|
||||
a.A_SetScale(min(0.8+invoker.mult*0.8,2.5));
|
||||
if ( !bAMBUSH ) return;
|
||||
UTMainHandler.DoBlast(self,120,6000);
|
||||
A_Explode(GetMissileDamage(0,0),120);
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_PlaySound("dpistol/fly",CHAN_VOICE,.9,true,2.);
|
||||
mult = max(1.,mult);
|
||||
}
|
||||
Default
|
||||
{
|
||||
Obituary "$O_DPISTOL";
|
||||
DamageFunction (15*mult);
|
||||
DamageType 'DAmmo1';
|
||||
Scale 0.8;
|
||||
Radius 4;
|
||||
Height 4;
|
||||
Speed 25;
|
||||
RenderStyle "Add";
|
||||
PROJECTILE;
|
||||
+FORCEXYBILLBOARD;
|
||||
+SKYEXPLODE;
|
||||
+EXPLODEONWATER;
|
||||
+FORCERADIUSDMG;
|
||||
+NODAMAGETHRUST;
|
||||
+INTERPOLATEANGLES;
|
||||
+HITTRACER;
|
||||
DispersionAmmo.LightClass "DispExLight1";
|
||||
DispersionAmmo.BurstClass "DispBurst1";
|
||||
DispersionAmmo.ExploClass "DispExplo1";
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DISM AABBCCDDEEFFGGHH 1 Bright A_DispTrail();
|
||||
Loop;
|
||||
Death:
|
||||
TNT1 A 1
|
||||
{
|
||||
A_PlaySound("dpistol/hit",CHAN_VOICE);
|
||||
A_DispExpl();
|
||||
}
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DAmmo2 : DispersionAmmo
|
||||
{
|
||||
Default
|
||||
{
|
||||
DamageFunction (25*mult);
|
||||
DamageType 'DAmmo2';
|
||||
DispersionAmmo.LightClass "DispExLight2";
|
||||
DispersionAmmo.BurstClass "DispBurst2";
|
||||
DispersionAmmo.ExploClass "DispExplo2";
|
||||
}
|
||||
}
|
||||
Class DAmmo3 : DispersionAmmo
|
||||
{
|
||||
Default
|
||||
{
|
||||
DamageFunction (40*mult);
|
||||
DamageType 'DAmmo3';
|
||||
DispersionAmmo.LightClass "DispExLight3";
|
||||
DispersionAmmo.BurstClass "DispBurst3";
|
||||
DispersionAmmo.ExploClass "DispExplo3";
|
||||
}
|
||||
}
|
||||
Class DAmmo4 : DispersionAmmo
|
||||
{
|
||||
Default
|
||||
{
|
||||
DamageFunction (55*mult);
|
||||
DamageType 'DAmmo4';
|
||||
DispersionAmmo.LightClass "DispExLight4";
|
||||
DispersionAmmo.BurstClass "DispBurst4";
|
||||
DispersionAmmo.ExploClass "DispExplo4";
|
||||
}
|
||||
}
|
||||
Class DAmmo5 : DispersionAmmo
|
||||
{
|
||||
Default
|
||||
{
|
||||
DamageFunction (75*mult);
|
||||
DamageType 'DAmmo5';
|
||||
DispersionAmmo.LightClass "DispExLight5";
|
||||
DispersionAmmo.BurstClass "DispBurst5";
|
||||
DispersionAmmo.ExploClass "DispExplo5";
|
||||
}
|
||||
}
|
||||
|
||||
Class DispLight1 : EnforcerLight
|
||||
{
|
||||
Default
|
||||
|
|
@ -127,42 +482,64 @@ Class DispersionPistol : UnrealWeapon
|
|||
bool pendingupgrade;
|
||||
double chargesize, count;
|
||||
bool bCharging;
|
||||
int MainUse, ChargeUse;
|
||||
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( sting_dpistol ) AmmoUse2 = 1;
|
||||
else AmmoUse2 = AmmoUse1/2;
|
||||
if ( MainUse < 1 ) MainUse = 1;
|
||||
if ( sting_dpistol ) ChargeUse = 1;
|
||||
else ChargeUse = max(1,MainUse/2);
|
||||
}
|
||||
action void A_DispFire()
|
||||
{
|
||||
Weapon weap = Weapon(invoker);
|
||||
if ( !weap ) return;
|
||||
if ( weap.Ammo1.Amount <= 0 ) return;
|
||||
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
|
||||
DispersionAmmo(weap.Ammo1).rechargephase = 0;
|
||||
DefaultAmmo(weap.Ammo1).rechargephase = 0;
|
||||
A_PlaySound("dpistol/fire",CHAN_WEAPON,Dampener.Active(self)?.4:1.,pitch:1.2);
|
||||
double mult = Amplifier.GetMult(self,80);
|
||||
invoker.FireEffect();
|
||||
switch ( invoker.upgradelevel )
|
||||
Class<Actor> proj, part;
|
||||
int ulevel = invoker.upgradelevel;
|
||||
if ( !(sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true)) )
|
||||
{
|
||||
if ( weap.Ammo1.Amount < max(10,invoker.MainUse) )
|
||||
{
|
||||
weap.Ammo1.Amount -= 1;
|
||||
ulevel = 0;
|
||||
}
|
||||
else weap.Ammo1.Amount -= invoker.MainUse;
|
||||
}
|
||||
switch ( ulevel )
|
||||
{
|
||||
case 0:
|
||||
proj = "DispersionAmmo";
|
||||
part = "ViewDispBurst1";
|
||||
UTMainHandler.DoFlash(self,Color(80,96,64,255),1);
|
||||
A_Overlay(PSP_FLASH,"Flash1");
|
||||
break;
|
||||
case 1:
|
||||
proj = "DAmmo2";
|
||||
part = "ViewDispBurst2";
|
||||
UTMainHandler.DoFlash(self,Color(80,64,255,96),1);
|
||||
A_Overlay(PSP_FLASH,"Flash2");
|
||||
break;
|
||||
case 2:
|
||||
proj = "DAmmo3";
|
||||
part = "ViewDispBurst3";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,255,96),1);
|
||||
A_Overlay(PSP_FLASH,"Flash3");
|
||||
break;
|
||||
case 3:
|
||||
proj = "DAmmo4";
|
||||
part = "ViewDispBurst4";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,160,64),1);
|
||||
A_Overlay(PSP_FLASH,"Flash4");
|
||||
break;
|
||||
default:
|
||||
proj = "DAmmo5";
|
||||
part = "ViewDispBurst5";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,96,64),1);
|
||||
A_Overlay(PSP_FLASH,"Flash5");
|
||||
break;
|
||||
|
|
@ -172,6 +549,23 @@ Class DispersionPistol : UnrealWeapon
|
|||
UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3),FRandom[DPistol](-0.1,0.3)),2,-0.3,3,SWING_Spring,0,3);
|
||||
if ( !Dampener.Active(self) ) A_AlertMonsters();
|
||||
A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z;
|
||||
Actor p = Spawn(proj,origin);
|
||||
p.angle = angle;
|
||||
p.pitch = BulletSlope();
|
||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||
p.target = self;
|
||||
DispersionAmmo(p).mult = mult;
|
||||
int numpt = Random[DPistol](10,20);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
let s = Spawn(part,origin);
|
||||
ViewASMDSpark(s).ofs = (10,3,-3);
|
||||
s.target = self;
|
||||
ViewASMDSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||
}
|
||||
}
|
||||
action void A_DispAltFire()
|
||||
{
|
||||
|
|
@ -181,30 +575,41 @@ Class DispersionPistol : UnrealWeapon
|
|||
invoker.bCharging = false;
|
||||
if ( self is 'UTPlayer' )
|
||||
UTPlayer(self).PlayAttacking();
|
||||
DispersionAmmo(weap.Ammo1).rechargephase = 0;
|
||||
DefaultAmmo(weap.Ammo1).rechargephase = 0;
|
||||
A_PlaySound("dpistol/fire",CHAN_WEAPON,Dampener.Active(self)?.4:1.);
|
||||
double mult = Amplifier.GetMult(self,int(invoker.ChargeSize*50)+50);
|
||||
invoker.FireEffect();
|
||||
int ulevel = sting_dpistol?0:invoker.upgradelevel;
|
||||
Class<Actor> proj, part;
|
||||
switch ( ulevel )
|
||||
{
|
||||
case 0:
|
||||
proj = "DispersionAmmo";
|
||||
part = "ViewDispBurst1";
|
||||
UTMainHandler.DoFlash(self,Color(80,96,64,255),1);
|
||||
A_Overlay(PSP_FLASH,"Flash1");
|
||||
break;
|
||||
case 1:
|
||||
proj = "DAmmo2";
|
||||
part = "ViewDispBurst2";
|
||||
UTMainHandler.DoFlash(self,Color(80,64,255,96),1);
|
||||
A_Overlay(PSP_FLASH,"Flash2");
|
||||
break;
|
||||
case 2:
|
||||
proj = "DAmmo3";
|
||||
part = "ViewDispBurst3";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,255,96),1);
|
||||
A_Overlay(PSP_FLASH,"Flash3");
|
||||
break;
|
||||
case 3:
|
||||
proj = "DAmmo4";
|
||||
part = "ViewDispBurst4";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,160,64),1);
|
||||
A_Overlay(PSP_FLASH,"Flash4");
|
||||
break;
|
||||
default:
|
||||
proj = "DAmmo5";
|
||||
part = "ViewDispBurst5";
|
||||
UTMainHandler.DoFlash(self,Color(80,255,96,64),1);
|
||||
A_Overlay(PSP_FLASH,"Flash5");
|
||||
break;
|
||||
|
|
@ -216,12 +621,32 @@ Class DispersionPistol : UnrealWeapon
|
|||
if ( !Dampener.Active(self) ) A_AlertMonsters();
|
||||
int qs = int(1+invoker.chargesize*0.3);
|
||||
A_QuakeEx(qs,qs,qs,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z;
|
||||
Actor p = Spawn(proj,origin);
|
||||
p.angle = angle;
|
||||
p.pitch = BulletSlope();
|
||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||
p.target = self;
|
||||
p.bAMBUSH = true;
|
||||
double scl = 0.5+invoker.chargesize*0.6;
|
||||
p.scale *= scl;
|
||||
DispersionAmmo(p).mult = scl*mult*1.1;
|
||||
int numpt = Random[DPistol](10,20);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
let s = Spawn(part,origin);
|
||||
ViewASMDSpark(s).ofs = (10,3,-3);
|
||||
s.target = self;
|
||||
ViewASMDSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||
}
|
||||
}
|
||||
action bool A_DispCharge()
|
||||
{
|
||||
Weapon weap = Weapon(invoker);
|
||||
if ( !weap ) return false;
|
||||
DispersionAmmo(weap.Ammo1).rechargephase = 0;
|
||||
DefaultAmmo(weap.Ammo1).rechargephase = 0;
|
||||
UTMainHandler.DoSwing(self,(FRandom[DPistol](-1,1),FRandom[DPistol](-1,1)),0.02*invoker.chargesize,0,2,SWING_Spring);
|
||||
A_WeaponOffset(FRandom[DPistol](-1,1)*1.2*invoker.chargesize,32+FRandom[DPistol](-1,1)*1.2*invoker.chargesize);
|
||||
if ( !Dampener.Active(self) ) A_AlertMonsters();
|
||||
|
|
@ -229,16 +654,14 @@ Class DispersionPistol : UnrealWeapon
|
|||
invoker.count += 1./35.;
|
||||
if ( invoker.count < 0.3 ) return false;
|
||||
invoker.count = 0;
|
||||
weap.DepleteAmmo(weap.bAltFire,true,1);
|
||||
if ( (weap.Ammo1.Amount <= 0) || (invoker.chargesize >= 5.) )
|
||||
return true;
|
||||
if ( invoker.chargesize >= 5. ) return true;
|
||||
if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) )
|
||||
{
|
||||
if ( weap.Ammo1.Amount < invoker.ChargeUse ) return true;
|
||||
weap.Ammo1.Amount -= invoker.ChargeUse;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
|
||||
{
|
||||
if ( bCharging ) return true;
|
||||
return Super.CheckAmmo(fireMode,autoSwitch,requireAmmo,ammocount);
|
||||
}
|
||||
Default
|
||||
{
|
||||
Tag "$T_DPISTOL";
|
||||
|
|
@ -246,9 +669,9 @@ Class DispersionPistol : UnrealWeapon
|
|||
Weapon.UpSound "dpistol/select";
|
||||
Weapon.SlotNumber 1;
|
||||
Weapon.SelectionOrder 1;
|
||||
Weapon.AmmoType "DispersionAmmo";
|
||||
Weapon.AmmoType "DefaultAmmo";
|
||||
Weapon.AmmoUse 1;
|
||||
Weapon.AmmoType2 "DispersionAmmo";
|
||||
Weapon.AmmoType2 "DefaultAmmo";
|
||||
Weapon.AmmoUse2 1;
|
||||
Weapon.AmmoGive 50;
|
||||
UTWeapon.DropAmmo 25;
|
||||
|
|
@ -294,7 +717,9 @@ Class DispersionPistol : UnrealWeapon
|
|||
TNT1 A 1
|
||||
{
|
||||
A_CheckReload();
|
||||
A_WeaponReady();
|
||||
let weap = Weapon(invoker);
|
||||
if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady();
|
||||
else A_WeaponReady(WRF_NOFIRE);
|
||||
}
|
||||
Wait;
|
||||
Idle:
|
||||
|
|
@ -423,7 +848,7 @@ Class DispersionPistol : UnrealWeapon
|
|||
#### # 0
|
||||
{
|
||||
A_Overlay(-9999,"Null");
|
||||
invoker.AmmoUse1 = min(6,invoker.upgradelevel+1);
|
||||
invoker.MainUse = min(6,invoker.upgradelevel+1);
|
||||
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle");
|
||||
else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1");
|
||||
else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2");
|
||||
|
|
|
|||
|
|
@ -570,8 +570,8 @@ Class FlareThrown : Actor
|
|||
States
|
||||
{
|
||||
Spawn:
|
||||
FLAR A -1;
|
||||
Stop;
|
||||
FLAR A 1 A_JumpIf(ReactionTime<=0,"Death");
|
||||
Wait;
|
||||
Bounce:
|
||||
FLAR A 0
|
||||
{
|
||||
|
|
@ -697,11 +697,24 @@ Class FlareThrownX : Actor
|
|||
}
|
||||
}
|
||||
|
||||
Class LightFlare : UnrealInventory
|
||||
Class BetaFlare : UnrealInventory
|
||||
{
|
||||
Class<Actor> ThrownClass;
|
||||
|
||||
Property ThrownClass : ThrownClass;
|
||||
|
||||
override bool TryPickup( in out Actor toucher )
|
||||
{
|
||||
if ( !sting_flares ) return false; // not allowed
|
||||
return Super.TryPickup(toucher);
|
||||
}
|
||||
}
|
||||
|
||||
Class LightFlare : BetaFlare
|
||||
{
|
||||
}
|
||||
|
||||
Class DarkFlare : UnrealInventory
|
||||
Class DarkFlare : BetaFlare
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ Class StingerProjectile : Actor
|
|||
Default
|
||||
{
|
||||
Obituary "$O_STINGER";
|
||||
DamageType 'shot';
|
||||
DamageType 'Stinger';
|
||||
DamageFunction Random[Stinger](15,25);
|
||||
Speed 40;
|
||||
Radius 2;
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ Class ShieldBelt : UnrealArmor
|
|||
Tag "$T_SHIELDBELT";
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
Inventory.Amount 100;
|
||||
Inventory.MaxAmount 100;
|
||||
Inventory.InterHubAmount 100;
|
||||
|
|
@ -228,6 +229,7 @@ Class PowerShield : UnrealArmor
|
|||
Tag "$T_POWERSHIELD";
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
Inventory.Amount 200;
|
||||
Inventory.MaxAmount 200;
|
||||
Inventory.InterHubAmount 200;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Class UPlayer : UTPlayer
|
|||
Player.StartItem "Automag";
|
||||
Player.StartItem "DispersionPistol";
|
||||
Player.StartItem "UMiniAmmo", 30;
|
||||
Player.StartItem "DispersionAmmo", 50;
|
||||
Player.StartItem "DefaultAmmo", 50;
|
||||
}
|
||||
|
||||
// Have to modify the give cheat to handle UT armor
|
||||
|
|
@ -124,7 +124,7 @@ Class UPlayer : UTPlayer
|
|||
let type = (class<Inventory>)(AllActorClasses[i]);
|
||||
if ( !type ) continue;
|
||||
let def = GetDefaultByType (type);
|
||||
if ( def.Icon.isValid() && (def.MaxAmount > 1) &&
|
||||
if ( def.Icon.isValid() && ((def.MaxAmount > 1) || (type is 'UnrealInventory')) &&
|
||||
!(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "Armor") )
|
||||
{
|
||||
// Do not give replaced items unless using "give everything"
|
||||
|
|
@ -177,7 +177,7 @@ Class UPlayer : UTPlayer
|
|||
override void PlayFootstep( double vol )
|
||||
{
|
||||
let boot = UJumpBoots(FindInventory("UJumpBoots"));
|
||||
if ( boot && boot.bActive ) A_PlaySound("u1/metalfootstep",CHAN_5,min(1.,vol*2));
|
||||
if ( boot ) A_PlaySound("u1/bootfootstep",CHAN_5,min(1.,vol*2));
|
||||
else A_PlaySound("ut/playerfootstep",CHAN_5,vol);
|
||||
}
|
||||
}
|
||||
|
|
@ -467,6 +467,17 @@ Class UPlayerMale : UPlayer
|
|||
}
|
||||
Class UPlayerMale1 : UPlayerMale
|
||||
{
|
||||
override void PlayFootstep( double vol )
|
||||
{
|
||||
let boot = UJumpBoots(FindInventory("UJumpBoots"));
|
||||
if ( boot ) A_PlaySound("u1/bootfootstep",CHAN_5,min(1.,vol*2));
|
||||
else
|
||||
{
|
||||
double ang = level.time/(20*TICRATE/35.)*360.;
|
||||
if ( sin(ang) > 0 ) A_PlaySound("u1/metalfootstep",CHAN_5,min(1.,vol*2));
|
||||
else A_PlaySound("ut/playerfootstep",CHAN_5,vol);
|
||||
}
|
||||
}
|
||||
Default
|
||||
{
|
||||
Player.DisplayName "$N_MALE1";
|
||||
|
|
@ -541,6 +552,7 @@ Class UnrealInventory : Inventory
|
|||
{
|
||||
Super.AttachToOwner(other);
|
||||
Charge = DefaultCharge;
|
||||
InterHubAmount = MaxAmount; // it's annoying to set this per-subclass
|
||||
}
|
||||
override bool HandlePickup( Inventory item )
|
||||
{
|
||||
|
|
@ -560,11 +572,15 @@ Class UnrealInventory : Inventory
|
|||
if ( bDROPPED && (pos.z <= floorz) )
|
||||
vel.xy *= 0;
|
||||
}
|
||||
override void DetachFromOwner()
|
||||
{
|
||||
Super.DetachFromOwner();
|
||||
// deactivate
|
||||
bActive = false;
|
||||
}
|
||||
override void OnDrop( Actor dropper )
|
||||
{
|
||||
Super.OnDrop(dropper);
|
||||
// deactivate
|
||||
bActive = false;
|
||||
// drop like weapons
|
||||
Vector2 hofs = RotateVector((dropper.radius,0),dropper.angle);
|
||||
SetOrigin(dropper.Vec3Offset(hofs.x,hofs.y,dropper.height*0.5),false);
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ Class UnrealHUD : BaseStatusBar
|
|||
OldAmmo[15] = "Big083";
|
||||
OldAmmo[16] = "Smini083";
|
||||
OldAmmo[17] = "Peace083";
|
||||
OldAmmoType[0] = "DispersionAmmo";
|
||||
OldAmmoType[0] = "DefaultAmmo";
|
||||
OldAmmoType[1] = "UMiniAmmo";
|
||||
OldAmmoType[2] = "StingerAmmo";
|
||||
OldAmmoType[3] = "AsmdAmmo";
|
||||
|
|
@ -233,7 +233,7 @@ Class UnrealHUD : BaseStatusBar
|
|||
Screen.DrawTexture(IconBase,false,CurX,CurY,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true);
|
||||
Screen.DrawTexture(i.Icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_TopOffset,0,DTA_LeftOffset,0);
|
||||
}
|
||||
if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) && (UnrealInventory(i).Charge < UnrealInventory(i).DefaultCharge) )
|
||||
if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) )
|
||||
Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(UnrealInventory(i).Charge/double(UnrealInventory(i).DefaultCharge)),28.));
|
||||
else if ( (i is 'UTArmor') && !HudMode )
|
||||
Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(i.Amount/double(i.MaxAmount)),28.));
|
||||
|
|
|
|||
|
|
@ -186,6 +186,49 @@ Class AmpSound : Actor
|
|||
|
||||
Class UJumpBoots : UnrealInventory
|
||||
{
|
||||
int draincnt;
|
||||
Default
|
||||
{
|
||||
Tag "$T_JUMPBOOTS";
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
Inventory.MaxAmount 3;
|
||||
Inventory.Icon "I_Boots";
|
||||
Inventory.PickupMessage "$I_JUMPBOOTS";
|
||||
Inventory.RespawnTics 1050;
|
||||
UnrealInventory.Charge 3;
|
||||
}
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
if ( pickup ) return false;
|
||||
bActive = !bActive;
|
||||
Owner.A_PlaySound("boot/pickup",CHAN_ITEM);
|
||||
if ( bActive ) Owner.GiveInventory("PowerJumpBoots_HighJump",1);
|
||||
else Owner.TakeInventory("PowerJumpBoots_HighJump",1);
|
||||
return false;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !Owner || !Owner.player ) return;
|
||||
draincnt++;
|
||||
if ( (draincnt >= 700) || (bActive && (owner.player.jumptics == -1)) )
|
||||
{
|
||||
draincnt = 0;
|
||||
charge--;
|
||||
Owner.A_PlaySound("boot/jump",CHAN_BODY);
|
||||
}
|
||||
else if ( (charge <= 0) && owner.player.onground )
|
||||
{
|
||||
if ( Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_JUMPBOOTS"));
|
||||
Amount--;
|
||||
Owner.TakeInventory("PowerJumpBoots_HighJump",1);
|
||||
charge = defaultcharge;
|
||||
bActive = false;
|
||||
if ( Amount <= 0 ) DepleteOrDestroy();
|
||||
}
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
|
|
@ -206,6 +249,23 @@ Class UJumpBoots : UnrealInventory
|
|||
}
|
||||
// TODO replace self with asbestos/toxin suits or scuba
|
||||
}
|
||||
override void AttachToOwner( Actor Other )
|
||||
{
|
||||
Super.AttachToOwner(Other);
|
||||
Other.GiveInventory("PowerJumpBoots_IronFeet",1);
|
||||
}
|
||||
override void DetachFromOwner()
|
||||
{
|
||||
Super.DetachFromOwner();
|
||||
Owner.TakeInventory("PowerJumpBoots_HighJump",1);
|
||||
Owner.TakeInventory("PowerJumpBoots_IronFeet",1);
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
JBUT A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class MotionDetector : UnrealInventory
|
||||
|
|
|
|||
|
|
@ -4,4 +4,9 @@ Class UTranslocatorAmmo : Ammo
|
|||
|
||||
Class UTranslocator : UnrealWeapon
|
||||
{
|
||||
override bool TryPickup( in out Actor toucher )
|
||||
{
|
||||
if ( !sting_telegun ) return false; // not allowed
|
||||
return Super.TryPickup(toucher);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue