83 lines
2.3 KiB
Lua
83 lines
2.3 KiB
Lua
--[[ Development Mode
|
|
This is a special gamestate that allows to change the game
|
|
world at will without interference. Features:
|
|
* Access to getitem
|
|
* Nothing is protected
|
|
* No laser updates
|
|
* Large inventory ]]
|
|
|
|
local S = minetest.get_translator("lzr_devmode")
|
|
|
|
lzr_gamestate.register_on_enter_state(function(new_state)
|
|
if new_state ~= lzr_gamestate.DEV then
|
|
return
|
|
end
|
|
local player = minetest.get_player_by_name("singleplayer")
|
|
if not player or not player:is_player() then
|
|
return
|
|
end
|
|
lzr_gui.set_dev_gui(player)
|
|
lzr_player.set_dev_inventory(player)
|
|
end)
|
|
|
|
-- Add /devmode command, but only if the hidden lzr_debug setting is active
|
|
if minetest.settings:get_bool("lzr_debug", false) then
|
|
minetest.register_chatcommand("devmode", {
|
|
description = S("Enter or exit development mode"),
|
|
privs = { server = true },
|
|
params = "[ enter | exit ]",
|
|
func = function(name, param)
|
|
local player = minetest.get_player_by_name(name)
|
|
local already_in = lzr_gamestate.get_state() == lzr_gamestate.DEV
|
|
if param == "" or param == "enter" then
|
|
if not already_in then
|
|
lzr_gamestate.set_state(lzr_gamestate.DEV)
|
|
return true
|
|
else
|
|
return false, S("Already in development mode!")
|
|
end
|
|
elseif param == "exit" then
|
|
if already_in then
|
|
lzr_gamestate.set_state(lzr_gamestate.MENU)
|
|
return true
|
|
else
|
|
return false, S("Not in development mode!")
|
|
end
|
|
end
|
|
return false
|
|
end,
|
|
})
|
|
end
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
if fields.__lzr_devmode_get_item then
|
|
local pname = player:get_player_name()
|
|
lzr_getitem.show_formspec(pname)
|
|
end
|
|
end)
|
|
|
|
-- Unlimited node placement in dev mode
|
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
|
if placer and placer:is_player() then
|
|
return lzr_gamestate.get_state() == lzr_gamestate.DEV
|
|
end
|
|
end)
|
|
|
|
-- Don't pick node up if the item is already in the inventory
|
|
local old_handle_node_drops = minetest.handle_node_drops
|
|
function minetest.handle_node_drops(pos, drops, digger)
|
|
if not digger or not digger:is_player() or
|
|
lzr_gamestate.get_state() ~= lzr_gamestate.DEV then
|
|
return old_handle_node_drops(pos, drops, digger)
|
|
end
|
|
local inv = digger:get_inventory()
|
|
if inv then
|
|
for _, item in ipairs(drops) do
|
|
if not inv:contains_item("main", item, true) then
|
|
inv:add_item("main", item)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|