MineClone2/mods/ITEMS/mcl_armor_stand/init.lua

154 lines
4.5 KiB
Lua

local S = minetest.get_translator(minetest.get_current_modname())
-- Spawn a stand entity
local function spawn_stand_entity(pos, node)
local luaentity = minetest.add_entity(pos, "mcl_armor_stand:armor_entity"):get_luaentity()
luaentity:update_rotation(node or minetest.get_node(pos))
return luaentity
end
-- Find a stand entity or spawn one
local function get_stand_entity(pos, node)
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 0)) do
local luaentity = obj:get_luaentity()
if luaentity and luaentity.name == "mcl_armor_stand:armor_entity" then
return luaentity
end
end
return spawn_stand_entity(pos, node)
end
-- Migrate the old inventory format
local function migrate_inventory(inv)
inv:set_size("armor", 5)
local lists = inv:get_lists()
for name, element in pairs(mcl_armor.elements) do
local listname = "armor_" .. name
local list = lists[listname]
if list then
inv:set_stack("armor", element.index, list[1])
inv:set_size(listname, 0)
end
end
end
-- Drop all armor on the ground when it got destroyed
local function drop_inventory(pos)
local inv = minetest.get_meta(pos):get_inventory()
for _, stack in pairs(inv:get_list("armor")) do
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
end
-- TODO: The armor stand should be an entity
minetest.register_node("mcl_armor_stand:armor_stand", {
description = S("Armor Stand"),
drawtype = "mesh",
mesh = "3d_armor_stand.obj",
inventory_image = "mcl_armor_stand_item.png",
wield_image = "mcl_armor_stand_item.png",
tiles = {"default_wood.png", "mcl_stairs_stone_slab_top.png"},
paramtype = "light",
paramtype2 = "facedir",
walkable = false,
is_ground_content = false,
stack_max = 16,
selection_box = {
type = "fixed",
fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5}
},
-- TODO: This should be breakable by 2 quick punches
groups = {handy=1, deco_block=1, dig_by_piston=1, attached_node=1},
_mcl_hardness = 2,
sounds = mcl_sounds.node_sound_wood_defaults(),
on_construct = function(pos)
spawn_stand_entity(pos)
end,
on_destruct = function(pos)
drop_inventory(pos)
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local protname = clicker:get_player_name()
if minetest.is_protected(pos, protname) then
minetest.record_protection_violation(pos, protname)
return itemstack
end
return mcl_armor.equip(itemstack, get_stand_entity(pos, node).object, true)
end,
on_rotate = function(pos, node, user, mode)
if mode == screwdriver.ROTATE_FACE then
node.param2 = (node.param2 + 1) % 4
minetest.swap_node(pos, node)
get_stand_entity(pos, node):update_rotation(node)
return true
end
return false
end,
})
minetest.register_entity("mcl_armor_stand:armor_entity", {
initial_properties = {
physical = true,
visual = "mesh",
mesh = "3d_armor_entity.obj",
visual_size = {x=1, y=1},
collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1},
pointable = false,
textures = {"blank.png"},
timer = 0,
static_save = false,
},
on_activate = function(self)
self.object:set_armor_groups({immortal = 1})
self.node_pos = vector.round(self.object:get_pos())
self.inventory = minetest.get_meta(self.node_pos):get_inventory()
migrate_inventory(self.inventory)
mcl_armor.update(self.object)
end,
on_step = function(self, dtime)
if minetest.get_node(self.node_pos).name ~= "mcl_armor_stand:armor_stand" then
self.object:remove()
end
end,
update_armor = function(self, info)
self.object:set_properties({textures = {info.texture}})
end,
update_rotation = function(self, node)
self.object:set_yaw(minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2)))
end,
})
minetest.register_lbm({
label = "Respawn armor stand entities",
name = "mcl_armor_stand:respawn_entities",
nodenames = {"mcl_armor_stand:armor_stand"},
run_at_every_load = true,
action = function(pos, node)
spawn_stand_entity(pos, node)
end,
})
minetest.register_craft({
output = "mcl_armor_stand:armor_stand",
recipe = {
{"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"},
{"", "mcl_core:stick", ""},
{"mcl_core:stick", "mcl_stairs:slab_stone", "mcl_core:stick"},
}
})
-- Legacy handling
minetest.register_alias("3d_armor_stand:armor_stand", "mcl_armor_stand:armor_stand")
minetest.register_entity(":3d_armor_stand:armor_entity", {
on_activate = function(self)
minetest.log("action", "[mcl_armor_stand] Removing legacy entity: 3d_armor_stand:armor_entity")
self.object:remove()
end,
static_save = false,
})