Replaced some incorrect instances of clip with magazine.

Add SMP 7243 from Oldskool to the BFG pool (toggleable).
Random fixarounds.
Spent mag models for the pistols, will be used (and backported to DT) soon.
This commit is contained in:
Marisa the Magician 2019-09-04 19:31:12 +02:00
commit bac59b45c1
31 changed files with 672 additions and 31 deletions

View file

@ -15,8 +15,8 @@ until the end of time.
## Automag ## Automag
A very reliable gunpowder-based firearm, chambered in 9mm. Uses two 10-round A very reliable gunpowder-based firearm, chambered in 9mm. Magazine feeds off
clips in tandem. two 10-round clips in tandem.
Primary fire: The typical. Hold for automatic fire. Primary fire: The typical. Hold for automatic fire.
@ -145,6 +145,15 @@ Primary fire: A rapid barrage of bullets.
Secondary fire: A much faster, but less accurate rain of pain. Secondary fire: A much faster, but less accurate rain of pain.
## SMP 7243
A limited edition, gold-plated rapid fire Automag. Magazine holds 100 rounds,
but believe it or not, they won't last very long.
Primary fire: Full auto, semi-accurate. Empties mag in 9 seconds.
Secondary fire: Fuller auto, extremely inaccurate. Empties mag in 3 seconds.
# Prototype weapons # Prototype weapons
## Stunner ## Stunner
@ -216,7 +225,7 @@ higher velocity, resulting in increased damage.
The special trait of this weapon comes into play when you realize that there's The special trait of this weapon comes into play when you realize that there's
no need to reload. An experimental entanglement unit inside the gun's internal no need to reload. An experimental entanglement unit inside the gun's internal
clip locates spare ammunition carried by the user and automatically loads it. mag locates spare ammunition carried by the user and automatically loads it.
Since there's no need to reload, pressing the reload button makes use of the Since there's no need to reload, pressing the reload button makes use of the
gun's weight to beat the crap out of your enemies up close. gun's weight to beat the crap out of your enemies up close.

View file

@ -43,6 +43,7 @@ Doom Tournament (currently the devel branch is required).
- GES Bio Rifle (slot 8) (replaces plasma rifle) - GES Bio Rifle (slot 8) (replaces plasma rifle)
- Rifle (slot 9) (replaces plasma rifle) - Rifle (slot 9) (replaces plasma rifle)
- Minigun (slot 0) (replaces chaingun) - Minigun (slot 0) (replaces chaingun)
- SMP 7243 (slot 0) (replaces bfg9000)
- Flashlight (replaces light amplifier) - Flashlight (replaces light amplifier)
- Searchlight (must be placed manually for balance reasons) - Searchlight (must be placed manually for balance reasons)

View file

@ -18,3 +18,5 @@ server bool sting_dpistol = false; // d.pistol altfire always level 0
server bool sting_pshield = false; // p.shield does not drain over time server bool sting_pshield = false; // p.shield does not drain over time
user bool sting_transext = false; // use an extended translator graphic user bool sting_transext = false; // use an extended translator graphic
// to fit more text // to fit more text
server bool sting_olsmp = false; // adds the stupid oldskool SMP 7243 to
// the BFG/Redeemer replacement pool

View file

