From 287cf8f9b87776c82d8b6b3c22dd9540d8987863 Mon Sep 17 00:00:00 2001 From: Fusselkater Date: Sun, 30 Oct 2022 15:39:11 +0100 Subject: [PATCH] [mcl_prideflags] add prideflags --- mods/ITEMS/mcl_prideflags/README.txt | 3 + mods/ITEMS/mcl_prideflags/init.lua | 198 ++++++++++++++++++ mods/ITEMS/mcl_prideflags/mod.conf | 4 + .../textures/mcl_prideflags_base.png | Bin 0 -> 6890 bytes .../textures/mcl_prideflags_item_overlay.png | Bin 0 -> 5015 bytes 5 files changed, 205 insertions(+) create mode 100644 mods/ITEMS/mcl_prideflags/README.txt create mode 100644 mods/ITEMS/mcl_prideflags/init.lua create mode 100644 mods/ITEMS/mcl_prideflags/mod.conf create mode 100644 mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_base.png create mode 100644 mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_item_overlay.png diff --git a/mods/ITEMS/mcl_prideflags/README.txt b/mods/ITEMS/mcl_prideflags/README.txt new file mode 100644 index 0000000..2c34ff6 --- /dev/null +++ b/mods/ITEMS/mcl_prideflags/README.txt @@ -0,0 +1,3 @@ +License of code: WTFPL + +License of textures: See README.md in top directory of MineClone 2. \ No newline at end of file diff --git a/mods/ITEMS/mcl_prideflags/init.lua b/mods/ITEMS/mcl_prideflags/init.lua new file mode 100644 index 0000000..fbead1e --- /dev/null +++ b/mods/ITEMS/mcl_prideflags/init.lua @@ -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 diff --git a/mods/ITEMS/mcl_prideflags/mod.conf b/mods/ITEMS/mcl_prideflags/mod.conf new file mode 100644 index 0000000..4682ca7 --- /dev/null +++ b/mods/ITEMS/mcl_prideflags/mod.conf @@ -0,0 +1,4 @@ +name = mcl_prideflags +author = NilsG +description = Adds decorative pride flags +depends = mcl_colors, mcl_banners, mcl_dye, mcl_wool diff --git a/mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_base.png b/mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_base.png new file mode 100644 index 0000000000000000000000000000000000000000..3827f8293cfacfe7cbeaf1f45331f8745602cdef GIT binary patch literal 6890 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 H9lQSr8E*fE literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_item_overlay.png b/mods/ITEMS/mcl_prideflags/textures/mcl_prideflags_item_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ff856dfc046cc7a4928462c866a60817edabef GIT binary patch literal 5015 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 YCiQKH9^{=x%zvLWaDKr4xu2x{1)B+opa1{> literal 0 HcmV?d00001