[mcl_prideflags] add prideflags
This commit is contained in:
parent
bd85d77cc8
commit
287cf8f9b8
5 changed files with 205 additions and 0 deletions
3
mods/ITEMS/mcl_prideflags/README.txt
Normal file
3
mods/ITEMS/mcl_prideflags/README.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
License of code: WTFPL
|
||||||
|
|
||||||
|
License of textures: See README.md in top directory of MineClone 2.
|
198
mods/ITEMS/mcl_prideflags/init.lua
Normal file
198
mods/ITEMS/mcl_prideflags/init.lua
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
local modpath = minetest.get_modpath(modname)
|
||||||
|
local S = minetest.get_translator(modname)
|
||||||
|
local N = function(s) return s end
|
||||||
|
|
||||||
|
local mod_mcl_core = minetest.get_modpath("mcl_core")
|
||||||
|
local mod_mcl_banners = minetest.get_modpath("mcl_banners")
|
||||||
|
local mod_mcl_dye = minetest.get_modpath("mcl_wool")
|
||||||
|
local mod_mcl_dye = minetest.get_modpath("mcl_dye")
|
||||||
|
local mod_doc = minetest.get_modpath("doc")
|
||||||
|
|
||||||
|
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 inv
|
||||||
|
local base
|
||||||
|
local finished_banner
|
||||||
|
|
||||||
|
base = "mcl_banners_item_base.png^mcl_prideflags_item_overlay.png^[resize:32x32"
|
||||||
|
finished_banner = base
|
||||||
|
|
||||||
|
inv = finished_banner
|
||||||
|
groups = { banner = 1, deco_block = 1, flammable = -1 }
|
||||||
|
|
||||||
|
-- Helper function
|
||||||
|
local function round(num, idp)
|
||||||
|
local mult = 10^(idp or 0)
|
||||||
|
return math.floor(num * mult + 0.5) / mult
|
||||||
|
end
|
||||||
|
|
||||||
|
local function rotation_level_to_yaw(rotation_level)
|
||||||
|
return (rotation_level * (math.pi/8)) + math.pi
|
||||||
|
end
|
||||||
|
|
||||||
|
local function spawn_banner_entity(pos, hanging, itemstack)
|
||||||
|
local banner
|
||||||
|
if hanging then
|
||||||
|
banner = minetest.add_entity(pos, "mcl_banners:hanging_banner")
|
||||||
|
else
|
||||||
|
banner = minetest.add_entity(pos, "mcl_banners:standing_banner")
|
||||||
|
end
|
||||||
|
if banner == nil then
|
||||||
|
return banner
|
||||||
|
end
|
||||||
|
local imeta = itemstack:get_meta()
|
||||||
|
local layers = ""
|
||||||
|
local colorid = ""
|
||||||
|
banner:set_properties({textures = {"mcl_prideflags_base.png"}})
|
||||||
|
local mname = imeta:get_string("name")
|
||||||
|
if mname and mname ~= "" then
|
||||||
|
banner:get_luaentity()._item_name = mname
|
||||||
|
banner:get_luaentity()._item_description = imeta:get_string("description")
|
||||||
|
end
|
||||||
|
|
||||||
|
return banner
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Respawn banner entities",
|
||||||
|
name = "mcl_prideflags:respawn_entities",
|
||||||
|
run_at_every_load = true,
|
||||||
|
nodenames = {"mcl_banners:standing_banner", "mcl_banners:hanging_banner"},
|
||||||
|
action = function(pos, node)
|
||||||
|
|
||||||
|
local hanging = node.name == "mcl_banners:hanging_banner"
|
||||||
|
local offset
|
||||||
|
if hanging then
|
||||||
|
offset = hanging_banner_entity_offset
|
||||||
|
else
|
||||||
|
offset = standing_banner_entity_offset
|
||||||
|
end
|
||||||
|
|
||||||
|
local bpos = vector.add(pos, offset)
|
||||||
|
local objects = minetest.get_objects_inside_radius(bpos, 0.5)
|
||||||
|
|
||||||
|
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
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if meta:get_int("pride") == 1 then
|
||||||
|
v:set_properties({textures = {"mcl_prideflags_base.png"}})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("mcl_prideflags:pride_flag", {
|
||||||
|
description = S("Pride Flag"),
|
||||||
|
_tt_help = S("Pride Flag decoration"),
|
||||||
|
_doc_items_create_entry = false,
|
||||||
|
inventory_image = inv,
|
||||||
|
wield_image = inv,
|
||||||
|
-- Banner group groups together the banner items, but not the nodes.
|
||||||
|
-- Used for crafting.
|
||||||
|
groups = groups,
|
||||||
|
stack_max = 16,
|
||||||
|
|
||||||
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
|
local above = pointed_thing.above
|
||||||
|
local under = pointed_thing.under
|
||||||
|
|
||||||
|
local node_under = minetest.get_node(under)
|
||||||
|
if placer and not placer:get_player_control().sneak then
|
||||||
|
-- Use pointed node's on_rightclick function first, if present
|
||||||
|
if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then
|
||||||
|
return minetest.registered_nodes[node_under.name].on_rightclick(under, node_under, placer, itemstack) or itemstack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Place the node!
|
||||||
|
local hanging = false
|
||||||
|
|
||||||
|
-- Standing or hanging banner. The placement rules are enforced by the node definitions
|
||||||
|
local _, success = minetest.item_place_node(ItemStack("mcl_banners:standing_banner"), placer, pointed_thing)
|
||||||
|
if not success then
|
||||||
|
-- Forbidden on ceiling
|
||||||
|
if pointed_thing.under.y ~= pointed_thing.above.y then
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
_, success = minetest.item_place_node(ItemStack("mcl_banners:hanging_banner"), placer, pointed_thing)
|
||||||
|
if not success then
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
hanging = true
|
||||||
|
end
|
||||||
|
local place_pos
|
||||||
|
if minetest.registered_nodes[node_under.name].buildable_to then
|
||||||
|
place_pos = under
|
||||||
|
else
|
||||||
|
place_pos = above
|
||||||
|
end
|
||||||
|
local bnode = minetest.get_node(place_pos)
|
||||||
|
if bnode.name ~= "mcl_banners:standing_banner" and bnode.name ~= "mcl_banners:hanging_banner" then
|
||||||
|
minetest.log("error", "[mcl_banners] The placed banner node is not what the mod expected!")
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(place_pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("banner", 1)
|
||||||
|
local store_stack = ItemStack(itemstack)
|
||||||
|
store_stack:set_count(1)
|
||||||
|
inv:set_stack("banner", 1, store_stack)
|
||||||
|
|
||||||
|
-- Spawn entity
|
||||||
|
local entity_place_pos
|
||||||
|
if hanging then
|
||||||
|
entity_place_pos = vector.add(place_pos, hanging_banner_entity_offset)
|
||||||
|
else
|
||||||
|
entity_place_pos = vector.add(place_pos, standing_banner_entity_offset)
|
||||||
|
end
|
||||||
|
local banner_entity = spawn_banner_entity(entity_place_pos, hanging, itemstack)
|
||||||
|
-- Set rotation
|
||||||
|
local final_yaw, rotation_level
|
||||||
|
if hanging then
|
||||||
|
local pdir = vector.direction(pointed_thing.under, pointed_thing.above)
|
||||||
|
final_yaw = minetest.dir_to_yaw(pdir)
|
||||||
|
if pdir.x > 0 then
|
||||||
|
rotation_level = 4
|
||||||
|
elseif pdir.z > 0 then
|
||||||
|
rotation_level = 8
|
||||||
|
elseif pdir.x < 0 then
|
||||||
|
rotation_level = 12
|
||||||
|
else
|
||||||
|
rotation_level = 0
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Determine the rotation based on player's yaw
|
||||||
|
local yaw = placer:get_look_horizontal()
|
||||||
|
-- Select one of 16 possible rotations (0-15)
|
||||||
|
rotation_level = round((yaw / (math.pi*2)) * 16)
|
||||||
|
if rotation_level >= 16 then
|
||||||
|
rotation_level = 0
|
||||||
|
end
|
||||||
|
final_yaw = rotation_level_to_yaw(rotation_level)
|
||||||
|
end
|
||||||
|
meta:set_int("rotation_level", rotation_level)
|
||||||
|
meta:set_int("pride", 1)
|
||||||
|
|
||||||
|
if banner_entity then
|
||||||
|
banner_entity:set_yaw(final_yaw)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
||||||
|
itemstack:take_item()
|
||||||
|
end
|
||||||
|
minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}, true)
|
||||||
|
|
||||||
|
return itemstack
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
if mod_mcl_core then
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_prideflags:pride_flag",
|
||||||
|
recipe = { {"mcl_wool:red", "mcl_wool:orange", "mcl_wool:yellow"}, {"mcl_wool:green", "mcl_wool:blue", "mcl_wool:purple"}, {"", "mcl_core:stick", ""} }
|
||||||
|
})
|
||||||
|
end
|
4
mods/ITEMS/mcl_prideflags/mod.conf
Normal file
4
mods/ITEMS/mcl_prideflags/mod.conf
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
name = mcl_prideflags
|
||||||
|
author = NilsG
|
||||||
|
description = Adds decorative pride flags
|
||||||
|
depends = mcl_colors, mcl_banners, mcl_dye, mcl_wool
|
BIN
mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_base.png
Normal file
BIN
mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_base.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
Loading…
Reference in a new issue