This is my first post in a long while. I am seeking any advice/help with how to resolve this issue that has finally left me in despair.
I have been patching and modding an existing mod and ran into a problem when I added an optional toggle to spawn random monsters using the SpawnItemEx and RandomSpawner.
I set up a menu option to use either the default spawns or to use random spawners for items and monsters. at first I thought it was working well until I noticed monsters that should be waiting in ambush coming for me without sighting me. I also had issues with lost Boss death flags triggering instant map completions or issues from monsters losing their TIDs but manged to resolve those in the end.
What remains is the monster spawns using the SpawnItemEx with RandomSpawner losing their map set ambush flags. I've been battling with this problem for a few weeks now without success. Despite constantly referring to the wiki and the forum for an solution, the answer still evades me. My knowledge of ACS is quite limited but just managed to do something basic. I wish I could learn and use ZScript but I am trying to maintain compatibility with the latest Zandronum 3.1 development version.
If anyone needs to know the specific mod, here it the link
https://www.moddb.com/mods/brutal-doom- ... v2-patched
DECORATE
- Code: Select all • Expand view
//WEAPON RANDOM SPAWNERS
actor D64PRifleReplacer : RandomSpawner
{
DropItem "PlasmaRifleSpawner"
DropItem "PlasmaRifleSpawner"
DropItem "Lasergun"
}
Actor D64BFGReplacer : RandomSpawner
{
DropItem "BFG9000Spawner"
DropItem "BFG9000Spawner"
DropItem "BFG9000Spawner"
DropItem "UnmakerSpawner"
}
//ITEM RANDOM SPAWNERS
actor WpnPower1Replacer : RandomSpawner
{
DropItem "64Blursphere"
DropItem "64Blursphere"
DropItem "64Blursphere"
DropItem "64Blursphere"
DropItem "64Blursphere"
DropItem "64Blursphere"
DropItem "WpnPower1"
}
Actor WpnPower2Replacer : RandomSpawner
{
DropItem "64Berserk"
DropItem "64Berserk"
DropItem "64Berserk"
DropItem "64Berserk"
DropItem "64Berserk"
DropItem "64Berserk"
DropItem "WpnPower2"
}
Actor WpnPower3Replacer : RandomSpawner
{
DropItem "64Soulsphere"
DropItem "64Soulsphere"
DropItem "64Soulsphere"
DropItem "64Soulsphere"
DropItem "64Soulsphere"
DropItem "64Soulsphere"
DropItem "WpnPower3"
}
//MONSTER RANDOM SPAWNERS
Actor D64ImpReplacer : RandomSpawner
{
DropItem "64DoomImp"
DropItem "64DoomImp"
DropItem "64DoomImp"
DropItem "NightmareImp"
}
Actor D64SpectreReplacer : RandomSpawner
{
DropItem "64Spectre"
DropItem "64Spectre"
DropItem "64Spectre"
DropItem "64Spectre"
DropItem "64NightmareSpectre"
}
Actor D64CacodemonReplacer : RandomSpawner
{
DropItem "64Cacodemon"
DropItem "64Cacodemon"
DropItem "64Cacodemon"
DropItem "64Cacodemon"
DropItem "64Cacodemon"
DropItem "64Cacodemon"
DropItem "NightmareCacodemon"
}
Actor D64CyberdemonReplacer : RandomSpawner// Replaces Cyberdemon
{
DropItem "64Cyberdemon"
DropItem "64Cyberdemon"
DropItem "64Cyberdemon"
DropItem "Annihilator64"
}
actor D64HellHoundReplacer : RandomSpawner
{
DropItem "64Demon"
DropItem "64Demon"
DropItem "64Demon"
DropItem "64Demon"
DropItem "64Demon"
DropItem "64Demon"
DropItem "64HellHound"
}
//ACS TRIGGERED DYNAMIC SPAWNERS
Actor Dyn_PlasmaRifleReplacer Replaces Plasmarifle
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1478,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("PlasmaRifleSpawner",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64PRifleReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
}
}
Actor Dyn_BFGReplacer Replaces BFG9000
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1478,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("BFG9000Spawner",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64BFGReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
}
}
Actor Dyn_WpnPower1Replacer Replaces Blursphere
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1478,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Blursphere",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("WpnPower1Replacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
}
}
Actor Dyn_WpnPower2Replacer Replaces Berserk
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1478,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Berserk",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("WpnPower2Replacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
}
}
Actor Dyn_WpnPower3Replacer Replaces Soulsphere
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1478,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Soulsphere",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("WpnPower3Replacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL | 48)
Stop
}
}
Actor Dyn_ImpReplacer Replaces Doomimp
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1480,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64DoomImp",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64ImpReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
Actor Dyn_SpectreReplacer Replaces Spectre
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1480,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Spectre",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64SpectreReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
Actor Dyn_CacodemonReplacer Replaces Cacodemon
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1480,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Cacodemon",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64CacodemonReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
Actor Dyn_CyberdemonReplacer Replaces Cyberdemon
{
+NOTDMATCH
+BOSS
+BOSSDEATH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1480,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Cyberdemon",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64CyberdemonReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
////////////////////////////
//ARCHVILE HELLHOUND REPLACER
///////////////////////////
Actor Dyn_ArchvileReplacer Replaces Archvile
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1479,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Hellhound",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("64Archvile",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
Actor Dyn_HellhoundReplacer Replaces Demon
{
+NOTDMATCH
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(1480,0)
TNT1 A 1 A_Jump(256,"Deciding")
Deciding:
TNT1 A 1
loop
NormalSpawner:
TNT1 A 0 A_SpawnItemEx("64Demon",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
DynSpawner:
TNT1 A 0 A_SpawnItemEx("D64HellHoundReplacer",0,0,0,0,0,0,0, SXF_TRANSFERPOINTERS | SXF_TRANSFERSPECIAL |SXF_TRANSFERAMBUSHFLAG | SXF_CLEARCALLERTID | 304, 0, tid)
Stop
}
}
Here is the ACS script part just in case it's needed
- Code: Select all • Expand view
script 1478 (void)
{
if (GetCvar("DynamicSpawnCvar") == 0) { SetActorState(0,"NormalSpawner"); }
if (GetCvar("DynamicSpawnCvar") == 1) { SetActorState(0,"DynSpawner"); }
}
script 1479 (void)
{
if (GetCvar("DynamicSpawnCvar2") == 0) { SetActorState(0,"NormalSpawner"); }
if (GetCvar("DynamicSpawnCvar2") == 1) { SetActorState(0,"DynSpawner"); }
}
script 1480 (void)
{
if (GetCvar("DynamicSpawnCvar3") == 0) { SetActorState(0,"NormalSpawner"); }
if (GetCvar("DynamicSpawnCvar3") == 1) { SetActorState(0,"DynSpawner"); }
}
Best regards,
swc132994