@ -670,3 +670,15 @@ HardwareShader Texture "models/AsmdPBeam.png"
{ {
Shader "shaders/glsl/AsmdPBeam.fp" Shader "shaders/glsl/AsmdPBeam.fp"
} }
HardwareShader Texture "models/OLSMP.png"
{
Shader "shaders/glsl/MeshEnviroMapMasked.fp"
Texture "masktex" "models/OLSMP_m.png"
texture "envtex" "models/OLSMP_env.png"
}
HardwareShader Texture "models/OLSMP_.png"
{
Shader "shaders/glsl/MeshEnviroMapMasked_AmbientGlow.fp"
Texture "masktex" "models/OLSMP_m.png"
texture "envtex" "models/OLSMP_env.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
graphics/icons/I_OLSMP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -34,6 +34,7 @@ O_BIGGUN = "%k blew a hole through %o with the Demolisher.";
O_SMINI = "%o got blasted into steaming chunks by %k's Autocannon."; O_SMINI = "%o got blasted into steaming chunks by %k's Autocannon.";
O_SENTRY = "%o shouldn't have walked into the sights of %k's Sentry."; O_SENTRY = "%o shouldn't have walked into the sights of %k's Sentry.";
O_STINGERX = "%o ate flaming Tarydium death thanks to %k."; O_STINGERX = "%o ate flaming Tarydium death thanks to %k.";
O_OLSMP = "%o didn't stand a chance against %k's SMP 7243.";
/* Pickup messages */ /* Pickup messages */
I_WPOWERUP = "You got a Dispersion Pistol Powerup."; I_WPOWERUP = "You got a Dispersion Pistol Powerup.";
I_STINGERAMMOL = "You picked up "; I_STINGERAMMOL = "You picked up ";
@ -95,6 +96,8 @@ I_SHEALTH = "You picked up the Super Health Pack.";
I_FLASHLIGHT = "You picked up a Flashlight."; I_FLASHLIGHT = "You picked up a Flashlight.";
I_DETECTOR = "You got the Motion Detector."; I_DETECTOR = "You got the Motion Detector.";
I_SCUBA = "You picked up the SCUBA Gear."; I_SCUBA = "You picked up the SCUBA Gear.";
I_OLSMP = "You got the SMP 7243. Time to kick ass!";
I_OLSMPAMMO = "You picked up a SMP 7243 Magazine.";
/* Tags */ /* Tags */
T_WPOWERUP = "Dispersion Pistol Powerup"; T_WPOWERUP = "Dispersion Pistol Powerup";
T_STINGERAMMO = "Tarydium Shards"; T_STINGERAMMO = "Tarydium Shards";
@ -156,6 +159,8 @@ T_LFLARES = "Light Flare";
T_DFLARES = "Darkness Flare"; T_DFLARES = "Darkness Flare";
T_DETECTOR = "Motion Detector"; T_DETECTOR = "Motion Detector";
T_SCUBA = "SCUBA Gear"; T_SCUBA = "SCUBA Gear";
T_OLSMP = "SMP 7243";
T_OLSMPAMMO = "SMP 7243 Magazine";
/* Miscellaneous */ /* Miscellaneous */
TR_NOMSG = "No new messages"; TR_NOMSG = "No new messages";
TR_NEWMSG = "New Translator message"; TR_NEWMSG = "New Translator message";
@ -200,6 +205,7 @@ STING_PROTODUAL = "Protomags";
STING_UOPTS = "Compatibility options"; STING_UOPTS = "Compatibility options";
STING_DPISTOL = "Dispersion Pistol altfire isn't upgraded"; STING_DPISTOL = "Dispersion Pistol altfire isn't upgraded";
STING_PSHIELD = "Power Shield does not drain over time"; STING_PSHIELD = "Power Shield does not drain over time";
STING_OLSMP = "Enable SMP 7243 from Oldskool Amp'd";
STING_MCREDS = "Unreal Credits"; STING_MCREDS = "Unreal Credits";
STING_CDR = "Doomreal"; STING_CDR = "Doomreal";
STING_CLEAD = "Development Lead:"; STING_CLEAD = "Development Lead:";
@ -243,6 +249,7 @@ O_BIGGUN = "%k abrió un hoyo a través de %o con el Demoledor.";
O_SMINI = "%o fue reventad@[ao_esp] en pedazos humeantes por el Autocañón de %k."; O_SMINI = "%o fue reventad@[ao_esp] en pedazos humeantes por el Autocañón de %k.";
O_SENTRY = "%o no debería haberse metido en el punto de mira de la Torreta de %k."; O_SENTRY = "%o no debería haberse metido en el punto de mira de la Torreta de %k.";
O_STINGERX = "%o tragó muerte ardiente de Tarydium gracias a %k."; O_STINGERX = "%o tragó muerte ardiente de Tarydium gracias a %k.";
O_OLSMP = "%o no tenía ninguna oportunidad contra el SMP 7243 de %k.";
/* Pickup messages */ /* Pickup messages */
I_WPOWERUP = "Has obtenido una Mejora para la Pistola de Dispersión."; I_WPOWERUP = "Has obtenido una Mejora para la Pistola de Dispersión.";
I_STINGERAMMOL = "Has recogido "; I_STINGERAMMOL = "Has recogido ";
@ -304,6 +311,8 @@ I_SHEALTH = "Has recogido el Paquete de Supersalud.";
I_FLASHLIGHT = "Has recogido una Linterna."; I_FLASHLIGHT = "Has recogido una Linterna.";
I_DETECTOR = "Has obtenido el Detector de Movimiento."; I_DETECTOR = "Has obtenido el Detector de Movimiento.";
I_SCUBA = "Has recogido el Kit de Buceo."; I_SCUBA = "Has recogido el Kit de Buceo.";
I_OLSMP = "Has obtenido el SMP 7243. ¡Hora de patear traseros!";
I_OLSMPAMMO = "Has recogido un Cargador de SMP 7243.";
/* Tags */ /* Tags */
T_WPOWERUP = "Mejora para Pistola de Dispersión"; T_WPOWERUP = "Mejora para Pistola de Dispersión";
T_STINGERAMMO = "Fragmentos de Tarydium"; T_STINGERAMMO = "Fragmentos de Tarydium";
@ -361,6 +370,7 @@ T_LFLARES = "Bengala Luminosa";
T_DFLARES = "Bengala Oscura"; T_DFLARES = "Bengala Oscura";
T_DETECTOR = "Detector de Movimiento"; T_DETECTOR = "Detector de Movimiento";
T_SCUBA = "Kit de Buceo"; T_SCUBA = "Kit de Buceo";
T_OLSMPAMMO = "Cargador de SMP 7243";
/* Miscellaneous */ /* Miscellaneous */
TR_NOMSG = "No hay mensajes nuevos"; TR_NOMSG = "No hay mensajes nuevos";
TR_NEWMSG = "Nuevo mensaje de Traductor"; TR_NEWMSG = "Nuevo mensaje de Traductor";
@ -392,6 +402,7 @@ STING_PROTODUAL = "Protoarmas";
STING_UOPTS = "Opciones de compatibilidad"; STING_UOPTS = "Opciones de compatibilidad";
STING_DPISTOL = "El fuego alternativo de la Pistola de Dispersión no es mejorado"; STING_DPISTOL = "El fuego alternativo de la Pistola de Dispersión no es mejorado";
STING_PSHIELD = "El Escudo de Fuerza no pierde carga con el tiempo"; STING_PSHIELD = "El Escudo de Fuerza no pierde carga con el tiempo";
STING_OLSMP = "Habilitar SMP 7243 de Oldskool Amp'd";
STING_MCREDS = "Créditos de Unreal"; STING_MCREDS = "Créditos de Unreal";
STING_CDR = "Doomreal"; STING_CDR = "Doomreal";
STING_CLEAD = "Desarrolladora Jefe:"; STING_CLEAD = "Desarrolladora Jefe:";

View file

@ -39,6 +39,7 @@ OptionMenu "UnrealOptionMenu"
StaticText "$STING_UOPTS", "Gold" StaticText "$STING_UOPTS", "Gold"
Option "$STING_DPISTOL", "sting_dpistol", "YesNo" Option "$STING_DPISTOL", "sting_dpistol", "YesNo"
Option "$STING_PSHIELD", "sting_pshield", "YesNo" Option "$STING_PSHIELD", "sting_pshield", "YesNo"
Option "$STING_OLSMP", "sting_olsmp", "YesNo"
} }
AddOptionMenu "OptionsMenu" AddOptionMenu "OptionsMenu"

