diff --git a/3d_armor/armor.lua b/3d_armor/armor.lua index f382ed9..b39c0b4 100644 --- a/3d_armor/armor.lua +++ b/3d_armor/armor.lua @@ -9,17 +9,40 @@ armor = { player_hp = {}, elements = {"head", "torso", "legs", "feet"}, physics = {"jump","speed","gravity"}, - formspec = "size[8,8.5]button[0,0;2,0.5;main;Back]" - .."list[current_player;main;0,4.5;8,4;]" - .."list[detached:player_name_armor;armor_head;3,0;1,1;]" - .."list[detached:player_name_armor;armor_torso;3,1;1,1;]" - .."list[detached:player_name_armor;armor_legs;3,2;1,1;]" - .."list[detached:player_name_armor;armor_feet;3,3;1,1;]", + formspec = "size[8,8.5]list[detached:player_name_armor;armor;0,1;2,3;]" + .."image[2,0.75;2,4;armor_preview]" + .."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 = {}, - default_skin = "character.png", + default_skin = "character", } --- armor.def - Added by BlockMen for HUD integration +if inventory_plus then + armor.formspec = "size[8,8.5]button[0,0;2,0.5;main;Back]" + .."list[detached:player_name_armor;armor;0,1;2,3;]" + .."image[2.5,0.75;2,4;armor_preview]" + .."label[5,1;Level: armor_level]" + .."label[5,1.5;Heal: armor_heal]" + .."list[current_player;main;0,4.5;8,4;]" +elseif unified_inventory then + unified_inventory.register_button("armor", { + type = "image", + image = "inventory_plus_armor.png", + }) + unified_inventory.register_page("armor", { + get_formspec = function(player) + local name = player:get_player_name() + local formspec = "background[0.06,0.99;7.92,7.52;3d_armor_ui_form.png]" + .."label[0,0;Armor]" + .."list[detached:"..name.."_armor;armor;0,1;2,3;]" + .."image[2.5,0.75;2,4;"..armor.textures[name].preview.."]" + .."label[5,1;Level: "..armor.def[name].level.."]" + .."label[5,1.5;Heal: "..armor.def[name].heal.."]" + return {formspec=formspec} + end, + }) +end armor.def = { state = 0, @@ -48,40 +71,58 @@ armor.set_player_armor = function(self, player) local player_inv = player:get_inventory() local armor_texture = "3d_armor_trans.png" local armor_level = 0 + local armor_heal = 0 local state = 0 local items = 0 + local elements = {} local textures = {} - local elements = {} local physics_o = {speed=1,gravity=1,jump=1} - for i, v in ipairs(self.elements) do - local stack = player_inv:get_stack("armor_"..v, 1) - local level = stack:get_definition().groups["armor_"..v] + local material = {type=nil, count=1} + local preview = armor:get_player_skin(name).."_preview.png" + for _,v in ipairs(self.elements) do + elements[v] = false + end + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) local item = stack:get_name() - elements[i] = string.match(item, "%:.+_(.+)$") - if level then - table.insert(textures, item:gsub("%:", "_")..".png") - armor_level = armor_level + level - state = state + stack:get_wear() - items = items + 1 - end - - for kk,vv in ipairs(self.physics) do - local o_value = stack:get_definition().groups["physics_"..vv] - if ( o_value ~= nil ) then - physics_o[vv] = physics_o[vv] + o_value + if stack:get_count() == 1 then + local def = stack:get_definition() + for k, v in pairs(elements) do + if v == false then + local level = def.groups["armor_"..k] + if level then + local texture = item:gsub("%:", "_") + table.insert(textures, texture..".png") + preview = preview.."^"..texture.."_preview.png" + armor_level = armor_level + level + state = state + stack:get_wear() + items = items + 1 + local heal = def.groups["armor_heal"] or 0 + armor_heal = armor_heal + heal + for kk,vv in ipairs(self.physics) do + local o_value = def.groups["physics_"..vv] + if o_value then + physics_o[vv] = physics_o[vv] + o_value + end + end + local mat = string.match(item, "%:.+_(.+)$") + if material.type then + if material.type == mat then + material.count = material.count + 1 + end + else + material.type = mat + end + elements[k] = true + end + end end end - end - - player:set_physics_override(physics_o) - if minetest.get_modpath("shields") then armor_level = armor_level * 0.9 end - if elements[1] == elements[2] and - elements[1] == elements[3] and - elements[1] == elements[4] then + if material.type and material.count == #self.elements then armor_level = armor_level * 1.1 end if #textures > 0 then @@ -93,9 +134,13 @@ armor.set_player_armor = function(self, player) armor_groups.fleshy = 100 - armor_level end player:set_armor_groups(armor_groups) + player:set_physics_override(physics_o) self.textures[name].armor = armor_texture + self.textures[name].preview = preview self.def[name].state = state self.def[name].count = items + self.def[name].level = armor_level + self.def[name].heal = armor_heal self:update_player_visuals(player) end @@ -117,15 +162,15 @@ armor.update_armor = function(self, player) local heal_max = 0 local state = 0 local items = 0 - for _,v in ipairs(self.elements) do - local stack = armor_inv:get_stack("armor_"..v, 1) + 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_"..v, 1, stack) - player_inv:set_stack("armor_"..v, 1, stack) + 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 @@ -148,6 +193,33 @@ armor.update_armor = function(self, player) self.player_hp[name] = hp end +armor.get_player_skin = function(self, name) + local skin = nil + if skins then + skin = skins.skins[name] + elseif u_skins then + skin = u_skins.u_skins[name] + end + return skin or armor.default_skin +end + +armor.update_inventory = function(self, player) + local name = player:get_player_name() + if unified_inventory then + unified_inventory.set_inventory_formspec(player, "armor") + elseif inventory_plus then + local formspec = armor.formspec:gsub("player_name", name) + formspec = formspec:gsub("armor_preview", armor.textures[name].preview) + formspec = formspec:gsub("armor_level", armor.def[name].level) + formspec = formspec:gsub("armor_heal", armor.def[name].heal) + inventory_plus.set_inventory_formspec(player, formspec) + else + local formspec = armor.formspec:gsub("player_name", name) + formspec = formspec:gsub("armor_preview", armor.textures[name].preview) + player:set_inventory_formspec(formspec) + end +end + -- Register Player Model default.player_register_model("3d_armor_character.x", { @@ -172,15 +244,15 @@ default.player_register_model("3d_armor_character.x", { minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() if fields.armor then - local formspec = armor.formspec:gsub("player_name", name) - inventory_plus.set_inventory_formspec(player, formspec) + armor:update_inventory(player) return end for field, _ in pairs(fields) do - if string.find(field, "^skins_set_") then + if string.find(field, "skins_set_") then minetest.after(0, function(player) - armor.textures[name].skin = skins.skins[name]..".png" - armor:update_player_visuals(player) + local skin = armor:get_player_skin(name) + armor.textures[name].skin = skin..".png" + armor:set_player_armor(player) end, player) end end @@ -188,52 +260,77 @@ end) minetest.register_on_joinplayer(function(player) default.player_set_model(player, "3d_armor_character.x") - inventory_plus.register_button(player,"armor", "Armor") - local player_inv = player:get_inventory() local name = player:get_player_name() + local player_inv = player:get_inventory() local armor_inv = minetest.create_detached_inventory(name.."_armor",{ on_put = function(inv, listname, index, stack, player) player:get_inventory():set_stack(listname, index, stack) 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: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:set_player_armor(player) + armor:update_inventory(player) end, allow_put = function(inv, listname, index, stack, player) - if inv:is_empty(listname) then - return 1 - end - return 0 + return 1 end, allow_take = function(inv, listname, index, stack, player) return stack:get_count() end, allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - return 0 + return count end, }) - for _,v in ipairs(armor.elements) do - local list = "armor_"..v - player_inv:set_size(list, 1) - armor_inv:set_size(list, 1) - armor_inv:set_stack(list, 1, player_inv:get_stack(list, 1)) + if inventory_plus then + inventory_plus.register_button(player,"armor", "Armor") end + armor_inv:set_size("armor", 6) + player_inv:set_size("armor", 6) + for i=1, 6 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.player_hp[name] = 0 armor.def[name] = { state = 0, count = 0, + level = 0, + heal = 0, } armor.textures[name] = { - skin = armor.default_skin, + skin = armor.default_skin..".png", armor = "3d_armor_trans.png", wielditem = "3d_armor_trans.png", + preview = armor.default_skin.."_preview.png", } if minetest.get_modpath("skins") then local skin = skins.skins[name] if skin and skins.get_type(skin) == skins.type.MODEL then armor.textures[name].skin = skin..".png" end + elseif minetest.get_modpath("u_skins") then + local skin = u_skins.u_skins[name] + if skin and u_skins.get_type(skin) == u_skins.type.MODEL then + armor.textures[name].skin = skin..".png" + end end if minetest.get_modpath("player_textures") then local filename = minetest.get_modpath("player_textures").."/textures/player_"..name @@ -245,6 +342,9 @@ minetest.register_on_joinplayer(function(player) end minetest.after(1, function(player) armor:set_player_armor(player) + if inventory_plus == nil and unified_inventory == nil then + armor:update_inventory(player) + end end, player) end) @@ -257,11 +357,11 @@ if minetest.get_modpath("bones") then local drop = {} local player_inv = player:get_inventory() local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) - for _,v in ipairs(armor.elements) do - local list = "armor_"..v - table.insert(drop, player_inv:get_stack(list, 1)) - armor_inv:set_stack(list, 1, nil) - player_inv:set_stack(list, 1, nil) + for i=1, player_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + table.insert(drop, stack) + armor_inv:set_stack("armor", i, nil) + player_inv:set_stack("armor", i, nil) end armor:set_player_armor(player) minetest.after(1, function() --TODO: Make delay configurable @@ -271,9 +371,9 @@ if minetest.get_modpath("bones") then local owner = meta:get_string("owner") local inv = meta:get_inventory() if name == owner then - for _,list in ipairs(drop) do - if inv:room_for_item("main", list) then - inv:add_item("main", list) + for _,stack in ipairs(drop) do + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) end end end diff --git a/3d_armor/depends.txt b/3d_armor/depends.txt index 5a6e76d..525e69c 100644 --- a/3d_armor/depends.txt +++ b/3d_armor/depends.txt @@ -1,3 +1,4 @@ default -inventory_plus +inventory_plus? +unified_inventory? diff --git a/3d_armor/textures/3d_armor_boots_bronze_preview.png b/3d_armor/textures/3d_armor_boots_bronze_preview.png new file mode 100644 index 0000000..eba8879 Binary files /dev/null and b/3d_armor/textures/3d_armor_boots_bronze_preview.png differ diff --git a/3d_armor/textures/3d_armor_boots_diamond_preview.png b/3d_armor/textures/3d_armor_boots_diamond_preview.png new file mode 100644 index 0000000..bd9fc7c Binary files /dev/null and b/3d_armor/textures/3d_armor_boots_diamond_preview.png differ diff --git a/3d_armor/textures/3d_armor_boots_mithril_preview.png b/3d_armor/textures/3d_armor_boots_mithril_preview.png new file mode 100644 index 0000000..f7ded16 Binary files /dev/null and b/3d_armor/textures/3d_armor_boots_mithril_preview.png differ diff --git a/3d_armor/textures/3d_armor_boots_steel_preview.png b/3d_armor/textures/3d_armor_boots_steel_preview.png new file mode 100644 index 0000000..a8a4d6a Binary files /dev/null and b/3d_armor/textures/3d_armor_boots_steel_preview.png differ diff --git a/3d_armor/textures/3d_armor_boots_wood_preview.png b/3d_armor/textures/3d_armor_boots_wood_preview.png new file mode 100644 index 0000000..357e72b Binary files /dev/null and b/3d_armor/textures/3d_armor_boots_wood_preview.png differ diff --git a/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/3d_armor/textures/3d_armor_chestplate_bronze_preview.png new file mode 100644 index 0000000..08ed599 Binary files /dev/null and b/3d_armor/textures/3d_armor_chestplate_bronze_preview.png differ diff --git a/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/3d_armor/textures/3d_armor_chestplate_diamond_preview.png new file mode 100644 index 0000000..6a78608 Binary files /dev/null and b/3d_armor/textures/3d_armor_chestplate_diamond_preview.png differ diff --git a/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/3d_armor/textures/3d_armor_chestplate_mithril_preview.png new file mode 100644 index 0000000..ac83eec Binary files /dev/null and b/3d_armor/textures/3d_armor_chestplate_mithril_preview.png differ diff --git a/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/3d_armor/textures/3d_armor_chestplate_steel_preview.png new file mode 100644 index 0000000..a33c2b4 Binary files /dev/null and b/3d_armor/textures/3d_armor_chestplate_steel_preview.png differ diff --git a/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/3d_armor/textures/3d_armor_chestplate_wood_preview.png new file mode 100644 index 0000000..218a5ae Binary files /dev/null and b/3d_armor/textures/3d_armor_chestplate_wood_preview.png differ diff --git a/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/3d_armor/textures/3d_armor_helmet_bronze_preview.png new file mode 100644 index 0000000..f79b966 Binary files /dev/null and b/3d_armor/textures/3d_armor_helmet_bronze_preview.png differ diff --git a/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/3d_armor/textures/3d_armor_helmet_diamond_preview.png new file mode 100644 index 0000000..537bac5 Binary files /dev/null and b/3d_armor/textures/3d_armor_helmet_diamond_preview.png differ diff --git a/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/3d_armor/textures/3d_armor_helmet_mithril_preview.png new file mode 100644 index 0000000..713a9fe Binary files /dev/null and b/3d_armor/textures/3d_armor_helmet_mithril_preview.png differ diff --git a/3d_armor/textures/3d_armor_helmet_steel_preview.png b/3d_armor/textures/3d_armor_helmet_steel_preview.png new file mode 100644 index 0000000..4a91205 Binary files /dev/null and b/3d_armor/textures/3d_armor_helmet_steel_preview.png differ diff --git a/3d_armor/textures/3d_armor_helmet_wood_preview.png b/3d_armor/textures/3d_armor_helmet_wood_preview.png new file mode 100644 index 0000000..5730372 Binary files /dev/null and b/3d_armor/textures/3d_armor_helmet_wood_preview.png differ diff --git a/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/3d_armor/textures/3d_armor_leggings_bronze_preview.png new file mode 100644 index 0000000..e755a01 Binary files /dev/null and b/3d_armor/textures/3d_armor_leggings_bronze_preview.png differ diff --git a/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/3d_armor/textures/3d_armor_leggings_diamond_preview.png new file mode 100644 index 0000000..d91b31b Binary files /dev/null and b/3d_armor/textures/3d_armor_leggings_diamond_preview.png differ diff --git a/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/3d_armor/textures/3d_armor_leggings_mithril_preview.png new file mode 100644 index 0000000..6b936f6 Binary files /dev/null and b/3d_armor/textures/3d_armor_leggings_mithril_preview.png differ diff --git a/3d_armor/textures/3d_armor_leggings_steel_preview.png b/3d_armor/textures/3d_armor_leggings_steel_preview.png new file mode 100644 index 0000000..d0565d6 Binary files /dev/null and b/3d_armor/textures/3d_armor_leggings_steel_preview.png differ diff --git a/3d_armor/textures/3d_armor_leggings_wood_preview.png b/3d_armor/textures/3d_armor_leggings_wood_preview.png new file mode 100644 index 0000000..792ae35 Binary files /dev/null and b/3d_armor/textures/3d_armor_leggings_wood_preview.png differ diff --git a/3d_armor/textures/3d_armor_ui_form.png b/3d_armor/textures/3d_armor_ui_form.png new file mode 100644 index 0000000..fe20f05 Binary files /dev/null and b/3d_armor/textures/3d_armor_ui_form.png differ diff --git a/3d_armor/textures/character_preview.png b/3d_armor/textures/character_preview.png new file mode 100644 index 0000000..76f6bfd Binary files /dev/null and b/3d_armor/textures/character_preview.png differ diff --git a/README.md b/README.md index 32c173b..8a3bb2d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@ Modpack - 3d Armor [0.4.1] [mod] Visible Player Armor [3d_armor] ------------------------------------- -depends: default, inventory_plus +depends: default + +recommends: inventory_plus or unified_inventory (use only one) Adds craftable armor that is visible to other players. Each armor item worn contributes to a player's armor group level making them less vulnerable to weapons. diff --git a/shields/init.lua b/shields/init.lua index f7845a3..ff59b4b 100644 --- a/shields/init.lua +++ b/shields/init.lua @@ -63,12 +63,6 @@ end minetest.after(0, function() table.insert(armor.elements, "shield") - armor.formspec = "size[8,8.5]button[0,0;2,0.5;main;Back]" - .."list[current_player;main;0,4.5;8,4;]" - .."list[detached:player_name_armor;armor_head;3,0;1,1;]" - .."list[detached:player_name_armor;armor_torso;3,1;1,1;]" - .."list[detached:player_name_armor;armor_legs;3,2;1,1;]" - .."list[detached:player_name_armor;armor_feet;3,3;1,1;]" - .."list[detached:player_name_armor;armor_shield;4,1;1,1;]" end) + diff --git a/shields/textures/shields_shield_bronze_preview.png b/shields/textures/shields_shield_bronze_preview.png new file mode 100644 index 0000000..f0d1326 Binary files /dev/null and b/shields/textures/shields_shield_bronze_preview.png differ diff --git a/shields/textures/shields_shield_diamond_preview.png b/shields/textures/shields_shield_diamond_preview.png new file mode 100644 index 0000000..d67f484 Binary files /dev/null and b/shields/textures/shields_shield_diamond_preview.png differ diff --git a/shields/textures/shields_shield_mithril_preview.png b/shields/textures/shields_shield_mithril_preview.png new file mode 100644 index 0000000..d63df6d Binary files /dev/null and b/shields/textures/shields_shield_mithril_preview.png differ diff --git a/shields/textures/shields_shield_steel_preview.png b/shields/textures/shields_shield_steel_preview.png new file mode 100644 index 0000000..fcd2b64 Binary files /dev/null and b/shields/textures/shields_shield_steel_preview.png differ diff --git a/shields/textures/shields_shield_wood_preview.png b/shields/textures/shields_shield_wood_preview.png new file mode 100644 index 0000000..d8484d9 Binary files /dev/null and b/shields/textures/shields_shield_wood_preview.png differ