Take a look here, I made something pretty similat to what you want. I have this weapon that uses altFire as simple switch, that switches fire modes. Firing itself is done only by primaryFire.
Code: Select all
class StaffBlasterUpgr : augmentedWeapon
{
int Fire1;
int Fire2;
int upStaffSwitch;
Default
{
//$Category "SoA/weapons"
//$color 6
//$Title "rangerska hul lvl.2 (ground)"
+WEAPON.AMMO_OPTIONAL
//+WEAPON.ALT_USES_BOTH
+WEAPON.NOAUTOAIM
+WEAPON.NOALERT
Tag "$T_STFBLUP";
Scale 0.4;
height 16;
radius 12;
Inventory.icon "H_USTF";
Inventory.pickupmessage "$F_STFBLUP";
Obituary "%o was splattered by %k Blaster Staff";
AttackSound "weapons/staffShoot";
Weapon.SlotNumber 3;
Weapon.SlotPriority 0.1;
Weapon.kickback 40;
Weapon.AmmoType1 "StaffUpgrMag";
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 0;
Weapon.AmmoType2 "EnergyPod";
Weapon.AmmoUse2 0;
Weapon.AmmoGive2 32;
Decal "redShotScorch";
}
States
{
Spawn:
USTD V -1;
Stop;
Ready:
USTF J 2
{
A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER1);
A_WeaponOffset(CallACS("Script_GetGunOffsetX"));
}
Loop;
Deselect:
USTF J 1 A_Lower();
Loop;
Select:
USTF J 1 A_Raise();
Loop;
AltFire:
TNT1 A 0
{
if(invoker.upStaffSwitch == 1)
{
return resolveState("setFire2");
}
if(invoker.upStaffSwitch == 2)
{
return resolveState("setFire1");
}
return resolveState(null);
}
//intentional fallthrough
setFire2:
USTF JIH 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE | WRF_NOSWITCH|WRF_ALLOWUSER1);
USSW A 4;
USSW B 3;
USSW C 3;
USSW D 4;
USSW E 5;
TNT1 A 0
{
A_Playsound("weapons/staffClose");
invoker.upStaffSwitch = 2;
self.giveinventory("staffFire2token", 1);
self.takeinventory("staffFire1token", 1);
}
USSW E 5;
USSW D 4;
USSW C 3;
USSW B 4;
USSW A 3;
USTF HIJ 3;
goto Ready;
setFire1:
USTF JIH 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE | WRF_NOSWITCH|WRF_ALLOWUSER1);
USSW A 4;
USSW B 3;
USSW C 3;
USSW D 4;
USSW E 5;
TNT1 A 0
{
A_Playsound("weapons/staffClose");
invoker.upStaffSwitch = 1;
self.giveinventory("staffFire1token", 1);
self.takeinventory("staffFire2token", 1);
}
USSW E 5;
USSW D 4;
USSW C 3;
USSW B 4;
USSW A 3;
USTF HIJ 3;
goto Ready;
Fire:
TNT1 A 0
{
if(invoker.upStaffSwitch == 1)
{
return resolveState("Fire1");
}
if(invoker.upStaffSwitch == 2)
{
return resolveState("Fire2");
}
return resolveState(null);
}
//intentional fallthrough
Fire1:
TNT1 A 0 A_JumpIf(invoker.Fire1 == 1, "RealFire1");
USTF JIH 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE | WRF_NOSWITCH|WRF_ALLOWUSER1);
USTF A 1 //takze hul zustane ve stredu obrazu
{
invoker.Fire1 = 1;
}
RealFire1:
USTF A 0 A_JumpIfNoAmmo("Reload");
USTF A 1;
USTF B 3 bright
{
A_FireStaffBlaster("redBlasterTracer", "redFlash");
A_AlertMonsters();
}
USTF C 4;
USTF D 3;
USTF E 1;
USTF F 3;
USTF G 5 A_Refire("RealFire1"); //umoznuje rychlou strelbu
USTF A 140 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER1);
USTF HIJ 4 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE|WRF_NOSWITCH|WRF_ALLOWUSER1);
TNT1 A 0
{
invoker.Fire1 = 0;
}
Goto Ready;
Fire2:
TNT1 A 0 A_JumpIf(invoker.Fire2 == 1, "RealFire2");
USTF JIH 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE|WRF_NOSWITCH|WRF_ALLOWUSER1);
USTF A 1 //takze hul zustane ve stredu obrazu
{
invoker.Fire2 = 1;
}
RealFire2:
USTF A 0 A_JumpIfNoAmmo("StopSoundnReload");
USTG A 1;
USTG BC 1 bright A_PlaySound("weapons/lightninggun/fire",7);
USTG D 1;
Hold:
USTF A 0 A_JumpIfNoAmmo("StopSoundnReload");
USTG E 2 bright
{
A_PlaySound("weapons/lightninggun/loop", CHAN_6, 1.0, false);
A_GunFlash();
A_FireProjectile("greenArcLightning", 0.1*random(20,-20), 1, 0, 8, 0, 0.1*random(20,-20));
A_SpawnItemEx("redFlash", 8, 0, 16, 0);
A_AlertMonsters();
A_WeaponOffset(random(-2,2), random(30,34), WOF_INTERPOLATE);
}
USTG F 2 bright
{
A_PlaySound("weapons/lightninggun/loop", CHAN_6, 1.0, false);
A_GunFlash();
A_FireProjectile("greenArcLightning", 0.1*random(20,-20), 0, 0, 8, 0, 0.1*random(20,-20));
A_SpawnItemEx("redFlash", 8, 0, 16, 0);
A_AlertMonsters();
A_WeaponOffset(random(-2,2),random(30,34), WOF_INTERPOLATE);
}
USTG E 0 A_Refire("Hold");
RealFire2End:
USTG E 1 bright Offset(0,35) A_PlaySound("weapons/lightninggun/stop",6);
USTG D 1 bright Offset(0,34);
USTG C 1 bright Offset(0,33);
USTG B 1 bright Offset(0,32);
USTG A 5 A_ReFire("RealFire2");
USTG A 140 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER1);
USTF HIJ 4 A_WeaponReady(WRF_ALLOWRELOAD|WRF_NOFIRE|WRF_NOSWITCH|WRF_ALLOWUSER1);
TNT1 A 0
{
invoker.Fire2 = 0;
}
goto Ready;
StopSoundnReload:
TNT1 A 0 A_StopSound(CHAN_6);
goto Reload;
/*User1:
USTF JKLMN 1;
MLKN ABC 1;
MLKN D 1 A_KnifeSlash();
MLKN EFG 1;
MLKN G 0;
USTF MNLKJ 2;
goto Ready;*/
ReloadFinish:
USTU A 3;
USTU B 2;
USTU C 1 A_Playsound("weapons/staffOpen");
USTU DEFGH 2;
USTU I 4;
USTU J 3;
USTU K 2;
USTU L 3;
USTU M 4;
USTU N 5 A_PlaySound("weapons/staffOut");
USTU OP 3;
USTU QR 4;
USTU ST 3;
USTU UVW 2;
USTU W 1;
USTL W 2
{
A_JumpIfInventory("NoAdvDebris",1,2,AAPTR_PLAYER1);
A_FireProjectile("staffCasingSpawner",-10,0,15,0);
}
USTL WVU 3;
USTL TS 3;
USTL RQ 4;
USTL PO 5;
USTL N 5;
USTL M 9 A_PlaySound("weapons/plasmaLoad_2");
USTL L 5;
USTL K 3;
USTL J 4;
USTL I 6;
USTL HGFED 2;
USTL C 2 A_Playsound("weapons/staffClose");
USTL B 2;
USTL A 3;
USTL A 3;
Goto Ready;
}
}