Implement formspec-free armor stand usage
- Rightclick with armor to place armor - Rightclick with bare hands to take first armor from up to down
This commit is contained in:
parent
fd053e5c0b
commit
14c620e81d
|
@ -1,15 +1,3 @@
|
||||||
local armor_stand_formspec = "size[8,7]" ..
|
|
||||||
"list[current_name;armor_head;3,0.5;1,1;]" ..
|
|
||||||
"list[current_name;armor_torso;4,0.5;1,1;]" ..
|
|
||||||
"list[current_name;armor_legs;3,1.5;1,1;]" ..
|
|
||||||
"list[current_name;armor_feet;4,1.5;1,1;]" ..
|
|
||||||
"image[3,0.5;1,1;3d_armor_stand_head.png]" ..
|
|
||||||
"image[4,0.5;1,1;3d_armor_stand_torso.png]" ..
|
|
||||||
"image[3,1.5;1,1;3d_armor_stand_legs.png]" ..
|
|
||||||
"image[4,1.5;1,1;3d_armor_stand_feet.png]" ..
|
|
||||||
"list[current_player;main;0,3;8,1;]" ..
|
|
||||||
"list[current_player;main;0,4.25;8,3;8]"
|
|
||||||
|
|
||||||
local elements = {"head", "torso", "legs", "feet"}
|
local elements = {"head", "torso", "legs", "feet"}
|
||||||
|
|
||||||
local function get_stand_object(pos)
|
local function get_stand_object(pos)
|
||||||
|
@ -98,7 +86,6 @@ minetest.register_node("3d_armor_stand:armor_stand", {
|
||||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
meta:set_string("formspec", armor_stand_formspec)
|
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
for _, element in pairs(elements) do
|
for _, element in pairs(elements) do
|
||||||
inv:set_size("armor_"..element, 1)
|
inv:set_size("armor_"..element, 1)
|
||||||
|
@ -114,6 +101,46 @@ minetest.register_node("3d_armor_stand:armor_stand", {
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
|
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||||
|
-- Check if player wields armor
|
||||||
|
local name = itemstack:get_name()
|
||||||
|
local list
|
||||||
|
for e=1, #elements do
|
||||||
|
local g = minetest.get_item_group(name, "armor_" .. elements[e])
|
||||||
|
if g ~= nil and g ~= 0 then
|
||||||
|
list = "armor_" .. elements[e]
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- If player wields armor, put it on armor stand
|
||||||
|
local inv = minetest.get_inventory({type = "node", pos = pos})
|
||||||
|
local wielditem = clicker:get_wielded_item()
|
||||||
|
if not inv then return end
|
||||||
|
if list then
|
||||||
|
if inv:room_for_item(list, itemstack) then
|
||||||
|
inv:add_item(list, itemstack)
|
||||||
|
update_entity(pos)
|
||||||
|
itemstack:take_item()
|
||||||
|
end
|
||||||
|
return itemstack
|
||||||
|
elseif wielditem:get_name() == "" then
|
||||||
|
-- If player does not wield anything, take the first available armor from the armor stand
|
||||||
|
-- and give it to the player
|
||||||
|
for e=1, #elements do
|
||||||
|
local stand_armor = inv:get_stack("armor_" .. elements[e], 1)
|
||||||
|
if not stand_armor:is_empty() then
|
||||||
|
local pinv = clicker:get_inventory()
|
||||||
|
pinv:set_stack("main", clicker:get_wield_index(), stand_armor)
|
||||||
|
stand_armor:take_item()
|
||||||
|
inv:set_stack("armor_" .. elements[e], 1, stand_armor)
|
||||||
|
update_entity(pos)
|
||||||
|
return clicker:get_wielded_item()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return itemstack
|
||||||
|
end,
|
||||||
after_place_node = function(pos)
|
after_place_node = function(pos)
|
||||||
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
|
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
|
||||||
end,
|
end,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user