183
modeldef.olsmp Normal file
View file

@ -0,0 +1,183 @@
Model "OLSMPAmmo"
{
Path "models"
Model 0 "OLSMPAmmo_d.3d"
Skin 0 "OLSMP_.png"
Scale 0.08 -0.08 0.096
ZOffset 1
FrameIndex UCLP A 0 0
}
Model "OLSMP"
{
Path "models"
Model 1 "OLSMPPick_d.3d"
Skin 1 "OLSMP_.png"
Scale 0.08 -0.08 0.096
AngleOffset -90
ZOffset 19
FrameIndex AUTP B 1 0
ZOffset 21
ROTATING
FrameIndex AUTP A 1 0
}
Model "OLSMP"
{
Path "models"
Model 2 "Flat_d.3d"
AngleOffset 90
Scale 0.04 0.04 0.04
Offset 12.4 -30.0 -3.9
Skin 2 "Muz1.png"
FrameIndex AMUZ A 2 0
Skin 2 "Muz2.png"
FrameIndex AMUZ B 2 0
Skin 2 "Muz3.png"
FrameIndex AMUZ C 2 0
Skin 2 "Muz4.png"
FrameIndex AMUZ D 2 0
Skin 2 "Muz5.png"
FrameIndex AMUZ E 2 0
Skin 2 "Muz6.png"
FrameIndex AMUZ F 2 0
Skin 2 "Muz7.png"
FrameIndex AMUZ G 2 0
Skin 2 "Muz8.png"
FrameIndex AMUZ H 2 0
Skin 2 "Muz9.png"
FrameIndex AMUZ I 2 0
}
Model "OLSMP"
{
Path "models"
Model 0 "OLSMPR_d.3d"
SurfaceSkin 0 1 "OLSMP.png"
Scale 0.12 -0.06 0.084
Offset 6.9 -16.8 -11.1
AngleOffset 90
RollOffset -90
// Fire
FrameIndex AUTF A 0 1
FrameIndex AUTF B 0 1
FrameIndex AUTF C 0 2
FrameIndex AUTF D 0 3
// Fire0
FrameIndex AUTF E 0 4
FrameIndex AUTF F 0 5
FrameIndex AUTF G 0 6
// Fire1
FrameIndex AUTF H 0 7
FrameIndex AUTF I 0 8
FrameIndex AUTF J 0 9
// Fire2
FrameIndex AUTF K 0 10
FrameIndex AUTF L 0 11
FrameIndex AUTF M 0 12
// Release
FrameIndex AUTF N 0 13
FrameIndex AUTF O 0 14
FrameIndex AUTF P 0 15
FrameIndex AUTF Q 0 16
FrameIndex AUTF R 0 17
FrameIndex AUTF S 0 18
FrameIndex AUTF T 0 19
// Twiddle
FrameIndex AUTT A 0 20
FrameIndex AUTT B 0 21
FrameIndex AUTT C 0 22
FrameIndex AUTT D 0 23
FrameIndex AUTT E 0 24
FrameIndex AUTT F 0 25
FrameIndex AUTT G 0 26
FrameIndex AUTT H 0 27
FrameIndex AUTT I 0 28
FrameIndex AUTT J 0 29
FrameIndex AUTT K 0 30
FrameIndex AUTT L 0 31
FrameIndex AUTT M 0 32
FrameIndex AUTT N 0 33
FrameIndex AUTT O 0 34
FrameIndex AUTT P 0 35
FrameIndex AUTT Q 0 36
FrameIndex AUTT R 0 37
FrameIndex AUTT S 0 38
FrameIndex AUTT T 0 39
FrameIndex AUTT U 0 40
FrameIndex AUTT V 0 41
FrameIndex AUTT W 0 42
FrameIndex AUTT X 0 43
FrameIndex AUTT Y 0 44
// Sway
FrameIndex AUTI A 0 20
FrameIndex AUTI B 0 21
// Eject
FrameIndex AUTR A 0 45
FrameIndex AUTR B 0 46
FrameIndex AUTR C 0 47
FrameIndex AUTR D 0 48
FrameIndex AUTR E 0 49
FrameIndex AUTR F 0 50
FrameIndex AUTR G 0 51
FrameIndex AUTR H 0 52
FrameIndex AUTR I 0 53
FrameIndex AUTR J 0 54
FrameIndex AUTR K 0 55
FrameIndex AUTR L 0 56
FrameIndex AUTR M 0 57
FrameIndex AUTR N 0 58
FrameIndex AUTR O 0 59
FrameIndex AUTR P 0 60
FrameIndex AUTR Q 0 61
FrameIndex AUTR R 0 62
FrameIndex AUTR S 0 63
FrameIndex AUTR T 0 64
FrameIndex AUTR U 0 65
FrameIndex AUTR V 0 66
FrameIndex AUTR W 0 67
FrameIndex AUTR X 0 68
FrameIndex AUTR Y 0 69
// Down
FrameIndex AUTD A 0 70
FrameIndex AUTD B 0 71
FrameIndex AUTD C 0 72
FrameIndex AUTD D 0 73
FrameIndex AUTD E 0 74
// Select
FrameIndex AUTS A 0 75
FrameIndex AUTS B 0 76
FrameIndex AUTS C 0 77
FrameIndex AUTS D 0 78
FrameIndex AUTS E 0 79
FrameIndex AUTS F 0 80
FrameIndex AUTS G 0 81
FrameIndex AUTS H 0 82
FrameIndex AUTS I 0 83
FrameIndex AUTS J 0 84
FrameIndex AUTS K 0 85
FrameIndex AUTS L 0 86
FrameIndex AUTS M 0 87
FrameIndex AUTS N 0 88
FrameIndex AUTS O 0 89
FrameIndex AUTS P 0 90
FrameIndex AUTS Q 0 91
FrameIndex AUTS R 0 92
FrameIndex AUTS S 0 93
FrameIndex AUTS T 0 94
FrameIndex AUTS U 0 95
FrameIndex AUTS V 0 96
FrameIndex AUTS W 0 97
FrameIndex AUTS X 0 98
FrameIndex AUTS Y 0 99
FrameIndex AUTS Z 0 100
FrameIndex AUS2 A 0 101
FrameIndex AUS2 B 0 102
FrameIndex AUS2 C 0 103
FrameIndex AUS2 D 0 104
}

