A new update has been released for Project Zomboid Update 41.71 with Patch Notes. You can find out all the details of the Game Update, Bug Fixes, improvements, and Patch Notes below. For all platforms, including PS4, PS5, Xbox One, Xbox Series S/X, and PC, the Project Zomboid Update 41.71 Patch Notes are now available for download. Depending on the platform, the file size may vary.
- New action music system
Instead of switching between tracks mid-combat, the music is reactive and can increase and decrease in intensity during combat and other dramatic moments. - Added “Stubble” checkboxes to the Hair and Beard sections in the character-creation ui.
- Added new items + updated 3D models
- Added new forage items
- Added the skeleton mannequin and scarecrow.
- Added additional item categories and addressed some blunders
- Added compilation of new hair types
- Added option to “add all” to partially full Thread, Duct Tape, Twine etc
- Added media/scripts/mannequins.txt which describes the model/texture/animation/etc for different mannequins.
- Added BackupsOnVersionChange server option.
- Added a second set of translations to the Survival Guide that are displayed when using a controller.
- Added <JOYPAD:XXX> formatting to rich text, where XXX is the name of a Joypad.Texture.XXX texture.
- Device options can now be opened when radio is on floor, in loot window or when radio just dropped from inventory
- Added methods Texture.saveToCurrentSavefileDirectory(filename) and Texture.saveToZomboidDirectory(filename).
The filename may contain folder names, but not “..”, to prevent saving to arbitrary locations.
These methods replace the broken Texture.save(filename) method. - Clicking and holding the left mouse button when placing items now locks the item to the clicked square.
- Added XBOX_Menu.png and XBOX_View.png controller icons.
- Added autouse new sack of gravel/sand/etc when pouring it on ground
- Renamed Skill books so that they are easier to categorise.
- ISClothingExtraAction now sets the item’s job type to “Wear” and displays the progress of the action in the inventory window.
- Updated credits
- Updated community translations.
- 3D items now shown as textures instead of models. They shouldn’t slide around as much when the player moves.
This helps a lot with framerates when there are 100 nails on the ground, for example.
In debug mode, holding the HOME key will disable the item atlas and render models as before. - Added IsoSprite.ItemHeight and IsoSprite.Surface debug options to display a rectangle around surfaces that items can be placed on.
- Changed some ItemHeight and Surface tile properties.
- Added a title bar to the mini-map window which allows the mini-map to be repositioned. The title bar and bottom row of buttons are hidden unless the mouse is over the mini-map.
- Changed setHaveConstruction to apply only when constructing and placing objects
MODELS/ANIMS
- Changed Diamond Pattern Sweater Vest and V-neck Sweater Vest to use Sweater body location
- Changed High Viz vest to use Sweater body location
- Added a different animation played when destroying floors with a sledgehammer.
MP
- Removed vehicle physics from server (not client) to address some of the vehicular weirdness sometimes seen online
- do not apply impulses to static / kinematic vehicles
- limit changes of linear and angular velocities
- Passengers no longer allowed to exit the car while moving
- Enable packet processing on the server
- MultiplayerSeeNonPvpZones debug only option is added
- Local admin check is delayed after set-access-level command
- Player update replay is commented out
- Check for local admin kick is improved
- Turn on player teleport logs on the server
- Admin is not kickable from safehouse
- Burnt or smashed vehicle check is added for dismantle vehicle command
- Car wreck is removed via new “dismantle” vehicle command
- Only admin can delete vehicle via “remove” vehicle command
- Add vehicle UI allows creation of burnt and smashed car wrecks
- Anti-cheat: fixed kick local admin issue
- Cancel auth ticket on client shutdown
- Toggle timer is disabled in non-pvp area
- MultiplayerLightAmbient debug option is removed
- Refactored SafetySystem
- Server option process cycles for SafetySystemManager are simplified
- PVP safety is now set to true when PVP is disabled on server
- Set the default Host server memory to 4GB on 64-bit systems. This is the value displayed in the “Server memory” combobox which is saved in Zomboid/Lua/host.ini.
- Don’t create a backup of the server savefile in Zomboid/backups/version if BackupsOnStart=false. This backup is created when a new version of the game is released, but only for the first server that is launched.
- Hide the black overlay when the sleeping players are killed
Improvements to how the MP game handles dead player bodies
- DeadBody creation is moved to the server
- DeadBody ID is added (World version 192)
- Client does not allocate dead body ID
- Fixed player death animations
- Fixed desaturation being set for dead player
- Fixed reanimation delay timer starting immediately without 10 seconds delay
- Fixed reanimation delay of 0-30 seconds
- Fixed player death final animation
- Fixed possible null point exception when zombie bites dead player
- Fixed dead body grabbing breaking reanimation
- Fixed dead body id not changing when added to world
- Fixed desync of safety cooldown timer
- Fixed sleeping player not being woken up in case of kick from safehouse
- Fixed PVP icon being located over the map
- Fixed players who could be kicked when admin removes that player from safehouse
- Fixed when a non-owner player quits a safe house, other players also getting kicked.
- Fixed when safehouse owner goes offline, the non-safehouse-members get teleported immediately
- Fixed PVP button becoming inactive for each player across the map if Admin shot\got shot by a player”
- Fixed player being kicked when admin creates or removes PVP zone
- Fixed SyncNonPvpZone packet send/receive loop
- Fixed newly connected player not having all the non PVP zones
- Fixed possible nullpointer in checkForNearbyRadios
- Fixed zed texture 4 being used for player texture 5 instead of random index
- Fixed reanimated player corpse disappearing
- Fixed being able to turn pvp on when server option PVP set to false.
- Fixed BufferUnderflowException on the server in SneezeCough packet processing
- Fixed possible NullPointerException in ClientPlayerDB.getAllSavedPlayers().
- Fixed player appearance sync in multiplayer with greater than 32 connections.
- Fixed erosion growth not being suppressed when building floors or digging graves in multiplayer.
- Fixed radio sync in MP
- Fixed players outside the Non-PVP zone being able to kill a player with a bomb located in that zone
- Fixed player being able to remove PVP button cooldown in non-PVP zone
- Fixed unexpected anti-cheat kick just after leaving non-PVP zone
- Fixed being able to turn pvp on when server option PVP is set to false.
- Fixed player being able to remove PVP button cooldown when in a non-PVP zone. (Safety cooldown timer is now stored/restored when player enters/leaves non-pvp-zone)
VHS Fix
- Fixed listened-to media lines being saved globally instead of for each player. This could add over 200KB to each player’s saved data if every line is listened to.
- Fixed ClientPlayerDB handling of WorldVersion.
- Transfer known media lines from recorded_media.bin to the player on the first load.
- Check for null arguments to RecordedMedia.hasListenedToAll(). A mod seems to pass null for the IsoPlayer argument, which was ok when listened-to lines were stored globally instead of per-player.
The mod file is es.info.books.main.lua.MODDER WARNING: This could break any mods that modify ISRadioInteractions.lua or are using the OnDeviceText event (which gained a new parameter).MODDING - Fixed mod animations not being loaded if they aren’t in a subdirectory of anims_X, or aren’t in a subdirectory registered in animations_meshes.txt. Any such animations are added to the MaleBody model by default.
Item tagging changes
- Added new tags to some items: BlowTorch, Fork, GasMask, Glue, HazmatSuit, Knife, Razor, Scissors, Sledgehammer, Spoon, StartFire, WeldingMask. These tags are used in multiple places instead of looking for specific item types.
- Added methods ItemContainer.getBestConditionEvalArg() and ItemContainer.getBestConditionEvalArgRecurse().
- Script properties item.staticModel and item.worldStaticModel are set to the fully-qualified “module.type” after loading scripts. This is to fix mod items not finding “model” scripts that aren’t in the Base module.
- Added a new item-script property ReplaceTypes which supersedes ReplaceOnUseOn (which is still supported).
The format is “ReplaceTypes=Key1 Type1;Key2 Type2;…” where each key is some string (such as WaterSource) and each type is an item type.
ReplaceTypes allows specifying different replacement item types for different uses of an item, for example, filling an empty item with water and/or with gasoline.
It is used for the same thing as ReplaceOnUseOn, but allows multiple key/type mappings instead of only one.
These new methods were added to both Item and InventoryItem classes:
String getReplaceType()
HashMap<String,String> getReplaceTypes()
String getReplaceType(String key)
boolean hasReplaceType(String key)
The existing ReplaceOnUseOn lines in items.txt add a new value to the item’s ReplaceTypes HashMap.SOUND CHANGES - Added global parameters Electricity, RoomType, and Water.
- Added a new tile property named “AmbientSound” to support custom ambient sounds from objects. Current values assigned to some tiles are:
FactoryMachineAmbiance
HotdogMachineAmbiance
PayPhoneAmbiance
StreetLightAmbiance
NeonLightAmbiance
NeonSignAmbiance
JukeboxAmbiance
ControlStationAmbiance
ClockAmbiance
GasPumpAmbiance
LightBulbAmbiance - The FMOD global parameter “Electricity” is set to 0.0 when the new WorldEventElectricityShutdown event passes the “ElectricityOff” timeline marker.
- Added FMOD parameter value RoomType=Factory.
- Changed debugSetRoomType() to accept an integer instead of the name of an enum value.
- Added sounds:
ArcadeMachineAmbiance
CanisterAddFuelFromGasPump
CanisterAddFuelSiphon
VehicleAddFuelFromCanister
VehicleAddFuelFromGasPump
VehicleHeadlightsOn
VehicleHeadlightsOff
VehicleWindowHandleOpen
VehicleWindowHandleClose
VehicleWindowElectricOpen
VehicleWindowElectricClose - Synchronize room lights and other objects losing power with the ElectricityOff timeline marker.
- Added PlaceOneSound and PlaceMultipleSound item script properties.
These are played when placing items using the “Place Item” command.
The default sound played if these aren’t defined is PutItemInBag (the same sound played when dropping items). - Added BoxOfRoundsOpenOne and BoxOfShellsOpenOne sounds to some recipes.
Increased the time of these recipes to allow the sound to play. The time is still quite short (was 5 ticks, now 15 ticks). Probably nobody will die waiting. - Added FountainBigAmbiance sound played to the multi-tile water fountain.
The sound doesn’t seem to loop and stops after several seconds. - Added RepairWithWrench sound played when plumbing sinks and for the moveables Wrench tool sound.
- Added value MetalGate to the FenceTypeLow and TripObstacleType parameters.
- Added sounds:
BBQPropaneTankInsert
BBQPropaneTankRemove
BBQPropaneRunning
BBQRegularAddFuel
BBQRegularLight
BBQRegularRunning
CampfireAddFuel
CampfireRunning
CampfireLight
CampfireBuild
FireplaceAddFuel
FireplaceRunning
FireplaceLight
ZombieTrip
ZombieThumpGarageDoor - Added EquippedBaggageContainer FMOD parameter.
- Added “SoundParameter = Name Value” item-script property.
- Added FMOD parameter SinkType=Generic|Ceramic|Metallic which affects the WaterDrip sound.
- Hitting trees with weapons and bare hands plays the weapon’s HitSound instead of ChopTree.
- A melee weapon’s SwingSound is now played via animation events instead of at the start of SwipeStatePlayer.
This allows using different sounds for different attack animations.
Currently this is used to play a different sound for spear stab versus spear slash attacks. - Play the WorldEventElectricityShutdown event from the nearest square in a building when outdoors.
- Set the FMOD parameter “RoomType” using RoomType objects added in WorldEd.
- Changed how ambient sounds are played from doors and windows.
Instead of choosing random objects, only the nearest exterior objects will play sound.
Different sounds are played depending on whether the door or window is open or closed.
This will be used for playing rain and wind sounds when the player is inside. - Fixed the BurningFlesh sound not stopping in multiplayer after a player dies.
- Fixed the barbecue and fireplace extinguish sounds stopping instead of being triggered to fade out.
- Play an animation when turning a propane barbecue on and off.
- Fixed crouching when extinguishing a charcoal barbecue.
- Fixed SFX and music cutting out in busy situations (often seen on MP servers)
- Reimplemented ZombieVocalsManager to limit zombie voice events to the nearest 20 zombies.
- Optimized sorting objects in DoorAndWindowEmitters and ZombieVocalsManager.
- Changed handling of object ambient sounds so they only play from the nearest 20 objects. This includes doors, fridges, trees, windows and any sprite with the AmbientSound property set.
- Removed DoorAndWindowEmitters. This is combined with ObjectAmbientEmitters.
- Fixed ZombieVocalsManager not actually stopping vocal events when one of the 20 slots was reassigned to a different zombie.
CONTROLLER / STEAMDECK IMPROVEMENTS
- ProjectZomboid64.exe will disable the -XX:+UseZGC option if a required function is undefined in Kernel32.dll.
Steam Proton does not define the MapViewOfFile3() function, which prevents the Windows version of the game starting on the Steam Deck.
Conveniently, MapViewOfFile3() is only available on Windows 10 1803, the same version ZGC requires. - When options.ini doesn’t exist on startup, set the display to fullscreen desktop resolution.
- When options.ini doesn’t exist on startup on Steam Deck, call Core.setOptionActiveController() to enable the controller.
- Allow precise positioning when placing items using a controller. This is done by holding the Y button and using either D-pad or the left joystick to move the item around the square. When there is more than one surface, it can be changed by pressing the right shoulder button while the Y button is held down.
- Enabled the on-screen keyboard in CoopUserName.lua.
- Leave room for two lines of tooltip text at the bottom of the character-creation profession ui.
- Several panels in the main menu can be scrolled using the right joystick.
- The Start/Menu button will display the main menu in single-player, or resume normal game speed.
This is instead of pressing once to pause the game and double-pressing to display the main menu.
The game can still be paused using the Back/View button radial menu. - Added controller navigation in the Workshop ui (for submitting Workshop items). NOTE: The controller doesn’t work in the Steam overlay, which some buttons display.
- Allow mouse clicks etc in the inventory and loot windows when a controller is active.
- Added controller navigation to the Temperature tab of the character info window.
- Made the selection in the Health panel easier to see.
- Made the character-info window more opaque.
- Made CharacterCreationMain wider at lower resolutions to avoid overlap.
- Added a button to the on-screen keyboard to hide and show password text.
- Enabled controller navigation in the server browser ui.
- Enabled controller navigation in the server-settings editor.
- Put the inventory and loot windows in their default positions if the controller is disconnected and “Use Keyboard and Mouse” is selected.
- When placing items, the inventory and loot windows are collapsed if they aren’t pinned open.
- When placing items, mouse clicks on world objects are ignored to prevent the loot window popping open.
- Set the width of ISEquippedItem to match its buttons. This fixes the wider invisible area blocking mouse clicks.
- Set the texture compression option to be on by default.
- Fixed navigation in the Multiplayer tab in the options.
- Fixed editing server spawn regions with a controller.
- Fixed the filter checkboxes going outside the ui on small screens.
- Fixed being unable to navigate to the filter checkboxes and some other buttons.
- Fixed controller focus when creating a splitscreen player.
- Fixed toggling the mod under the mouse pointer when pressing the controller A button.
- Fixed several cases of improper controller focus after clicking buttons with the mouse.
- Fixed Lua error in MapSpawnSelect when the filename entry is hidden.
- Fixed LoadingQueueState disconnecting immediately due to the A button being pressed, after pressing it in the last character-creation panel.
- Fixed ISGameLoadingUI not receiving the controller focus when an unexpected error occurred while loading.
- Fixed BootstrapConnectPopup, ServerConnectPopup and ServerWorkshopItemScreen not working with a controller.
- Fixed Build 41 popup and DebugScenarios ui appearing overtop BootstrapConnectPopup.
- Fixed cancellation in ServerWorkshopItemScreen throwing an exception in ConnectToServerState due to GameClient.connection being null.
- Fixed using the controller X button to “Toggle Vision Info” in the foraging ui.
- Fixed rendering the post-death ui for split-screen players 3 and 4 in the top half of the screen.
- Fixed a Lua error pressing the Y button when moving furniture when the player isn’t on a square.
BALANCE
- Added BedType property to the Pizza-Whirled seats which fixes pizza spawning on them.
- Added amount of bait items to Fishing UI
- Added dismantling cameras for scrap/skill points
- Plastic bags and paper money can now be used as tinder.
- Doors broken by zombies now give unusable wood instead of planks.
- Container items now grouped together into their type in the context menu, so you can ‘fill all’ of a certain container.
- Players now able to stack and unstack logs on the ground
- Cars now remember their cruise control setting
- Breaking vehicle windows now produces broken glass
- Decrease zed attraction volume of “remove broken glass action”
- Updated and fixed item categorizations
- Updated evolvedrecipes.txt and items_food.txt.
- Removed Cookable:true from the Burger evolved recipe.
- Added the “|Cooked” flag to Burger ingredients in farming.txt.
- Updated distributions Lua files
- Muffins produced by the “Get 6 Muffins” recipe have the name of the ingredient added to the muffins, if any, such as “Apple Muffin”.
- Muffins produced by the “Get 6 Muffins” recipe are marked “Cooked”, so the hunger-reduction bonus due to being cooked is applied.
- Fixed adding a spice to a stale Taco increases boredom and unhappiness.
- Added new methods to the Food class (to fix the above issue):
getBoredomChangeUnmodified()
getEnduranceChangeUnmodified()
getStressChangeUnmodified()
getThirstChangeUnmodified()
getUnhappyChangeUnmodified() - Higher level carpentry crates now have more space.
- Can now move empty composter.
- Can now move military crates.
DEBUG
- Updated Debug context menu.
- Updated Debug Menu UI.
- Added Z param to teleport.
- Added change vehicle skin option to debug.
- Added Sync for changing color, blood and skin of vehicles.
- Refactored “Remove Item”-tool UI.
- Added option to the F11 UI: Disable Welcome message (Works only in debug mode).
- Added Reload Lua button to main screen (only in debug mode).
- Added Cheats Panel in debug menu. Updated cheat list (merged in options from Admin and F11 menu).
- Added fast move cheat (Controls: Arrow keys, Page Up/Down) (Debug and Admin panel).
- Added Admin context menu options (some options from debug).
- Added cheat Spawn Key door
- Added LootZed tool
- Added LootZed tool cheat (Check what can spawn in a container with what chance)
- Added remove items tools
- Added Remove items tools in Debug mode (Option for remove items from container menu and option in Debug UI for remove items in area)
- Added options to the “[DEBUG] Objects” menu to:
1) Change a mannequin’s script.
2) Create a Moveable item in the player’s inventory for a chosen mannequin script. - Changes to the debug Items List UI:
- Don’t recreate the ui each time it is displayed, because it’s slow.
- Keyboard focus is set to the “Type” text-entry box each time the ui is displayed.
- Pressing the Tab key switches focus between the “Type” and “Name” text-entry boxes when either one has the focus.
FIXES
- Fixed the player’s head being semi-transparent where hair and beard stubble appears. This also fixes semi-transparency that has always been there around the edges of holes in clothing.
- Fixed the controller tooltip text in the character-creation profession ui not displaying.
- Fixed the overly-long delay before changing the volume of a cd player or television when using a controller.
- Fixed spam messages about CDplayer’s invalid world sprite.
- Fixed the player not running when moving too slowly to sprint.
- Fixed the character-creation Add Trait button being covered by the controller tooltip text.
- Fixed placing multiple items locking the items to the first square that is clicked.
- Fixed controller focus not being set to the “Check back cover” ui.
- Fixed exploit holding down the Escape key before starting certain actions.
- Fixed taking damage when walking down stairs while faster-forwarding.
- Fixed a NullPointerException in InventoryItem.update() when an item’s ReplaceOnUseOn refers to an invalid item type.
- Fixed the post-death ui appearing in the main menu in multiplayer, if the player dies while the main menu is displayed.
- Fixed use of an undefined variable in SPlantGlobalObject.stateToIsoObject().
- Fixed buggy player rendering in the in-game map when the player is attacked.
- Fixed “Decaying Corpse Health Impact” health reduction for “Low” and “High” both being less than “Normal”.
- Fixed some duplications and formatting in MainCreationMethods.lua.
- Fixed custom Sandbox floats displaying too many decimals in the tooltip.
- Fixed walls in Fire station in LV remaining cutaway for no reason.
- Fixed character being able to rest on seats seen through some windows.
- Fixed siren and light bar shutting off once you get a certain distance away from the vehicle. Now even when you go over 1000 blocks away and come back, the lights and sirens on cars are still going off.
- Fixed not being able to attach sheet ropes at certain locations.
- Fixed cars not remembering their cruise control setting.
- Fixed “Place item on ground” ignoring item’s favourite status when placing items.
- Fixed being able to interact with rain collectors through the wall.
- Fixed player-built doors inside houses being transparent at any angle of view.
- Fixed Walkie-Talkies not showing new “equipped” weight when equipped.
- Fixed Metalwork locker container name being “Crate” in the loot window.
- Fixed a spawned bowl of pasta or rice not being edible.
- Fixed Painted Crates becoming white after Pick up / Place down.
- Fixed Rotten food showing in right click menu as (Fresh) when newly spawned.
- Fixed Applying Disinfectant to an un-infected wound making that body part immune to infection.
- Fixed player-built walls cutting away completely when built inside of another building.
- Fixed typo in AdjacentFreeTileFinder.lua.
- Fixed “Cake Preparation” not spawning rotten in 6 Months Later scenario.
- Fixed Dish Towel having option to “dry self” even if char is dry.
- Fixed Hair/Beard types grow back to their dyed colour, instead of their natural colour.
- Fixed Coffee / coffee beverage fatigue reduction values not saving on quit / restart.
- Fixed replacing disassembled floors with dirt tiles above ground level.
- Fixed clock Size option not being changable while in game.
- Fixed nil variable in ISWorldObjectContextMenu.doSleepOption() when tired enough to sleep on the ground.
- Fixed disassmbling floors playing the standing animation instead of crouching.
- Fixed saved Radio Stations being removed when a radio is removed and reinstalled.
- Fixed Foundation Makeup requiring a mirror when it already comes with one.
- Fixed characters not using a Knive that was equipped or in main inventory when crafting while a better Knive was in a nearby container.
- Fixed ISPaintMenu error when near a placed radio.
- Fixed weirdness installing and uninstalling radios in vehicles.
- Fixed NullPointerException in ParameterInside.
- Fixed Composters not having a container icon and title.
- Fixed blank VHS Home tapes spawning. They are now replaced with a random Retail VHS when spawning loot.
- Fixed an occasional exception in ISInventoryPane.sortItemsByTypeAndWeight() caused by a bad item-sorting comparison function.
- Fixed parts of weather effects not being rendered sometimes. This resulted in some clouds not being rendered at different zoom levels, causing the scene color to change when zooming in/out, for example.
- Fixed items replaced by their ReplaceOnCooked type not being synced in multiplayer correctly.
- Fixed Lua error when the mini-map doesn’t exist.
- Fixed jumbo item-atlas textures being drawn the first time models are loaded.
- Fixed mannequins that spawn in containers being invisible when placing them the first time.
- Fixed being unable to transfer the same item between containers until a timeout expires, if the first attempt was interrupted. This happened in multiplayer only.
- Fixed item models being drawn jumbo-sized for one frame when they are still loading, when using the old way of rendering 3D items.
- Fixed item-atlas textures being drawn in the incorrect position sometimes.
- Fixed items floating in air or remaining on the ground after removing or placing furniture.
- Fixed items on furniture being visible through walls. Item alpha is set to match that of the furniture it is placed on.
- Fixed not setting the keyboard focus on the debug Items List ui the first time it is displayed.
- Fixed the character-creation profession screen displaying controller icons after activating mods in the New Game ui, when no controller is active.
- Fixed building Wallframe using two planks but giving three when disassembled
- Fixed cooking an egg showing the progress bar twice
- Fixed shirts and other clothing items getting auto-removed from the world when they shouldn’t be.
- Fixed the character-creation profession screen displaying controller icons after activating mods in the New Game ui, when no controller is active.
- Fixed ISMap.canWrite() and ISMap:canErase() not using the Write and Eraser tags.
- Fixed support pillars for stairs not being created on the server or other clients.
- Fixed inability to burn corpses in MP
- Fixed Millipede and Millepede2 in forageDefinitions.lua both using type=Base.Centipede.
- Fixed forageSystem.modifyItemDef() incorrect use of _itemDef.type.
- Fixed forageSystem.removeItemDef() possibly using a nil _itemDef variable when printing a warning.
- Fixed HumanVisual.naturalBeardColor possibly being uninitialized before being copied in HumanVisual.copyFrom().
- Fixed OldBrake1 VehicleType being 3 instead of 1.
- Fixed the “Enable left joystick radial menu” option not being saved.
- Fixed a Lua error pressing the Toggle Search Mode key before starting a game.
- Fixed the Toggle Search Mode key getting in the way when the game is paused.
- Fixed crafted radios getting less maximum range at higher Electricity levels.
[*]Fixed crafted Ham Radios weighing 1.5-3 pounds instead of 20.
Source:Project Zomboid