mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-16 16:11:06 +01:00
Integrate dispensers
This commit is contained in:
parent
9f7b371bfc
commit
222104b3cb
1 changed files with 15 additions and 76 deletions
|
@ -136,93 +136,32 @@ local dispenserdef = {
|
||||||
-- Hardcoded dispensions --
|
-- Hardcoded dispensions --
|
||||||
|
|
||||||
-- Armor, mob heads and pumpkins
|
-- Armor, mob heads and pumpkins
|
||||||
if igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then
|
if igroups.armor then
|
||||||
local armor_type, armor_slot
|
local droppos_below = {x = droppos.x, y = droppos.y - 1, z = droppos.z}
|
||||||
local armor_dispensed = false
|
|
||||||
if igroups.armor_head then
|
|
||||||
armor_type = "armor_head"
|
|
||||||
armor_slot = 2
|
|
||||||
elseif igroups.armor_torso then
|
|
||||||
armor_type = "armor_torso"
|
|
||||||
armor_slot = 3
|
|
||||||
elseif igroups.armor_legs then
|
|
||||||
armor_type = "armor_legs"
|
|
||||||
armor_slot = 4
|
|
||||||
elseif igroups.armor_feet then
|
|
||||||
armor_type = "armor_feet"
|
|
||||||
armor_slot = 5
|
|
||||||
end
|
|
||||||
|
|
||||||
local droppos_below = {x=droppos.x, y=droppos.y-1, z=droppos.z}
|
for _, objs in ipairs({minetest.get_objects_inside_radius(droppos, 1), minetest.get_objects_inside_radius(droppos_below, 1)}) do
|
||||||
local dropnode_below = minetest.get_node(droppos_below)
|
for _, obj in ipairs(objs) do
|
||||||
-- Put armor on player or armor stand
|
stack = mcl_armor.equip(stack, obj)
|
||||||
local standpos
|
if stack:is_empty() then
|
||||||
if dropnode.name == "mcl_armor_stand:armor_stand" then
|
|
||||||
standpos = droppos
|
|
||||||
elseif dropnode_below.name == "mcl_armor_stand:armor_stand" then
|
|
||||||
standpos = droppos_below
|
|
||||||
end
|
|
||||||
if standpos then
|
|
||||||
local dropmeta = minetest.get_meta(standpos)
|
|
||||||
local dropinv = dropmeta:get_inventory()
|
|
||||||
if dropinv:room_for_item(armor_type, dropitem) then
|
|
||||||
dropinv:add_item(armor_type, dropitem)
|
|
||||||
minetest.registered_nodes["mcl_armor_stand:armor_stand"].on_metadata_inventory_put(standpos)
|
|
||||||
stack:take_item()
|
|
||||||
inv:set_stack("main", stack_id, stack)
|
|
||||||
mcl_armor.play_equip_sound(dropitem, nil, standpos)
|
|
||||||
armor_dispensed = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
-- Put armor on nearby player
|
|
||||||
-- First search for player in front of dispenser (check 2 nodes)
|
|
||||||
local objs1 = minetest.get_objects_inside_radius(droppos, 1)
|
|
||||||
local objs2 = minetest.get_objects_inside_radius(droppos_below, 1)
|
|
||||||
local objs_table = {objs1, objs2}
|
|
||||||
local player
|
|
||||||
for oi=1, #objs_table do
|
|
||||||
local objs_inner = objs_table[oi]
|
|
||||||
for o=1, #objs_inner do
|
|
||||||
--[[ First player in list is the lucky one. The other player get nothing :-(
|
|
||||||
If multiple players are close to the dispenser, it can be a bit
|
|
||||||
-- unpredictable on who gets the armor. ]]
|
|
||||||
if objs_inner[o]:is_player() then
|
|
||||||
player = objs_inner[o]
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if player then
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- If player found, add armor
|
if stack:is_empty() then
|
||||||
if player then
|
break
|
||||||
local ainv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"})
|
|
||||||
local pinv = player:get_inventory()
|
|
||||||
if ainv:get_stack("armor", armor_slot):is_empty() and pinv:get_stack("armor", armor_slot):is_empty() then
|
|
||||||
ainv:set_stack("armor", armor_slot, dropitem)
|
|
||||||
pinv:set_stack("armor", armor_slot, dropitem)
|
|
||||||
mcl_armor.update(player)
|
|
||||||
mcl_armor.play_equip_sound(dropitem, player)
|
|
||||||
|
|
||||||
stack:take_item()
|
|
||||||
inv:set_stack("main", stack_id, stack)
|
|
||||||
armor_dispensed = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Place head or pumpkin as node, if equipping it as armor has failed
|
-- Place head or pumpkin as node, if equipping it as armor has failed
|
||||||
if not armor_dispensed then
|
if not stack:is_empty() then
|
||||||
if igroups.head or iname == "mcl_farming:pumpkin_face" then
|
if igroups.head or iname == "mcl_farming:pumpkin_face" then
|
||||||
if dropnodedef.buildable_to then
|
if dropnodedef.buildable_to then
|
||||||
minetest.set_node(droppos, {name = iname, param2 = node.param2})
|
minetest.set_node(droppos, {name = iname, param2 = node.param2})
|
||||||
stack:take_item()
|
stack:take_item()
|
||||||
inv:set_stack("main", stack_id, stack)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
inv:set_stack("main", stack_id, stack)
|
||||||
-- Spawn Egg
|
-- Spawn Egg
|
||||||
elseif igroups.spawn_egg then
|
elseif igroups.spawn_egg then
|
||||||
-- Spawn mob
|
-- Spawn mob
|
||||||
|
|
Loading…
Reference in a new issue