Binary file not shown.

Binary file not shown.

BIN
models/OLSMP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
models/OLSMPAmmo_a.3d Normal file

Binary file not shown.

BIN
models/OLSMPAmmo_d.3d Normal file

Binary file not shown.

BIN
models/OLSMPPick_a.3d Normal file

Binary file not shown.

BIN
models/OLSMPPick_d.3d Normal file

Binary file not shown.

BIN
models/OLSMPR_a.3d Normal file

Binary file not shown.

BIN
models/OLSMPR_d.3d Normal file

Binary file not shown.

BIN
models/OLSMPSpentClip_a.3d Normal file

Binary file not shown.

BIN
models/OLSMPSpentClip_d.3d Normal file

Binary file not shown.

BIN
models/OLSMP_.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
models/OLSMP_env.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
models/OLSMP_m.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,9 @@
// imitation of the Unreal Engine 1.x bMeshEnviroMap effect, not 1:1 but gets close
vec4 ProcessTexel()
{
vec4 base = getTexel(vTexCoord.st);
float mask = texture(masktex,vTexCoord.st).x;
vec3 eyedir = normalize(uCameraPos.xyz-pixelpos.xyz);
vec3 norm = reflect(eyedir,normalize(vWorldNormal.xyz));
return vec4(base.rgb+texture(envtex,norm.xz*0.5).rgb*mask,base.a);
}

