mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-12-23 08:29:34 +01:00
342 lines
12 KiB
Lua
342 lines
12 KiB
Lua
crafting = {}
|
|
crafting.creative_inventory_size = 0
|
|
|
|
function init()
|
|
local inv = minetest.create_detached_inventory("creative", {
|
|
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
|
if minetest.setting_getbool("creative_mode") then
|
|
return count
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
allow_put = function(inv, listname, index, stack, player)
|
|
return 0
|
|
end,
|
|
allow_take = function(inv, listname, index, stack, player)
|
|
if minetest.setting_getbool("creative_mode") then
|
|
return -1
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
|
end,
|
|
on_put = function(inv, listname, index, stack, player)
|
|
end,
|
|
on_take = function(inv, listname, index, stack, player)
|
|
print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack))
|
|
if stack then
|
|
print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count()))
|
|
end
|
|
end,
|
|
})
|
|
set_inv("all")
|
|
end
|
|
|
|
function set_inv(filter, player)
|
|
local inv = minetest.get_inventory({type="detached", name="creative"})
|
|
inv:set_size("main", 0)
|
|
local creative_list = {}
|
|
for name,def in pairs(minetest.registered_items) do
|
|
if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then
|
|
if filter ~= "" then
|
|
if filter == "#blocks" then
|
|
if def.walkable == true then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#deco" then
|
|
if def.walkable == false or def.drawtype == "plantlike" or def.drawtype == "allfaces_optional" then--def.groups. == true then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#redstone" then
|
|
if string.find(string.lower(def.name), "redstone") or string.find(string.lower(def.description), "redstone") then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#rail" then
|
|
if string.find(string.lower(def.name), "rail") or string.find(string.lower(def.description), "rail") or string.find(string.lower(def.name), "cart") or string.find(string.lower(def.description), "cart") or string.find(string.lower(def.description), "boat") then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#misc" then
|
|
if def.drawtype == nil and def.tool_capabilities == nil and not string.find(string.lower(def.description), "ingot") and not string.find(string.lower(def.description), "lump") and not string.find(string.lower(def.description), "dye") and not string.find(string.lower(def.name), "diamond") and not string.find(string.lower(def.name), "redstone") and not string.find(string.lower(def.name), "obsidian") and not string.find(string.lower(def.description), "clay") then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#food" then
|
|
if def.groups.food ~= nil then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#tools" then
|
|
if def.tool_capabilities ~= nil and not string.find(string.lower(def.description), "sword") then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#combat" then
|
|
if def.tool_capabilities ~= nil and (string.find(string.lower(def.description), "sword") or string.find(string.lower(def.name), "armor") or string.find(string.lower(def.description), "bow") or string.find(string.lower(def.description), "arrow")) or string.find(string.lower(def.name), "armor") then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "#matr" then
|
|
if def.drawtype == nil and def.tool_capabilities == nil and (string.find(string.lower(def.description), "ingot") or string.find(string.lower(def.description), "lump") or string.find(string.lower(def.description), "dye") or string.find(string.lower(def.name), "diamond") or string.find(string.lower(def.name), "redstone") or string.find(string.lower(def.name), "obsidian") or string.find(string.lower(def.description), "clay") or string.find(string.lower(def.description), "stick") or string.find(string.lower(def.description), "flint") or string.find(string.lower(def.description), "seed")) then
|
|
table.insert(creative_list, name)
|
|
end
|
|
elseif filter == "all" then
|
|
table.insert(creative_list, name)
|
|
else --for all other
|
|
if string.find(string.lower(def.name), filter) or string.find(string.lower(def.description), filter) then
|
|
table.insert(creative_list, name)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
table.sort(creative_list)
|
|
inv:set_size("main", #creative_list)
|
|
for _,itemstring in ipairs(creative_list) do
|
|
inv:add_item("main", ItemStack(itemstring))
|
|
end
|
|
crafting.creative_inventory_size = #creative_list
|
|
--print("creative inventory size: "..dump(crafting.creative_inventory_size))
|
|
end
|
|
|
|
-- Create the trash field
|
|
local trash = minetest.create_detached_inventory("creative_trash", {
|
|
allow_put = function(inv, listname, index, stack, player)
|
|
if minetest.setting_getbool("creative_mode") then
|
|
return stack:get_count()
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
on_put = function(inv, listname, index, stack, player)
|
|
inv:set_stack(listname, index, "")
|
|
end,
|
|
})
|
|
trash:set_size("main", 1)
|
|
|
|
|
|
-- Create detached creative inventory after loading all mods
|
|
minetest.after(0, init)
|
|
|
|
local offset = {}
|
|
local hoch = {}
|
|
local bg = {}
|
|
offset["blocks"] = "-0.29,-0.25"
|
|
offset["deco"] = "0.98,-0.25"
|
|
offset["redstone"] = "2.23,-0.25"
|
|
offset["rail"] = "3.495,-0.25"
|
|
offset["misc"] = "4.75,-0.25"
|
|
offset["nix"] = "8.99,-0.25"
|
|
offset["food"] = "-0.29,8.12"
|
|
offset["tools"] = "0.98,8.12"
|
|
offset["combat"] = "2.23,8.12"
|
|
offset["brew"] = "3.495,8.12"
|
|
offset["matr"] = offset["brew"]--"4.74,8.12"
|
|
offset["inv"] = "8.99,8.12"
|
|
|
|
hoch["blocks"] = ""
|
|
hoch["deco"] = ""
|
|
hoch["redstone"] = ""
|
|
hoch["rail"] = ""
|
|
hoch["misc"] = ""
|
|
hoch["nix"] = ""
|
|
hoch["food"] = "^[transformfy"
|
|
hoch["tools"] = "^[transformfy"
|
|
hoch["combat"] = "^[transformfy"
|
|
hoch["brew"] = "^[transformfy"
|
|
hoch["matr"] = "^[transformfy"
|
|
hoch["inv"] = "^[transformfy"
|
|
|
|
local dark_bg = "crafting_creative_bg_dark.png"
|
|
|
|
local function reset_menu_item_bg()
|
|
bg["blocks"] = dark_bg
|
|
bg["deco"] = dark_bg
|
|
bg["redstone"] = dark_bg
|
|
bg["rail"] = dark_bg
|
|
bg["misc"] = dark_bg
|
|
bg["nix"] = dark_bg
|
|
bg["food"] = dark_bg
|
|
bg["tools"] = dark_bg
|
|
bg["combat"] = dark_bg
|
|
bg["brew"] = dark_bg
|
|
bg["matr"] = dark_bg
|
|
bg["inv"] = dark_bg
|
|
end
|
|
|
|
|
|
crafting.set_creative_formspec = function(player, start_i, pagenum, show, page)
|
|
reset_menu_item_bg()
|
|
pagenum = math.floor(pagenum) or 1
|
|
local pagemax = math.floor((crafting.creative_inventory_size-1) / (9*5) + 1)
|
|
local slider_height = 4/pagemax
|
|
local slider_pos = slider_height*(pagenum-1)+2.25
|
|
local name = "nix"
|
|
local formspec = ""
|
|
local main_list = "list[detached:creative;main;0,1.75;9,5;"..tostring(start_i).."]"
|
|
local listrings = "listring[detached:creative;main]"..
|
|
"listring[current_player;main]"..
|
|
"listring[detached:creative_trash;main]"
|
|
|
|
if page ~= nil then name = page end
|
|
bg[name] = "crafting_creative_bg.png"
|
|
if name == "inv" then
|
|
main_list = "image[-0.2,1.7;11.35,2.33;crafting_creative_bg.png]"..
|
|
"list[current_player;main;0,3.75;9,3;9]"
|
|
end
|
|
formspec = "size[10,9.3]"..
|
|
default.inventory_header..
|
|
"background[-0.19,-0.25;10.5,9.87;crafting_inventory_creative.png]"..
|
|
"label[-5,-5;"..name.."]"..
|
|
"image[" .. offset[name] .. ";1.5,1.44;crafting_creative_active.png"..hoch[name].."]"..
|
|
"image_button[-0.1,0;1,1;"..bg["blocks"].."^default_brick.png;build;]".. --build blocks
|
|
"image_button[1.15,0;1,1;"..bg["deco"].."^flower_peony.png;deco;]".. --decoration blocks
|
|
"image_button[2.415,0;1,1;"..bg["redstone"].."^mesecons_redstone_dust.png;redstone;]".. --redstone
|
|
"image_button[3.693,0;1,1;"..bg["rail"].."^carts_rail_pwr.png;rail;]".. --transportation
|
|
"image_button[4.93,0;1,1;"..bg["misc"].."^bucket_lava.png;misc;]".. --miscellaneous
|
|
"image_button[9.19,0;1,1;"..bg["nix"].."^default_sign.png;default;]".. --search
|
|
"image[0,1;5,0.75;fnt_"..name..".png]"..
|
|
"list[current_player;main;0,7;9,1;]"..
|
|
main_list..
|
|
"image_button[9.03,1.74;0.85,0.6;crafting_creative_up.png;creative_prev;]"..
|
|
"image[9.04," .. tostring(slider_pos) .. ";0.75,"..tostring(slider_height) .. ";crafting_slider.png]"..
|
|
"image_button[9.03,6.15;0.85,0.6;crafting_creative_down.png;creative_next;]"..
|
|
"image_button[-0.1,8.28;1,1;"..bg["food"].."^default_apple.png;food;]".. --foodstuff
|
|
"image_button[1.15,8.28;1,1;"..bg["tools"].."^default_tool_steelaxe.png;tools;]".. --tools
|
|
"image_button[2.415,8.28;1,1;"..bg["combat"].."^default_tool_goldsword.png;combat;]".. --combat
|
|
"image_button[3.693,8.28;1,1;"..bg["matr"].."^default_stick.png;matr;]".. --brewing
|
|
"image_button[9.19,8.28;1,1;"..bg["inv"].."^default_chest_front.png;inv;]".. --inventory
|
|
"list[detached:creative_trash;main;9,7;1,1;]"..
|
|
"image[9,7;1,1;crafting_creative_trash.png]"..
|
|
listrings
|
|
|
|
if name == "nix" then formspec = formspec .. "field[5.3,1.3;4,0.75;suche;;]" end
|
|
if pagenum ~= nil then formspec = formspec .. "p"..tostring(pagenum) end
|
|
|
|
player:set_inventory_formspec(formspec)
|
|
end
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
local page = nil
|
|
if not minetest.setting_getbool("creative_mode") then
|
|
return
|
|
end
|
|
|
|
if fields.bgcolor then
|
|
minetest.chat_send_all("jupp")
|
|
end
|
|
if fields.suche ~= nil and fields.suche ~= "" then
|
|
set_inv(string.lower(fields.suche))
|
|
minetest.show_formspec(player:get_player_name(), "detached:creative", player:get_inventory_formspec())
|
|
end
|
|
|
|
if fields.build then
|
|
set_inv("#blocks",player)
|
|
page = "blocks"
|
|
end
|
|
if fields.deco then
|
|
set_inv("#deco",player)
|
|
page = "deco"
|
|
end
|
|
if fields.redstone then
|
|
set_inv("#redstone",player)
|
|
page = "redstone"
|
|
end
|
|
if fields.rail then
|
|
set_inv("#rail",player)
|
|
page = "rail"
|
|
end
|
|
if fields.misc then
|
|
set_inv("#misc",player)
|
|
page = "misc"
|
|
end
|
|
if fields.default then
|
|
set_inv("all")
|
|
page = nil
|
|
end
|
|
if fields.food then
|
|
set_inv("#food")
|
|
page = "food"
|
|
end
|
|
if fields.tools then
|
|
set_inv("#tools")
|
|
page = "tools"
|
|
end
|
|
if fields.combat then
|
|
set_inv("#combat")
|
|
page = "combat"
|
|
end
|
|
if fields.matr then
|
|
set_inv("#matr")
|
|
page = "matr"
|
|
end
|
|
if fields.inv then
|
|
page = "inv"
|
|
end
|
|
-- Figure out current page from formspec
|
|
local current_page = 0
|
|
local formspec = player:get_inventory_formspec()
|
|
|
|
local size = string.len(formspec)
|
|
local marker = string.sub(formspec,size-2)
|
|
marker = string.sub(marker,1)
|
|
if marker ~= nil and marker == "p" then
|
|
local page = string.sub(formspec,size-1)
|
|
--minetest.chat_send_all(page)
|
|
start_i = page
|
|
end
|
|
start_i = tonumber(start_i) or 0
|
|
if fields.creative_prev then
|
|
start_i = start_i - 9*5
|
|
end
|
|
if fields.creative_next then
|
|
start_i = start_i + 9*5
|
|
end
|
|
if start_i < 0 then
|
|
start_i = start_i + 9*5
|
|
end
|
|
if start_i >= crafting.creative_inventory_size then
|
|
start_i = start_i - 9*5
|
|
end
|
|
if start_i < 0 or start_i >= crafting.creative_inventory_size then
|
|
start_i = 0
|
|
end
|
|
crafting.set_creative_formspec(player, start_i, start_i / (9*5) + 1, false, page)
|
|
end)
|
|
|
|
|
|
if minetest.setting_getbool("creative_mode") then
|
|
minetest.register_item(":", {
|
|
type = "none",
|
|
wield_image = "wieldhand.png",
|
|
wield_scale = {x=1,y=1,z=2.5},
|
|
tool_capabilities = {
|
|
full_punch_interval = 0.5,
|
|
max_drop_level = 3,
|
|
groupcaps = {
|
|
crumbly = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
|
cracky = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
|
snappy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
|
choppy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
|
oddly_breakable_by_hand = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
|
}
|
|
}
|
|
})
|
|
|
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
|
return true
|
|
end)
|
|
|
|
function minetest.handle_node_drops(pos, drops, digger)
|
|
if not digger or not digger:is_player() then
|
|
return
|
|
end
|
|
local inv = digger:get_inventory()
|
|
if inv then
|
|
for _,item in ipairs(drops) do
|
|
item = ItemStack(item):get_name()
|
|
if not inv:contains_item("main", item) then
|
|
inv:add_item("main", item)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|