by Apeirogon » Fri Jul 12, 2019 10:58 am
Void Weaver wrote:Oh, seems I've got it.
I guess this can be easily done at ZScript, but unfortunately I can provide only decor example.
That Shotgun can fire Missiles when alt-fire pressed at any part of Ready\Fire sequence without breaking shooting sequence or playing any RLauncher sprites:
Code: Select all
ACTOR AssaultShotgun : Shotgun replaces Shotgun
{
Weapon.SlotNumber 3
Weapon.SlotPriority 1
States
{
Ready:
SHTG A 1
{
A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
Loop
Fire:
SHTG A 3
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 7
{
A_FireShotgun;
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG BC 5
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG D 4
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG CB 5
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 3
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 7 A_ReFire
Goto Ready
AltFire:
Stop
MissileShot:
TNT1 A 8 A_GunFlash("Flash.MissileShot")
TNT1 A 0 A_TakeInventory("RocketAmmo",1)
TNT1 A 12 A_FireProjectile("Rocket",0,0)
Stop
Flash.MissileShot:
TNT1 A 3 Bright A_Light1
TNT1 A 4 Bright
TNT1 AA 4 Bright A_Light2
Goto LightDone
}
}
As variant instatnt attack can be called from CustomInventory item.
Code: Select all
Actor InvMissileShooter : CustomInventory
{
+INVENTORY.ALWAYSPICKUP
Inventory.MaxAmount 0
States
{
Spawn:
POSS A -1
Pickup:
TNT1 A 0 A_JumpIf(CountInv("RocketAmmo")<=0,3)
TNT1 A 0 A_TakeInventory("RocketAmmo",1)
TNT1 A 0 A_SpawnItemEx("Rocket",0,0,Height/2,cos(pitch)*20,0,-sin(pitch)*20,0,SXF_TRANSFERPITCH)
TNT1 A 0
Stop
}
}
Btw, in a one of those threads you can also find a some useful related stuff for current task, I guess:
CustomInventory Overlays - How To?!
[Decorate] Do X if button pressed for < 0.5 s, do Y if > 0.5
That require changing weapon code, while I need a way to do so without changing weapon code.
Matt wrote:Can a player sprite be given to an actor that has no controlling player?
No, since psprite class nailed to playerinfo struct and you cant "deattach" it and/or create new psprite class/playerinfo struct.
Problem with weapon, that a_fireprojectile, and similar weapon functions, works only if player available. So I can change weapon state, when it lie on the ground, to "fire" and it play it states and animations, but dont actually shoot. And in inventory I cant call states of it without using it as reference to psprite.
So looks like this is impossible.
[quote="Void Weaver"]Oh, seems I've got it. :D I guess this can be easily done at ZScript, but unfortunately I can provide only decor example.
That Shotgun can fire Missiles when alt-fire pressed at any part of Ready\Fire sequence without breaking shooting sequence or playing any RLauncher sprites:[code]ACTOR AssaultShotgun : Shotgun replaces Shotgun
{
Weapon.SlotNumber 3
Weapon.SlotPriority 1
States
{
Ready:
SHTG A 1
{
A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
Loop
Fire:
SHTG A 3
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 7
{
A_FireShotgun;
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG BC 5
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG D 4
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG CB 5
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 3
{
A_WeaponReady(WRF_NOPRIMARY|WRF_ALLOWRELOAD|WRF_ALLOWUSER#);
If(GetPlayerInput(INPUT_OLDBUTTONS)&BT_ATTACK&&GetPlayerInput(INPUT_BUTTONS)&BT_ALTATTACK)
{A_Overlay(2,"MissileShot");Return state("");}
Else{Return state("");}
}
SHTG A 7 A_ReFire
Goto Ready
AltFire:
Stop
MissileShot:
TNT1 A 8 A_GunFlash("Flash.MissileShot")
TNT1 A 0 A_TakeInventory("RocketAmmo",1)
TNT1 A 12 A_FireProjectile("Rocket",0,0)
Stop
Flash.MissileShot:
TNT1 A 3 Bright A_Light1
TNT1 A 4 Bright
TNT1 AA 4 Bright A_Light2
Goto LightDone
}
}[/code]As variant instatnt attack can be called from CustomInventory item.[code]Actor InvMissileShooter : CustomInventory
{
+INVENTORY.ALWAYSPICKUP
Inventory.MaxAmount 0
States
{
Spawn:
POSS A -1
Pickup:
TNT1 A 0 A_JumpIf(CountInv("RocketAmmo")<=0,3)
TNT1 A 0 A_TakeInventory("RocketAmmo",1)
TNT1 A 0 A_SpawnItemEx("Rocket",0,0,Height/2,cos(pitch)*20,0,-sin(pitch)*20,0,SXF_TRANSFERPITCH)
TNT1 A 0
Stop
}
}[/code]
Btw, in a one of those threads you can also find a some useful related stuff for current task, I guess:
[url=https://forum.zdoom.org/viewtopic.php?f=3&t=54909]CustomInventory Overlays - How To?![/url]
[url=https://forum.zdoom.org/viewtopic.php?f=122&t=63909][Decorate] Do X if button pressed for < 0.5 s, do Y if > 0.5[/url][/quote]
That require changing weapon code, while I need a way to do so without changing weapon code.
[quote="Matt"]Can a player sprite be given to an actor that has no controlling player?[/quote]
No, since psprite class nailed to playerinfo struct and you cant "deattach" it and/or create new psprite class/playerinfo struct.
Problem with weapon, that a_fireprojectile, and similar weapon functions, works only if player available. So I can change weapon state, when it lie on the ground, to "fire" and it play it states and animations, but dont actually shoot. And in inventory I cant call states of it without using it as reference to psprite.
So looks like this is impossible.