View file

@ -0,0 +1,17 @@
// imitation of the Unreal Engine 1.x ambient glow effect, timing may be off
#define PI 3.14159265
vec4 ProcessLight( vec4 color )
{
float glow = (1.0+sin(timer*2*PI))*0.25;
return vec4(min(color.rgb+vec3(glow),1.0),color.a);
}
// imitation of the Unreal Engine 1.x bMeshEnviroMap effect, not 1:1 but gets close
vec4 ProcessTexel()
{
vec4 base = getTexel(vTexCoord.st);
float mask = texture(masktex,vTexCoord.st).x;
vec3 eyedir = normalize(uCameraPos.xyz-pixelpos.xyz);
vec3 norm = reflect(eyedir,normalize(vWorldNormal.xyz));
return vec4(base.rgb+texture(envtex,norm.xz*0.5).rgb*mask,base.a);
}

View file

@ -29,3 +29,4 @@ version "4.3"
#include "zscript/unrealhud.zsc" #include "zscript/unrealhud.zsc"
#include "zscript/unrealmenus.zsc" #include "zscript/unrealmenus.zsc"
#include "zscript/dtspawners.zsc" #include "zscript/dtspawners.zsc"
#include "zscript/olsmp.zsc"

View file

@ -708,6 +708,13 @@ Class BetaFlare : UnrealInventory
if ( !sting_flares ) return false; // not allowed if ( !sting_flares ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick()
{
Super.Tick();
if ( sting_flares ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
Default Default
{ {
Inventory.MaxAmount 1; Inventory.MaxAmount 1;

393
zscript/olsmp.zsc Normal file
View file

@ -0,0 +1,393 @@
/*
usaar33 is a wiener
now watch as I turn this trash fire into a better weapon
*/
Class OLSMPAmmo : Ammo
{
override bool TryPickup( in out Actor toucher )
{
if ( !sting_olsmp ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_olsmp ) return;
if ( !Owner )
{
let r = Spawn("CellPack",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
Default
{
Tag "$T_OLSMPAMMO";
Inventory.Icon "I_OLSMP";
Inventory.PickupMessage "$I_OLSMPAMMO";
Inventory.Amount 100;
Inventory.MaxAmount 300;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 900;
Ammo.DropAmount 100;
}
States
{
Spawn:
UCLP A -1;
Stop;
}
}
Class OLSMP : UnrealWeapon
{
int ClipCount;
double AltAccuracy;
property ClipCount : ClipCount;
override void PlayUpSound( Actor origin )
{
origin.A_PlaySound(upsound,CHAN_WEAPON,Dampener.Active(origin)?.1:1.,pitch:0.8);
}
override bool TryPickup( in out Actor toucher )
{
if ( !sting_olsmp ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_olsmp ) return;
if ( !Owner )
{
let r = Spawn("BFG9000",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
action void A_OLSMPRefire( statelabel flash = null, bool slave = false )
{
Weapon weap = Weapon(invoker);
if ( !weap || !player ) return;
if ( invoker.altaccuracy < 0.2 ) invoker.altaccuracy += 0.01;
if ( invoker.clipcount < 35 ) A_PlaySound("automag/click",CHAN_ITEM,!Dampener.Active(self)?1.:.35,pitch:1.6);
if ( (invoker.clipcount <= 0) || (weap.Ammo1.Amount <= 0) )
{
A_ClearRefire();
return;
}
A_Refire(flash);
}
action void A_OLSMPFire( bool alt = false )
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
if ( weap.Ammo1.Amount <= 0 ) return;
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
invoker.clipcount--;
invoker.FireEffect();
UTMainHandler.DoFlash(self,Color(32,255,128,0),1);
A_PlaySound("automag/fire",CHAN_WEAPON,!Dampener.Active(self)?1.:.2,pitch:FRandom[Automag](1.2,1.8)*(alt?2.5:1.));
if ( !Dampener.Active(self) ) A_AlertMonsters();
A_QuakeEx(1,1,1,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15);
A_Overlay(-2,"MuzzleFlash");
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
A_OverlayRenderstyle(-2,STYLE_Add);
UTMainHandler.DoSwing(self,(FRandom[Automag](-2.,-5.)*invoker.altaccuracy,FRandom[Automag](-3.,2.)*invoker.altaccuracy),3,1,2,SWING_Spring,1,2);
Vector3 x, y, z, x2, y2, z2;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
if ( alt )
{
vel -= x*(player.onground?2.:0.8);
vel.z += (player.onground?.3:.08);
}
else
{
vel -= x*(player.onground?4.:1.5);
vel.z += (player.onground?.5:.15);
}
Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x;
origin = origin-z*1.0+y*4.0;
double a = FRandom[Automag](0,360), s = FRandom[Automag](0,alt?(0.05+invoker.altaccuracy):0.05);
[x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll);
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
FLineTraceData d;
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
if ( d.HitType == TRACE_HitActor )
{
int dmg = 17;
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
double mm = 3000;
if ( FRandom[Automag](0,1) < 0.2 ) mm *= 5;
UTMainHandler.DoKnockback(d.HitActor,d.HitDir,mm);
if ( d.HitActor.bNOBLOOD )
{
let p = Spawn("BulletImpact",d.HitLocation);
p.angle = atan2(d.HitDir.y,d.HitDir.x)+180;
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 )
{
Vector3 hitnormal = -d.HitDir;
if ( d.HitType == TRACE_HitFloor ) hitnormal = d.HitSector.floorplane.Normal;
else if ( d.HitType == TRACE_HitCeiling ) hitnormal = d.HitSector.ceilingplane.Normal;
else if ( d.HitType == TRACE_HitWall )
{
hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
if ( !d.LineSide ) hitnormal *= -1;
}
let p = Spawn("BulletImpact",d.HitLocation+hitnormal*0.01);
p.angle = atan2(hitnormal.y,hitnormal.x);
p.pitch = asin(-hitnormal.z);
if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
}
for ( int i=0; i<3; i++ )
{
let s = Spawn("UTViewSmoke",origin);
UTViewSmoke(s).ofs = (10,4,-1);
s.target = self;
s.alpha *= 0.5;
}
origin += x*8.0+y*6.0-z*2.0;
let c = Spawn("UCasing",origin);
c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](2,3);
}
Default
{
Tag "$T_OLSMP";
Inventory.PickupMessage "$I_OLSMP";
Weapon.UpSound "automag/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 9;
Weapon.AmmoType "OLSMPAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "OLSMPAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 100;
Weapon.Kickback 320;
UTWeapon.DropAmmo 50;
OLSMP.ClipCount 100;
}
States
{
Spawn:
AUTP A -1;
Stop;
AUTP B -1;
Stop;
Select:
AUTS A 1 A_Raise(int.max);
Ready:
AUTS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1 A_WeaponReady(WRF_NOFIRE);
AUS2 ABCD 1 A_WeaponReady(WRF_NOFIRE);
Idle:
AUTI A 0 A_Overlay(-9999,"Dummy");
AUTI AB 30;
AUTI A 0 A_Jump(50,"Twiddle");
Goto Idle+1;
Twiddle:
AUTT ABCDEFGHIJKLMNOPQRSTUVWXY 2;
Goto Idle+1;
Dummy:
TNT1 A 1
{
if ( (invoker.clipcount <= 0) && (invoker.Ammo1.Amount > 0) ) A_Overlay(PSP_WEAPON,"Reload");
else if ( invoker.clipcount < min(invoker.default.clipcount,invoker.Ammo1.Amount) ) A_WeaponReady(WRF_ALLOWRELOAD);
else A_WeaponReady();
}
Wait;
Fire:
AUTF A 1 A_Overlay(-9999,null);
AUTF BCD 1;
Hold:
AUTF E 1 A_OLSMPFire();
AUTF F 1;
AUTF G 0 A_OLSMPRefire(1);
Goto Release1;
AUTF G 1;
AUTF H 1 A_OLSMPFire();
AUTF I 1;
AUTF J 0 A_OLSMPRefire(1);
Goto Release2;
AUTF J 1;
AUTF K 1 A_OLSMPFire();
AUTF L 1;
AUTF M 0 A_OLSMPRefire(1);
Goto Release3;
AUTF M 1;
Goto Hold;
Release1:
AUTF G 1;
Goto Release;
Release2:
AUTF J 1;
Goto Release;
Release3:
AUTF M 1;
Goto Release;
Release:
AUTF NOPQRST 1;
AUTI A 0;
Goto Idle;
AltFire:
AUTF A 1 A_Overlay(-9999,null);
AUTF BCD 1;
AltHold:
AUTF E 1 A_OLSMPFire(true);
AUTF H 0 A_OLSMPRefire(1);
Goto AltRelease1;
AUTF H 1 A_OLSMPFire(true);
AUTF K 0 A_OLSMPRefire(1);
Goto AltRelease2;
AUTF K 1 A_OLSMPFire(true);
AUTF E 0 A_OLSMPRefire("AltHold");
Goto AltRelease3;
AltRelease1:
AUTF FG 1;
Goto Release;
AltRelease2:
AUTF IJ 1;
Goto Release;
AltRelease3:
AUTF LM 1;
Goto Release;
Reload:
AUTR A 0 A_JumpIf(invoker.clipcount>=min(invoker.default.clipcount,invoker.Ammo1.Amount),"Idle");
AUTR A 0
{
invoker.clipcount = Min(invoker.default.clipcount,invoker.Ammo1.Amount);
A_Overlay(-9999,null);
A_WeaponOffset(0,32); // fix sudden psprite lowering
A_PlaySound("automag/click",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
}
AUTR ABCDEFGHIJKLMNOPQRSTUVWXY 1;
AUTD ABCD 1;
AUTD E 30
{
A_PlaySound("automag/reload",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
if ( self is 'UTPlayer' )
UTPlayer(self).PlayReloading();
}
AUTS A 0 A_PlaySound("automag/select",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
Goto Ready;
Deselect:
AUTD A 1 A_Overlay(-9999,null);
AUTD BCD 1;
AUTD E 1 A_Lower(int.max);
Wait;
MuzzleFlash:
TNT1 A 0 A_Jump(256,1,2,3,4,5,6,7,8,9);
AMUZ A 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ B 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ C 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ D 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ E 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ F 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ G 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ H 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
AMUZ I 2 Bright
{
let l = Spawn("EnforcerLight",pos);
l.target = self;
}
Stop;
}
}

View file

@ -793,7 +793,8 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') ) else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') )
{ {
if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun'; if ( sting_olsmp && Random[Replacements](0,1) ) e.Replacement = 'OLSMP';
else if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun';
else e.Replacement = 'BigGun'; else e.Replacement = 'BigGun';
} }
else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) e.Replacement = 'UClip'; else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) e.Replacement = 'UClip';
@ -890,6 +891,7 @@ Class UnrealMainHandler : EventHandler
else e.Replacement = 'BigAmmo2'; else e.Replacement = 'BigAmmo2';
} }
else if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo'; else if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo';
else if ( sting_olsmp && !Random[Replacements](0,2) ) e.Replacement = 'OLSMPAmmo';
else if ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo'; else if ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo';
else e.Replacement = 'URifleAmmo'; else e.Replacement = 'URifleAmmo';
} }
@ -1004,15 +1006,7 @@ Class UnrealMainHandler : EventHandler
} }
override void PlayerRespawned( PlayerEvent e ) override void PlayerRespawned( PlayerEvent e )
{ {
if ( flak_translocator ) PlayerEntered(e);
players[e.playernumber].mo.TakeInventory("Translocator",1);
if ( sting_telegun )
players[e.playernumber].mo.GiveInventory("UTranslocator",1);
if ( sting_flares )
{
players[e.playernumber].mo.GiveInventory("LightFlare",1);
players[e.playernumber].mo.GiveInventory("DarkFlare",1);
}
} }
override void NetworkProcess( ConsoleEvent e ) override void NetworkProcess( ConsoleEvent e )
{ {
@ -1032,13 +1026,6 @@ Class UnrealMainHandler : EventHandler
players[i].mo.GiveInventory("UTranslocator",1); players[i].mo.GiveInventory("UTranslocator",1);
} }
} }
else
{
for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] )
{
players[i].mo.TakeInventory("UTranslocator",1);
}
}
if ( sting_flares ) if ( sting_flares )
{ {
for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] ) for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] )
@ -1047,14 +1034,6 @@ Class UnrealMainHandler : EventHandler
players[i].mo.GiveInventory("DarkFlare",1); players[i].mo.GiveInventory("DarkFlare",1);
} }
} }
else
{
for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] )
{
players[i].mo.TakeInventory("LightFlare",1);
players[i].mo.TakeInventory("DarkFlare",1);
}
}
} }
} }
override void WorldLoaded( WorldEvent e ) override void WorldLoaded( WorldEvent e )

