Modding for Project Zomboid was a nightmare.
At the time, there was almost no usable documentation. The official wiki was years out of date. Most guides were dead links or half broken forum posts. Anything that used to be useful had rotted away.
Every forum post or conversation ended the same way. Just use the official Discord.
That was a problem. The information might have existed, but only in chat scroll back. If you weren't there when someone answered, it might as well not have existed at all.
I spent about a week trying to figure out how to add a single action to Zomboid's context menu. Not a system. Not a mechanic. One menu option. I didn't learn it from docs. I learned it by opening dozens of other mods until I found one that called the right context menu method and went from there.
One thing I did actually learn is that you're not working with Lua tables most of the time. Functions like getPlayer() return Java objects. You're calling Java and getting Java back. Lua is only the calling syntax.
Because of that, none of Lua's usual strengths apply. You can't inspect objects, iterate fields, or dump state to see what's inside. You can't poke values to see what changes. You only get whatever surface the engine chose to expose, usually as methods.
A example looks like this.
local player = getPlayer()
player is not a table. It's a Java IsoPlayer object.
You can still call methods on it:
local x = player:getX()
local y = player:getY()
local z = player:getZ()
Those are Java methods being called through Lua syntax.
Same thing when you go deeper:
local inv = player:getInventory()
local items = inv:getItems()
getInventory() returns a Java ItemContainer.
getItems() returns a Java collection.
At no point are you dealing with Lua tables, even though the syntax looks Lua-ish.
What you can't do is this:
print(player.health)
print(inv.capacity)
Those fields may exist in Java, but unless there's an exposed getter like getHealth() or getCapacity(), Lua can't see them.
This isn't unusual for Lua bindings. Calling into engine objects and only having access to a limited set of methods is normal. What made Project Zomboid painful was how little of that surface was documented or discoverable. There was no reliable way to tell what was exposed, what wasn't, or why something didn't work without digging through other mods or the source.