VoxeLibre/mods/ITEMS/mcl_paintings/init.lua
2017-07-27 04:04:12 +02:00

150 lines
4.1 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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
]]