Code: Select all
Class PortableAirCan : HDPickup
{
default
{
//$Category "Items/Hideous Destructor/Supplies"
//$Title "Air Canister"
//$Sprite "OXYCA0"
Inventory.MaxAmount 8;
Inventory.Amount 1;
Inventory.PickupMessage "Acquired a Portable Air Canister.";
Inventory.Icon "OXYCA0";
hdpickup.bulk 15;
}
States
{
Spawn:
OXYC A -1;
use:
TNT1 A 0{
A_GiveInventory("HDOxygener");
A_SelectWeapon("HDOxygener");
}
fail;
}
}
Class HDOxygener : HDWoundFixer
{
class<actor> injecttype;
class<actor> spentinjecttype;
class<inventory> inventorytype;
string noerror;
property injecttype:injecttype;
property spentinjecttype:spentinjecttype;
property inventorytype:inventorytype;
property noerror:noerror;
default{
hdoxygener.injecttype "InjectOxyDummy";
//hdoxygener.spentinjecttype "SpentAirCan";
hdoxygener.inventorytype "PortableAirCan";
hdoxygener.noerror "No Air Cans.";
weapon.selectionorder 1003;
}
States
{
Spawn:
TNT1 A 1;
Stop;
select:
TNT1 A 0{
if(!countinv(invoker.inventorytype)){
if(getcvar("hd_helptext"))A_WeaponMessage(invoker.noerror);
A_SelectWeapon("Ring");
}else if(getcvar("hd_helptext"))A_WeaponMessage("\cd<<< \cjAIR CANISTER \cd>>>\c-\n\n\nAir Canisters restore the o2 tanks \n for extended time in airless \n environments. \n\n\Press altfire to use on someone else.");
}
goto super::select;
deselecthold:
TNT1 A 1;
TNT1 A 0 A_Refire("deselecthold");
TNT1 A 0{
A_SelectWeapon("Ring");
A_WeaponReady(WRF_NOFIRE);
}goto nope;
fire:
hold:
TNT1 A 1;
TNT1 A 0{
if(!countinv(invoker.inventorytype)){
if(getcvar("hd_helptext"))A_WeaponMessage(invoker.noerror);
A_Refire("deselecthold");
}
if(pitch<55){
A_MuzzleClimb(0,8);
A_Refire();
}else{
A_Refire("inject");
}
}
goto nope;
inject:
TNT1 A 1{
A_TakeInventory(invoker.inventorytype,1);
A_SetBlend("7a 3a 18",0.1,4);
A_MuzzleClimb(0,2);
A_PlaySound("Oxygen/Refill",CHAN_VOICE);
actor a=spawn(invoker.injecttype,pos);
}
TNT1 AAAA 1 A_MuzzleClimb(0,-0.5);
TNT1 A 6;
TNT1 A 0{
actor a=spawn(invoker.spentinjecttype,pos+(0,0,height-8));
a.angle=angle;a.vel=vel;a.A_ChangeVelocity(3,1,2,CVF_RELATIVE);
a.A_PlaySound("weapons/grenopen",CHAN_VOICE);
}
goto nope;
altfire:
TNT1 A 10;
TNT1 A 0 A_Refire();
goto nope;
althold:
TNT1 A 0{
if(!countinv(invoker.inventorytype)){
if(getcvar("hd_helptext"))A_WeaponMessage(invoker.noerror);
A_Refire("deselecthold");
}
}
TNT1 A 8{
flinetracedata injectorline;
linetrace(
angle,42,pitch,
offsetz:height-12,
data:injectorline
);
let c=HDPlayerPawn(injectorline.hitactor);
if(!c){
if(getcvar("hd_helptext"))A_WeaponMessage("Nothing to be done here.",2);
return resolvestate("nope");
}
else{
//and now...
A_TakeInventory(invoker.inventorytype,1);
c.A_PlaySound("Oxygen/Refill",CHAN_VOICE);
c.A_SetBlend("7a 3a 18",0.1,4);
actor a=spawn(invoker.injecttype,c.pos);
a.accuracy=40;a.target=c;
if(!countinv(invoker.inventorytype))return resolvestate("deselecthold");
return resolvestate("injected");
}
}
injected:
TNT1 A 0{
actor a=spawn(invoker.spentinjecttype,pos+(0,0,height-8));
a.angle=angle;a.vel=vel;a.A_ChangeVelocity(-2,1,4,CVF_RELATIVE);
a.A_PlaySound("weapons/grenopen",CHAN_VOICE);
}
goto nope;
}}
class InjectOxyDummy:IdleDummy{
int GetAirTime()
{
if(!target || !target.player || target.waterlevel < 3)
return level.airsupply;
else
return max(target.player.air_finished - level.time, 0);
}
hdplayerpawn tg;
states{
spawn:
TNT1 A 6 nodelay{
tg=HDPlayerPawn(target);
Target.Player.Air_Finished = Target.Player.Air_Finished;
//Target.Player.Air_Finished = (GetAirTime() + 4200);
}
TNT1 A 1{
if(target.bkilled||accuracy<1){destroy();return;}
}wait;
}
}