328 lines
13 KiB
Lua
328 lines
13 KiB
Lua
--Mod : Xmas Balls
|
|
--Depends : None
|
|
--Based on Colorful Mod
|
|
--© Lars Müller @appguru.eu, licensed under GNU GPLv3
|
|
--Offers a simple API :
|
|
-- THEMES={name={"theme_texture","Description"}}
|
|
-- SIZES={size={"Description", Model & Wield Image Scale, Size "Logo"}}
|
|
-- MAXIMUM_SIZE = Biggest size
|
|
|
|
HEX = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}
|
|
local function toHex(number) --Converts a number from 0-255 into a hexadecimal string
|
|
local result=""
|
|
result=result..HEX[number % 16+1]
|
|
result=result..HEX[((number - (number % 16)) / 16) % 16+1]
|
|
return result:reverse()
|
|
end
|
|
local function round(number) --Rounds a number
|
|
return math.floor(number+0.5)
|
|
end
|
|
|
|
function create_colortable(r_steps, g_steps, b_steps, extreme, nodename) --Creates a colortable for r/g/b steps using specified nodename
|
|
local t={}
|
|
local colors={}
|
|
local rs=r_steps
|
|
local bs=b_steps
|
|
local gs=g_steps
|
|
if extreme then
|
|
if r_steps % 2 == 0 then
|
|
rs=rs+1
|
|
end
|
|
if b_steps % 2 == 0 then
|
|
bs=bs+1
|
|
end
|
|
if g_steps % 2 == 0 then
|
|
gs=gs+1
|
|
end
|
|
end
|
|
local r_step=255/rs
|
|
local b_step=255/bs
|
|
local g_step=255/gs
|
|
for r = 1,rs,1 do
|
|
for b = 1,bs,1 do
|
|
for g = 1,gs,1 do
|
|
local red=r_step*r
|
|
local blue=b_step*b
|
|
local green=g_step*g
|
|
local register_as=nodename.."_"..red.."_"..green.."_"..blue
|
|
t[red..","..green..","..blue]=register_as
|
|
end
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
function save_colortable(r_steps, g_steps, b_steps, extreme, nodename, save_as) --Saves a colortable for r/g/b steps using specified nodename
|
|
local result=""
|
|
local colors={}
|
|
local rs=r_steps
|
|
local bs=b_steps
|
|
local gs=g_steps
|
|
if extreme then
|
|
if r_steps % 2 == 0 then
|
|
rs=rs+1
|
|
end
|
|
if b_steps % 2 == 0 then
|
|
bs=bs+1
|
|
end
|
|
if g_steps % 2 == 0 then
|
|
gs=gs+1
|
|
end
|
|
end
|
|
local r_step=255/rs
|
|
local b_step=255/bs
|
|
local g_step=255/gs
|
|
for r = 1,rs,1 do
|
|
for b = 1,bs,1 do
|
|
for g = 1,gs,1 do
|
|
local red=r_step*r
|
|
local blue=b_step*b
|
|
local green=g_step*g
|
|
local register_as=nodename.."_"..red.."_"..green.."_"..blue
|
|
if save_as then
|
|
result=result.."\n"..red..","..green..","..blue..",255-"..register_as
|
|
end
|
|
end
|
|
end
|
|
end
|
|
result=string.sub(result, 2)
|
|
file=io.open(save_as, "w+")
|
|
file:write(result)
|
|
file:close()
|
|
end
|
|
|
|
function register_all_nodes(r_steps, g_steps, b_steps, a, extreme, nodename, node, generate_crafts, append, save_as) --Register all nodes with specified values
|
|
local result=""
|
|
local alpha=toHex(a)
|
|
local colors={}
|
|
local rs=r_steps
|
|
local bs=b_steps
|
|
local gs=g_steps
|
|
if extreme then
|
|
if r_steps % 2 == 0 then
|
|
rs=rs+1
|
|
end
|
|
if b_steps % 2 == 0 then
|
|
bs=bs+1
|
|
end
|
|
if g_steps % 2 == 0 then
|
|
gs=gs+1
|
|
end
|
|
end
|
|
local items={}
|
|
if generate_crafts then
|
|
items=create_colortable(r_steps, g_steps, b_steps, extreme, nodename)
|
|
end
|
|
local r_step=255/rs
|
|
local b_step=255/bs
|
|
local g_step=255/gs
|
|
for r = 1,rs,1 do
|
|
for b = 1,bs,1 do
|
|
for g = 1,gs,1 do
|
|
local red=r_step*r
|
|
local blue=b_step*b
|
|
local green=g_step*g
|
|
local tiles_colorized={}
|
|
local copied_table={}
|
|
local color=toHex(red)..toHex(green)..toHex(blue)..alpha
|
|
for key, value in pairs(node) do
|
|
copied_table[key]=value
|
|
end
|
|
for index, tile in pairs(node["tiles"]) do
|
|
if not string.match(tile,"#color") then
|
|
tiles_colorized[index]=tile.."^[colorize:#"..color
|
|
else
|
|
tiles_colorized[index]=string.gsub(tile,"#color","^[colorize:#"..color)
|
|
end
|
|
end
|
|
if append then
|
|
if type(node["drop"])=="table" then
|
|
local drop_items={}
|
|
for index, drop in ipairs(node["drop"]["items"]) do
|
|
drop_items[index]=drop.."_"..red.."_"..green.."_"..blue
|
|
end
|
|
copied_table["drop"]["items"]=drop_items
|
|
elseif copied_table["drop"] then
|
|
copied_table["drop"]=copied_table["drop"].."_"..red.."_"..green.."_"..blue
|
|
end
|
|
end
|
|
copied_table["tiles"]=tiles_colorized
|
|
if copied_table["inventory_image"] then
|
|
if not string.match(copied_table["inventory_image"],"#color") then
|
|
copied_table["inventory_image"]=copied_table["inventory_image"].."^[colorize:#"..color
|
|
else
|
|
copied_table["inventory_image"]=string.gsub(copied_table["inventory_image"],"#color","^[colorize:#"..color)
|
|
end
|
|
end
|
|
if copied_table["wield_image"] then
|
|
if not string.match(copied_table["wield_image"],"#color") then
|
|
copied_table["wield_image"]=copied_table["wield_image"].."^[colorize:#"..color
|
|
else
|
|
copied_table["wield_image"]=string.gsub(copied_table["wield_image"],"#color","^[colorize:#"..color)
|
|
end
|
|
end
|
|
if copied_table["description"] then
|
|
if not string.match(copied_table["description"],"#color") then
|
|
copied_table["description"]=copied_table["description"]..node["description"]..", Color : Red : "..red..", Green : "..green..", Blue : "..blue
|
|
else
|
|
copied_table["description"]=string.gsub(copied_table["description"],"#color",", Color : Red : "..red..", Green : "..green..", Blue : "..blue)
|
|
end
|
|
end
|
|
local register_as=nil
|
|
if not string.match(nodename,"#color") then
|
|
register_as=nodename.."_"..red.."_"..green.."_"..blue
|
|
else
|
|
register_as=string.gsub(nodename, "#color", red.."_"..green.."_"..blue)
|
|
end
|
|
minetest.register_node(register_as, copied_table)
|
|
if save_as then
|
|
result=result.."\n"..red..","..green..","..blue..",255-"..register_as
|
|
end
|
|
if generate_crafts then
|
|
for color_value, name in pairs(items) do
|
|
local splut=color_value:split(",")
|
|
local red_value=round((tonumber(splut[1])+red)/2/r_step)*r_step
|
|
local green_value=round((tonumber(splut[2])+green)/2/b_step)*b_step
|
|
local blue_value=round((tonumber(splut[3])+blue)/2/g_step)*g_step
|
|
minetest.register_craft({
|
|
type = "shapeless",
|
|
output = nodename.."_"..red_value.."_"..green_value.."_"..blue_value.." 2",
|
|
recipe = {name, register_as},
|
|
})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if save_as then
|
|
result=string.sub(result, 2)
|
|
file=io.open(save_as, "w+")
|
|
file:write(result)
|
|
file:close()
|
|
end
|
|
end
|
|
|
|
function register_all_items(r_steps, g_steps, b_steps, a, extreme, itemname, item, generate_crafts) --Register all items with specified values
|
|
local alpha=toHex(a)
|
|
local colors={}
|
|
local rs=r_steps
|
|
local bs=b_steps
|
|
local gs=g_steps
|
|
if extreme then
|
|
if r_steps % 2 == 0 then
|
|
rs=rs+1
|
|
end
|
|
if b_steps % 2 == 0 then
|
|
bs=bs+1
|
|
end
|
|
if g_steps % 2 == 0 then
|
|
gs=gs+1
|
|
end
|
|
end
|
|
local items={}
|
|
if generate_crafts then
|
|
items=create_colortable(r_steps, g_steps, b_steps, extreme, itemname)
|
|
end
|
|
local r_step=255/rs
|
|
local b_step=255/bs
|
|
local g_step=255/gs
|
|
for r = 1,rs,1 do
|
|
for b = 1,bs,1 do
|
|
for g = 1,gs,1 do
|
|
local red=r_step*r
|
|
local blue=b_step*b
|
|
local green=g_step*g
|
|
local color=toHex(red)..toHex(green)..toHex(blue)..alpha
|
|
local tiles_colorized={}
|
|
local copied_table={}
|
|
for key, value in ipairs(item) do
|
|
copied_table[key]=value
|
|
end
|
|
if copied_table["inventory_image"] then
|
|
if not string.match(copied_table["inventory_image"],"#color") then
|
|
copied_table["inventory_image"]=copied_table["inventory_image"].."^[colorize:#"..color
|
|
else
|
|
copied_table["inventory_image"]=string.gsub(copied_table["inventory_image"],"#color","^[colorize:#"..color)
|
|
end
|
|
end
|
|
if copied_table["wield_image"] then
|
|
if not string.match(copied_table["wield_image"],"#color") then
|
|
copied_table["wield_image"]=copied_table["wield_image"].."^[colorize:#"..color
|
|
else
|
|
copied_table["wield_image"]=string.gsub(copied_table["wield_image"],"#color","^[colorize:#"..color)
|
|
end
|
|
end
|
|
if copied_table["description"] then
|
|
if not string.match(copied_table["description"],"#color") then
|
|
copied_table["description"]=copied_table["description"]..node["description"]..", Color : Red : "..red..", Green : "..green..", Blue : "..blue
|
|
else
|
|
copied_table["description"]=string.gsub(copied_table["description"],"#color",", Color : Red : "..red..", Green : "..green..", Blue : "..blue)
|
|
end
|
|
end
|
|
local register_as=nil
|
|
if not string.match(nodename,"#color") then
|
|
register_as=itemname.."_"..red.."_"..green.."_"..blue
|
|
else
|
|
register_as=string.gsub(nodename, "#color", red.."_"..green.."_"..blue)
|
|
end
|
|
minetest.register_craftitem(register_as, copied_table)
|
|
if generate_crafts then
|
|
for color_value, name in pairs(items) do
|
|
local splut=color_value:split(",")
|
|
local red_value=round((tonumber(splut[1])+red)/2/r_step)*r_step
|
|
local green_value=round((tonumber(splut[2])+green)/2/b_step)*b_step
|
|
local blue_value=round((tonumber(splut[3])+blue)/2/g_step)*g_step
|
|
minetest.register_craft({
|
|
type = "shapeless",
|
|
output = itemname.."_"..red_value.."_"..green_value.."_"..blue_value.." 2",
|
|
recipe = {name, register_as},
|
|
})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
THEMES={star={"Star","baubles_theme_star.png"},heart={"Heart","baubles_theme_heart.png"},snowflake={"Snowflake","baubles_theme_ice.png"},christmas_tree={"Christmas Tree","baubles_theme_xmas_tree.png"}, snow={"Snow", "baubles_theme_snow.png"}, candle={"Candle", "baubles_theme_candle.png"}, present={"Present", "baubles_theme_present.png"}}
|
|
SIZES={large={"Large", 0.03, "baubles_size_large.png"}, medium={"Medium", 0.02, "baubles_size_medium.png"}, small={"Small", 0.01, "baubles_size_small.png"}}
|
|
MAXIMUM_SIZE=0.03
|
|
|
|
for name1, texpath in pairs(THEMES) do
|
|
for name2, a in pairs(SIZES) do
|
|
b=a[2]/2*32
|
|
register_all_nodes(2,2,2, 100, true, "baubles:bauble_"..name1.."_"..name2 , {
|
|
description = "Bauble, "..texpath[1]..", "..a[1],
|
|
paramtype2="facedir",
|
|
tiles = {"baubles_ball.png#color^baubles_circle.png^"..texpath[2]},
|
|
inventory_image = "baubles_ball.png#color^baubles_circle.png^"..texpath[2].."^"..a[3],
|
|
wield_image = "baubles_ball.png#color^baubles_circle.png^"..texpath[2],
|
|
light_source=8,
|
|
visual_scale=a[2],
|
|
wield_scale={x=a[2]/MAXIMUM_SIZE,y=a[2]/MAXIMUM_SIZE,z=a[2]/MAXIMUM_SIZE},
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-b, -b, -b, b, b, b}
|
|
},
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-b, -b, -b, b, b, b}
|
|
},
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-b, -b, -b, b, b, b}
|
|
},
|
|
},
|
|
drawtype="mesh",
|
|
mesh="baubles_bauble.obj",
|
|
groups = {oddly_breakable_by_hand=1},
|
|
drop = "baubles:bauble_"..name1.."_"..name2
|
|
}, true, true)
|
|
end
|
|
end
|