Project Zomboid – Easy Plates

This is a mod that I first created back in 2018, I was playing PZ with friends and our team’s chef expressed frustration at frying pans being deadlocked until somebody ate their contents.

5 minutes read

Platform

PC

Engine

Project Zomboid

Release Date

July 30, 2025

Technologies Used

Java Lua

Source Code

This is a mod that I first created back in 2018, I was playing PZ with friends and our team’s chef expressed frustration at frying pans being deadlocked until somebody ate their contents. This effectively required us to stockpile an endless amount of frying, baking, and roasting pans to be able to have a steady throughput of food, this was a little annoying; especially on the first days where we were strangely unlucky with cooking utensils. Well, today I gave it a pretty big update, making it work again.

Enter the matrix that is PZ modding. This game supports Lua, and exposes almost everything that one could need, but I don’t think there’s proper documentation. Luckily, decompiling the game code is easily feasible, allowing you to discover any secrets that might be hiding exposed in Lua, but not documented. Furthermore, simply printing the global _G table is definitely an option; it will yield everything that’s currently exposed to Lua. It’s a common trick that I and probably many others use for games that use this language for their modding or scripting.

With this I was able to make sense of how .txt script files are parsed, and was able to find any and all supported options for recipes and item definitions. I didn’t really need to do this anyway in the end, as nothing really couldn’t already be found in the game’s defs that ship with it. However, I was able to find this function inside Item.java:

So, I used that to replace the game’s icons for the vanilla colored plates, which all shared the base white plate icon. P.S.: Dear The Indie Stone, I couldn’t use TileZed to export .pack files for the life of me. Pls fix.

High level overview of how plate splitting works:

  • – We grab the food item that we want to split
  • – We grab the necessary plates for the splitting option picked by the player
  • – We convert every empty plate into a full plate, splitting the food’s parameters (more on this later)
  • – We remove the empty plates that were used for the crafting, which are marked as keep items (more on this later, too)
  • – We give the user the empty counterpart of the source food item
  • – We set the condition of the base item to the source item’s condition, so that we do not accidentally regenerate the frying pan lol
  • – The game handles removing the source food item, we didn’t mark it as keep

Now, what’s that about splitting the food parameters? Well, I looked through the game files and java code as much as possible to find all possible parameters that might apply to food. And I got a pretty long list… About 49. After finding the RecipeManager.java class and taking a look at its PerformMakeItem function, it became clear that I didn’t need to worry about quite a few of them… Also confirmed by The Indie Stone’s implementation of splitting soup into bowls. For example, they do not re-apply the burnt status to the result item, because the java code already handles this when producing a food item from burnt source items.

Also, while on their Soup splitting recipe they restore the pot’s condition, I don’t think they’re doing it here… So it seems like splitting a Pot of Stew might regenerate the base pot to full condition, in the current release of Build 41, at the time of writing this. See, they’re doing it here for the soup:

Now, what was that about the keep items? Well, I was looking for a few to make a recipe that would require N items of any kind within a list, allowing a mix of all of them. It was perfect for my usecase: Split Stir Fry into 4 plates of any kind, whatever they may be. Just need to be 4 plates. Right? Well, it doesn’t seem the engine allows it. So I got a little creative:

This might seem a little unusual, and it is. In fact, owning a single one of those plates would mark even the five plates recipe as craftable. This is technically a bad recipe definition. However, I wanted to convey through the UI that just 5 plates of any kind would do, and it kinda does a good job at showing that with how it renders these requirements. It’s just a little… long. (THAT’S WHAT S-)

Then it was just a matter of writing an actual Lua function that would check whether or not the recipe was craftable, by counting however many plates you have in your inventory, without caring about their color. Which works, however it’s still a little buggy when it comes to the “Craft All” context menu, as the callback would technically be true for each one of the food items we have, even if we don’t have enough plates in total; not sure if there’s a way to fix this. Luckily, the game checks before each attempt even if you click on the button to queue all of them, so it doesn’t bug out.

Another tricky part was making the held plate model for the full plate, since the game doesn’t seem to allow us to specify an offset and rotation when holding the item during an action. So, I had to improvise by literally importing the plate model, modifying it to look like it’s full, and exporting several times with a different offset until it lined up properly in the character’s hand. Other than that it was pretty straightforward. Oh, by the way, for importing and exporting PZ FBX models on blender, these are the settings I used:

Unit Scale should be 0.01, Unit System should be Metric

FBX (.fbx) importer and exporter, not the experimental ones.

And these are the import and export settings:

But yeah, there you have it: way too much information about a simple mod!