Added the possibility to wear the armor on rightclick (#16)

* Added the possibility to wear the armor on rightclick
* Added equip, unequip and get_weared_armor_elements functions

Co-authored-by: Giov4 <brancacciogiovanni1@gmail.com>
This commit is contained in:
Giov4 2020-09-22 07:45:39 +02:00 committed by GitHub
parent 9459400474
commit 294338d3b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 3 deletions

@ -164,6 +164,14 @@ armor:remove_all(player)
Removes all armors from the player's inventory without triggering any callback. Removes all armors from the player's inventory without triggering any callback.
armor:equip(player, armor_name)
Equip the armor, removing the itemstack from the main inventory if there's one.
armor:unequip(player, armor_name)
Unequip the armor, adding the itemstack to the main inventory.
Item Callbacks: Item Callbacks:
on_equip = func(player, index, stack) on_equip = func(player, index, stack)

@ -103,7 +103,25 @@ armor.config = {
-- Armor Registration -- Armor Registration
armor.register_armor = function(self, name, def) armor.register_armor = function(self, name, def)
minetest.register_tool(name, def) local wear_on_rightclick = {
on_secondary_use = function(itemstack, player)
armor:equip(player, itemstack:get_name())
end,
on_place = function(itemstack, player)
armor:equip(player, itemstack:get_name())
end
}
local function merge_tables(a, b)
if type(a) == 'table' and type(b) == 'table' then
for k,v in pairs(b) do
if type(v)=='table' and type(a[k] or false)=='table' then
merge_tables(a[k],v) else a[k]=v
end
end
end
return a
end
minetest.register_tool(name, merge_tables(def, wear_on_rightclick))
end end
armor.register_armor_group = function(self, group, base) armor.register_armor_group = function(self, group, base)
@ -406,12 +424,64 @@ armor.damage = function(self, player, index, stack, use)
end end
end end
armor.get_weared_armor_elements = function(self, player)
local name, inv = self:get_valid_player(player, "[get_weared_armor]")
local weared_armor = {}
if not name then
return
end
for i=1, inv:get_size("armor") do
local item_name = inv:get_stack("armor", i):get_name()
local element = self:get_element(item_name)
if element ~= nil then
weared_armor[element] = item_name
end
end
return weared_armor
end
armor.equip = function(self, player, armor_name)
local name, inv = self:get_valid_player(player, "[equip]")
local weared_armor = self:get_weared_armor_elements(player)
local armor_element = self:get_element(armor_name)
if not name then
return
elseif self:get_element(armor_name) == nil then
return
elseif inv:contains_item("armor", ItemStack(armor_name)) then
return
end
if weared_armor[armor_element] ~= nil then
self:unequip(player, weared_armor[armor_element])
end
inv:add_item("armor", ItemStack(armor_name))
minetest.after(0, function() player:get_inventory():remove_item("main", ItemStack(armor_name)) end)
self:set_player_armor(player)
self:save_armor_inventory(player)
end
armor.unequip = function(self, player, armor_name)
local name, inv = self:get_valid_player(player, "[unequip]")
if not name then
return
elseif self:get_element(armor_name) == nil then
return
elseif not inv:contains_item("armor", ItemStack(armor_name)) then
return
end
inv:remove_item("armor", ItemStack(armor_name))
minetest.after(0, function() player:get_inventory():add_item("main", ItemStack(armor_name)) end)
self:set_player_armor(player)
self:save_armor_inventory(player)
self:save_armor_inventory(player)
end
armor.remove_all = function(self, player) armor.remove_all = function(self, player)
local name, armor_inv = self:get_valid_player(player, "[remove_all]") local name, inv = self:get_valid_player(player, "[remove_all]")
if not name then if not name then
return return
end end
armor_inv:set_list("armor", {}) inv:set_list("armor", {})
self:set_player_armor(player) self:set_player_armor(player)
self:save_armor_inventory(player) self:save_armor_inventory(player)
end end