I thought the SDL file was loaded by the PRP and not by the Age Python file. That's why I talked about Drizzle more than the Offline-Ki.
The age SDL load is connected with that "VeryVerySpecialPythonFileMod" in some weird ways, including, but not limited to, black magic and unicorns. I figured it out enough to get age SDL state management working on Alcugs (which was not that much, just some weird IDs and flags that had to be just right). At any rate, "OnFirstUpdate" is triggered when the page was loaded completely - but the game loads the page *before* it requests their state from the server (since it needs to know how the page look like to apply it's state). After all pages are loaded, the client asks the server for the "initial age state", and the server replies with tons of messages, the first one containing the total number of sates. After the last one is received, OnServerInitComplete is triggered. For that reason, there is no age SDL when OnFirstUpdate runs.
If however you call PtPageInNodes within a python script, the page loading is done after that initial age state was sent, and the message sent to the server to get their state is slightly different. Most importantly, OnServerInitComplete will not be triggered again for the same age, so it will never be triggered at all for PythonFileMods associated with a dynamic page.
I mentioned Drizzle because you said it was not a Drizzle problem in reply to my original post, which however was about Python stuff
. For SDL to work, Drizzle has to get the PRP converted correctly (including the renaming, I remember some weird problems in the beginning with age states of renamed ages being totally broken, but only when playing online...). However, Offline KI brings the actual KirelMOUL.sdl and KirelMOUL.py files, both of which are necessary to make SDL work.
Glad to see you got it figured out! Opening the log and searching for "Error" is the very first thing to do if your Python script does not what it is supposed to do
And yes, I modified the visitor loggers a lot, because neither the original POTS nor the MOUL one worked well enough in Alcugs. Not to mention that the same code could be found in like 4 different locations (for each age that had a logger), so I unified it to have one change fix them all