diff --git a/mods/ITEMS/mcl_paintings/depends.txt b/mods/ITEMS/mcl_paintings/depends.txt new file mode 100644 index 0000000000..2f12da4c87 --- /dev/null +++ b/mods/ITEMS/mcl_paintings/depends.txt @@ -0,0 +1 @@ +mcl_core? diff --git a/mods/ITEMS/mcl_paintings/description.txt b/mods/ITEMS/mcl_paintings/description.txt new file mode 100644 index 0000000000..f52ec648cb --- /dev/null +++ b/mods/ITEMS/mcl_paintings/description.txt @@ -0,0 +1 @@ +Decorative paintings which you can placed on walls. diff --git a/mods/ITEMS/mcl_paintings/init.lua b/mods/ITEMS/mcl_paintings/init.lua new file mode 100644 index 0000000000..aea7692724 --- /dev/null +++ b/mods/ITEMS/mcl_paintings/init.lua @@ -0,0 +1,150 @@ +-- TODO: Move all textures to mcl_paintings when finished + +-- Intllib +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") + +minetest.register_craftitem("mcl_paintings:painting", { + description = S("Next-Gen Painting"), + _doc_items_longdesc = S("Paintings are decorations which can be placed on walls. THIS ITEM IS INCOMPLETE."), + wield_image = "gemalde_node.png", + inventory_image = "gemalde_node.png", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local under = pointed_thing.under + local above = pointed_thing.above + -- Am I right-clicking on something that has a custom on_rightclick set? + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[under.name] and minetest.registered_nodes[under.name].on_rightclick then + return minetest.registered_nodes[under.name].on_rightclick(pointed_thing.under, under, placer, itemstack) or itemstack + end + end + + -- Can only be placed on side + if under.y ~= above.y then + return itemstack + end + -- Can only be placed on solid nodes + local undernode = minetest.get_node(under) + if minetest.get_item_group(undernode.name, "solid") == 0 then + return itemstack + end + + -- Spawn painting and rotate + local painting = minetest.add_entity(above, "mcl_paintings:painting") + local yaw = minetest.dir_to_yaw(vector.direction(under, above)) + painting:set_yaw(yaw) + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, +}) + +-- List of painting IDs, indexed by size. +-- Outer index: Width in node lengths +-- Inner index: Height in node lengths +local paintings = { + [1] = { + [1] = { 1, 2, 3, 4, 5, 6, 7 }, -- 1×1 + [2] = { 8, 9, 10, 11, 12 }, -- 1×2 + }, + [2] = { + [1] = { 13, 14}, -- 2×1 + [2] = { 15, 16, 17, 18, 19, 20 }, -- 2×2 + }, + [3] = { + [4] = { 25, 26 }, -- 3×4 + }, + [4] = { + [2] = { 21 }, -- 4×2 + [4] = { 22, 23, 24 }, -- 4×4 + }, +} + +-- Returns a random painting ID for the given size. +-- x: Width in node lenghts +-- y: Height in node lengths +local function select_painting(x, y) + if paintings[x] then + local pool = paintings[x][y] + if paintings[x][y] then + local p = math.random(1, #pool) + return p + end + end + return nil +end + +-- Returns the texture table for the given painting ID +local get_textures = function(painting_id) + return { + "gemalde_bg.png", + "gemalde_bg.png", + "gemalde_bg.png", + "gemalde_bg.png", + "gemalde_"..tostring(painting_id)..".png", + "gemalde_bg.png" + } +end + +-- Painting entitty. +-- Can be killed. +-- Breaks and drops as item if punched. +-- +minetest.register_entity("mcl_paintings:painting", { + physical = false, + collide_with_objects = true, + hp_max = 1, + -- TODO: Fix visual + visual = "cube", + visual_size = { x=1, y=1 }, + textures = get_textures(1), + + _painting = nil, -- Holds the current painting ID. Initially nil for random painting + + get_staticdata = function(self) + local out = { _painting = self._painting } + return minetest.serialize(out) + end, + on_activate = function(self, staticdata) + if staticdata and staticdata ~= "" then + local inp = minetest.deserialize(staticdata) + self._painting = inp._painting + end + -- Initial spawn. Select random painting + if not self._painting then + self._painting = select_painting(1, 1) + end + self.object:set_properties({textures = get_textures(self._painting)}) + end, + on_punch = function(self, puncher) + if not puncher or not puncher:is_player() or self._removed then + return + end + -- Drop painting as item on ground + if not minetest.settings:get_bool("creative_mode") then + minetest.add_item(self.object:getpos(), "mcl_paintings:painting") + end + self._removed = true + self.object:remove() + end +}) + +--[[ +-- TODO: Add crafting when this mod works better +if minetest.get_modpath("mcl_core") then + minetest.register_craft({ + output = "mcl_paintings:painting", + recipe = { + {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, + {"mcl_core:stick", "group:wool", "mcl_core:stick"}, + {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, + } + }) +end +]] diff --git a/mods/ITEMS/mcl_paintings/intllib.lua b/mods/ITEMS/mcl_paintings/intllib.lua new file mode 100644 index 0000000000..6669d72023 --- /dev/null +++ b/mods/ITEMS/mcl_paintings/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/ITEMS/mcl_paintings/mod.conf b/mods/ITEMS/mcl_paintings/mod.conf new file mode 100644 index 0000000000..ea1d61c3dd --- /dev/null +++ b/mods/ITEMS/mcl_paintings/mod.conf @@ -0,0 +1 @@ +name = mcl_paintings diff --git a/mods/MISC/mcl_wip/depends.txt b/mods/MISC/mcl_wip/depends.txt index 85259f341c..77b465ca87 100644 --- a/mods/MISC/mcl_wip/depends.txt +++ b/mods/MISC/mcl_wip/depends.txt @@ -9,3 +9,4 @@ gemalde mcl_observers doc_identifier mobs_mc +mcl_paintings diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index 534608990e..df13414d0b 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -18,6 +18,7 @@ local wip_items = { "mcl_core:cobweb", "mobs_mc:llama", "mobs_mc:totem", + "mcl_paintings:painting", } for i=1,#wip_items do