Hello modding fans!
In this blogpost we’ll detail an addition to the modding support in the next update. In one word: LUA.
Project Zomboid now fully supports LUA scripts within the modding interface. In case you do not know what LUA is, it’s basically a programming language where the code is simply put in text files instead of being compiled into an exe, meaning it is open for modders to play about with, modify and learn from. Project Zomboid currently has a really simple scripting system for creating new inventory items and conversations or cutscenes, but the power of LUA goes way way beyond that.
Barring a few accidental omissions no doubt, the next version of Project Zomboid will allow modders near unlimited access to the entire inner workings of the game, opening up 10000x the mod possibilities. Modders will be able to code their own game logic to implement new game mechanics, item effects, or practically anything else they could dream up. There will of course be exceptions, particularly for the first version, but with the release of the LUA scripting we should see much more in-depth and powerful mods emerge in the weeks and months afterwards, with each update providing more and more power.
Here are a few (slightly silly) examples that should hopefully show a few things that are now open to modders:
1) Live map editing
This code adds a lua function as an event for ‘OnGameStart’ which cycles through the entire map, tile by tile, gets a list of every object on that tile and loops through those, and any with collidable properties it deletes. Modders can therefore modify the map in any way they like before or during the game.
function DeleteAllWalls() local world = GetWorld(); local cell = world:GetCell(); if cell == nil then print ("Failed to get cell"); else for x = 0, cell:GetWidth() do for y = 0, cell:GetHeight() do for z = 0, cell:GetMaxFloors() do local square = cell:GetGridSquare(x, y, z); if square ~= nil then local objects = square:GetTileObjects(); if(objects ~= nil) then for k,v in ipairs(objects) do local properties = v:GetProperties(); if(properties ~= nil) then if properties:Is(PropertyType.solid) or properties:Is(PropertyType.solidtrans) or properties:Is(PropertyType.collideN) or properties:Is(PropertyType.collideW) then square:DeleteTileObject(v); end end end end end end end end end end Events.OnGameStart.Add(DeleteAllWalls);
2) Direct graphics drawing: ESCAPE THE WILL
Here we add The Will Porter as a ghostly apparition that follows your mouse! This shows that, as well as draw into the isometric map with tiles, modders can now draw textures directly to the screen, allowing the potential for UI changes or other graphical mods.
x = 0; y = 0;function DrawTheWill() local texture = GetTexture("media/ui/will.png"); local core = GetCore(); if texture ~= nil then texture:render(x,y); end local centreX = x + (texture:GetWidth() / 2); local centreY = y + (texture:GetHeight() / 2); x = x + ( (GetMouseX() - centreX) / 5.0); y = y + ( (GetMouseY() - centreY) / 5.0); end Events.OnPostUIDraw.Add(DrawTheWill);
3) Item behaviours: EXPLODING APPLE OF DOOM
Here we add exploding suicide apples to the game! We add an event to the apple that when eaten will explode, killing those within a radius and setting fire to random tiles.
function DoExplodingApple(character, item) if item:GetType() == "Apple" then local radius = 30; local numFires = 300; local cell = GetWorld():GetCell(); local objects = cell:GetObjects(); for k,v in ipairs(objects) do if character:DistTo(v) < radius and v:IsCharacter() then v:Kill(character); end end GetSoundManager():PlayWorldSound("explode", character:GetSquare(), 0, 20, 1.0, false); for i = 0, numFires do local sq = cell:GetGridSquare(ZombRand(character:GetX()-radius, character:GetX()+radius), ZombRand(character:GetY()-radius, character:GetY()+radius), character:GetZ() ); if sq ~= nil then sq:StartFire(); end end end end Events.OnUseItem.Add(DoExplodingApple);
We couldn’t possibly have expected how many mods would become available for Project Zomboid so quickly. We were genuinely blown away, and cannot wait to see what the modders can do when they get their hands on this!