I tried to play this but I encountered java.nio.file.InvalidPathException: Illegal char <"> at index 13: Melee_V1\28;K"ReplaceableTextures\Splats"\28;K"HumanUberSplat".blp
error and it crashed game. So I changed my SLK parser, which was apparently bugged, and recompiled the game.
Then I got
Code:
runThreads() encountered exception at <unknown function>(<unknown source>:-1) at CreateNeutralHostile(war3map.j:20673) at CreateAllUnits(war3map.j:20996) at main(war3map.j:66301)
This is apparently because you are spawning a unit called Blood Wizard that isn't present in my unit data.
So then I recompiled my game to ignore an unknown unit type in these cases (random creep spawn or whatever), and then I got this problem:
Code:
JassException: Max jass array size exceeded at InitGlobals(war3map.j:18425) at main(war3map.j:66316)
So then I recompiled my game with a bigger max array size, noting that I could solve the problem by increasing only by 1 to a size of 32769 instead of 32768 because you're only writing 1 out of bounds write. Then I got this:
Code:
JassException: runThreads() encountered exception at <unknown function>(<unknown source>:-1) at sc___prototype2_evaluate(war3map.j:4513) at h__TriggerRegisterVariableEvent(war3map.j:4518) at InitTrig_Unit_In_Action(war3map.j:21364) at InitCustomTriggers(war3map.j:65383) at main(war3map.j:66317)
I don't really know what happened there so for the time being I programmed the system to ignore TriggerEvaluate calls on a null trigger. Then I got this:
Code:
JassException: runThreads() encountered exception at <unknown function>(<unknown source>:-1) at DFavour___init(war3map.j:8460)Caused by: java.lang.IndexOutOfBoundsException: Index 16 out of bounds for length 16
That was just me, sorry, I had 16 players loaded instead of 28 players mode. So I was being cheezy, changed to 28 players, then of course had
Code:
java.lang.IllegalStateException: Missing texture: ReplaceableTextures\TeamColor\TeamColor16.blp
Because I was being lame and using a 1.27 install as an art asset source for my recompiled game. I guess that one's on me.
So I switched to using art files from 1.29, but then I got this:
Code:
JassException: runThreads() encountered exception at <unknown function>(<unknown source>:-1) at DFavour___init(war3map.j:8460)Caused by: java.lang.IndexOutOfBoundsException: Index 28 out of bounds for length 28
Man, what are we doing here? I was wrong about needing 28 player mode. The problem is an out-of-bounds player access! Am I not crazy?
JASS:
// Hotkeys loop set i=i + 1 exitwhen i > 5 set HotkeyListener[i]=CreateTrigger() endloop set i=- 1 loop set i=i + 1 exitwhen i > bj_MAX_PLAYER_SLOTS call BlzTriggerRegisterPlayerKeyEvent(HotkeyListener[1], Player(i), OSKEY_Q, s__OSKEY_META_CTRL, true) call BlzTriggerRegisterPlayerKeyEvent(HotkeyListener[2], Player(i), OSKEY_W, s__OSKEY_META_CTRL, true) call BlzTriggerRegisterPlayerKeyEvent(HotkeyListener[3], Player(i), OSKEY_E, s__OSKEY_META_CTRL, true) call BlzTriggerRegisterPlayerKeyEvent(HotkeyListener[4], Player(i), OSKEY_R, s__OSKEY_META_CTRL, true) call BlzTriggerRegisterPlayerKeyEvent(HotkeyListener[5], Player(i), OSKEY_T, s__OSKEY_META_CTRL, true) endloop
The second part of this pretty obviously should have been set to exitwhen i >= bj_MAX_PLAYER_SLOTS
.
It's pretty late where I am staying, so I think I will sleep on this. I don't feel like making fake error players for out of bounds calls like Player(28)
when it's zero-indexed, why is that even a concept that your map requires?
So then I went ahead and changed Player(28)
to return null instead of a crash, because that makes sense.
That led me to this problem:
Code:
JassException: runThreads() encountered exception at <unknown function>(<unknown source>:-1) at InitializeUnitIndexer(war3map.j:23998)Caused by: java.lang.NullPointerException: Cannot invoke "Trigger.addEvent(RemovableTriggerEvent)" because "t" is null
Now, it seems that for the problem above, we didn't agree on what ExecuteFunc should really mean. Apparently this unit indexer is expecting GetTriggeringTrigger
to still work inside the ExecuteFunc
call, which is a new one on me. On my side, I had been thinking that ExecuteFunc
created a new context, where GetTriggeringTrigger
wouldn't have a meaningful return value and therefore was returning null.
But my definition of ExecuteFunc had the following code comment in the native implementation anyway (lol!):
Code:
// TODO below TriggerExecutionScope.EMPTY is probably not correct
So I went ahead and told this thing to run with the scope of its caller.
That got me to the following:
Code:
JassException: runThreads() encountered exception at <unknown function>(<unknown source>:-1) at FavourLoop___onPeriod(war3map.j:19431)Caused by: java.lang.NullPointerException: Cannot invoke "CPlayerJass.getController()" because "player" is null
But why do we have a null error when the script line count is pointing at the DestroyGroup? I'm pretty sure in this case, the JASS debug mode that I'm using in my recompiled engine is busted and has a bad line number tracker on this loop.
If we think for a moment about the broader concept, it's failing because player.getController()
can't be called on a null player. So....
Code:
local integer i= - 1 local integer cVal local player play local string path local unit u loop set i=i + 1 exitwhen i > bj_MAX_PLAYER_SLOTS
... it's this scat again. You're looping 0 - 28 and treating each as a player, for a total of 29 players. I'll try changing native GetPlayerController
to return null
if called on null
instead of a crash, but my life would sure be easier if I didn't have to do that. Can you stop looping at only 28 players, which means Player(27)
, please?
The null player controller got me to the sweet success... of the void!
View attachment 501221
But obviously the problem here, based on your screenshots, is that you're using the UI natives. I didn't bother to add those to my recompiled game yet, so, too bad, I'm going to bed. Have a good night. Thank you for participating in this aperture science computer aided enrichment activity. Your specimen has been processed, and we now ready to begin the test proper.