View file

@ -36,8 +36,8 @@ Class UnrealHUD : BaseStatusBar
bool MidPrintLarge; bool MidPrintLarge;
// 0.83 HUD stuff // 0.83 HUD stuff
String OldAmmo[18]; String OldAmmo[19];
Class<Inventory> OldAmmoType[18]; Class<Inventory> OldAmmoType[19];
String OldArmor[6]; String OldArmor[6];
Class<Inventory> OldArmorType[6]; Class<Inventory> OldArmorType[6];
String OldKeys[7]; String OldKeys[7];
@ -106,6 +106,7 @@ Class UnrealHUD : BaseStatusBar
OldAmmo[15] = "Big083"; OldAmmo[15] = "Big083";
OldAmmo[16] = "Smini083"; OldAmmo[16] = "Smini083";
OldAmmo[17] = "Peace083"; OldAmmo[17] = "Peace083";
OldAmmo[18] = "OLSMP083";
OldAmmoType[0] = "DefaultAmmo"; OldAmmoType[0] = "DefaultAmmo";
OldAmmoType[1] = "UMiniAmmo"; OldAmmoType[1] = "UMiniAmmo";
OldAmmoType[2] = "StingerAmmo"; OldAmmoType[2] = "StingerAmmo";
@ -124,6 +125,7 @@ Class UnrealHUD : BaseStatusBar
OldAmmoType[15] = "BigAmmo"; OldAmmoType[15] = "BigAmmo";
OldAmmoType[16] = "SMiniAmmo"; OldAmmoType[16] = "SMiniAmmo";
OldAmmoType[17] = "PeaceAmmo"; OldAmmoType[17] = "PeaceAmmo";
OldAmmoType[18] = "OLSMPAmmo";
OldArmor[0] = "Armor083"; OldArmor[0] = "Armor083";
OldArmor[1] = "Kev083"; OldArmor[1] = "Kev083";
OldArmor[2] = "Asb083"; OldArmor[2] = "Asb083";
@ -646,7 +648,7 @@ Class UnrealHUD : BaseStatusBar
if ( Ammo1 ) if ( Ammo1 )
{ {
if ( Ammo1.Amount ) DrawString(mOldDigits,FormatNumber(Ammo1.Amount,3),(549,366),DI_TEXT_ALIGN_RIGHT); if ( Ammo1.Amount ) DrawString(mOldDigits,FormatNumber(Ammo1.Amount,3),(549,366),DI_TEXT_ALIGN_RIGHT);
for ( int i=0; i<18; i++ ) for ( int i=0; i<19; i++ )
{ {
// match by ammo // match by ammo
if ( (OldAmmoType[i] is 'Ammo') && !(Ammo1 is OldAmmoType[i]) ) continue; if ( (OldAmmoType[i] is 'Ammo') && !(Ammo1 is OldAmmoType[i]) ) continue;

View file

@ -9,6 +9,13 @@ Class UTranslocatorAmmo : Ammo
Ammo.BackpackMaxAmount 2; Ammo.BackpackMaxAmount 2;
+INVENTORY.IGNORESKILL; +INVENTORY.IGNORESKILL;
} }
override void Tick()
{
Super.Tick();
if ( sting_telegun ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
} }
Class UTranslocator : UnrealWeapon Class UTranslocator : UnrealWeapon
@ -18,6 +25,13 @@ Class UTranslocator : UnrealWeapon
if ( !sting_telegun ) return false; // not allowed if ( !sting_telegun ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick()
{
Super.Tick();
if ( sting_telegun ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
Default Default
{ {
Tag "$T_TELEGUN"; Tag "$T_TELEGUN";