Implement banner rotation with screwdriver

This commit is contained in:
Wuzzy 2019-12-09 18:27:30 +01:00
parent bbcab7275e
commit 643b1e7933

View File

@ -50,6 +50,10 @@ local layer_ratio = 255
local standing_banner_entity_offset = { x=0, y=-0.499, z=0 }
local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 }
local rotation_level_to_yaw = function(rotation_level)
return (rotation_level * (math.pi/8)) + math.pi
end
local on_dig_banner = function(pos, node, digger)
-- Check protection
local name = digger:get_player_name()
@ -151,7 +155,7 @@ local spawn_banner_entity = function(pos, hanging, itemstack)
return banner
end
local respawn_banner_entity = function(pos, node)
local respawn_banner_entity = function(pos, node, force)
local hanging = node.name == "mcl_banners:hanging_banner"
local offset
if hanging then
@ -165,26 +169,24 @@ local respawn_banner_entity = function(pos, node)
for _, v in ipairs(objects) do
local ent = v:get_luaentity()
if ent and (ent.name == "mcl_banners:standing_banner" or ent.name == "mcl_banners:hanging_banner") then
if force then
v:remove()
else
return
end
end
end
-- Spawn new entity
local meta = minetest.get_meta(pos)
local banner_item = meta:get_inventory():get_stack("banner", 1)
local banner_entity = spawn_banner_entity(bpos, hanging, banner_item)
-- Set rotation
local final_yaw
local rotation_level = meta:get_int("rotation_level")
final_yaw = (rotation_level * (math.pi/8)) + math.pi
local final_yaw = rotation_level_to_yaw(rotation_level)
banner_entity:set_yaw(final_yaw)
end
local on_rotate
if minetest.get_modpath("screwdriver") then
on_rotate = screwdriver.disallow
end
-- Banner nodes.
-- These are an invisible nodes which are only used to destroy the banner entity.
-- All the important banner information (such as color) is stored in the entity.
@ -229,6 +231,18 @@ S("You can copy the pattern of a banner by placing two banners of the same color
end,
_mcl_hardness = 1,
_mcl_blast_resistance = 5,
on_rotate = function(pos, node, user, mode, param2)
if mode == screwdriver.ROTATE_FACE then
local meta = minetest.get_meta(pos)
local rot = meta:get_int("rotation_level")
rot = (rot - 1) % 16
meta:set_int("rotation_level", rot)
respawn_banner_entity(pos, node, true)
return true
else
return false
end
end,
})
-- Hanging banner node
@ -261,7 +275,29 @@ minetest.register_node("mcl_banners:hanging_banner", {
end,
_mcl_hardness = 1,
_mcl_blast_resistance = 5,
on_rotate = on_rotate,
on_rotate = function(pos, node, user, mode, param2)
if mode == screwdriver.ROTATE_FACE then
local r = screwdriver.rotate.wallmounted(pos, node, mode)
node.param2 = r
minetest.swap_node(pos, node)
local meta = minetest.get_meta(pos)
local rot = 0
if node.param2 == 2 then
rot = 12
elseif node.param2 == 3 then
rot = 4
elseif node.param2 == 4 then
rot = 0
elseif node.param2 == 5 then
rot = 8
end
meta:set_int("rotation_level", rot)
respawn_banner_entity(pos, node, true)
return true
else
return false
end
end,
})
for colorid, colortab in pairs(mcl_banners.colors) do
@ -410,7 +446,7 @@ for colorid, colortab in pairs(mcl_banners.colors) do
if rotation_level >= 16 then
rotation_level = 0
end
final_yaw = (rotation_level * (math.pi/8)) + math.pi
final_yaw = rotation_level_to_yaw(rotation_level)
end
meta:set_int("rotation_level", rotation_level)