I don't know if this is considered a bug. Or if there is a reason why it works this way.
But when I spawn a "RandomSpawner" through a "A_SpawnitemEx", the ambush flag from the replaced ACTOR is gone. Even if I use "SXF_TRANSFERAMBUSHFLAG".
Both work separately.
When I used only RandomSpawner everything was fine. Or if I spawn the ACTOR of the enemy through A_SpawnitemEx using SXF_TRANSFERAMBUSHFLAG, that works too.
Here's an example what I'm trying to do with it(from a DECORATE):
ACTOR ZombiemanReplacer replaces Zombieman
{
states
{
Spawn:
POSS A 0
Goto Scripted
Scripted:
POSS A 0 A_JumpIf(CallACS("CH_ZombieReplacer") == 0, "Off") //Replacers Off
POSS A 0 A_JumpIf(CallACS("CH_ZombieReplacer") == 1, "On") //Default
POSS A 0 A_JumpIf(CallACS("CH_ZombieReplacer") == 2, "More") //Replacers more frequent
POSS A 0 A_JumpIf(CallACS("CH_ZombieReplacer") == 3, "ReplOnly") //Replacers Only
POSS A 0
Goto On
Off:
POSS A 0 A_SpawnitemEx("Zombieman2",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG) //Replacers Off
stop
On:
POSS A 0 A_SpawnitemEx("ZombiemanDefault",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG) //Default
stop
More:
POSS A 0 A_SpawnitemEx("ZombiemanFrequent",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG) //Replacers more frequent
stop
ReplOnly:
POSS A 0 A_SpawnitemEx("ZombiemanReplacers",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG) //Replacers Only
stop
}
}
ACTOR ZombiemanDefault: RandomSpawner //Default
{
DropItem "Zombieman2" 255, 2
DropItem "ZombiemanReplacers" 255, 1
}
ACTOR ZombiemanFrequent: RandomSpawner //Replacers more frequent
{
DropItem "Zombieman2" 255, 1
DropItem "ZombiemanReplacers" 255, 5
}
ACTOR ZombiemanReplacers : RandomSpawner
{
DropItem "FemaleZombie" 255, 60
DropItem "FemalePlasma" 255, 30
DropItem "ChainsawZombie" 255, 10
DropItem "Machinegunguy" 255, 50
DropItem "SmallRat" 255, 1
DropItem "KamikaziGuy" 255, 3
DropItem "ScienceDrop" 255, 18
}
ACTOR ScienceDrop : RandomSpawner
{
DropItem "FemaleScientist" 255, 5
DropItem "FemaleScientist4" 255, 4
DropItem "ZombieScientist" 255, 5
DropItem "ZombieScientist2" 255, 5
DropItem "T667TWO_Zombie" 255, 3
DropItem "HazmatZombie" 255, 4
DropItem "SegwayZombie" 255, 1
DropItem "ZombieScientistPlasma" 255, 5
DropItem "ZombieScientistHeadless" 255, 4
DropItem "FemaleScientist2" 255, 5
DropItem "FemaleScientist3" 255, 5
DropItem "ZombieScientist3" 255, 5
DropItem "ZombieScientist4" 255, 4
DropItem "StealthFighter" 255, 3
}
Yes, I'm asking because I really would love to get it to work this way on my project.
But also if that could be fixed(again... if it is a bug, and there's no intended reason why it works that way.), it would make doing these kind of options for different spawning settings(especially random) so much simpler for everyone.
Here's a video of the spawning working as I intended, and the problem with the Ambush FLAG:
Either way... Thank you for everything you've done for GZDOOM over the years. It is the best!
EDIT:
+BossDeath doesn't seem to transfer either. (using the same type of A_SpawnItemEx + RandomSpawner combination)
If I've understood correctly that is the one needed for things like E1M8. Kill the barons to trigger tag 666.
Or maybe the +BossDeath transfers fine. But GZDOOM doesn't count them as Barons anymore. Because "replaces Baronofhell" is not in the randomspawners themselves?
Here's an example of the DECORATE I'm using:
SXF_TRANSFERAMBUSHFLAG doesn't transfer spawn flag, only actor's one. Probably, it's a bug because initial ambush state is lost indeed.
This can be fixed by copying bAmbushhere, or by setting corresponding bit in SpawnFlagshere.
I need someone else opinion as I cannot decide which one is better.
Also I wanted to add that you can even spawn a RandomSpawner through another RandomSpawner, and even that works just fine.
But when you combine A_SpawnitemEx with RandomSpawner. That's when it breaks.
And for my own mod I could define RandomSpawner2 using this code?
I'm very unfamiliar with zscript. I tried couple things, but couldn't get it to work.
Last edited by Plynthus on Mon Jul 01, 2019 2:05 pm, edited 2 times in total.
+BossDeath doesn't seem to transfer either. (using the same type of A_SpawnItemEx + RandomSpawner combination)
If I've understood correctly that is the one needed for things like E1M8. Kill the barons to trigger tag 666.
Or maybe the +BossDeath transfers fine. But GZDOOM doesn't count them as Barons anymore. Because "replaces Baronofhell" is not in the randomspawners themselves?
Here's an example of the DECORATE I'm using:
The problem here is very simple: The RandomSpawner was designed for replacing map placed items, it contains code to handle the flags from there. This will always overwrite those map-settable flags in the spawner actor itself, which is where the SXF_TRANSFERAMBUSHFLAG writes into. And since a runtime-spawned actor has no corresponding mapthing, these flags will not be set.
Also the BossDeath thing might be even bigger.
I tried spawning the ACTOR directly using the SpawnItemEx, and not through a RandomSpawner as well. And their special actions("BaronSpecial", "CyberdemonSpecial" etc.) gets triggered as soon as you start the map.
And if I spawned RandomSpawner throgh SpawnItemEx. Those "specials" wouldn't trigger at all(shown in the second video).
I assume this isn't a bug either. Just thought I'd point it out, because I just noticed it.
ACTOR CyberReplacer : Randomspawner replaces Cyberdemon
{
Dropitem "CyberdemonReplacer"
}
ACTOR CyberdemonReplacer
{
states
{
Spawn:
TNT1 A 0
TNT1 A 0 A_SpawnitemEx("Cyberdemon2",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG)
stop
}
}
ACTOR Cyberdemon2 : Cyberdemon {}
Example 2 https://www.mediafire.com/file/hcrxzz0v ... 8.wad/file
-If you go to E2M8 and kill the Cyberdemon, nothing happens. I lowered it's health down to 15 for test purpose.
-Maybe the randomspawner had nothing to do with this after all, because it happens even when doing it like this:
ACTOR CyberdemonReplacer replaces Cyberdemon
{
states
{
Spawn:
TNT1 A 0
TNT1 A 0 A_SpawnitemEx("Cyberdemon2",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION|SXF_TRANSFERSPECIAL|SXF_TRANSFERAMBUSHFLAG)
stop
}
}
ACTOR Cyberdemon2 : Cyberdemon
{
Health 15
}
And for the ambush flag. I know your reply wasn't for me, but I thought I should mention this.
I can confirm that I got it working with the first way you proposed. I added
"newmobj.bAmbush = bAmbush;"
to the "// copy everything relevant" section starting from line 187.
Haven't noticed it causing any side effects or any other problems so far.