mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 10:31:06 +01:00
survival inventory tabs API + mcl_gamemode
This commit is contained in:
parent
fb79465052
commit
fbb51835b3
9 changed files with 539 additions and 265 deletions
|
@ -247,3 +247,12 @@ end)
|
||||||
minetest.register_on_mods_loaded(function()
|
minetest.register_on_mods_loaded(function()
|
||||||
table.sort(mcl_experience.on_add_xp, function(a, b) return a.priority < b.priority end)
|
table.sort(mcl_experience.on_add_xp, function(a, b) return a.priority < b.priority end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode)
|
||||||
|
if new_gamemode == "survival" then
|
||||||
|
mcl_experience.setup_hud(player)
|
||||||
|
mcl_experience.update(player)
|
||||||
|
elseif new_gamemode == "creative" then
|
||||||
|
mcl_experience.remove_hud(player)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
name = mcl_experience
|
name = mcl_experience
|
||||||
author = oilboi
|
author = oilboi
|
||||||
description = eXPerience mod
|
description = eXPerience mod
|
||||||
|
depends = mcl_gamemode
|
||||||
|
|
0
mods/HUD/mcl_inventory/API.md
Normal file
0
mods/HUD/mcl_inventory/API.md
Normal file
|
@ -11,7 +11,8 @@ local inventory_lists = {}
|
||||||
--local mod_player = minetest.get_modpath("mcl_player")
|
--local mod_player = minetest.get_modpath("mcl_player")
|
||||||
|
|
||||||
-- Create tables
|
-- Create tables
|
||||||
local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"}
|
local builtin_filter_ids = { "blocks", "deco", "redstone", "rail", "food", "tools", "combat", "mobs", "brew", "matr",
|
||||||
|
"misc", "all" }
|
||||||
for _, f in pairs(builtin_filter_ids) do
|
for _, f in pairs(builtin_filter_ids) do
|
||||||
inventory_lists[f] = {}
|
inventory_lists[f] = {}
|
||||||
end
|
end
|
||||||
|
@ -32,16 +33,25 @@ end
|
||||||
executed after loading all the other mods in order to work. ]]
|
executed after loading all the other mods in order to work. ]]
|
||||||
minetest.register_on_mods_loaded(function()
|
minetest.register_on_mods_loaded(function()
|
||||||
for name, def in pairs(minetest.registered_items) do
|
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 (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and
|
||||||
|
def.description ~= "" then
|
||||||
local function is_redstone(def)
|
local function is_redstone(def)
|
||||||
return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off
|
return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or
|
||||||
|
def.groups.mesecon_effecor_off
|
||||||
end
|
end
|
||||||
|
|
||||||
local function is_tool(def)
|
local function is_tool(def)
|
||||||
return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil)
|
return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function is_weapon_or_armor(def)
|
local function is_weapon_or_armor(def)
|
||||||
return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1)
|
return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or
|
||||||
|
(
|
||||||
|
(
|
||||||
|
def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or
|
||||||
|
def.groups.horse_armor) and def.groups.non_combat_armor ~= 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Is set to true if it was added in any category besides misc
|
-- Is set to true if it was added in any category besides misc
|
||||||
local nonmisc = false
|
local nonmisc = false
|
||||||
if def.groups.building_block then
|
if def.groups.building_block then
|
||||||
|
@ -126,7 +136,8 @@ local function set_inv_search(filter, player)
|
||||||
local creative_list = {}
|
local creative_list = {}
|
||||||
local lang = minetest.get_player_information(playername).lang_code
|
local lang = minetest.get_player_information(playername).lang_code
|
||||||
for name, def in pairs(minetest.registered_items) do
|
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 (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and
|
||||||
|
def.description ~= "" then
|
||||||
if filter_item(string.lower(def.name), def.description, lang, filter) then
|
if filter_item(string.lower(def.name), def.description, lang, filter) then
|
||||||
table.insert(creative_list, name)
|
table.insert(creative_list, name)
|
||||||
end
|
end
|
||||||
|
@ -314,7 +325,19 @@ function mcl_inventory.set_creative_formspec(player)
|
||||||
local name = players[playername].page
|
local name = players[playername].page
|
||||||
local inv_size = players[playername].inv_size
|
local inv_size = players[playername].inv_size
|
||||||
local filter = players[playername].filter
|
local filter = players[playername].filter
|
||||||
|
|
||||||
|
if not inv_size then
|
||||||
|
if page == "nix" then
|
||||||
|
local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername })
|
||||||
|
inv_size = inv:get_size("main")
|
||||||
|
elseif page and page ~= "inv" then
|
||||||
|
inv_size = #(inventory_lists[page])
|
||||||
|
else
|
||||||
|
inv_size = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
local pagemax = math.max(1, math.floor((inv_size - 1) / (9 * 5) + 1))
|
local pagemax = math.max(1, math.floor((inv_size - 1) / (9 * 5) + 1))
|
||||||
|
local name = "nix"
|
||||||
local main_list
|
local main_list
|
||||||
local listrings = "listring[detached:creative_" .. playername .. ";main]" ..
|
local listrings = "listring[detached:creative_" .. playername .. ";main]" ..
|
||||||
"listring[current_player;main]" ..
|
"listring[current_player;main]" ..
|
||||||
|
@ -374,7 +397,7 @@ function mcl_inventory.set_creative_formspec(player)
|
||||||
"image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]" ..
|
"image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]" ..
|
||||||
"tooltip[__mcl_doc;" .. F(S("Help")) .. "]" ..
|
"tooltip[__mcl_doc;" .. F(S("Help")) .. "]" ..
|
||||||
|
|
||||||
-- Achievements button
|
-- Advancements button
|
||||||
"image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]" ..
|
"image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]" ..
|
||||||
--"style_type[image_button;border=;bgimg=;bgimg_pressed=]" ..
|
--"style_type[image_button;border=;bgimg=;bgimg_pressed=]" ..
|
||||||
"tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" ..
|
"tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" ..
|
||||||
|
@ -427,11 +450,11 @@ function mcl_inventory.set_creative_formspec(player)
|
||||||
else
|
else
|
||||||
bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png"
|
bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png"
|
||||||
end
|
end
|
||||||
return
|
return "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=]" ..
|
||||||
"style["..this_tab..";border=false;bgimg=;bgimg_pressed=]"..
|
|
||||||
"item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]" ..
|
"item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]" ..
|
||||||
"image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]"
|
"image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]"
|
||||||
end
|
end
|
||||||
|
|
||||||
local caption = ""
|
local caption = ""
|
||||||
if name ~= "inv" and filtername[name] then
|
if name ~= "inv" and filtername[name] then
|
||||||
caption = "label[0,1.2;" .. F(minetest.colorize("#313131", filtername[name])) .. "]"
|
caption = "label[0,1.2;" .. F(minetest.colorize("#313131", filtername[name])) .. "]"
|
||||||
|
@ -606,14 +629,67 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
players[name].filter = ""
|
players[name].filter = ""
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_inventory.set_creative_formspec(player)
|
mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
if minetest.is_creative_enabled("") then
|
||||||
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
||||||
return placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name())
|
-- Place infinite nodes, except for shulker boxes
|
||||||
|
local group = minetest.get_item_group(itemstack:get_name(), "shulker_box")
|
||||||
|
return group == 0 or group == nil
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
function minetest.handle_node_drops(pos, drops, digger)
|
||||||
|
if not digger or not digger:is_player() then
|
||||||
|
for _, item in ipairs(drops) do
|
||||||
|
minetest.add_item(pos, item)
|
||||||
|
end
|
||||||
|
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
|
||||||
|
|
||||||
|
mcl_inventory.update_inventory_formspec = function(player)
|
||||||
|
local page
|
||||||
|
|
||||||
|
local name = player:get_player_name()
|
||||||
|
|
||||||
|
if players[name].page then
|
||||||
|
page = players[name].page
|
||||||
|
else
|
||||||
|
page = "nix"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Figure out current scroll bar from formspec
|
||||||
|
--local formspec = player:get_inventory_formspec()
|
||||||
|
local start_i = players[name].start_i
|
||||||
|
|
||||||
|
local inv_size
|
||||||
|
if page == "nix" then
|
||||||
|
local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. name })
|
||||||
|
inv_size = inv:get_size("main")
|
||||||
|
elseif page and page ~= "inv" then
|
||||||
|
inv_size = #(inventory_lists[page])
|
||||||
|
else
|
||||||
|
inv_size = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local filter = players[name].filter
|
||||||
|
if filter == nil then
|
||||||
|
filter = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
-- Initialize variables and inventory
|
-- Initialize variables and inventory
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
@ -629,7 +705,8 @@ minetest.register_on_joinplayer(function(player)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info)
|
minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info)
|
||||||
if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and inventory_info.listname == "main" then
|
if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and
|
||||||
|
inventory_info.listname == "main" then
|
||||||
local stack = inventory_info.stack
|
local stack = inventory_info.stack
|
||||||
stack:set_count(stack:get_stack_max())
|
stack:set_count(stack:get_stack_max())
|
||||||
player:get_inventory():set_stack("main", inventory_info.index, stack)
|
player:get_inventory():set_stack("main", inventory_info.index, stack)
|
||||||
|
|
|
@ -300,6 +300,9 @@ local F = minetest.formspec_escape
|
||||||
|
|
||||||
mcl_inventory = {}
|
mcl_inventory = {}
|
||||||
|
|
||||||
|
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua")
|
||||||
|
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua")
|
||||||
|
|
||||||
--local mod_player = minetest.get_modpath("mcl_player")
|
--local mod_player = minetest.get_modpath("mcl_player")
|
||||||
--local mod_craftguide = minetest.get_modpath("mcl_craftguide")
|
--local mod_craftguide = minetest.get_modpath("mcl_craftguide")
|
||||||
|
|
||||||
|
@ -363,90 +366,9 @@ local function set_inventory(player, armor_change_only)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local inv = player:get_inventory()
|
|
||||||
|
|
||||||
inv:set_width("craft", 2)
|
|
||||||
inv:set_size("craft", 4)
|
|
||||||
|
|
||||||
local armor_slots = { "helmet", "chestplate", "leggings", "boots" }
|
player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player))
|
||||||
local armor_slot_imgs = ""
|
|
||||||
|
|
||||||
for a = 1, 4 do
|
|
||||||
if inv:get_stack("armor", a + 1):is_empty() then
|
|
||||||
armor_slot_imgs = armor_slot_imgs ..
|
|
||||||
"image[0.375," .. (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if inv:get_stack("offhand", 1):is_empty() then
|
|
||||||
armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]"
|
|
||||||
end
|
|
||||||
|
|
||||||
local form = table.concat({
|
|
||||||
"formspec_version[6]",
|
|
||||||
"size[11.75,10.9]",
|
|
||||||
|
|
||||||
--Armor slots
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4),
|
|
||||||
"list[current_player;armor;0.375,0.375;1,1;1]",
|
|
||||||
"list[current_player;armor;0.375,1.625;1,1;2]",
|
|
||||||
"list[current_player;armor;0.375,2.875;1,1;3]",
|
|
||||||
"list[current_player;armor;0.375,4.125;1,1;4]",
|
|
||||||
|
|
||||||
--Main inventory
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3),
|
|
||||||
"list[current_player;main;0.375,5.575;9,3;9]",
|
|
||||||
|
|
||||||
--Hotbar
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1),
|
|
||||||
"list[current_player;main;0.375,9.525;9,1;]",
|
|
||||||
|
|
||||||
--Player model
|
|
||||||
"image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]",
|
|
||||||
mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, ""),
|
|
||||||
|
|
||||||
--Offhand
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1),
|
|
||||||
"list[current_player;offhand;5.375,4.125;1,1]",
|
|
||||||
|
|
||||||
armor_slot_imgs,
|
|
||||||
|
|
||||||
--Craft grid
|
|
||||||
"label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]",
|
|
||||||
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2),
|
|
||||||
"list[current_player;craft;6.625,0.875;2,2]",
|
|
||||||
|
|
||||||
"image[9.125,1.5;1,1;crafting_formspec_arrow.png]",
|
|
||||||
|
|
||||||
mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1),
|
|
||||||
"list[current_player;craftpreview;10.375,1.5;1,1;]",
|
|
||||||
|
|
||||||
--Crafting guide button
|
|
||||||
"image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]",
|
|
||||||
"tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]",
|
|
||||||
|
|
||||||
--Help button
|
|
||||||
"image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]",
|
|
||||||
"tooltip[__mcl_doc;" .. F(S("Help")) .. "]",
|
|
||||||
|
|
||||||
--Skins button
|
|
||||||
"image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]",
|
|
||||||
"tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]",
|
|
||||||
|
|
||||||
--Achievements button
|
|
||||||
"image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]",
|
|
||||||
"tooltip[__mcl_achievements;" .. F(S("Achievements")) .. "]",
|
|
||||||
|
|
||||||
--Listring
|
|
||||||
"listring[current_player;main]",
|
|
||||||
"listring[current_player;armor]",
|
|
||||||
"listring[current_player;main]",
|
|
||||||
"listring[current_player;craft]",
|
|
||||||
"listring[current_player;main]",
|
|
||||||
})
|
|
||||||
|
|
||||||
player:set_inventory_formspec(form)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Drop items in craft grid and reset inventory on closing
|
-- Drop items in craft grid and reset inventory on closing
|
||||||
|
@ -508,87 +430,21 @@ minetest.register_on_joinplayer(function(player)
|
||||||
return_fields(player, "enchanting_lapis")
|
return_fields(player, "enchanting_lapis")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
---@param player ObjectRef
|
||||||
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua")
|
function mcl_inventory.update_inventory(player)
|
||||||
|
local player_gamemode = mcl_gamemode.get_gamemode(player)
|
||||||
local mt_is_creative_enabled = minetest.is_creative_enabled
|
if player_gamemode == "creative" then
|
||||||
|
--if armor_change_only then
|
||||||
function minetest.is_creative_enabled(name)
|
-- Stay on survival inventory plage if only the armor has been changed
|
||||||
if mt_is_creative_enabled(name) then return true end
|
-- mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv")
|
||||||
if not name then return false end
|
--else
|
||||||
local p = minetest.get_player_by_name(name)
|
mcl_inventory.set_creative_formspec(player, 0, 1)
|
||||||
if p then
|
--end
|
||||||
return p:get_meta():get_string("gamemode") == "creative"
|
elseif player_gamemode == "survival" then
|
||||||
|
player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player))
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--Insta "digging" nodes in gamemode-creative
|
mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode)
|
||||||
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
|
set_inventory(player)
|
||||||
if not puncher or not puncher:is_player() then return end
|
|
||||||
if minetest.is_creative_enabled() then return end
|
|
||||||
local name = puncher:get_player_name()
|
|
||||||
if not minetest.is_creative_enabled(name) then return end
|
|
||||||
if pointed_thing.type ~= "node" then return end
|
|
||||||
local def = minetest.registered_nodes[node.name]
|
|
||||||
if def then
|
|
||||||
if def.on_destruct then def.on_destruct(pos) end
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--Don't subtract from inv when placing in gamemode-creative
|
|
||||||
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
|
|
||||||
if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local function in_table(n, h)
|
|
||||||
for k, v in pairs(h) do
|
|
||||||
if v == n then return true end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local gamemodes = {
|
|
||||||
"survival",
|
|
||||||
"creative"
|
|
||||||
}
|
|
||||||
|
|
||||||
function mcl_inventory.player_set_gamemode(p, g)
|
|
||||||
local m = p:get_meta()
|
|
||||||
m:set_string("gamemode", g)
|
|
||||||
if g == "survival" then
|
|
||||||
mcl_experience.setup_hud(p)
|
|
||||||
mcl_experience.update(p)
|
|
||||||
elseif g == "creative" then
|
|
||||||
mcl_experience.remove_hud(p)
|
|
||||||
end
|
|
||||||
set_inventory(p)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_chatcommand("gamemode", {
|
|
||||||
params = S("[<gamemode>] [<player>]"),
|
|
||||||
description = S("Change gamemode (survival/creative) for yourself or player"),
|
|
||||||
privs = { server = true },
|
|
||||||
func = function(n, param)
|
|
||||||
-- Full input validation ( just for @erlehmann <3 )
|
|
||||||
local p = minetest.get_player_by_name(n)
|
|
||||||
local args = param:split(" ")
|
|
||||||
if args[2] ~= nil then
|
|
||||||
p = minetest.get_player_by_name(args[2])
|
|
||||||
end
|
|
||||||
if not p then
|
|
||||||
return false, S("Player not online")
|
|
||||||
end
|
|
||||||
if args[1] ~= nil and not in_table(args[1], gamemodes) then
|
|
||||||
return false, S("Gamemode " .. args[1] .. " does not exist.")
|
|
||||||
elseif args[1] ~= nil then
|
|
||||||
mcl_inventory.player_set_gamemode(p, args[1])
|
|
||||||
end
|
|
||||||
--Result message - show effective game mode
|
|
||||||
local gm = p:get_meta():get_string("gamemode")
|
|
||||||
if gm == "" then gm = gamemodes[1] end
|
|
||||||
return true, S("Gamemode for player ") .. n .. S(": " .. gm)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
name = mcl_inventory
|
name = mcl_inventory
|
||||||
author = BlockMen
|
author = BlockMen
|
||||||
description = Adds the player inventory and creative inventory.
|
description = Adds the player inventory and creative inventory.
|
||||||
|
<<<<<<< HEAD
|
||||||
depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_player
|
depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_player
|
||||||
optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide
|
optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide
|
||||||
|
=======
|
||||||
|
depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode
|
||||||
|
optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player
|
||||||
|
>>>>>>> a2429154d (survival inventory tabs API + mcl_gamemode)
|
||||||
|
|
219
mods/HUD/mcl_inventory/survival.lua
Normal file
219
mods/HUD/mcl_inventory/survival.lua
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
---@diagnostic disable need-check-nil
|
||||||
|
|
||||||
|
local table = table
|
||||||
|
local ipairs = ipairs
|
||||||
|
|
||||||
|
local S = minetest.get_translator("mcl_inventory")
|
||||||
|
local F = minetest.formspec_escape
|
||||||
|
|
||||||
|
---@type {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean}[]
|
||||||
|
mcl_inventory.registered_survival_inventory_tabs = {}
|
||||||
|
|
||||||
|
---@param def {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean}
|
||||||
|
function mcl_inventory.register_survival_inventory_tab(def)
|
||||||
|
if #mcl_inventory.registered_survival_inventory_tabs == 7 then
|
||||||
|
error("Too much tabs registered!")
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(def.id)
|
||||||
|
assert(def.description)
|
||||||
|
assert(def.item_icon)
|
||||||
|
assert(def.build)
|
||||||
|
assert(def.handle)
|
||||||
|
|
||||||
|
if not def.access then
|
||||||
|
function def.access(player)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if def.show_inventory == nil then
|
||||||
|
def.show_inventory = true
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(mcl_inventory.registered_survival_inventory_tabs, def)
|
||||||
|
end
|
||||||
|
|
||||||
|
local player_current_tab = {}
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player, last_login)
|
||||||
|
player_current_tab[player] = "main"
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player, timed_out)
|
||||||
|
player_current_tab[player] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
|
---@param player ObjectRef
|
||||||
|
---@param content string
|
||||||
|
---@param inventory boolean
|
||||||
|
---@param tabname string
|
||||||
|
function build_page(player, content, inventory, tabname)
|
||||||
|
local tab_buttons = "style_type[image;noclip=true]"
|
||||||
|
|
||||||
|
if #mcl_inventory.registered_survival_inventory_tabs ~= 1 then
|
||||||
|
for i, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do
|
||||||
|
local btn_name = "tab_" .. d.id
|
||||||
|
|
||||||
|
tab_buttons = tab_buttons .. table.concat({
|
||||||
|
"style[" .. btn_name .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]",
|
||||||
|
"image[" ..
|
||||||
|
(0.2 + (i - 1) * 1.6) ..
|
||||||
|
",-1.34;1.5,1.44;" .. (tabname == d.id and "crafting_creative_active.png" or "crafting_creative_inactive.png") ..
|
||||||
|
"]",
|
||||||
|
"item_image_button[" .. (0.44 + (i - 1) * 1.6) .. ",-1.1;1,1;" .. d.item_icon .. ";" .. btn_name .. ";]",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat({
|
||||||
|
"formspec_version[6]",
|
||||||
|
"size[11.75,10.9]",
|
||||||
|
|
||||||
|
inventory and table.concat({
|
||||||
|
--Main inventory
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3),
|
||||||
|
"list[current_player;main;0.375,5.575;9,3;9]",
|
||||||
|
|
||||||
|
--Hotbar
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1),
|
||||||
|
"list[current_player;main;0.375,9.525;9,1;]"
|
||||||
|
}) or "",
|
||||||
|
|
||||||
|
content,
|
||||||
|
tab_buttons,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local main_page_static = table.concat({
|
||||||
|
--Armor slots
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4),
|
||||||
|
"list[current_player;armor;0.375,0.375;1,1;1]",
|
||||||
|
"list[current_player;armor;0.375,1.625;1,1;2]",
|
||||||
|
"list[current_player;armor;0.375,2.875;1,1;3]",
|
||||||
|
"list[current_player;armor;0.375,4.125;1,1;4]",
|
||||||
|
|
||||||
|
--Player model background
|
||||||
|
"image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]",
|
||||||
|
|
||||||
|
--Offhand
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1),
|
||||||
|
"list[current_player;offhand;5.375,4.125;1,1]",
|
||||||
|
|
||||||
|
--Craft grid
|
||||||
|
"label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]",
|
||||||
|
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2),
|
||||||
|
"list[current_player;craft;6.625,0.875;2,2]",
|
||||||
|
|
||||||
|
"image[9.125,1.5;1,1;crafting_formspec_arrow.png]",
|
||||||
|
|
||||||
|
mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1),
|
||||||
|
"list[current_player;craftpreview;10.375,1.5;1,1;]",
|
||||||
|
|
||||||
|
--Crafting guide button
|
||||||
|
"image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]",
|
||||||
|
"tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]",
|
||||||
|
|
||||||
|
--Help button
|
||||||
|
"image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]",
|
||||||
|
"tooltip[__mcl_doc;" .. F(S("Help")) .. "]",
|
||||||
|
|
||||||
|
--Skins button
|
||||||
|
"image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]",
|
||||||
|
"tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]",
|
||||||
|
|
||||||
|
--Achievements button
|
||||||
|
"image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]",
|
||||||
|
"tooltip[__mcl_achievements;" .. F(S("Achievements")) .. "]",
|
||||||
|
|
||||||
|
--Listring
|
||||||
|
"listring[current_player;main]",
|
||||||
|
"listring[current_player;armor]",
|
||||||
|
"listring[current_player;main]",
|
||||||
|
"listring[current_player;craft]",
|
||||||
|
"listring[current_player;main]",
|
||||||
|
})
|
||||||
|
|
||||||
|
mcl_inventory.register_survival_inventory_tab({
|
||||||
|
id = "main",
|
||||||
|
description = "Main Inventory",
|
||||||
|
item_icon = "mcl_crafting_table:crafting_table",
|
||||||
|
show_inventory = true,
|
||||||
|
build = function(player)
|
||||||
|
local inv = player:get_inventory()
|
||||||
|
|
||||||
|
local armor_slots = { "helmet", "chestplate", "leggings", "boots" }
|
||||||
|
local armor_slot_imgs = ""
|
||||||
|
|
||||||
|
for a = 1, 4 do
|
||||||
|
if inv:get_stack("armor", a + 1):is_empty() then
|
||||||
|
armor_slot_imgs = armor_slot_imgs ..
|
||||||
|
"image[0.375," .. (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if inv:get_stack("offhand", 1):is_empty() then
|
||||||
|
armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]"
|
||||||
|
end
|
||||||
|
return main_page_static .. armor_slot_imgs .. mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, "")
|
||||||
|
end,
|
||||||
|
handle = function() end,
|
||||||
|
})
|
||||||
|
|
||||||
|
--
|
||||||
|
mcl_inventory.register_survival_inventory_tab({
|
||||||
|
id = "test",
|
||||||
|
description = "Test",
|
||||||
|
item_icon = "mcl_core:stone",
|
||||||
|
show_inventory = true,
|
||||||
|
build = function(player)
|
||||||
|
return "label[1,1;Hello hello]button[2,2;2,2;Hello;hey]"
|
||||||
|
end,
|
||||||
|
handle = function(player, fields)
|
||||||
|
print(dump(fields))
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
---@param player ObjectRef
|
||||||
|
function mcl_inventory.build_survival_formspec(player)
|
||||||
|
local inv = player:get_inventory()
|
||||||
|
|
||||||
|
inv:set_width("craft", 2)
|
||||||
|
inv:set_size("craft", 4)
|
||||||
|
|
||||||
|
local tab = player_current_tab[player]
|
||||||
|
|
||||||
|
local tab_def = nil
|
||||||
|
|
||||||
|
for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do
|
||||||
|
if tab == d.id then
|
||||||
|
tab_def = d
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local form = build_page(player, tab_def.build(player), tab_def.show_inventory, tab)
|
||||||
|
|
||||||
|
return form
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if formname == "" and #mcl_inventory.registered_survival_inventory_tabs ~= 1 and
|
||||||
|
mcl_gamemode.get_gamemode(player) == "survival" then
|
||||||
|
for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do
|
||||||
|
if fields["tab_" .. d.id] and d.access(player) then
|
||||||
|
player_current_tab[player] = d.id
|
||||||
|
mcl_inventory.update_inventory(player)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do
|
||||||
|
if player_current_tab[player] == d.id and d.access(player) then
|
||||||
|
d.handle(player, fields)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
106
mods/PLAYER/mcl_gamemode/init.lua
Normal file
106
mods/PLAYER/mcl_gamemode/init.lua
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
---@diagnostic disable lowercase-global
|
||||||
|
|
||||||
|
local S = minetest.get_translator("mcl_gamemode")
|
||||||
|
|
||||||
|
mcl_gamemode = {}
|
||||||
|
|
||||||
|
mcl_gamemode.gamemodes = {
|
||||||
|
"survival",
|
||||||
|
"creative",
|
||||||
|
}
|
||||||
|
|
||||||
|
---@param n any
|
||||||
|
---@param h table
|
||||||
|
---@return boolean
|
||||||
|
local function in_table(n, h)
|
||||||
|
for k, v in pairs(h) do
|
||||||
|
if v == n then return true end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"')[]
|
||||||
|
mcl_gamemode.registered_on_gamemode_change = {}
|
||||||
|
|
||||||
|
---@param func fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"')
|
||||||
|
function mcl_gamemode.register_on_gamemode_change(func)
|
||||||
|
table.insert(mcl_gamemode.registered_on_gamemode_change, func)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param player ObjectRef
|
||||||
|
---@param gamemode '"survival"'|'"creative"'
|
||||||
|
function mcl_gamemode.set_gamemode(player, gamemode)
|
||||||
|
local meta = player:get_meta()
|
||||||
|
local old_gamemode = meta:get_string("gamemode")
|
||||||
|
meta:set_string("gamemode", gamemode)
|
||||||
|
for _, f in ipairs(mcl_gamemode.registered_on_gamemode_change) do
|
||||||
|
f(player, old_gamemode, gamemode)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mt_is_creative_enabled = minetest.is_creative_enabled
|
||||||
|
|
||||||
|
---@param player ObjectRef
|
||||||
|
---@return '"survival"'|'"creative"'
|
||||||
|
function mcl_gamemode.get_gamemode(player)
|
||||||
|
if mt_is_creative_enabled(player:get_player_name()) then
|
||||||
|
return "creative"
|
||||||
|
end
|
||||||
|
return player:get_meta():get_string("gamemode")
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.is_creative_enabled(name)
|
||||||
|
if mt_is_creative_enabled(name) then return true end
|
||||||
|
if not name then return false end
|
||||||
|
local p = minetest.get_player_by_name(name)
|
||||||
|
if p then
|
||||||
|
return p:get_meta():get_string("gamemode") == "creative"
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Insta "digging" nodes in gamemode-creative
|
||||||
|
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
|
||||||
|
if not puncher or not puncher:is_player() then return end
|
||||||
|
if minetest.is_creative_enabled() then return end
|
||||||
|
local name = puncher:get_player_name()
|
||||||
|
if not minetest.is_creative_enabled(name) then return end
|
||||||
|
if pointed_thing.type ~= "node" then return end
|
||||||
|
local def = minetest.registered_nodes[node.name]
|
||||||
|
if def then
|
||||||
|
if def.on_destruct then def.on_destruct(pos) end
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Don't subtract from inv when placing in gamemode-creative
|
||||||
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
|
||||||
|
if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_chatcommand("gamemode", {
|
||||||
|
params = S("[<gamemode>] [<player>]"),
|
||||||
|
description = S("Change gamemode (survival/creative) for yourself or player"),
|
||||||
|
privs = { server = true },
|
||||||
|
func = function(n, param)
|
||||||
|
-- Full input validation ( just for @erlehmann <3 )
|
||||||
|
local p = minetest.get_player_by_name(n)
|
||||||
|
local args = param:split(" ")
|
||||||
|
if args[2] ~= nil then
|
||||||
|
p = minetest.get_player_by_name(args[2])
|
||||||
|
end
|
||||||
|
if not p then
|
||||||
|
return false, S("Player not online")
|
||||||
|
end
|
||||||
|
if args[1] ~= nil and not in_table(args[1], gamemodes) then
|
||||||
|
return false, S("Gamemode " .. args[1] .. " does not exist.")
|
||||||
|
elseif args[1] ~= nil then
|
||||||
|
mcl_inventory.player_set_gamemode(p, args[1])
|
||||||
|
end
|
||||||
|
--Result message - show effective game mode
|
||||||
|
local gm = p:get_meta():get_string("gamemode")
|
||||||
|
if gm == "" then gm = gamemodes[1] end
|
||||||
|
return true, S("Gamemode for player ") .. n .. S(": " .. gm)
|
||||||
|
end
|
||||||
|
})
|
1
mods/PLAYER/mcl_gamemode/mod.conf
Normal file
1
mods/PLAYER/mcl_gamemode/mod.conf
Normal file
|
@ -0,0 +1 @@
|
||||||
|
name = mcl_gamemode
|
Loading…
Reference in a new issue