From fd988cf650f5e82f04fe441281ba93be9f051e4c Mon Sep 17 00:00:00 2001 From: sys4-fr Date: Thu, 6 Sep 2018 22:40:52 +0200 Subject: [PATCH] Version MFF. --- README.md | 0 depends.txt | 0 init.lua | 214 ++++++++++++------------- paint_roller.lua | 0 textures/colormachine_bottom.png | Bin 2178 -> 1870 bytes textures/colormachine_front.png | Bin 2431 -> 2146 bytes textures/colormachine_front_active.png | Bin 2429 -> 2165 bytes textures/colormachine_side.png | Bin 2229 -> 1923 bytes textures/colormachine_top.png | Bin 2310 -> 1998 bytes textures/colormachine_top_active.png | Bin 2303 -> 2021 bytes textures/paint_roller.png | Bin 417 -> 196 bytes 11 files changed, 107 insertions(+), 107 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 depends.txt mode change 100644 => 100755 init.lua mode change 100644 => 100755 paint_roller.lua mode change 100644 => 100755 textures/colormachine_bottom.png mode change 100644 => 100755 textures/colormachine_front.png mode change 100644 => 100755 textures/colormachine_front_active.png mode change 100644 => 100755 textures/colormachine_side.png mode change 100644 => 100755 textures/colormachine_top.png mode change 100644 => 100755 textures/colormachine_top_active.png mode change 100644 => 100755 textures/paint_roller.png diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/depends.txt b/depends.txt old mode 100644 new mode 100755 diff --git a/init.lua b/init.lua old mode 100644 new mode 100755 index 28fc375..9ca1766 --- a/init.lua +++ b/init.lua @@ -22,7 +22,7 @@ -- Version 0.6 --- Changelog: +-- Changelog: -- 23.05.15 As all dyes can be crafted into other dyes, only white dye is consumed - provided the -- other dyes needed for the crafting chain are stored. -- 22.05.15 Added support for new homedecor meshnodes. @@ -61,7 +61,7 @@ -- Added some more labels in the main menu to make it easier to understand. -- 22.07.13 Added textures provided by Vanessae -- fixed a bug concerning normal dyes (when unifieddyes is not installed) - + -- adds a function to check ownership of a node; taken from VanessaEs homedecor mod colormachine = {}; @@ -86,14 +86,14 @@ local stained_glass_exception = 0; -- the names of suitable sources of that color (note: this does not work by group!); -- you can add your own color sources here if you want -colormachine.basic_dye_sources = { "flowers:rose", "flowers:tulip", "flowers:dandelion_yellow", +colormachine.basic_dye_sources = { "flowers:rose", "flowers:tulip", "flowers:dandelion_yellow", "", "default:cactus", "", "", "", -- no lime, no aqua, no cyan, no skyblue "flowers:geranium", "flowers:viola", "", "", -- no magenta, no redviolet "default:clay_lump", "", "", "", "default:coal_lump" }; -- if flowers is not installed -colormachine.alternate_basic_dye_sources = { - "default:apple", "default:desert_stone", "default:sand", +colormachine.alternate_basic_dye_sources = { + "default:apple", "default:desert_stone", "default:sand", "", "default:cactus", "", "", "", "default:leaves", "", "", "" , "default:clay_lump", "", "", "", "default:coal_lump" }; @@ -115,11 +115,11 @@ colormachine.dye_mixes = { red = {}, -- base color white = {}, -- base color lightgrey = {13,15}, -- white + grey - grey = {13,17}, -- black + white + grey = {13,17}, -- black + white darkgrey = {15,17}, -- grey + black black = {}, -- base color } - + -- construct the formspec for the color selector @@ -140,7 +140,7 @@ end -- defines the order in which blocks are shown -- nr: the diffrent block types need to be ordered by some system; the number defines that order --- modname: some mods define more than one type of colored blocks; the modname is needed +-- modname: some mods define more than one type of colored blocks; the modname is needed -- for checking if the mod is installed and for creating colored blocks -- shades: some mods (or parts thereof) do not support all possible shades -- grey_shades: some mods support only some shades of grey (or none at all) @@ -166,7 +166,7 @@ colormachine.data = { hardenedclay_ = { nr=3.5, modname='hardenedclay', shades={1,0,1,0,0,0,1,0}, grey_shades={1,0,1,1,1}, u=0, descr="hclay", block="hardenedclay:hardened_clay_white", add="hardened_clay_", p=16}, colouredstonebricks_ = { nr=3.6, modname='colouredstonebricks', shades={1,0,1,0,0,0,1,0}, grey_shades={1,0,1,1,1}, u=0, descr="cbrick", block="default:stonebrick", add="", p=1}, - + clstone_stone_ = { nr=3.7, modname='clstone', shades={1,0,1,0,0,0,1,0}, grey_shades={1,0,1,1,1}, u=0, descr="clstone",block="default:stone", add="", p=1, obj_postfix='_stone' }, colorcubes_1_ = { nr=3.8, modname='colorcubes', shades={1,0,1,0,0,0,1,0}, grey_shades={1,0,1,1,1}, u=0, descr="ccubes",block="default:stone", add="", p=1, obj_postfix='_single' }, @@ -403,7 +403,7 @@ colormachine.generate_form = function( m_prefix ) "label[0.3,1;light]"; -- not all mods offer all shades (and some offer even more) - local supported = colormachine.data[ m_prefix ].shades; + local supported = colormachine.data[ m_prefix ].shades; if( supported[2]==0 ) then form = form.. @@ -510,7 +510,7 @@ colormachine.decode_color_name = function( meta, new_color ) table.remove( liste, 1 ); -- the color has been selected end end - + -- the color was not found! error! keep the old color if( selected_color == -1 ) then if( meta ) then @@ -595,8 +595,8 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob if( meta ~= nil ) then c = tonumber(meta:get_string('selected_color')); - s = tonumber(meta:get_string('selected_shade')); - g = tonumber(meta:get_string('selected_grey_shade')); + s = tonumber(meta:get_string('selected_shade')); + g = tonumber(meta:get_string('selected_grey_shade')); end @@ -608,7 +608,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob local k_orig = k; -- unifieddyes_ does not supply all colors - if( k == 'unifieddyes_' + if( k == 'unifieddyes_' and ( (g==-1 and s==3 and (as_obj_name==1 or not(c==4 or c==6 or c==8 or c==12 or c==13 ))) or (g==-1 and s==1 and c==1 ) -- pink or (g==-1 and s==7 and c==5 ) -- dark brown @@ -646,7 +646,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob return 'homedecor:'..colormachine.data[k].add..'brown'..(colormachine.data[k].postfix or ''); end end - + if( k=='homedecor_table_' and as_obj_name==1 and new_color=='dark_orange' ) then return 'homedecor:'..colormachine.data[k].add..'mahogany'..(colormachine.data[k].postfix or ''); end @@ -661,8 +661,8 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob end -- beds and sofas are available in less colors - if( g==-1 - and (c==7 or c==11) + if( g==-1 + and (c==7 or c==11) and (k=='beds_bed_top_top_' or k=='lrfurn_sofa_right_front_' or k=='lrfurn_armchair_front_' or k=='lrfurn_longsofa_middle_front_' )) then return nil; @@ -674,7 +674,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob local color_used = ""; if( s==1 and c==1 ) then color_used = 'pink'; -- in blox, this is called "pink"; normally "light_red" - elseif( g>-1 ) then + elseif( g>-1 ) then color_used = colormachine.grey_names[ g ]; elseif( s ~= 3 ) then return nil; -- only normal saturation supported @@ -692,7 +692,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob return 'blox_'..( color_used )..( colormachine.data[k].add )..'.png'; end end - + local postfix = '.png'; local prefix = k; @@ -709,12 +709,12 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob return nil; -- no grey values for them end local h_trans = {yellow=1, lime=2, green=3, aqua=4, cyan=5, skyblue=6, blue=7, violet=8, magenta=9, redviolet=10, red=11,orange=12}; - + local h = h_trans[ colormachine.colors[c] ]; local b = ""; local sat = ""; - + if( k == 'stained_glass_' ) then prefix = "stained_glass:"..(colormachine.colors[c]).."_"; if( s==1 or s==2) then b = "8"; -- light @@ -723,7 +723,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob elseif( s==7 or s==8) then b = "3"; -- dark end prefix = prefix.."_"; - + sat = "7"; if( s==2 or s==4 or s==6 or s==8 ) then -- saturation sat = "6"; @@ -747,7 +747,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob if( s==1 and new_color=='light_blue' ) then -- only light blue is supported return prefix..'light_blue'..postfix; - + elseif( new_color=='dark_green' ) then return prefix..'forest_green'..postfix; @@ -760,14 +760,14 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob elseif( new_color=='orange' ) then return prefix..'oak'..postfix; - + end end if( k=='cotton_' and new_color=='grey') then new_color = 'mediumgrey'; end - + if( k=='framedglass_' and as_obj_name ~= 1) then postfix = 'glass.png'; @@ -791,7 +791,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob end -- those have split textures... - if( colormachine.data[k].modname == 'coloredblocks') then + if( colormachine.data[k].modname == 'coloredblocks') then @@ -818,7 +818,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob return 'coloredblocks_'..new_color..postfix; - elseif( new_color..'_' == colormachine.data[k].add ) then + elseif( new_color..'_' == colormachine.data[k].add ) then prefix = 'coloredblocks:'; --]] @@ -827,7 +827,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob end if( colormachine.data[k].modname == 'plasticbox' - and new_color == 'dark_green') then + and new_color == 'dark_green') then return prefix..'darkgreen'..postfix; end @@ -835,11 +835,11 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob if( as_obj_name == 1 and colormachine.data[k].obj_postfix ) then postfix = (colormachine.data[k].obj_postfix) ..postfix; end - + -- normal dyes (also used for wool) use a diffrent naming scheme if( colormachine.data[k].u == 0) then if( new_color == 'darkgrey' and k ~= 'framedglass_') then - return prefix..'dark_grey'..postfix; + return prefix..'dark_grey'..postfix; elseif( new_color == 'dark_orange' ) then return prefix..'brown'..postfix; elseif( new_color == 'dark_green' ) then @@ -847,7 +847,7 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob elseif( new_color == 'light_red' ) then return prefix..'pink'..postfix; -- lime, aqua, skyblue and redviolet do not exist as standard wool/dye colors - elseif( g == -1 and (c==4 or c==6 or c==8 or c==12) and k_orig ~= 'unifieddyes_') then + elseif( g == -1 and (c==4 or c==6 or c==8 or c==12) and k_orig ~= 'unifieddyes_') then return nil; -- all other colors of normal dye/wool exist only in normal shade elseif( g == -1 and s~= 3 and k_orig ~= 'unifieddyes_') then @@ -872,16 +872,16 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) if( mod_name == v.modname ) then table.insert( found, k ); end - end + end if( #found < 1 ) then return { error_code ="Sorry, this block is not supported by the spray booth.", found_name = "", blocktype = ""}; end - - -- another case of special treatment needed; at least the color is given in the tiles - if( mod_name =='stained_glass' and stained_glass_exception==1) then + + -- another case of special treatment needed; at least the color is given in the tiles + if( mod_name =='stained_glass' and stained_glass_exception==1) then local original_node = minetest.registered_items[ bname ]; if( original_node ~= nil ) then @@ -891,7 +891,7 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) end end - -- this mod does not seperate modname and objectname well enough :-( Naming scheme:- steel_framed_obsidian_glassCOLOR + -- this mod does not seperate modname and objectname well enough :-( Naming scheme:- steel_framed_obsidian_glassCOLOR if( mod_name =='framedglass' ) then block_name = string.sub( block_name, 28 ); end @@ -909,13 +909,13 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) local bloxdescr = original_node.description; -- bloxparts[1] will be filled with the name of the color: local bloxparts = string.split( bloxdescr, " "); - -- now extract the blocktype information + -- now extract the blocktype information if( bloxparts ~= nil and #bloxparts > 0 ) then -- we split with the color name local found_name = bloxparts[1]; local blocktype = 'blox_'..string.sub( block_name, string.len( found_name )+1 )..'_'; - + -- handle pink and purple if( found_name == 'pink' ) then found_name = 'light_red'; @@ -931,7 +931,7 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) -- if this point is reached, the decoding of the blox-block-name has failed return { error_code = "Error: Failed to decode color of this blox-block.", found_name = "", - blocktype = "" }; + blocktype = "" }; end @@ -944,9 +944,9 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) elseif( block_name == 'shutter_mahogany' ) then block_name = 'shutter_dark_orange'; - + -- this is the default, unpainted one..which can also be considered as "orange" in the menu --- elseif( blockname == 'shutter_oak' ) then +-- elseif( blockname == 'shutter_oak' ) then -- block_name = 'shutter_orange'; end end @@ -968,7 +968,7 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) if( colormachine.data[k].obj_postfix ) then local l = string.len( colormachine.data[k].obj_postfix); - if( string.len( block_name ) > l + if( string.len( block_name ) > l and string.sub( block_name, -1*l ) == colormachine.data[k].obj_postfix ) then block_name = string.sub( block_name, 1, (-1*l)-1 ); @@ -992,14 +992,14 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) liste[ curr_index ] = 'dark'; table.insert( liste, 'orange' ); curr_index = curr_index + 1; - + -- pink <=> light_red elseif( #liste > 0 and liste[ curr_index ]=='pink' ) then liste[ curr_index ] = 'light'; table.insert( liste, 'red' ); curr_index = curr_index + 1; end - + -- find out the saturation - either "s50" or omitted local sat = 0; if( curr_index > 1 and liste[ curr_index ] == "s50" ) then @@ -1060,7 +1060,7 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) -- for blocks that do not follow the naming scheme - the color cannot be decoded if( g==-1 and c==0 ) then - return { error_code ="This is a colored block: "..tostring( bname )..".", + return { error_code ="This is a colored block: "..tostring( bname )..".", found_name = "", blocktype = ""}; end @@ -1072,7 +1072,7 @@ colormachine.get_color_from_blockname = function( mod_name, block_name ) for k,v in pairs( colormachine.data ) do -- prefix and postfix have to fit - if( curr_index > 0 and add=="" and mod_name == v.modname and (liste[ curr_index ].."_") == v.add + if( curr_index > 0 and add=="" and mod_name == v.modname and (liste[ curr_index ].."_") == v.add -- if a postfix exists, we did check for that before and set blocktype accordingly and( not( blocktype ) or blocktype=='' or blocktype==k)) then add = v.add; @@ -1133,13 +1133,13 @@ colormachine.blocktype_menu = function( meta, new_color, page ) local y = 2; for i,k in ipairs( colormachine.ordered ) do - + -- only installed mods are of intrest - if( k ~= nil and colormachine.data[ k ].installed == 1 and i > start_at_offset and i <= (start_at_offset + per_page)) then + if( k ~= nil and colormachine.data[ k ].installed == 1 and i > start_at_offset and i <= (start_at_offset + per_page)) then -- that particular mod may not offer this color form = form.."button["..tostring(x)..","..tostring(y-0.8).. ";1,1;"..k..";"..colormachine.data[k].descr.."]".. - "item_image["..tostring(x)..","..tostring(y )..";1,1;"..colormachine.data[k].block.."]"; + "item_image["..tostring(x)..","..tostring(y )..";1,1;"..colormachine.data[k].block.."]"; local button = colormachine.print_color_image( meta, k, new_color, nil, nil, nil, tostring(x), tostring(y+1), 1);-- translated_color as return value for button if( button ~= "" ) then @@ -1198,7 +1198,7 @@ colormachine.main_menu_formspec = function( pos, option ) "label[3,0.0;1. Input - Insert material to paint:]".. "list[current_name;input;4.5,0.5;1,1;]".. - + "label[9.3,-0.5;Additional storage for dyes:]".. "list[current_name;extrastore;9.3,0;5,9]"; @@ -1206,7 +1206,7 @@ colormachine.main_menu_formspec = function( pos, option ) form = form.."label[0.5,0.25;CREATIVE MODE:]".."label[0.5,0.75;no dyes or input consumed]"; end - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory(); -- display the name of the color the machine is set to @@ -1228,7 +1228,7 @@ colormachine.main_menu_formspec = function( pos, option ) if( bname == v.block and colormachine.data[ k ].installed==1) then table.insert( found, k ); end - end + end -- make sure all output fields are empty for i = 1, inv:get_size( "output" ) do @@ -1288,13 +1288,13 @@ colormachine.main_menu_formspec = function( pos, option ) end -- so that we can determine the factor when taking blocks from the output slots meta:set_string('p_values', minetest.serialize( p_values )); - + -- this color was not supported if( anz_found == 0 ) then form = form.."label[2.2,3.0;Block is not available in that color.]"; return form; end - + form = form.."label[3.0,1.2;2. Select color for any style:]".. "label[3.0,2.9;3. Take output (determines style):]".. "list[current_name;output;"..tostring(out_offset+1)..",3.5;"..tostring( anz_found )..",1;]"; @@ -1308,7 +1308,7 @@ colormachine.main_menu_formspec = function( pos, option ) form = form.."label[2.2,3.0;ERROR! Failed to analyze the name of this node: "..tostring(bname).."]"; return form; end - + -- it may be a dye source for i,v in ipairs( colormachine.basic_dye_sources ) do @@ -1330,7 +1330,7 @@ colormachine.main_menu_formspec = function( pos, option ) -- the previous analyse was necessary in order to determine which block we ought to use if( option == 'remove_paint' ) then - -- actually remove the paint from the + -- actually remove the paint from the inv:set_stack( "input", 1, colormachine.data[ found_color_data.blocktype ].block.." "..tostring( anz_blocks )); -- update display (we changed the input!) return colormachine.main_menu_formspec(pos, "analyze"); @@ -1353,7 +1353,7 @@ colormachine.main_menu_formspec = function( pos, option ) else form = form.."label[5.5,2.0;This is the selected color.]"; end - + return form; end @@ -1368,7 +1368,7 @@ colormachine.get_node_name_painted = function( old_node_name, dye_node_name ) table.insert( possible_blocks, k ); unpainted_block = old_node_name; end - end + end if( unpainted_block == "" ) then local parts = string.split(old_node_name,":"); @@ -1399,7 +1399,7 @@ colormachine.get_node_name_painted = function( old_node_name, dye_node_name ) table.insert( possible_blocks, k ); end end - end + end -- remove paint if( not( dye_node_name ) or dye_node_name == "") then @@ -1429,7 +1429,7 @@ colormachine.get_node_name_painted = function( old_node_name, dye_node_name ) local new_block_name = colormachine.translate_color_name( nil, k, dye_name, cdata.c, cdata.s, cdata.g, 1 ); table.insert( found, new_block_name ); - end + end if( #found < 1 ) then return; end @@ -1439,7 +1439,7 @@ end colormachine.check_owner = function( pos, player ) -- only the owner can put something in - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); if( meta:get_string('owner') ~= player:get_player_name() ) then minetest.chat_send_player( player:get_player_name(), @@ -1468,7 +1468,7 @@ colormachine.allow_inventory_access = function(pos, listname, index, stack, play local stack_name = stack:get_name(); -- the dyes are a bit special - they accept only powder of the correct name - if( listname == "dyes" + if( listname == "dyes" and stack_name ~= ("dye:".. colormachine.colors_and_greys[ index ]) and stack_name ~= ("unifieddyes:"..colormachine.colors_and_greys[ index ]) and (stack_name ~= "dye:light_grey" or colormachine.colors_and_greys[ index ]~="lightgrey" ) @@ -1500,8 +1500,8 @@ end colormachine.on_metadata_inventory_put = function( pos, listname, index, stack, player ) - - local meta = minetest.env:get_meta(pos); + + local meta = minetest.get_meta(pos); local inv = meta:get_inventory(); -- nothing to do if onnly a dye was inserted @@ -1558,8 +1558,8 @@ end colormachine.on_metadata_inventory_take = function( pos, listname, index, stack, player ) - - local meta = minetest.env:get_meta(pos); + + local meta = minetest.get_meta(pos); local inv = meta:get_inventory(); @@ -1598,7 +1598,7 @@ colormachine.on_metadata_inventory_take = function( pos, listname, index, stack, else inv:set_stack( "input", 1, inv:get_stack("input",1):get_name().." "..tostring( anz_present )); end - + -- the main menu needs to be updated as well meta:set_string( 'formspec', colormachine.main_menu_formspec( pos, "analyze" )); return; @@ -1637,7 +1637,7 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) needed[ colormachine.colors[ c ]] = 1; -- handle saturation if( s==1 ) then needed[ "white" ]=1; -- light --- elseif( s==3 ) then -- normal color - no changes needed +-- elseif( s==3 ) then -- normal color - no changes needed elseif( s==4 ) then needed[ "white" ]=2; needed[ "black" ] =1; -- normal, low saturation elseif( s==5 ) then needed[ "black" ] =1; -- medium dark elseif( s==6 ) then needed[ "white" ]=1; needed[ "black" ] =1; -- medium dark, low saturation @@ -1651,7 +1651,7 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) anz_pigments = anz_pigments + v; end - + -- n: portions of *mixtures* needed local n = 1; -- if the colors are to be consumed, we need to calculate how many we actually need @@ -1663,7 +1663,7 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) -- now we need to check how many pigments of each color we have for i,v in ipairs( colormachine.colors_and_greys ) do - if( needed[ v ] and needed[ v ]> 0 ) then + if( needed[ v ] and needed[ v ]> 0 ) then -- find out how many blocks of this type we can actually color local stack = inv:get_stack( "dyes", i ); @@ -1688,8 +1688,8 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) n = math.min( anz_white, need_white ); end - - + + -- return how many *could* be colored if( amount_needed > 0 and do_consume ~= 1 ) then return n*anz_pigments; @@ -1700,8 +1700,8 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) for i,v in ipairs( colormachine.colors_and_greys ) do - if( needed[ v ] and needed[ v ]> 0 ) then - + if( needed[ v ] and needed[ v ]> 0 ) then + -- show how many pigments of this color are needed for the selected mixture -- normal color if( i <= #colormachine.colors ) then @@ -1717,9 +1717,9 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) if( amount_needed > 0 and n > 0 ) then local stack = inv:get_stack( "dyes", i ); local found = stack:get_count(); - --print( ' CONSUMED '..math.floor( n * needed[ v ] )..' of '..tostring( stack:get_name())); + --print( ' CONSUMED '..math.floor( n * needed[ v ] )..' of '..tostring( stack:get_name())); if( found > math.floor( n * needed[ v ] )) then - inv:set_stack( "dyes", i, stack:get_name()..' '..tostring( math.max( 1, found - math.floor( n * needed[ v ] )))); + inv:set_stack( "dyes", i, stack:get_name()..' '..tostring( math.max( 1, found - math.floor( n * needed[ v ] )))); else inv:set_stack( "dyes", i, "" ); end @@ -1730,7 +1730,7 @@ colormachine.calc_dyes_needed = function( meta, inv, amount_needed, do_consume ) -- in case pigments where consumed, return how many blocks where colored successfully if( amount_needed > 0 and n > 0 ) then ---print('Successfully colored: '..tostring( n*anz_pigments )); +--print('Successfully colored: '..tostring( n*anz_pigments )); return n*anz_pigments; end @@ -1763,9 +1763,9 @@ colormachine.mix_colors = function( inv, i, sender ) local stack1 = inv:get_stack( "dyes", mix[1] ); local stack2 = inv:get_stack( "dyes", mix[2] ); local stack3 = inv:get_stack( "dyes", i ); - - if( stack3:get_free_space() > 1 -- we need space for two + + if( stack3:get_free_space() > 1 -- we need space for two and stack1:get_count() > 0 and stack2:get_count() > 0 ) then @@ -1794,12 +1794,12 @@ colormachine.mix_colors = function( inv, i, sender ) elseif( stack3:get_free_space() > 1 ) then minetest.chat_send_player( sender:get_player_name(), 'Need '..colormachine.colors_and_greys[ mix[1] ]..' and '.. - colormachine.colors_and_greys[ mix[2] ]..' in order to mix '..farbe..'.'); + colormachine.colors_and_greys[ mix[2] ]..' in order to mix '..farbe..'.'); end end --- this generates the formspec for all supported mods and the general colormachine.dye_management_formspec +-- this generates the formspec for all supported mods and the general colormachine.dye_management_formspec colormachine.init = function() local liste = {}; -- create formspecs for all machines @@ -1820,7 +1820,7 @@ colormachine.init = function() end end - table.sort( liste, function(a,b) return colormachine.data[a].nr < colormachine.data[b].nr end); + table.sort( liste, function(a,b) return colormachine.data[a].nr < colormachine.data[b].nr end); colormachine.ordered = liste; -- if no flowers are present, take dye sources from default (so we only have to depend on dyes) @@ -1854,7 +1854,7 @@ colormachine.init = function() -- align colors horizontal for i,k in ipairs( colormachine.colors ) do - + local prefix = 'dye:'; if( i==4 or i==6 or i==8 or i==12 or i==14 ) then if( colormachine.data[ 'unifieddyes_' ].installed == 1 ) then @@ -1871,15 +1871,15 @@ colormachine.init = function() form = form.."item_image["..tostring(i)..",1;1,1;"..source.."]"; -- even those colors may be additionally mixed - if( #colormachine.dye_mixes[ colormachine.colors_and_greys[ i ] ] == 2 ) then + if( #colormachine.dye_mixes[ colormachine.colors_and_greys[ i ] ] == 2 ) then form = form.. "button["..tostring(i-0.1)..",1.9;0.8,0.2;mix_"..colormachine.colors_and_greys[ i ]..";mix]"; end -- a color that can be mixed - elseif( #colormachine.dye_mixes[ colormachine.colors_and_greys[ i ] ] == 2 ) then + elseif( #colormachine.dye_mixes[ colormachine.colors_and_greys[ i ] ] == 2 ) then local mixes = colormachine.dye_mixes[ colormachine.colors_and_greys[ i ] ]; - + local source1 = 'dye:'..colormachine.colors_and_greys[ mixes[1] ]; local source2 = 'dye:'..colormachine.colors_and_greys[ mixes[2] ]; @@ -1887,7 +1887,7 @@ colormachine.init = function() "item_image["..tostring(i+0.3)..",1.3;1,1;"..source2.."]".. "button["..tostring(i-0.1)..",1.9;0.8,0.2;mix_"..colormachine.colors_and_greys[ i ]..";mix]"; end - + form = form.. "item_image["..tostring(i)..",2;1,1;"..tostring( prefix..colormachine.colors[ i ] ).."]".. "label["..tostring(i)..",3.6;" ..tostring( colormachine.colors_and_greys[ i ] ).."]"; else @@ -1897,14 +1897,14 @@ colormachine.init = function() -- align grey-values vertical for i,k in ipairs( colormachine.grey_names ) do - + if( i ~= 2 or colormachine.data[ 'unifieddyes_' ].installed == 1 ) then local source = colormachine.basic_dye_sources[ #colormachine.colors + i ]; if( source and source ~= "" ) then form = form.."item_image[10,"..tostring(i+4)..";1,1;"..source.."]"; - elseif( #colormachine.dye_mixes[ colormachine.colors_and_greys[ #colormachine.colors + i ] ] == 2 ) then + elseif( #colormachine.dye_mixes[ colormachine.colors_and_greys[ #colormachine.colors + i ] ] == 2 ) then local mixes = colormachine.dye_mixes[ colormachine.colors_and_greys[ #colormachine.colors + i ] ]; @@ -1915,7 +1915,7 @@ colormachine.init = function() "item_image[10.3,"..tostring(i+4.3)..";1,1;"..source2.."]".. "button[9.8," ..tostring(i+4.9)..";0.8,0.2;mix_"..colormachine.colors_and_greys[ #colormachine.colors + i ]..";mix]"; end - + local dye_name = 'dye:'..k; -- lightgrey exists only in unifieddyes @@ -1930,7 +1930,7 @@ colormachine.init = function() elseif( i==4 ) then dye_name = 'dye:dark_grey'; end - + if( dye_name ~= "" ) then form = form.. "item_image[11,"..tostring(i+4)..";1,1;"..tostring( dye_name ).."]".. "label[ 12.9,"..tostring(i+4)..";" ..tostring( colormachine.colors_and_greys[ #colormachine.colors + i ] ).."]"; @@ -1939,8 +1939,8 @@ colormachine.init = function() form = form.."label[12.2,"..tostring(i+4)..";n/a]"; end end - - + + colormachine.dye_management_formspec = form; end @@ -1957,7 +1957,7 @@ minetest.after( 0, colormachine.init ); -- unifiedbricks: clay blocks, brick blocks (skip individual clay lumps and bricks!) -- multicolor: 3 shades, usual amount of colors -- cotton: (by jordach) probably the same as coloredwood --- +-- -- stained_glass: 9 shades/intensities @@ -1979,7 +1979,7 @@ minetest.register_node("colormachine:colormachine", { on_construct = function(pos) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); meta:set_string('selected_shade', 3 ); -- grey-shade meta:set_string('selected_grey_shade', 1 ); @@ -2001,7 +2001,7 @@ minetest.register_node("colormachine:colormachine", { end, after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); meta:set_string( "owner", ( placer:get_player_name() or "" )); meta:set_string( "infotext", "Spray booth (owned by "..( meta:get_string( "owner" ) or "" )..")"); @@ -2051,15 +2051,15 @@ minetest.register_node("colormachine:colormachine", { return; elseif( colormachine.data[ k ] ) then -- remember the page we where at - meta:set_string( 'formspec', colormachine.data[ k ].formspec.. + meta:set_string( 'formspec', colormachine.data[ k ].formspec.. "field[20,20;0.1,0.1;page;;"..tostring(fields.page).."]" ); return; elseif( k=='key_escape') then -- nothing to do else local inv = meta:get_inventory(); - - -- perhaps we ought to mix colors + + -- perhaps we ought to mix colors for i,f in ipairs( colormachine.colors_and_greys ) do if( k==("mix_"..f )) then colormachine.mix_colors( inv, i, sender ); @@ -2083,8 +2083,8 @@ minetest.register_node("colormachine:colormachine", { elseif( k=='last_page') then fields.page = math.ceil(#colormachine.ordered/(3*13)-1); end - - meta:set_string( 'formspec', colormachine.blocktype_menu( meta, k, fields.page )); + + meta:set_string( 'formspec', colormachine.blocktype_menu( meta, k, fields.page )); else @@ -2102,7 +2102,7 @@ minetest.register_node("colormachine:colormachine", { return 0; end, - + allow_metadata_inventory_put = function(pos, listname, index, stack, player) return colormachine.allow_inventory_access(pos, listname, index, stack, player, "put" ); end, @@ -2122,7 +2122,7 @@ minetest.register_node("colormachine:colormachine", { can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() if( not( colormachine.check_owner( pos, player ))) then @@ -2131,13 +2131,13 @@ minetest.register_node("colormachine:colormachine", { if( not( inv:is_empty("input")) or not( inv:is_empty("refill"))) then - minetest.chat_send_player( player:get_player_name(), "Please remove the material in the input- and/or refill slot first!"); - meta:set_string( 'formspec', colormachine.blocktype_menu( meta, meta:get_string('selected_name'), 0)); + minetest.chat_send_player( player:get_player_name(), "Please remove the material in the input- and/or refill slot first!"); + meta:set_string( 'formspec', colormachine.blocktype_menu( meta, meta:get_string('selected_name'), 0)); return false; end if( not( inv:is_empty("dyes"))) then - minetest.chat_send_player( player:get_player_name(), "Please remove the stored dyes first!"); - meta:set_string( 'formspec', colormachine.blocktype_menu( meta, meta:get_string('selected_name'), 0 )); + minetest.chat_send_player( player:get_player_name(), "Please remove the stored dyes first!"); + meta:set_string( 'formspec', colormachine.blocktype_menu( meta, meta:get_string('selected_name'), 0 )); return false; end diff --git a/paint_roller.lua b/paint_roller.lua old mode 100644 new mode 100755 diff --git a/textures/colormachine_bottom.png b/textures/colormachine_bottom.png old mode 100644 new mode 100755 index 7c429f990aaad8e7ba7fd960dabbf264226868aa..39a178195cf48aad9193557dc9d08d36c55445f5 GIT binary patch delta 1866 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 W%x%${Ut%Z#0000ABHH;2MF6+kq4OAFTkRaPi`k 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 literal 2429 zcmV-@34->CP)3s-$}n75!q)3>@Sow}1$NVIo(6sZ{0eYK1#YkRE^r0rHxk2Y;N*MmV;lxT>JWt3 zMaE&pbI(0bEIG5Yy^TjDSzufZys;X&STfgt5u(9B7z7shoFiGfFL4x0htRD1>6ZC5JcEKxPden_E#+P$gmvgXFY1}Bo#Ie z%!yqDaW;Yi(5i9p_=4d-mPn_hcO7TE{2J~~Gp7%VF%|0OxH*yp47?aVIw1zOjvQj# z-J|a#sty<_MM4Ousxp>}Bb2fthJd?c4tL$P;Ks{)NGGKCZc(pXMBKm)+`*kr6bB?K zn1D=|ivkf^Gxm3ONwXPg)}tc$*f4XN8H&JcK4-bNOV@RX2-%&V-db?=%93sonElM0 z{L(FKwGSFV1Pw|B+#SrOSKD;4ZYUstFpeYRYNWLWqV%aJbb(e1)*33n{_YN?HcByS ztti5U{Q(0G+&gFW%7Cv7Tp&e6*Zl>Gg9C^oQL&{%5D0<*tu-1#EtTE9+Z2b8B1euK z!QD|&LEJd7xkYI!nl%ikG~=GT7u^1@B{aZ6`VLCP*8;8XtgNA;2!c0968Kqet+r`aM%$aR&vRv*l@8>9jI~?EI;OgZi4mgek#g;1w3DJNx!+`@S zO?`EyFDv-y&`)|0g%~13D~L44Vgz+mWNKG!jaxfAIL>l!9|=MfxUe@&iDr(k9A=;? zfj3&tAcC2%?Yb^f1nC4>C}bcC?#^l$i5MCbbtgB&CZnMM^Nl&gNWU>dRVfZh1dR%+ z5CyX1u82-Ms?e?NT3bbf;?<^tt3w2hf;FSmN{Grh82vn&pXc3=y~36mv#4-Sk1W8qz4AX}O;YGNYSs(Ds+OK@1@fLS(V%(0&Ss3%~Gdm^FHhoOoGz_xFubD!xv(Yaw#& z$`uUfN2l-PyBbiDDUjUAdBm&{LPT|sfRb}2ra;b_l!V2BO+pZ&ihv5E!1HQ7uA4O0@n zsd`0l13?H9h%wQnj@Wf*h~U#e`|k)$);5j~@u>wwZlIhImgaBl;@A0m535Gnfdvll3 zoz*f=mx@yBng=X6qZM}N19x@D*u3*zjxA1bGwo4AV_fZ%bEdV11B>|vkIY|~_}D%L zC@+W8Z)su}jfZF7MRd-Yzx?(j8hGmwF(pD!RGD}nn2*xr-<|-JLtlM>jd|qJ;S@O!eBo0crHlQ#fT@ty z8X6RF>j<< zN6U?!PyYh|N5B4Y&V2Qmw=Q_>p;LrD@REI+_qQhr!T5YFJSshpQ25Hh1K>Vcak-pW zp|(cOnJ)Jn?l))@l5~h0ZD{n1M6Hch8>Ir)*m~kYc0TiM%6{dshfa}Zk+P~h{EZiQ z?4eVT;N|eUystdL?-5nXIMU4* z#1LsVskC48DDc!%PjmOdDGz*e^0T|6VLAPjY=8!ROD|?NrKdx!H?d%72)yy%yBvGh zy)5Sa+ructz~1r<7ygGa*SC2pINr|93uTa?boOMHxQM$aD9W00000NkvXXu0mjfHYAKb diff --git a/textures/colormachine_side.png b/textures/colormachine_side.png old mode 100644 new mode 100755 index cdcc98133032924ae5a2b5bd9e10a95337577485..e23ab43f7ef33ec4cbd792e7c3738c0929004c26 GIT binary patch delta 1919 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 delta 2309 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 A`~Uy| delta 2302 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 delta 402 zcmX@YxR7~*WIY=L14D6D)fXVeSRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv=#?*(1o8 zfuTx`fuW&=f#DZWsNn?zL#Y7+!>a@a2CEqi4B`cIb_Lo1B{&N_B8wRq_zr_G*ZL5JGGjecJwrqH&raq*Wlua^977`9-%dTq zdsu-}x7YF?H=u>d$*5$DjI2q(J;s0ay+uH>WnSEtsXf4*u za9iX0zTHAh;oaVF&L{iK8Vu96$6sd52#ClockhcgkYcFfWa!u;+rZWoc&TOZYYJi2;XqJP7rgq7?mp$e@Tf-0xaOP$ntz;vZ$<-O=n zos8!m$y}6J!|ia|GrKy1;r(&3dEcuZSc|vuGE9tL$kp&f;QyXa6XwK)v~ed`Zjg!K u^C^80FFmcq`J2uRtDYUr%ToV~A2OJ|E`GW5K?ZK1mpxtmT-G@yGywogRh26M