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