Added first person visual effects to all weapons.
Added "instant rocket" mode to RL, toggleable with reload button. Various adjustments to offsets and scales. Fixed a bug where other armors wouldn't absorb damage if at least one of them is depleted. Reduced armor bonus pickup amount to 1, and made it absorb more damage the more you have, up to a 75% cap at max amount. Tweaked vibration on the Chainsaw. More particles for rockets and flak slugs. Reduced delay for rocket launcher refire. Fixed Pulse balls having no XY billboarding. Tweaked Pulse bolt visual effects. Reduced shake of Shock Rifle and Enhanced Shock Rifle to more bearable levels. Fixed clipping on the Ripper after offsets were changed.
This commit is contained in:
parent
9561ca57b1
commit
07915ea7c2
13 changed files with 454 additions and 109 deletions
10
Readme.md
10
Readme.md
|
|
@ -41,17 +41,13 @@ This mod requires GZDoom 3.4.0 or later.
|
||||||
- Minigun (slot 7)
|
- Minigun (slot 7)
|
||||||
- Sniper Rifle (slot 0)
|
- Sniper Rifle (slot 0)
|
||||||
- Rocket Launcher (slot 9)
|
- Rocket Launcher (slot 9)
|
||||||
|
- "Instant Rocket" mode toggleable with reload
|
||||||
- Scaling/Customization options for the HUD
|
- Scaling/Customization options for the HUD
|
||||||
|
|
||||||
## In progress
|
## In progress
|
||||||
|
|
||||||
- General polishing and bugfixing
|
- General polishing and bugfixing
|
||||||
- Add some more effects
|
- Add some more effects
|
||||||
- Additional particle effects on explosions
|
|
||||||
- Smoke on spent casings [DONE]
|
|
||||||
- View-space particles for weapon fire [WIP]
|
|
||||||
- Done: Enforcer, Biorifle
|
|
||||||
- Remaining: Shock Rifle, Pulsegun, Minigun, Flak Cannon, Rocket Launcher, Sniper rifle, Chainsaw
|
|
||||||
- Visual recoil affecting aim (time to recycle SM's A_Swing once again)
|
- Visual recoil affecting aim (time to recycle SM's A_Swing once again)
|
||||||
- Lava/Slime footstep sounds?
|
- Lava/Slime footstep sounds?
|
||||||
- Additional model optimization and cleanup
|
- Additional model optimization and cleanup
|
||||||
|
|
@ -69,6 +65,7 @@ This mod requires GZDoom 3.4.0 or later.
|
||||||
|
|
||||||
- Add ammo counters to Pulsegun, Minigun, Flak Cannon and Rocket Launcher once
|
- Add ammo counters to Pulsegun, Minigun, Flak Cannon and Rocket Launcher once
|
||||||
scripted textures are implemented.
|
scripted textures are implemented.
|
||||||
|
- Add player models + weapon attachment support when that is also added in.
|
||||||
|
|
||||||
## Known bugs
|
## Known bugs
|
||||||
|
|
||||||
|
|
@ -76,4 +73,5 @@ This mod requires GZDoom 3.4.0 or later.
|
||||||
enforcer is reloading. No idea what causes this (Could be bobbing-related)
|
enforcer is reloading. No idea what causes this (Could be bobbing-related)
|
||||||
- Pulse gun beams behave oddly when the player is moving or looking up and
|
- Pulse gun beams behave oddly when the player is moving or looking up and
|
||||||
down. This might just be a rendering interpolation glitch, as usual
|
down. This might just be a rendering interpolation glitch, as usual
|
||||||
- Translocator allows telefragging of other players in coop.
|
- Translocator allows telefragging of other players in coop
|
||||||
|
- Biorifle sludge doesn't handle 3d floors (especially sloped ones) properly
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ Model "MinigunTracer"
|
||||||
Model 0 "MiniTrace_d.3d"
|
Model 0 "MiniTrace_d.3d"
|
||||||
Skin 0 "JUT_Tracer_01.png"
|
Skin 0 "JUT_Tracer_01.png"
|
||||||
Scale 0.6 0.2 0.24
|
Scale 0.6 0.2 0.24
|
||||||
|
Offset 60 0 0
|
||||||
USEACTORPITCH
|
USEACTORPITCH
|
||||||
USEACTORROLL
|
USEACTORROLL
|
||||||
DONTCULLBACKFACES
|
DONTCULLBACKFACES
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,8 @@ Model "Ripper2"
|
||||||
SurfaceSkin 0 2 "JRazor4.png"
|
SurfaceSkin 0 2 "JRazor4.png"
|
||||||
SurfaceSkin 0 3 "JRazor5.png"
|
SurfaceSkin 0 3 "JRazor5.png"
|
||||||
SurfaceSkin 0 4 "JRazor3.png"
|
SurfaceSkin 0 4 "JRazor3.png"
|
||||||
Scale 0.16 -0.1 0.16
|
Scale 0.32 -0.2 0.32
|
||||||
Offset 5.2 -9.6 -7.6
|
Offset 10.4 -19.2 -15.2
|
||||||
AngleOffset 88
|
AngleOffset 88
|
||||||
RollOffset 2
|
RollOffset 2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ Class UTArmor : Armor
|
||||||
{
|
{
|
||||||
+INVENTORY.AUTOACTIVATE;
|
+INVENTORY.AUTOACTIVATE;
|
||||||
+INVENTORY.UNTOSSABLE;
|
+INVENTORY.UNTOSSABLE;
|
||||||
|
+INVENTORY.KEEPDEPLETED;
|
||||||
}
|
}
|
||||||
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
|
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
|
||||||
{
|
{
|
||||||
|
|
@ -21,18 +22,23 @@ Class UTArmor : Armor
|
||||||
damage = newdamage;
|
damage = newdamage;
|
||||||
}
|
}
|
||||||
if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage);
|
if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage);
|
||||||
if ( amount <= 0 ) Destroy();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Class UTArmorBonus : UTArmor replaces ArmorBonus
|
Class UTArmorBonus : UTArmor replaces ArmorBonus
|
||||||
{
|
{
|
||||||
|
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
|
||||||
|
{
|
||||||
|
absorb = Clamp(amount*2,25,75);
|
||||||
|
Super.AbsorbDamage(damage,damageType,newdamage);
|
||||||
|
}
|
||||||
|
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
Tag "Armor Bonus";
|
Tag "Armor Bonus";
|
||||||
+COUNTITEM;
|
+COUNTITEM;
|
||||||
+INVENTORY.ALWAYSPICKUP;
|
+INVENTORY.ALWAYSPICKUP;
|
||||||
Inventory.Amount 5;
|
Inventory.Amount 1;
|
||||||
Inventory.MaxAmount 50;
|
Inventory.MaxAmount 50;
|
||||||
Inventory.InterHubAmount 50;
|
Inventory.InterHubAmount 50;
|
||||||
UTArmor.ArmorAbsorption 25;
|
UTArmor.ArmorAbsorption 25;
|
||||||
|
|
@ -98,12 +104,9 @@ Class UTShieldBelt : UTArmor replaces Megasphere
|
||||||
Owner.A_PlaySound("belt/absorb",CHAN_7);
|
Owner.A_PlaySound("belt/absorb",CHAN_7);
|
||||||
UTMainHandler.DoFlash(Owner,Color(80,255,224,0),5);
|
UTMainHandler.DoFlash(Owner,Color(80,255,224,0),5);
|
||||||
}
|
}
|
||||||
|
int oldamt = amount;
|
||||||
Super.AbsorbDamage(damage,damageType,newdamage);
|
Super.AbsorbDamage(damage,damageType,newdamage);
|
||||||
}
|
if ( (oldamt > 0) && (amount <= 0) ) PrintPickupMessage(true,"The Shield Belt has depleted.");
|
||||||
override void OnDestroy()
|
|
||||||
{
|
|
||||||
Super.OnDestroy();
|
|
||||||
if ( amount <= 0 && Owner ) PrintPickupMessage(true,"The Shield Belt has depleted.");
|
|
||||||
}
|
}
|
||||||
override bool Use( bool pickup )
|
override bool Use( bool pickup )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,26 @@ Class UTChainsaw : UTWeapon
|
||||||
A_PlaySound("chainsaw/lower",CHAN_6);
|
A_PlaySound("chainsaw/lower",CHAN_6);
|
||||||
Super.DetachFromOwner();
|
Super.DetachFromOwner();
|
||||||
}
|
}
|
||||||
|
action void A_Vibrate( bool bAlt = false )
|
||||||
|
{
|
||||||
|
A_AlertMonsters();
|
||||||
|
if ( bAlt ) A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE,rollIntensity:0.4);
|
||||||
|
else A_QuakeEx(0,0,0,2,0,1,"",QF_RELATIVE,rollIntensity:0.2);
|
||||||
|
if ( bAlt || Random[Chainsaw](0,2) ) return;
|
||||||
|
Vector3 x, y, z;
|
||||||
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
|
Vector3 origin = (pos.x,pos.y,player.viewz)+5.0*x+1.0*y-3.0*z;
|
||||||
|
for ( int i=0; i<5; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (5,1,-3);
|
||||||
|
s.scale *= 1.2;
|
||||||
|
s.alpha *= 0.2;
|
||||||
|
s.SetShade("202020");
|
||||||
|
s.target = self;
|
||||||
|
UTViewSmoke(s).vvel += (0,-0.2,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
Tag "Chainsaw";
|
Tag "Chainsaw";
|
||||||
|
|
@ -161,26 +181,20 @@ Class UTChainsaw : UTWeapon
|
||||||
Ready:
|
Ready:
|
||||||
CSWS ABCDEFGHIJLMNO 1
|
CSWS ABCDEFGHIJLMNO 1
|
||||||
{
|
{
|
||||||
|
A_Vibrate();
|
||||||
A_WeaponReady(WRF_NOFIRE);
|
A_WeaponReady(WRF_NOFIRE);
|
||||||
A_AlertMonsters();
|
|
||||||
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE,rollIntensity:0.1);
|
|
||||||
}
|
}
|
||||||
Idle:
|
Idle:
|
||||||
CSWI A 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
CSWI A 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
||||||
CSWI ABCDEFGHIJ 1
|
CSWI ABCDEFGHIJ 1
|
||||||
{
|
{
|
||||||
A_AlertMonsters();
|
A_Vibrate();
|
||||||
A_WeaponReady();
|
A_WeaponReady();
|
||||||
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE,rollIntensity:0.1);
|
|
||||||
}
|
}
|
||||||
Goto Idle+1;
|
Goto Idle+1;
|
||||||
Fire:
|
Fire:
|
||||||
CSWJ A 1 A_PlaySound("chainsaw/fire",CHAN_6,looping:true);
|
CSWJ A 1 A_PlaySound("chainsaw/fire",CHAN_6,looping:true);
|
||||||
CSWJ BCDEF 1
|
CSWJ BCDEF 1 A_Vibrate();
|
||||||
{
|
|
||||||
A_AlertMonsters();
|
|
||||||
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE,rollIntensity:0.1);
|
|
||||||
}
|
|
||||||
Hold:
|
Hold:
|
||||||
CSWJ G 1 A_SawHit();
|
CSWJ G 1 A_SawHit();
|
||||||
CSWJ H 0 A_Refire(1);
|
CSWJ H 0 A_Refire(1);
|
||||||
|
|
@ -221,25 +235,13 @@ Class UTChainsaw : UTWeapon
|
||||||
CSWJ S 1 A_SawHit();
|
CSWJ S 1 A_SawHit();
|
||||||
CSWJ G 0 A_Refire("Hold");
|
CSWJ G 0 A_Refire("Hold");
|
||||||
Release:
|
Release:
|
||||||
CSWJ FEDCBA 1
|
CSWJ FEDCBA 1 A_Vibrate();
|
||||||
{
|
|
||||||
A_AlertMonsters();
|
|
||||||
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE,rollIntensity:0.1);
|
|
||||||
}
|
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
AltFire:
|
AltFire:
|
||||||
CSWA A 0 A_PlaySound("chainsaw/fire",CHAN_6);
|
CSWA A 0 A_PlaySound("chainsaw/fire",CHAN_6);
|
||||||
CSWA ABCDEFG 2
|
CSWA ABCDEFG 2 A_Vibrate(true);
|
||||||
{
|
|
||||||
A_AlertMonsters();
|
|
||||||
A_QuakeEx(2,2,2,3,0,1,"",QF_RELATIVE,rollIntensity:0.15);
|
|
||||||
}
|
|
||||||
CSWA H 2 A_SawSwipe();
|
CSWA H 2 A_SawSwipe();
|
||||||
CSWA IJK 2
|
CSWA IJK 2 A_Vibrate(true);
|
||||||
{
|
|
||||||
A_AlertMonsters();
|
|
||||||
A_QuakeEx(2,2,2,3,0,1,"",QF_RELATIVE,rollIntensity:0.15);
|
|
||||||
}
|
|
||||||
CSWA K 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
CSWA K 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
||||||
Goto Ready;
|
Goto Ready;
|
||||||
Deselect:
|
Deselect:
|
||||||
|
|
|
||||||
|
|
@ -149,12 +149,13 @@ Class UTRocket : Actor
|
||||||
let s = Spawn("UTSpark",pos);
|
let s = Spawn("UTSpark",pos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
}
|
}
|
||||||
numpt = Random[Eightball](25,50);
|
numpt = Random[Eightball](35,70);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (FRandom[Eightball](-1,1),FRandom[Eightball](-1,1),FRandom[Eightball](-1,1)).unit()*FRandom[Eightball](4,12);
|
Vector3 pvel = (FRandom[Eightball](-1,1),FRandom[Eightball](-1,1),FRandom[Eightball](-1,1)).unit()*FRandom[Eightball](4,36);
|
||||||
let s = Spawn("UTChip",pos);
|
let s = Spawn("UTChip",pos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
|
s.scale *= FRandom[Eightball](0.9,2.7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
States
|
States
|
||||||
|
|
@ -239,6 +240,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
Actor LockedTarget;
|
Actor LockedTarget;
|
||||||
TextureID lockontex;
|
TextureID lockontex;
|
||||||
int locktics;
|
int locktics;
|
||||||
|
bool bSingleRocket;
|
||||||
|
|
||||||
override void PostBeginPlay()
|
override void PostBeginPlay()
|
||||||
{
|
{
|
||||||
|
|
@ -259,7 +261,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
{
|
{
|
||||||
LockedTarget = null;
|
LockedTarget = null;
|
||||||
LockedOn = false;
|
LockedOn = false;
|
||||||
Owner.A_PlaySound("utrl/seeklost",CHAN_6);
|
Owner.A_PlaySound("utrl/seeklost",CHAN_WEAPON);
|
||||||
}
|
}
|
||||||
if ( LockedTarget ) crosshair = 99;
|
if ( LockedTarget ) crosshair = 99;
|
||||||
else crosshair = 0;
|
else crosshair = 0;
|
||||||
|
|
@ -303,7 +305,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
Vector3 x, y, z, x2, y2, z2;
|
Vector3 x, y, z, x2, y2, z2;
|
||||||
double a, s;
|
double a, s;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+8.0*y-6.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-3.0*z;
|
||||||
[x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
[x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
||||||
Actor p;
|
Actor p;
|
||||||
if ( weap.bAltFire )
|
if ( weap.bAltFire )
|
||||||
|
|
@ -362,6 +364,15 @@ Class UTRocketLauncher : UTWeapon
|
||||||
if ( invoker.LockedOn ) A_PlaySound("utrl/seeklost",CHAN_6);
|
if ( invoker.LockedOn ) A_PlaySound("utrl/seeklost",CHAN_6);
|
||||||
invoker.LockedTarget = null;
|
invoker.LockedTarget = null;
|
||||||
invoker.LockedOn = false;
|
invoker.LockedOn = false;
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,3,-3);
|
||||||
|
UTViewSmoke(s).vvel = (FRandom[Eightball](0,1.2),FRandom[Eightball](-.4,.4),FRandom[Eightball](-.4,.4));
|
||||||
|
s.target = self;
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.alpha *= 0.8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// lock-on check
|
// lock-on check
|
||||||
|
|
@ -385,8 +396,8 @@ Class UTRocketLauncher : UTWeapon
|
||||||
invoker.LockedTarget = a;
|
invoker.LockedTarget = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( invoker.LockedTarget ) A_PlaySound("utrl/seeklock",CHAN_6);
|
if ( invoker.LockedTarget ) A_PlaySound("utrl/seeklock",CHAN_WEAPON);
|
||||||
else if ( invoker.LockedOn ) A_PlaySound("utrl/seeklost",CHAN_6);
|
else if ( invoker.LockedOn ) A_PlaySound("utrl/seeklost",CHAN_WEAPON);
|
||||||
if ( invoker.LockedTarget ) invoker.LockedOn = true;
|
if ( invoker.LockedTarget ) invoker.LockedOn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -420,12 +431,12 @@ Class UTRocketLauncher : UTWeapon
|
||||||
{
|
{
|
||||||
invoker.locktics = 0;
|
invoker.locktics = 0;
|
||||||
A_CheckReload();
|
A_CheckReload();
|
||||||
A_WeaponReady();
|
A_WeaponReady(WRF_ALLOWRELOAD);
|
||||||
}
|
}
|
||||||
EBLI A 1
|
EBLI A 1
|
||||||
{
|
{
|
||||||
A_CheckReload();
|
A_CheckReload();
|
||||||
A_WeaponReady();
|
A_WeaponReady(WRF_ALLOWRELOAD);
|
||||||
invoker.locktics++;
|
invoker.locktics++;
|
||||||
if ( invoker.locktics > 42 )
|
if ( invoker.locktics > 42 )
|
||||||
{
|
{
|
||||||
|
|
@ -434,16 +445,25 @@ Class UTRocketLauncher : UTWeapon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Wait;
|
Wait;
|
||||||
|
Reload:
|
||||||
|
EBLI A 5
|
||||||
|
{
|
||||||
|
A_PlaySound("utrl/load",CHAN_6,0.3);
|
||||||
|
if ( invoker.bSingleRocket = !invoker.bSingleRocket ) A_Print("Instant Rocket mode enabled");
|
||||||
|
else A_Print("Instant Rocket mode disabled");
|
||||||
|
}
|
||||||
|
Goto Idle;
|
||||||
Fire:
|
Fire:
|
||||||
AltFire:
|
AltFire:
|
||||||
// one is loaded already
|
// one is loaded already
|
||||||
EBLI A 3 A_LoadRocket(false);
|
EBLI A 1 A_LoadRocket(false);
|
||||||
|
EBLI A 2 A_JumpIf(!invoker.bAltFire&&invoker.bSingleRocket,"FireOne");
|
||||||
EBLI A 0 A_LoadedRefire(1);
|
EBLI A 0 A_LoadedRefire(1);
|
||||||
Goto FireOne;
|
Goto FireOne;
|
||||||
// load two
|
// load two
|
||||||
EBLI A 2;
|
EBLI A 2;
|
||||||
EBL1 A 0;
|
EBL1 A 0;
|
||||||
EBR1 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1);
|
EBR1 A 2 A_PlaySound("utrl/rotate",CHAN_6,0.1);
|
||||||
EBR1 B 0 A_Refire(1);
|
EBR1 B 0 A_Refire(1);
|
||||||
Goto FireOne;
|
Goto FireOne;
|
||||||
EBR1 B 2;
|
EBR1 B 2;
|
||||||
|
|
@ -464,7 +484,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR1 G 2;
|
EBR1 G 2;
|
||||||
EBL2 A 0 A_Refire(1);
|
EBL2 A 0 A_Refire(1);
|
||||||
Goto FireOne;
|
Goto FireOne;
|
||||||
EBL2 A 3 A_PlaySound("utrl/load",CHAN_WEAPON);
|
EBL2 A 3 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBL2 B 0 A_Refire(1);
|
EBL2 B 0 A_Refire(1);
|
||||||
Goto FireOne;
|
Goto FireOne;
|
||||||
EBL2 B 3;
|
EBL2 B 3;
|
||||||
|
|
@ -486,7 +506,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR2 A 0 A_LoadedRefire(1);
|
EBR2 A 0 A_LoadedRefire(1);
|
||||||
Goto FireTwo;
|
Goto FireTwo;
|
||||||
// load three
|
// load three
|
||||||
EBR2 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1);
|
EBR2 A 2 A_PlaySound("utrl/rotate",CHAN_6,0.1);
|
||||||
EBR2 B 0 A_Refire(1);
|
EBR2 B 0 A_Refire(1);
|
||||||
Goto FireTwo;
|
Goto FireTwo;
|
||||||
EBR2 B 2;
|
EBR2 B 2;
|
||||||
|
|
@ -507,7 +527,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR2 G 2;
|
EBR2 G 2;
|
||||||
EBL3 A 0 A_Refire(1);
|
EBL3 A 0 A_Refire(1);
|
||||||
Goto FireTwo;
|
Goto FireTwo;
|
||||||
EBL3 A 3 A_PlaySound("utrl/load",CHAN_WEAPON);
|
EBL3 A 3 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBL3 B 0 A_Refire(1);
|
EBL3 B 0 A_Refire(1);
|
||||||
Goto FireTwo;
|
Goto FireTwo;
|
||||||
EBL3 B 3;
|
EBL3 B 3;
|
||||||
|
|
@ -529,7 +549,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR3 A 0 A_LoadedRefire(1);
|
EBR3 A 0 A_LoadedRefire(1);
|
||||||
Goto FireThree;
|
Goto FireThree;
|
||||||
// load four
|
// load four
|
||||||
EBR3 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1);
|
EBR3 A 2 A_PlaySound("utrl/rotate",CHAN_6,0.1);
|
||||||
EBR3 B 0 A_Refire(1);
|
EBR3 B 0 A_Refire(1);
|
||||||
Goto FireThree;
|
Goto FireThree;
|
||||||
EBR3 B 2;
|
EBR3 B 2;
|
||||||
|
|
@ -550,7 +570,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR3 G 2;
|
EBR3 G 2;
|
||||||
EBL4 A 0 A_Refire(1);
|
EBL4 A 0 A_Refire(1);
|
||||||
Goto FireThree;
|
Goto FireThree;
|
||||||
EBL4 A 3 A_PlaySound("utrl/load",CHAN_WEAPON);
|
EBL4 A 3 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBL4 B 0 A_Refire(1);
|
EBL4 B 0 A_Refire(1);
|
||||||
Goto FireThree;
|
Goto FireThree;
|
||||||
EBL4 B 3;
|
EBL4 B 3;
|
||||||
|
|
@ -572,7 +592,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR4 A 0 A_LoadedRefire(1);
|
EBR4 A 0 A_LoadedRefire(1);
|
||||||
Goto FireFour;
|
Goto FireFour;
|
||||||
// load five
|
// load five
|
||||||
EBR4 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1);
|
EBR4 A 2 A_PlaySound("utrl/rotate",CHAN_6,0.1);
|
||||||
EBR4 B 0 A_Refire(1);
|
EBR4 B 0 A_Refire(1);
|
||||||
Goto FireFour;
|
Goto FireFour;
|
||||||
EBR4 B 2;
|
EBR4 B 2;
|
||||||
|
|
@ -593,7 +613,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR4 G 2;
|
EBR4 G 2;
|
||||||
EBL5 A 0 A_Refire(1);
|
EBL5 A 0 A_Refire(1);
|
||||||
Goto FireFour;
|
Goto FireFour;
|
||||||
EBL5 A 3 A_PlaySound("utrl/load",CHAN_WEAPON);
|
EBL5 A 3 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBL5 B 0 A_Refire(1);
|
EBL5 B 0 A_Refire(1);
|
||||||
Goto FireFour;
|
Goto FireFour;
|
||||||
EBL5 B 3;
|
EBL5 B 3;
|
||||||
|
|
@ -615,7 +635,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR5 A 0 A_LoadedRefire(1);
|
EBR5 A 0 A_LoadedRefire(1);
|
||||||
Goto FireFive;
|
Goto FireFive;
|
||||||
// load six
|
// load six
|
||||||
EBR5 A 2 A_PlaySound("utrl/rotate",CHAN_WEAPON,0.1);
|
EBR5 A 2 A_PlaySound("utrl/rotate",CHAN_6,0.1);
|
||||||
EBR5 B 0 A_Refire(1);
|
EBR5 B 0 A_Refire(1);
|
||||||
Goto FireFive;
|
Goto FireFive;
|
||||||
EBR5 B 2;
|
EBR5 B 2;
|
||||||
|
|
@ -636,7 +656,7 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBR5 G 2;
|
EBR5 G 2;
|
||||||
EBL6 A 0 A_Refire(1);
|
EBL6 A 0 A_Refire(1);
|
||||||
Goto FireFive;
|
Goto FireFive;
|
||||||
EBL6 A 3 A_PlaySound("utrl/load",CHAN_WEAPON);
|
EBL6 A 3 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBL6 B 0 A_Refire(1);
|
EBL6 B 0 A_Refire(1);
|
||||||
Goto FireFive;
|
Goto FireFive;
|
||||||
EBL6 B 3;
|
EBL6 B 3;
|
||||||
|
|
@ -657,43 +677,49 @@ Class UTRocketLauncher : UTWeapon
|
||||||
EBF1 A 0 A_FireRockets(1);
|
EBF1 A 0 A_FireRockets(1);
|
||||||
EBF1 ABCDEFGH 2;
|
EBF1 ABCDEFGH 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
FireTwo:
|
FireTwo:
|
||||||
EBF2 A 0 A_FireRockets(2);
|
EBF2 A 0 A_FireRockets(2);
|
||||||
EBF2 ABCDEFGHIJK 2;
|
EBF2 ABCDEFGHIJK 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
FireThree:
|
FireThree:
|
||||||
EBF3 A 0 A_FireRockets(3);
|
EBF3 A 0 A_FireRockets(3);
|
||||||
EBF3 ABCDEFGHIJ 2;
|
EBF3 ABCDEFGHIJ 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
FireFour:
|
FireFour:
|
||||||
EBF4 A 0 A_FireRockets(4);
|
EBF4 A 0 A_FireRockets(4);
|
||||||
EBF4 ABCDEFGHIJK 2;
|
EBF4 ABCDEFGHIJK 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
FireFive:
|
FireFive:
|
||||||
EBF5 A 0 A_FireRockets(5);
|
EBF5 A 0 A_FireRockets(5);
|
||||||
EBF5 ABCDEFGHIJKLM 2;
|
EBF5 ABCDEFGHIJKLM 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
FireSix:
|
FireSix:
|
||||||
EBF6 A 0 A_FireRockets(6);
|
EBF6 A 0 A_FireRockets(6);
|
||||||
EBF6 ABCDEFGHIJKLMNOP 2;
|
EBF6 ABCDEFGHIJKLMNOP 2;
|
||||||
EBL1 A 0 A_CheckReload();
|
EBL1 A 0 A_CheckReload();
|
||||||
EBL1 ABCDEFG 2;
|
EBL1 A 2 A_PlaySound("utrl/load",CHAN_6);
|
||||||
EBLI A 8;
|
EBL1 BCDEFG 2;
|
||||||
|
EBLI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
Deselect:
|
Deselect:
|
||||||
EBLD ABCDEFGHIJK 1;
|
EBLD ABCDEFGHIJK 1;
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ Class FlakChunk : Actor
|
||||||
+BOUNCEAUTOOFFFLOORONLY;
|
+BOUNCEAUTOOFFFLOORONLY;
|
||||||
+CANBOUNCEWATER;
|
+CANBOUNCEWATER;
|
||||||
+SKYEXPLODE;
|
+SKYEXPLODE;
|
||||||
Scale 0.5;
|
Scale 0.3;
|
||||||
}
|
}
|
||||||
override bool CanCollideWith( Actor other, bool passive )
|
override bool CanCollideWith( Actor other, bool passive )
|
||||||
{
|
{
|
||||||
|
|
@ -163,7 +163,7 @@ Class FlakChunk : Actor
|
||||||
lifespeed = FRandom[Flak](0.004,0.008);
|
lifespeed = FRandom[Flak](0.004,0.008);
|
||||||
trail = ChunkTrail(Spawn("ChunkTrail",pos));
|
trail = ChunkTrail(Spawn("ChunkTrail",pos));
|
||||||
trail.target = self;
|
trail.target = self;
|
||||||
trail.speed = 2;
|
trail.speed = 1.2;
|
||||||
rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||||
pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||||
yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||||
|
|
@ -415,12 +415,13 @@ Class FlakSlug : Actor
|
||||||
let s = Spawn("UTSpark",pos);
|
let s = Spawn("UTSpark",pos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
}
|
}
|
||||||
numpt = Random[Flak](20,40);
|
numpt = Random[Flak](40,80);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,8);
|
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](6,16);
|
||||||
let s = Spawn("UTChip",pos);
|
let s = Spawn("UTChip",pos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
|
s.scale *= FRandom[Flak](0.9,1.8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
States
|
States
|
||||||
|
|
@ -507,10 +508,19 @@ Class FlakCannon : UTWeapon
|
||||||
int numpt = Random[Flak](20,30);
|
int numpt = Random[Flak](20,30);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (x+(FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8))).unit()*FRandom[Flak](8,32);
|
let s = Spawn("UTViewSpark",origin);
|
||||||
let s = Spawn("UTSpark",origin);
|
UTViewSpark(s).ofs = (10,2,-3);
|
||||||
s.vel = pvel;
|
UTViewSpark(s).vvel = (FRandom[Flak](3,12),FRandom[Flak](-4,4),FRandom[Flak](-4,4));
|
||||||
s.alpha *= 0.2;
|
s.target = self;
|
||||||
|
}
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-3);
|
||||||
|
UTViewSmoke(s).vvel = (FRandom[Flak](0,1.2),FRandom[Flak](-.4,.4),FRandom[Flak](-.4,.4));
|
||||||
|
s.target = self;
|
||||||
|
s.scale *= 2.4;
|
||||||
|
s.alpha *= 0.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
action void A_FireSlug()
|
action void A_FireSlug()
|
||||||
|
|
@ -539,10 +549,19 @@ Class FlakCannon : UTWeapon
|
||||||
int numpt = Random[Flak](10,15);
|
int numpt = Random[Flak](10,15);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (x+(FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8))).unit()*FRandom[Flak](8,32);
|
let s = Spawn("UTViewSpark",origin);
|
||||||
let s = Spawn("UTSpark",origin);
|
UTViewSpark(s).ofs = (10,2,-3);
|
||||||
s.vel = pvel;
|
UTViewSpark(s).vvel = (FRandom[Flak](3,12),FRandom[Flak](-4,4),FRandom[Flak](-4,4));
|
||||||
s.alpha *= 0.2;
|
s.target = self;
|
||||||
|
}
|
||||||
|
for ( int i=0; i<16; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-3);
|
||||||
|
UTViewSmoke(s).vvel = (FRandom[Flak](0,1.2),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8));
|
||||||
|
s.target = self;
|
||||||
|
s.scale *= 2.4;
|
||||||
|
s.alpha *= 0.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ Class MinigunTracer : Actor
|
||||||
override void Tick()
|
override void Tick()
|
||||||
{
|
{
|
||||||
Super.Tick();
|
Super.Tick();
|
||||||
|
if ( level.frozen || globalfreeze ) return;
|
||||||
Vector3 dir = level.Vec3Diff(pos,dest);
|
Vector3 dir = level.Vec3Diff(pos,dest);
|
||||||
if ( dir.length() < 160 )
|
if ( dir.length() < 160 )
|
||||||
{
|
{
|
||||||
|
|
@ -106,14 +107,14 @@ Class Minigun : UTWeapon
|
||||||
invoker.FireEffect();
|
invoker.FireEffect();
|
||||||
UTMainHandler.DoFlash(self,Color(32,255,255,0),1);
|
UTMainHandler.DoFlash(self,Color(32,255,255,0),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
if ( alt ) A_QuakeEx(3,3,3,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12);
|
if ( alt ) A_QuakeEx(2,2,2,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12);
|
||||||
else A_QuakeEx(2,2,2,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08);
|
else A_QuakeEx(1,1,1,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08);
|
||||||
let l = Spawn("MinigunLight",pos);
|
let l = Spawn("MinigunLight",pos);
|
||||||
l.target = self;
|
l.target = self;
|
||||||
if ( !alt ) MinigunLight(l).cnt--;
|
if ( !alt ) MinigunLight(l).cnt--;
|
||||||
Vector3 x, y, z, x2, y2, z2;
|
Vector3 x, y, z, x2, y2, z2;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+y*4.0-z*4.0;
|
Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+y*2.0-z*2.0;
|
||||||
double a = FRandom[Minigun](0,360), s = FRandom[Minigun](0,alt?0.05:0.02);
|
double a = FRandom[Minigun](0,360), s = FRandom[Minigun](0,alt?0.05:0.02);
|
||||||
[x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
[x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
||||||
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
||||||
|
|
@ -159,6 +160,14 @@ Class Minigun : UTWeapon
|
||||||
t.pitch = asin(-dir.z);
|
t.pitch = asin(-dir.z);
|
||||||
MinigunTracer(t).dest = d.HitLocation;
|
MinigunTracer(t).dest = d.HitLocation;
|
||||||
}
|
}
|
||||||
|
for ( int i=0; i<8; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-2);
|
||||||
|
s.scale *= 1.5;
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[Minigun](0.2,0.8),FRandom[Minigun](-0.3,0.3),FRandom[Minigun](-0.3,0.3));
|
||||||
|
s.target = self;
|
||||||
|
}
|
||||||
origin += x*8.0+y*5.0-z*5.0;
|
origin += x*8.0+y*5.0-z*5.0;
|
||||||
let c = Spawn("UTCasing",origin);
|
let c = Spawn("UTCasing",origin);
|
||||||
c.vel = x*FRandom[Junk](-2,2)+y*FRandom[Junk](3,6)+z*FRandom[Junk](3,5);
|
c.vel = x*FRandom[Junk](-2,2)+y*FRandom[Junk](3,6)+z*FRandom[Junk](3,5);
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,46 @@ Class PulseSpark : Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class ViewPulseSpark : PulseSpark
|
||||||
|
{
|
||||||
|
Vector3 ofs, vvel;
|
||||||
|
|
||||||
|
override void PostBeginPlay()
|
||||||
|
{
|
||||||
|
Actor.PostBeginPlay();
|
||||||
|
scale *= FRandom[Puff](0.4,0.9);
|
||||||
|
alpha *= FRandom[Puff](0.5,2.0);
|
||||||
|
roll = FRandom[Pulse](0,360);
|
||||||
|
}
|
||||||
|
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
Actor.Tick();
|
||||||
|
if ( !target || !target.player )
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Vector3 x, y, z;
|
||||||
|
[x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll);
|
||||||
|
Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz);
|
||||||
|
SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true);
|
||||||
|
bInvisible = (players[consoleplayer].camera != target);
|
||||||
|
if ( level.frozen || globalfreeze ) return;
|
||||||
|
ofs += vvel;
|
||||||
|
vvel *= 0.9;
|
||||||
|
scale *= 0.8;
|
||||||
|
if ( scale.x <= 0.01 ) Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
PSPK A 1 Bright A_FadeOut(FRandom[Pulse](0.0,0.15));
|
||||||
|
Wait;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class PulseBallLight : DynamicLight
|
Class PulseBallLight : DynamicLight
|
||||||
{
|
{
|
||||||
double pulseofs;
|
double pulseofs;
|
||||||
|
|
@ -146,6 +186,7 @@ Class PulseBall : Actor
|
||||||
PROJECTILE;
|
PROJECTILE;
|
||||||
+EXPLODEONWATER;
|
+EXPLODEONWATER;
|
||||||
+SKYEXPLODE;
|
+SKYEXPLODE;
|
||||||
|
+FORCEXYBILLBOARD;
|
||||||
Scale 0.19;
|
Scale 0.19;
|
||||||
Speed 29;
|
Speed 29;
|
||||||
Radius 2;
|
Radius 2;
|
||||||
|
|
@ -239,6 +280,24 @@ Class PulseBoltTracer : LineTracer
|
||||||
|
|
||||||
Class PulseBoltCap : Actor
|
Class PulseBoltCap : Actor
|
||||||
{
|
{
|
||||||
|
override void OnDestroy()
|
||||||
|
{
|
||||||
|
Super.OnDestroy();
|
||||||
|
if ( tracer ) tracer.Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
Super.Tick();
|
||||||
|
if ( bAMBUSH ) return;
|
||||||
|
if ( !tracer )
|
||||||
|
{
|
||||||
|
tracer = Spawn(GetClass(),pos);
|
||||||
|
tracer.bAMBUSH = true;
|
||||||
|
}
|
||||||
|
tracer.SetOrigin(pos,true);
|
||||||
|
}
|
||||||
|
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
RenderStyle "Add";
|
RenderStyle "Add";
|
||||||
|
|
@ -260,6 +319,23 @@ Class PulseBoltCap : Actor
|
||||||
|
|
||||||
Class PulseBoltHit : Actor
|
Class PulseBoltHit : Actor
|
||||||
{
|
{
|
||||||
|
override void OnDestroy()
|
||||||
|
{
|
||||||
|
Super.OnDestroy();
|
||||||
|
if ( tracer ) tracer.Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
Super.Tick();
|
||||||
|
if ( bAMBUSH ) return;
|
||||||
|
if ( !tracer )
|
||||||
|
{
|
||||||
|
tracer = Spawn(GetClass(),pos);
|
||||||
|
tracer.bAMBUSH = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
RenderStyle "Add";
|
RenderStyle "Add";
|
||||||
|
|
@ -332,11 +408,19 @@ Class PulseBolt : Actor
|
||||||
accdamage = 0;
|
accdamage = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos);
|
Vector3 norm = -x;
|
||||||
|
if ( t.Results.HitType == TRACE_HitWall )
|
||||||
|
{
|
||||||
|
norm = (t.Results.HitLine.delta.y,-t.Results.HitLine.delta.x,0).unit();
|
||||||
|
if ( t.Results.Side ) norm *= -1;
|
||||||
|
t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos);
|
||||||
|
}
|
||||||
|
else if ( t.Results.HitType == TRACE_HitFloor ) norm = t.Results.HitSector.floorplane.Normal;
|
||||||
|
else if ( t.Results.HitType == TRACE_HitCeiling ) norm = t.Results.HitSector.ceilingplane.Normal;
|
||||||
int numpt = Random[Pulse](10,20)*!Random[Pulse](0,2);
|
int numpt = Random[Pulse](10,20)*!Random[Pulse](0,2);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = ((FRandom[Pulse](-.4,.5),FRandom[Pulse](-.4,.4),FRandom[Pulse](-.4,.4))-x).unit()*FRandom[Pulse](2,4);
|
Vector3 pvel = (norm+(FRandom[Pulse](-.6,.6),FRandom[Pulse](-.6,.6),FRandom[Pulse](-.6,.6))).unit()*FRandom[Pulse](2,4);
|
||||||
let s = Spawn("PulseSpark",t.Results.HitPos-t.Results.HitVector*4);
|
let s = Spawn("PulseSpark",t.Results.HitPos-t.Results.HitVector*4);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
}
|
}
|
||||||
|
|
@ -346,7 +430,11 @@ Class PulseBolt : Actor
|
||||||
weffect = null;
|
weffect = null;
|
||||||
}
|
}
|
||||||
if ( !weffect ) weffect = Spawn("PulseBoltHit",t.Results.HitPos-t.Results.HitVector*4);
|
if ( !weffect ) weffect = Spawn("PulseBoltHit",t.Results.HitPos-t.Results.HitVector*4);
|
||||||
else weffect.SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true);
|
else
|
||||||
|
{
|
||||||
|
weffect.SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true);
|
||||||
|
if ( weffect.tracer ) weffect.tracer.SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true);
|
||||||
|
}
|
||||||
A_SprayDecal("BoltScorch",beamsize+8);
|
A_SprayDecal("BoltScorch",beamsize+8);
|
||||||
if ( next )
|
if ( next )
|
||||||
{
|
{
|
||||||
|
|
@ -367,7 +455,7 @@ Class PulseBolt : Actor
|
||||||
int numpt = Random[Pulse](5,10)*!Random[Pulse](0,5);
|
int numpt = Random[Pulse](5,10)*!Random[Pulse](0,5);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (t.Results.HitVector+(FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5))).unit()*FRandom[Pulse](2,4);
|
Vector3 pvel = (t.Results.HitVector+(FRandom[Pulse](-.6,.6),FRandom[Pulse](-.6,.6),FRandom[Pulse](-.6,.6))).unit()*FRandom[Pulse](2,4);
|
||||||
let s = Spawn("PulseSpark",t.Results.HitPos);
|
let s = Spawn("PulseSpark",t.Results.HitPos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
}
|
}
|
||||||
|
|
@ -377,7 +465,11 @@ Class PulseBolt : Actor
|
||||||
weffect = null;
|
weffect = null;
|
||||||
}
|
}
|
||||||
if ( !weffect ) weffect = Spawn("PulseBoltCap",t.Results.HitPos);
|
if ( !weffect ) weffect = Spawn("PulseBoltCap",t.Results.HitPos);
|
||||||
else weffect.SetOrigin(t.Results.HitPos,true);
|
else
|
||||||
|
{
|
||||||
|
weffect.SetOrigin(t.Results.HitPos,true);
|
||||||
|
if ( weffect.tracer ) weffect.tracer.SetOrigin(t.Results.HitPos,true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -489,12 +581,23 @@ Class PulseGun : UTWeapon
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+4.1*y-2.7*z;
|
Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+4.1*y-2.7*z;
|
||||||
int numpt = Random[Pulse](2,5);
|
for ( int i=0; i<4; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,4.1,-2.7);
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("206010");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[Pulse](0.2,0.6),FRandom[Pulse](-0.2,0.2),FRandom[Pulse](-0.2,0.2));
|
||||||
|
}
|
||||||
|
int numpt = Random[Pulse](8,16);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (x+(FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5))).unit()*FRandom[Pulse](2,4);
|
let s = Spawn("ViewPulseSpark",origin);
|
||||||
let s = Spawn("PulseSpark",origin);
|
ViewPulseSpark(s).ofs = (10,4.1,-2.7);
|
||||||
s.vel = pvel;
|
s.target = self;
|
||||||
|
ViewPulseSpark(s).vvel += (FRandom[Pulse](0.2,0.8),FRandom[Pulse](-0.5,0.5),FRandom[Pulse](-0.5,0.5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
action void A_PulseRefire( statelabel flash = null, bool noreload = false )
|
action void A_PulseRefire( statelabel flash = null, bool noreload = false )
|
||||||
|
|
@ -542,7 +645,7 @@ Class PulseGun : UTWeapon
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
double a;
|
double a;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+4.0*y-1.5*z;
|
Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+3.0*y-1.8*z;
|
||||||
origin += y*cos(invoker.sangle)*2.0+z*sin(invoker.sangle)*2.0;
|
origin += y*cos(invoker.sangle)*2.0+z*sin(invoker.sangle)*2.0;
|
||||||
invoker.sangle += 100;
|
invoker.sangle += 100;
|
||||||
Actor p = Spawn("PulseBall",origin);
|
Actor p = Spawn("PulseBall",origin);
|
||||||
|
|
@ -550,12 +653,23 @@ Class PulseGun : UTWeapon
|
||||||
p.pitch = BulletSlope();
|
p.pitch = BulletSlope();
|
||||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||||
p.target = self;
|
p.target = self;
|
||||||
int numpt = Random[Pulse](2,5);
|
for ( int i=0; i<8; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,3.0,-1.8);
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("206010");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[Pulse](0.4,0.8),FRandom[Pulse](-0.2,0.2),FRandom[Pulse](-0.2,0.2));
|
||||||
|
}
|
||||||
|
int numpt = Random[Pulse](8,16);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (x+(FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5),FRandom[Pulse](-.5,.5))).unit()*FRandom[Pulse](2,4);
|
let s = Spawn("ViewPulseSpark",origin);
|
||||||
let s = Spawn("PulseSpark",origin);
|
ViewPulseSpark(s).ofs = (10,3.0,-1.8);
|
||||||
s.vel = pvel;
|
s.target = self;
|
||||||
|
ViewPulseSpark(s).vvel += (FRandom[Pulse](0.4,1.6),FRandom[Pulse](-1.2,1.2),FRandom[Pulse](-1.2,1.2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
action void A_StartBeam()
|
action void A_StartBeam()
|
||||||
|
|
|
||||||
|
|
@ -271,10 +271,10 @@ Class Ripper2 : UTWeapon
|
||||||
UTMainHandler.DoFlash(self,Color(8,0,255,255),1);
|
UTMainHandler.DoFlash(self,Color(8,0,255,255),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
if ( alt ) A_QuakeEx(3,3,3,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
if ( alt ) A_QuakeEx(3,3,3,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||||
else A_QuakeEx(2,2,2,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08);
|
else A_QuakeEx(1,1,1,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08);
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+8.0*y-7.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+6.0*y-4.0*z;
|
||||||
Actor p;
|
Actor p;
|
||||||
if ( alt ) p = Spawn("Razor2Alt",origin);
|
if ( alt ) p = Spawn("Razor2Alt",origin);
|
||||||
else p = Spawn("Razor2",origin);
|
else p = Spawn("Razor2",origin);
|
||||||
|
|
|
||||||
|
|
@ -916,6 +916,46 @@ Class SuperShockBall : Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class ViewShockSpark : ShockSpark
|
||||||
|
{
|
||||||
|
Vector3 ofs, vvel;
|
||||||
|
|
||||||
|
override void PostBeginPlay()
|
||||||
|
{
|
||||||
|
Actor.PostBeginPlay();
|
||||||
|
scale *= FRandom[Puff](0.4,0.9);
|
||||||
|
alpha *= FRandom[Puff](0.5,2.0);
|
||||||
|
roll = FRandom[ASMD](0,360);
|
||||||
|
}
|
||||||
|
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
Actor.Tick();
|
||||||
|
if ( !target || !target.player )
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Vector3 x, y, z;
|
||||||
|
[x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll);
|
||||||
|
Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz);
|
||||||
|
SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true);
|
||||||
|
bInvisible = (players[consoleplayer].camera != target);
|
||||||
|
if ( level.frozen || globalfreeze ) return;
|
||||||
|
ofs += vvel;
|
||||||
|
vvel *= 0.9;
|
||||||
|
scale *= 0.8;
|
||||||
|
if ( scale.x <= 0.01 ) Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ASMK A 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.1));
|
||||||
|
Wait;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class ShockRifle : UTWeapon
|
Class ShockRifle : UTWeapon
|
||||||
{
|
{
|
||||||
action void A_ShockFire()
|
action void A_ShockFire()
|
||||||
|
|
@ -928,14 +968,32 @@ Class ShockRifle : UTWeapon
|
||||||
invoker.FireEffect();
|
invoker.FireEffect();
|
||||||
UTMainHandler.DoFlash(self,Color(128,128,0,255),1);
|
UTMainHandler.DoFlash(self,Color(128,128,0,255),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
A_QuakeEx(3,3,3,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z;
|
||||||
Actor p = Spawn("ShockBeam",origin);
|
Actor p = Spawn("ShockBeam",origin);
|
||||||
p.angle = angle;
|
p.angle = angle;
|
||||||
p.pitch = BulletSlope();
|
p.pitch = BulletSlope();
|
||||||
p.target = self;
|
p.target = self;
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-1.5);
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("C080FF");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[ASMD](0.2,0.6),FRandom[ASMD](-0.2,0.2),FRandom[ASMD](-0.2,0.2));
|
||||||
|
}
|
||||||
|
int numpt = Random[ASMD](20,40);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("ViewShockSpark",origin);
|
||||||
|
ViewShockSpark(s).ofs = (10,2,-1.5);
|
||||||
|
s.target = self;
|
||||||
|
ViewShockSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
action void A_ShockAlt()
|
action void A_ShockAlt()
|
||||||
{
|
{
|
||||||
|
|
@ -947,15 +1005,33 @@ Class ShockRifle : UTWeapon
|
||||||
invoker.FireEffect();
|
invoker.FireEffect();
|
||||||
UTMainHandler.DoFlash(self,Color(128,128,0,255),1);
|
UTMainHandler.DoFlash(self,Color(128,128,0,255),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
A_QuakeEx(3,3,3,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
A_QuakeEx(2,2,2,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z;
|
||||||
Actor p = Spawn("ShockBall",origin);
|
Actor p = Spawn("ShockBall",origin);
|
||||||
p.angle = angle;
|
p.angle = angle;
|
||||||
p.pitch = BulletSlope();
|
p.pitch = BulletSlope();
|
||||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||||
p.target = self;
|
p.target = self;
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-1.5);
|
||||||
|
s.scale *= 2.2;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("C080FF");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[ASMD](0.4,1.2),FRandom[ASMD](-0.4,0.4),FRandom[ASMD](-0.4,0.4));
|
||||||
|
}
|
||||||
|
int numpt = Random[ASMD](20,40);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("ViewShockSpark",origin);
|
||||||
|
ViewShockSpark(s).ofs = (10,2,-1.5);
|
||||||
|
s.target = self;
|
||||||
|
ViewShockSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Default
|
Default
|
||||||
|
|
@ -1025,6 +1101,17 @@ Class EnhancedShockAmmo : Ammo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class ViewSuperShockSpark : ViewShockSpark
|
||||||
|
{
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
SSMK A 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.1));
|
||||||
|
Wait;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class EnhancedShockRifle : UTWeapon replaces InvulnerabilitySphere
|
Class EnhancedShockRifle : UTWeapon replaces InvulnerabilitySphere
|
||||||
{
|
{
|
||||||
int ticcnt;
|
int ticcnt;
|
||||||
|
|
@ -1048,14 +1135,32 @@ Class EnhancedShockRifle : UTWeapon replaces InvulnerabilitySphere
|
||||||
invoker.FireEffect();
|
invoker.FireEffect();
|
||||||
UTMainHandler.DoFlash(self,Color(128,255,128,0),1);
|
UTMainHandler.DoFlash(self,Color(128,255,128,0),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
A_QuakeEx(8,8,8,12,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25);
|
A_QuakeEx(3,3,3,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15);
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z;
|
||||||
Actor p = Spawn("SuperShockBeam",origin);
|
Actor p = Spawn("SuperShockBeam",origin);
|
||||||
p.angle = angle;
|
p.angle = angle;
|
||||||
p.pitch = BulletSlope();
|
p.pitch = BulletSlope();
|
||||||
p.target = self;
|
p.target = self;
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-1.5);
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("FFC040");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[ASMD](0.2,0.6),FRandom[ASMD](-0.2,0.2),FRandom[ASMD](-0.2,0.2));
|
||||||
|
}
|
||||||
|
int numpt = Random[ASMD](20,40);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("ViewSuperShockSpark",origin);
|
||||||
|
ViewShockSpark(s).ofs = (10,2,-1.5);
|
||||||
|
s.target = self;
|
||||||
|
ViewShockSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
action void A_SShockAlt()
|
action void A_SShockAlt()
|
||||||
{
|
{
|
||||||
|
|
@ -1067,15 +1172,33 @@ Class EnhancedShockRifle : UTWeapon replaces InvulnerabilitySphere
|
||||||
invoker.FireEffect();
|
invoker.FireEffect();
|
||||||
UTMainHandler.DoFlash(self,Color(128,255,128,0),1);
|
UTMainHandler.DoFlash(self,Color(128,255,128,0),1);
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
A_QuakeEx(8,8,8,16,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25);
|
A_QuakeEx(3,3,3,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15);
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z;
|
||||||
Actor p = Spawn("SuperShockBall",origin);
|
Actor p = Spawn("SuperShockBall",origin);
|
||||||
p.angle = angle;
|
p.angle = angle;
|
||||||
p.pitch = BulletSlope();
|
p.pitch = BulletSlope();
|
||||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||||
p.target = self;
|
p.target = self;
|
||||||
|
for ( int i=0; i<12; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,2,-1.5);
|
||||||
|
s.scale *= 2.2;
|
||||||
|
s.target = self;
|
||||||
|
s.SetShade("FFC040");
|
||||||
|
s.A_SetRenderStyle(0.4,STYLE_AddShaded);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[ASMD](0.4,1.2),FRandom[ASMD](-0.4,0.4),FRandom[ASMD](-0.4,0.4));
|
||||||
|
}
|
||||||
|
int numpt = Random[ASMD](20,40);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("ViewSuperShockSpark",origin);
|
||||||
|
ViewShockSpark(s).ofs = (10,2,-1.5);
|
||||||
|
s.target = self;
|
||||||
|
ViewShockSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
|
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,15 @@ Class SniperRifle : UTWeapon
|
||||||
p.pitch = asin(-hitnormal.z);
|
p.pitch = asin(-hitnormal.z);
|
||||||
if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
|
if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
|
||||||
}
|
}
|
||||||
|
for ( int i=0; i<24; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("UTStaticViewSmoke",origin);
|
||||||
|
UTViewSmoke(s).ofs = (10,1,-1);
|
||||||
|
UTViewSmoke(s).vvel += (FRandom[Sniper](-0.05,0.15),FRandom[Sniper](-0.4,0.4),FRandom[Sniper](-0.1,0.1));
|
||||||
|
s.target = self;
|
||||||
|
s.scale *= 1.8;
|
||||||
|
s.alpha *= 0.3;
|
||||||
|
}
|
||||||
origin += x*8.0+y*6.0-z*9.0;
|
origin += x*8.0+y*6.0-z*9.0;
|
||||||
let c = Spawn("UTCasing",origin);
|
let c = Spawn("UTCasing",origin);
|
||||||
c.scale *= 1.25;
|
c.scale *= 1.25;
|
||||||
|
|
|
||||||
|
|
@ -390,6 +390,37 @@ Class UTSpark : Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class UTViewSpark : UTSpark
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
+NOCLIP;
|
||||||
|
-MISSILE;
|
||||||
|
BounceType "None";
|
||||||
|
}
|
||||||
|
Vector3 ofs, vvel;
|
||||||
|
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
Actor.Tick();
|
||||||
|
if ( !target || !target.player )
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Vector3 x, y, z;
|
||||||
|
[x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll);
|
||||||
|
Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz);
|
||||||
|
SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true);
|
||||||
|
bInvisible = (players[consoleplayer].camera != target);
|
||||||
|
if ( level.frozen || globalfreeze ) return;
|
||||||
|
ofs += vvel;
|
||||||
|
vvel.z -= 0.1;
|
||||||
|
scale *= 0.8;
|
||||||
|
if ( (scale.x <= 0.01) || (waterlevel > 0) ) Destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class UTChip : Actor
|
Class UTChip : Actor
|
||||||
{
|
{
|
||||||
int deadtimer;
|
int deadtimer;
|
||||||
|
|
@ -635,6 +666,16 @@ Class UTViewSmoke : UTSmoke
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class UTStaticViewSmoke : UTViewSmoke
|
||||||
|
{
|
||||||
|
override void PostBeginPlay()
|
||||||
|
{
|
||||||
|
Actor.PostBeginPlay();
|
||||||
|
scale *= FRandom[Puff](0.1,0.3);
|
||||||
|
alpha *= FRandom[Puff](0.5,1.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class UTRedSkull : RedSkull replaces RedSkull
|
Class UTRedSkull : RedSkull replaces RedSkull
|
||||||
{
|
{
|
||||||
Default
|
Default
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue