diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index bae19b339..c055f160a 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -212,6 +212,7 @@ core.register_entity(":__builtin:item", { end end + local nn = node and node.name or "" if nn == "default:lava_flowing" or nn == "default:lava_source" then minetest.sound_play("default_cool_lava", { pos=self.object:getpos(), diff --git a/games/default/files/3d_armor/armor.lua b/games/default/files/3d_armor/armor.lua index e0a52cb88..b3facfcd7 100644 --- a/games/default/files/3d_armor/armor.lua +++ b/games/default/files/3d_armor/armor.lua @@ -24,6 +24,31 @@ end local time = 0 +local armor_def = setmetatable({}, { + __index = function() + return setmetatable({ + groups = setmetatable({}, { + __index = function() + return 0 + end}) + }, { + __index = function() + return 0 + end + }) + end, +}) + +local armor_textures = setmetatable({}, { + __index = function() + return setmetatable({}, { + __index = function() + return "blank.png" + end + }) + end +}) + armor = { player_hp = {}, elements = {"head", "torso", "legs", "feet"}, @@ -33,7 +58,8 @@ armor = { .."list[current_player;main;0,4.5;8,4;]" .."list[current_player;craft;4,1;3,3;]" .."list[current_player;craftpreview;7,2;1,1;]",]] - textures = {}, + def = armor_def, + textures = armor_textures, default_skin = "character", } @@ -63,11 +89,6 @@ elseif unified_inventory then }) end]] -armor.def = { - state = 0, - count = 0, -} - armor.update_player_visuals = function(self, player) if not player then return @@ -87,11 +108,11 @@ armor.set_player_armor = function(self, player) return end local name = player:get_player_name() - local player_inv = player:get_inventory() + local armor_inv = self:get_armor_inventory(player) if not name then minetest.log("error", "Failed to read player name") return - elseif not player_inv then + elseif not armor_inv then minetest.log("error", "Failed to read player inventory") return end @@ -109,7 +130,7 @@ armor.set_player_armor = function(self, player) elements[v] = false end for i=1, 4 do - local stack = player_inv:get_stack("armor", i) + local stack = armor_inv:get_stack("armor", i) local item = stack:get_name() if stack:get_count() == 1 then local def = stack:get_definition() @@ -181,53 +202,39 @@ armor.update_armor = function(self, player) end local name = player:get_player_name() local hp = player:get_hp() or 0 - if hp == 0 or hp == self.player_hp[name] then + if hp == 0 then return end - if self.player_hp[name] > hp then - local player_inv = player:get_inventory() - local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) - if not player_inv then - minetest.log("error", "Failed to read player inventory") - return - elseif not armor_inv then - minetest.log("error", "Failed to read detached inventory") - return - end - local heal_max = 0 - local state = 0 - local items = 0 - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - if stack:get_count() > 0 then - local use = stack:get_definition().groups["armor_use"] or 0 - local heal = stack:get_definition().groups["armor_heal"] or 0 - local item = stack:get_name() - stack:add_wear(use) - armor_inv:set_stack("armor", i, stack) - player_inv:set_stack("armor", i, stack) - state = state + stack:get_wear() - items = items + 1 - if stack:get_count() == 0 then - local desc = minetest.registered_items[item].description - if desc then - minetest.chat_send_player(name, "Your "..desc.." got destroyed!") - end - self:set_player_armor(player) - armor:update_inventory(player) + + local armor_inv = self:get_armor_inventory(player) + if not armor_inv then + minetest.log("error", "Failed to read detached inventory") + return + end + local state = 0 + local items = 0 + for i=1, 4 do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + local use = stack:get_definition().groups["armor_use"] or 0 + local item = stack:get_name() + stack:add_wear(use) + armor_inv:set_stack("armor", i, stack) + state = state + stack:get_wear() + items = items + 1 + if stack:get_count() == 0 then + local desc = minetest.registered_items[item].description + if desc then + minetest.chat_send_player(name, "Your "..desc.." got destroyed!") end - heal_max = heal_max + heal + self:set_player_armor(player) + armor:update_inventory(player) end end - self.def[name].state = state - self.def[name].count = items - heal_max = heal_max * ARMOR_HEAL_MULTIPLIER - if heal_max > math.random(100) then - player:set_hp(self.player_hp[name]) - return - end end - self.player_hp[name] = hp + self:save_armor_inventory(player) + self.def[name].state = state + self.def[name].count = items end armor.get_player_skin = function(self, name) @@ -265,6 +272,51 @@ end end end end]] +armor.update_inventory = function(self, player) end + +armor.get_armor_inventory = function(self, player) + local name = player:get_player_name() + if name then + return minetest.get_inventory({type="detached", name=name.."_armor"}) + end +end + +armor.serialize_inventory_list = function(self, list) + local list_table = {} + for _, stack in ipairs(list) do + table.insert(list_table, stack:to_string()) + end + return minetest.serialize(list_table) +end + +armor.deserialize_inventory_list = function(self, list_string) + local list_table = minetest.deserialize(list_string) + local list = {} + for _, stack in ipairs(list_table or {}) do + table.insert(list, ItemStack(stack)) + end + return list +end + +armor.load_armor_inventory = function(self, player) + local inv = self:get_armor_inventory(player) + if inv then + local armor_list_string = player:get_attribute("3d_armor_inventory") + if armor_list_string then + inv:set_list("armor", + self:deserialize_inventory_list(armor_list_string)) + return true + end + end +end + +armor.save_armor_inventory = function(self, player) + local inv = self:get_armor_inventory(player) + if inv then + player:set_attribute("3d_armor_inventory", + self:serialize_inventory_list(inv:get_list("armor"))) + end +end -- Register Player Model @@ -308,7 +360,6 @@ end) minetest.register_on_joinplayer(function(player) player_api.set_model(player, "3d_armor_character.b3d") local name = player:get_player_name() - local player_inv = player:get_inventory() local armor_inv = minetest.create_detached_inventory(name.."_armor",{ allow_put = function(inv, listname, index, stack, player) local item = stack:get_name() @@ -337,20 +388,17 @@ minetest.register_on_joinplayer(function(player) return 0 end, on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, stack) + armor:save_armor_inventory(player) armor:set_player_armor(player) --armor:update_inventory(player) end, on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, nil) + armor:save_armor_inventory(player) armor:set_player_armor(player) --armor:update_inventory(player) end, on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - local plaver_inv = player:get_inventory() - local stack = inv:get_stack(to_list, to_index) - player_inv:set_stack(to_list, to_index, stack) - player_inv:set_stack(from_list, from_index, nil) + armor:save_armor_inventory(player) armor:set_player_armor(player) --armor:update_inventory(player) end, @@ -364,19 +412,20 @@ minetest.register_on_joinplayer(function(player) --[[if inventory_plus then inventory_plus.register_button(player,"armor", "Armor") end]] - armor_inv:set_size("armor", 4) - player_inv:set_size("armor", 4) - for i=1, 4 do - local stack = player_inv:get_stack("armor", i) - armor_inv:set_stack("armor", i, stack) - end - -- Legacy support, import player's armor from old inventory format - for _,v in pairs(armor.elements) do - local list = "armor_"..v - armor_inv:add_item("armor", player_inv:get_stack(list, 1)) - player_inv:set_stack(list, 1, nil) - end + armor_inv:set_size("armor", 4) + if not armor:load_armor_inventory(player) then + local player_inv = player:get_inventory() + if player_inv then + player_inv:set_size("armor", 4) + for i=1, 4 do + local stack = player_inv:get_stack("armor", i) + armor_inv:set_stack("armor", i, stack) + end + player_inv:set_size("armor", 0) + end + armor:save_armor_inventory(player) + end armor.player_hp[name] = 0 armor.def[name] = { @@ -434,17 +483,18 @@ if ARMOR_DROP == true or ARMOR_DESTROY == true then local pos = player:get_pos() if name and pos then local drop = {} - local player_inv = player:get_inventory() - local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) - for i=1, player_inv:get_size("armor") do - local stack = armor_inv:get_stack("armor", i) - if stack:get_count() > 0 then - table.insert(drop, stack) - armor_inv:set_stack("armor", i, nil) - player_inv:set_stack("armor", i, nil) - end - end - armor:set_player_armor(player) + local armor_inv = self:get_armor_inventory(player) + if armor_inv then + for i=1, armor_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + table.insert(drop, stack) + armor_inv:set_stack("armor", i, nil) + end + end + end + armor:save_armor_inventory(player) + armor:set_player_armor(player) --[[if unified_inventory then unified_inventory.set_inventory_formspec(player, "craft") elseif inventory_plus then @@ -492,13 +542,16 @@ if ARMOR_DROP == true or ARMOR_DESTROY == true then end) end -minetest.register_globalstep(function(dtime) - time = time + dtime - if time > ARMOR_UPDATE_TIME then - for _,player in ipairs(minetest.get_connected_players()) do - armor:update_armor(player) - end - time = 0 - end +minetest.register_on_player_hpchange(function(player, hp_change) + if player and hp_change < 0 then + local name = player:get_player_name() + if name then + if armor.def[name].heal > math.random(100) then + hp_change = 0 + end + end + armor:update_armor(player) + end + return hp_change end) diff --git a/games/default/files/creative/inventory.lua b/games/default/files/creative/inventory.lua index b48e68766..996185d96 100644 --- a/games/default/files/creative/inventory.lua +++ b/games/default/files/creative/inventory.lua @@ -31,22 +31,18 @@ hoch["brew"] = "^[transformfy" hoch["matr"] = "^[transformfy" hoch["inv"] = "^[transformfy" -local dark_bg = "creative_bg_dark.png" - -local function reset_menu_item_bg() - bg["blocks"] = dark_bg - bg["deco"] = dark_bg - bg["mese"] = dark_bg - bg["rail"] = dark_bg - bg["misc"] = dark_bg - bg["all"] = 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 +bg["blocks"] = "default_grass_side.png" +bg["deco"] = "creative_deko.png" +bg["mese"] = "creative_mese.png" +bg["rail"] = "boats_inventory.png" +bg["misc"] = "bucket_water.png" +bg["all"] = "creative_all.png" +bg["food"] = "creative_food.png" +bg["tools"] = "creative_tool.png" +bg["combat"] = "creative_sword.png" +bg["brew"] = "creative_brew.png" +bg["matr"] = "default_emerald.png" +bg["inv"] = "creative_inv.png" local function get_item_list(group) local item_list = {} @@ -152,7 +148,6 @@ trash:set_size("main", 1) creative.formspec_add = "" local function get_creative_formspec(player_name, start_i, pagenum, page, pagemax) - reset_menu_item_bg() pagenum = math.floor(pagenum) or 1 local slider_height = 4 / pagemax local slider_pos = slider_height * (pagenum - 1) + 2.2 @@ -161,7 +156,6 @@ local function get_creative_formspec(player_name, start_i, pagenum, page, pagema ";main;0,1.75;9,5;"..tostring(start_i).."]" local name = "all" if page ~= nil then name = page end - bg[name] = "creative_bg.png" if name == "inv" then main_list = "image[-0.2,1.7;11.35,2.33;creative_bg.png]".. "image[-0.3,0.15;3,4.3;inventory_armor.png]".. @@ -176,24 +170,25 @@ local function get_creative_formspec(player_name, start_i, pagenum, page, pagema "bgcolor[#080808BB;true]".. "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]".. "label[-5,-5;"..name.."]".. - "image[" .. offset[name] .. ";1.5,1.44;creative_active.png"..hoch[name].."]".. - "image_button[-0.1,0;1,1;"..bg["blocks"].."^default_grass_side.png;build;]".. --build blocks - "image_button[1.15,0;1,1;"..bg["deco"].."^creative_deko.png;deco;]".. --decoration blocks - "image_button[2.415,0;1,1;"..bg["mese"].."^creative_mese.png;mese;]".. --bluestone - "image_button[3.693,0;1,1;"..bg["rail"].."^boats_inventory.png;rail;]".. --transportation - "image_button[4.93,0;1,1;"..bg["misc"].."^bucket_water.png;misc;]".. --miscellaneous - "image_button[9.19,0;1,1;"..bg["all"].."^creative_all.png;default;]".. --search + "image[" .. offset[name] .. ";1.5,1.44;creative_active.png"..hoch[name].. + "^[combine:107x98:21,17="..bg[name].."]".. + "image_button[-0.1,0;1,1;"..bg["blocks"]..";build;;;false]".. --build blocks + "image_button[1.15,0;1,1;"..bg["deco"]..";deco;;;false]".. --decoration blocks + "image_button[2.415,0;1,1;"..bg["mese"]..";mese;;;false]".. --bluestone + "image_button[3.693,0;1,1;"..bg["rail"]..";rail;;;false]".. --transportation + "image_button[4.93,0;1,1;"..bg["misc"]..";misc;;;false]".. --miscellaneous + "image_button[9.19,0;1,1;"..bg["all"]..";default;;;false]".. --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;creative_up.png;creative_prev;]".. "image_button[9.03,6.15;0.85,0.6;creative_down.png;creative_next;]".. - "image_button[-0.1,8.28;1,1;"..bg["food"].."^creative_food.png;food;]".. --foodstuff - "image_button[1.15,8.28;1,1;"..bg["tools"].."^creative_tool.png;tools;]".. --tools - "image_button[2.415,8.28;1,1;"..bg["combat"].."^creative_sword.png;combat;]".. --combat - "image_button[3.693,8.28;1,1;"..bg["matr"].."^default_emerald.png;matr;]".. --brewing - "image_button[4.93,8.28;1,1;"..bg["brew"].."^creative_brew.png;brew;]".. --materials - "image_button[9.19,8.28;1,1;"..bg["inv"].."^creative_inv.png;inv;]".. --inventory + "image_button[-0.1,8.28;1,1;"..bg["food"]..";food;;;false]".. --foodstuff + "image_button[1.15,8.28;1,1;"..bg["tools"]..";tools;;;false]".. --tools + "image_button[2.415,8.28;1,1;"..bg["combat"]..";combat;;;false]".. --combat + "image_button[3.693,8.28;1,1;"..bg["matr"]..";matr;;;false]".. --brewing + "image_button[4.93,8.28;1,1;"..bg["brew"]..";brew;;;false]".. --materials + "image_button[9.19,8.28;1,1;"..bg["inv"]..";inv;;;false]".. --inventory "list[detached:creative_trash;main;9.02,7.02;1,1;]".. "image[9.04," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";creative_slider.png]" @@ -235,6 +230,7 @@ function creative.register_tab(name, title, items) local player_name = player:get_player_name() local inv = player_inventory[player_name] assert(inv) + inv.filter = "" if fields.build then sfinv.set_page(player, "creative:blocks") diff --git a/games/default/files/creative/textures/creative_bg_dark.png b/games/default/files/creative/textures/creative_bg_dark.png deleted file mode 100644 index bda61b56f..000000000 Binary files a/games/default/files/creative/textures/creative_bg_dark.png and /dev/null differ diff --git a/games/default/files/default/nodes.lua b/games/default/files/default/nodes.lua index 0765fd283..117ce3d6e 100644 --- a/games/default/files/default/nodes.lua +++ b/games/default/files/default/nodes.lua @@ -1185,12 +1185,7 @@ minetest.register_node("default:chest", { "list[current_player;main;0,10.5;9,1;]") m:set_string("infotext", "Large Chest") else - meta:set_string("formspec", - "size[9,8.5]".. - "image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]".. - "list[current_name;main;0,0;9,3;]".. - "list[current_player;main;0,4;9,3;9]".. - "list[current_player;main;0,7.5.5;9,1;]") + meta:set_string("formspec", default.chest_formspec) meta:set_string("infotext", "Chest") end local inv = meta:get_inventory() diff --git a/games/default/files/inventory/init.lua b/games/default/files/inventory/init.lua index 394dba46c..40f64814c 100644 --- a/games/default/files/inventory/init.lua +++ b/games/default/files/inventory/init.lua @@ -28,6 +28,13 @@ local function drop_fields(player, name) end end +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + if inv then + inv:set_size("main", 9*4) + end +end) + sfinv.override_page("sfinv:inventory", { title = "Inventory", get = function(self, player, context) diff --git a/src/constants.h b/src/constants.h index de59b8531..80c3e3198 100644 --- a/src/constants.h +++ b/src/constants.h @@ -85,7 +85,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ // Size of player's main inventory -#define PLAYER_INVENTORY_SIZE (8 * 4) +#define PLAYER_INVENTORY_SIZE (9 * 4) // Maximum hit points of a player #define PLAYER_MAX_HP 20