1
0
mirror of https://github.com/Sokomine/colormachine.git synced 2024-09-19 02:40:33 +02:00

removed obsolete functions, cleaned up, improved support for hardware color

This commit is contained in:
Sokomine 2017-08-08 03:11:09 +02:00
parent 3a649a80ad
commit e9215fcf31

270
init.lua
View File

@ -20,9 +20,10 @@
-- Version 0.6
-- Version 0.9
-- Changelog:
-- 07.08.17 Adjusted to new hardware coloring (paramtype2 based)
-- 16.02.17 Removed support for lrfurn (that mod uses the new coloring mechanism as well)
-- 08.02.17 Removed support for homedecor, blox, plasticbox, stainedglass, coloredwood and unifiedbricks
-- as those now use a new feature of newer versions of MT that makes the colormachine
@ -87,24 +88,6 @@ colormachine.colors = {
-- TODO: what about nodes with the old names? aqua -> spring, skyblue -> azure, and redviolet -> rose aliases
}
--[[
-- information about how to compute the ColorString for ^[colorize
colormachine.color_components = {
{"red", 2, 0, 0 }, -- ff 00 00
{"orange", 2, 1, 0 }, -- ff 80 00
{"yellow", 2, 2, 0 }, -- ff ff 00
{"lime", 1, 2, 0 }, -- 80 ff 00
{"green", 0, 2, 0 }, -- 00 ff 00
{"spring", 0, 2, 1 }, -- 00 ff 80 old name: "aqua",
{"cyan", 0, 2, 2 }, -- 00 ff ff
{"azure", 0, 1, 2 }, -- 00 80 ff old: "skyblue",
{"blue", 0, 0, 2 }, -- 00 00 ff
{"violet", 1, 0, 2 }, -- 80 00 ff
{"magenta",2, 0, 2 }, -- ff 00 ff
{"rose", 2, 0, 1 }, -- ff 00 80 old: "redviolet"
}
--]]
-- set this to 0 if you're using that branch of stained_glass where the node names correspond to those of unified_dyes
local stained_glass_exception = 0;
@ -230,18 +213,6 @@ colormachine.dye_palette[ "unifieddyes_palette_colorwallmounted.png"] = {
{ 11, 5, -1, "nonexistant", 31, "550055"}, -- 32 very dark mangeta
};
--[[
colormachine.dye_palette[ "unifieddyes_palette_reds.png"] = {
{ 1, 1, -1, "nonexistant", 0, "ff0000"}, -- 1
{ 1, 2, -1, "nonexistant", 1, "ff8000"}, -- 2
{ 1, 3, -1, "nonexistant", 2, "ffff00"}, -- 3
{ 1, 4, -1, "nonexistant", 3, "00ff00"}, -- 4
{ 1, 5, -1, "nonexistant", 4, "00ffff"}, -- 5
{ 1, 6, -1, "nonexistant", 5, "0000ff"}, -- 6
{ 1, 7, -1, "nonexistant", 6, "8000ff"}, -- 7
{ 1, 8, -1, "dye:magenta", 7, "ff00ff"}, -- 8
};
--]]
colormachine.add_unifieddyes_palette = function( color_name, c_nr )
local color_name_old = color_name;
@ -281,52 +252,6 @@ for c_nr,color_name in ipairs( colormachine.colors ) do
end
colormachine.add_unifieddyes_palette( "grey", -1 );
local dye_palette_nr = {};
-- dye name { colorfacedir_palette.png, unifieddyes_palette_colorwallmounted.png, #colorcode}
dye_palette_nr[ "dye:white" ] = { 0, 0, "ffffff", "ffffff"};
dye_palette_nr[ "dye:red" ] = { 1, 16, "8b0000", "a80000"}; -- (close enough?)
dye_palette_nr[ "dye:orange" ] = { 2, 9, "ffa500", "ff8000"}; -- (close enough?)
dye_palette_nr[ "dye:yellow" ] = { 3, 10, "eeee00", "ffff00"}; -- (bright yellow)
dye_palette_nr[ "dye:green" ] = { 4, 27, "006400", "005500"}; -- (very dark green)
dye_palette_nr[ "dye:blue" ] = { 5, 29, "00008b", "000055"}; -- (very dark blue)
dye_palette_nr[ "dye:grey" ] = { 6, 2, "808080", "808080"};
dye_palette_nr[ "dye:magenta" ] = { 7, 15, "ff1493", "ff00ff"};
-- we have some dyes left (standard: 15 dyes)
dye_palette_nr[ "dye:black" ] = {-1, 4, nil, "141414"};
dye_palette_nr[ "dye:brown" ] = {-1, 25, nil, "552a00"}; -- also: very dark orange
dye_palette_nr[ "dye:cyan" ] = {-1, 20, nil, "00a8a8"};
-- dark green is darker than normal green; necessary because
-- the colors ought to be the same as for the 8-color-palette
dye_palette_nr[ "dye:dark_green"] = {-1, 19, nil, "00a800"};
dye_palette_nr[ "dye:dark_grey" ] = {-1, 3, nil, "404040"};
dye_palette_nr[ "dye:pink" ] = {-1, 7, nil, "ffc1da"};
dye_palette_nr[ "dye:violet" ] = {-1, 22, nil, "5400a8"};
dye_palette_nr[ "nonexistant" ] = {-1, 1, nil, "bfbfbf"}; -- light grey
dye_palette_nr[ "nonexistant" ] = {-1, 5, nil, "8080ff"}; -- bright violett
dye_palette_nr[ "nonexistant" ] = {-1, 6, nil, "aa5500"}; -- ocker brown
dye_palette_nr[ "nonexistant" ] = {-1, 8, nil, "ff0000"}; -- bright red
dye_palette_nr[ "nonexistant" ] = {-1, 11, nil, "00ff00"}; -- bright green
dye_palette_nr[ "nonexistant" ] = {-1, 12, nil, "00ffff"}; -- bright cyan
dye_palette_nr[ "nonexistant" ] = {-1, 13, nil, "0000ff"}; -- bright blue
dye_palette_nr[ "nonexistant" ] = {-1, 14, nil, "8000ff"}; -- lila
dye_palette_nr[ "nonexistant" ] = {-1, 17, nil, "a85400"}; -- dark orange
dye_palette_nr[ "nonexistant" ] = {-1, 18, nil, "a8a800"}; -- dark yellow
dye_palette_nr[ "nonexistant" ] = {-1, 21, nil, "0000a8"}; -- dark blue
dye_palette_nr[ "nonexistant" ] = {-1, 23, nil, "a800a8"}; -- dark magenta
dye_palette_nr[ "nonexistant" ] = {-1, 24, nil, "550000"}; -- very dark red
dye_palette_nr[ "nonexistant" ] = {-1, 26, nil, "555500"}; -- very dark yellow
dye_palette_nr[ "nonexistant" ] = {-1, 28, nil, "005500"}; -- very dark cyan
dye_palette_nr[ "nonexistant" ] = {-1, 30, nil, "2a0055"}; -- very dark violet
dye_palette_nr[ "nonexistant" ] = {-1, 31, nil, "550055"}; -- very dark mangeta
-- dye numbers left uncovered in the colorwallmounted palette:
-- 1 5 6
-- 11 12 13 14 15 17 18
-- 21 23 24 26 28
--30 31
-- 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
@ -832,6 +757,10 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob
c = tonumber(meta:get_string('selected_color'));
s = tonumber(meta:get_string('selected_shade'));
g = tonumber(meta:get_string('selected_grey_shade'));
-- wrong metadata?
if( not(c) or c=="" or not(s) or s=="" or not(g) or g=="") then
return nil;
end
end
@ -868,59 +797,6 @@ colormachine.translate_color_name = function( meta, k, new_color, c, s, g, as_ob
end
end
--[[
if( colormachine.data[k].palette == "colorfacedir_palette.png" ) then
-- no lime, spring, cyan, azure, violet or rose
if( (c==4 or c==6 or c==7 or c==8 or c==10 or c==12 )
-- no lightgrey, darkgrey or black (only white and grey)
or (g==2 or g==4 or g==5 )
-- no other saturation than normal
or (g==-1 and s~=3 )) then
return nil;
end
-- there is just one block; coloring works through param2/itemstack data
if( as_obj_name==1 ) then
return colormachine.data[k].block;
end
local palette_idx = nil;
if( g==1 ) then
palette_idx = 1; -- white
elseif( c==1 ) then
palette_idx = 2; -- red
elseif( c==2 ) then
palette_idx = 3; -- orange
elseif( c==3 ) then
palette_idx = 4; -- yellow
elseif( c==5 ) then
palette_idx = 5; -- green
elseif( c==9 ) then
palette_idx = 6; -- blue
elseif( g==3 ) then
palette_idx = 7; -- grey
elseif( c==11) then
palette_idx = 8; -- magenta
else
return nil;
end
local found = nil;
for dye_name,v2 in pairs(dye_palette_nr ) do
if( v2 and v2[1]==palette_idx-1 ) then
found = dye_name;
end
end
if( not( found )) then
return nil;
end
-- formspec_escape is required here
return minetest.formspec_escape(
colormachine.data[k].texture_name.."^[colorize:#"..
dye_palette_nr[ found ][3]..":128");
end
end
--]]
local k_orig = k;
-- unifieddyes_ does not supply all colors
@ -1180,8 +1056,61 @@ end
-- if a block is inserted, the name of its color is very intresting (for removing color or for setting that color)
-- (kind of the inverse of translate_color_name)
colormachine.get_color_from_blockname = function( mod_name, block_name )
-- palette_index is used for hardware coloring: stack:get_meta():get_string("palette_index"); it is nil otherwise
colormachine.get_color_from_blockname = function( mod_name, block_name, palette_index )
-- we are dealing with the new hardware coloring
if( palette_index ~= nil and palette_index ~= "") then
local data = colormachine.data[ block_name.."_" ];
if( not( data )
or not( data.palette )
or not( data.paramtype2 )) then
return { error_code ="Sorry, this hardware colored block is not supported by the spray booth.",
found_name = "",
blocktype = ""};
end
-- determine the name of the color (found_name)
local palette = colormachine.dye_palette[ data.palette ];
local found_name = nil;
-- palette_index seems to carry the multiplier in it
local p2 = tonumber(palette_index);
if( data.paramtype2=="colorfacedir" ) then
p2 = (p2/32) - (p2%32);
elseif( data.paramtype2 == "colorwallmounted" ) then
p2 = (p2/ 8) - (p2% 8);
end
-- determine the (unifieddyes) name of the color the block has
for i,c in ipairs( palette ) do
if( c[5] == p2 ) then
if( c[3]==-1 ) then
-- compose the name
found_name = colormachine.colors[c[1] ];
local prefix = colormachine.prefixes[ (c[2]/2) - c[2]%2 ];
local postfix = "";
if( c[2]%2==1 ) then
postfix = "_s50";
end
if( found_name and prefix and postfix ) then
found_name = prefix..found_name..postfix;
end
else
found_name = colormachine.grey_names[c[3]];
end
end
end
if( not( found_name )) then
return { error_code = "Error: No suitable palette found with index "..tostring(palette_index).." for this block.",
found_name = "",
blocktype = ""};
end
return { error_code = nil,
found_name = found_name,
blocktype = block_name.."_"};
end
if( not( mod_name )) then
mod_name = "does not exist";
end
local bname = mod_name..":"..block_name;
local found = {};
for k,v in pairs( colormachine.data ) do
@ -1506,6 +1435,16 @@ colormachine.blocktype_menu = function( meta, new_color, page )
return form;
end
colormachine.owner_has_creative_priv = function( meta )
if( not( meta )) then
return false;
end
local owner = meta:get_string("owner");
if( not(owner) or owner=="" or not(minetest.check_player_privs( owner, {creative=true}))) then
return false;
end
return true;
end
-- this function tries to figure out which block type was inserted and how the color can be decoded
@ -1528,12 +1467,13 @@ colormachine.main_menu_formspec = function( pos, option )
"label[9.3,-0.5;Additional storage for dyes:]"..
"list[current_name;extrastore;9.3,0;5,9]";
if( minetest.setting_getbool("creative_mode") ) then
local meta = minetest:get_meta(pos);
local inv = meta:get_inventory();
if( colormachine.owner_has_creative_priv( meta )) then
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 inv = meta:get_inventory();
-- display the name of the color the machine is set to
form = form.."label[1.0,4.3;Current painting color:]"..
@ -1553,6 +1493,14 @@ colormachine.main_menu_formspec = function( pos, option )
for k,v in pairs( colormachine.data ) do
if( bname == v.block and colormachine.data[ k ].installed==1) then
table.insert( found, k );
-- the block might be listed under "similar blocks"
elseif( colormachine.data[ k ].similar_blocks) then
for j,block in ipairs( colormachine.data[ k ].similar_blocks) do
if( block and block == bname ) then
table.insert( found, k );
end
end
end
end
@ -1563,8 +1511,15 @@ colormachine.main_menu_formspec = function( pos, option )
local anz_blocks = stack:get_count();
-- a block that can be colored
if( #found > 0 ) then
-- are we dealing with one of the new blocks using hardware coloring?
local stackmeta = stack:get_meta();
local palette_index = nil;
if( meta ) then
palette_index = stackmeta:get_string("palette_index");
end
-- a block (unpainted) that can be colored
if( #found > 0 and (not( palette_index) or palette_index=="" or tonumber(palette_index)==0)) then
local out_offset = 3.5-math.floor( #found / 2 );
if( out_offset < 0 ) then
@ -1593,11 +1548,12 @@ colormachine.main_menu_formspec = function( pos, option )
-- how many of these blocks can we actually paint?
local can_be_painted = 0;
if( not( minetest.setting_getbool("creative_mode") )) then
if( not( colormachine.owner_has_creative_priv( meta ))) then
can_be_painted = colormachine.calc_dyes_needed( meta, inv, math.ceil( anz_blocks / factor ), 0 );
else
can_be_painted = 99; -- an entire stack can be painted in creative mode
end
local ostack = inv:get_stack( "output", i );
inv:set_stack( "output", i, block_name.." "..tostring( math.min( can_be_painted * factor, anz_blocks )));
p_values[ i ] = factor;
@ -1648,7 +1604,7 @@ colormachine.main_menu_formspec = function( pos, option )
-- it is possible that we are dealing with an already painted block - in that case we have to dertermie the color
local found_color_data = colormachine.get_color_from_blockname( parts[1], parts[2] );
local found_color_data = colormachine.get_color_from_blockname( nil, stack:get_name(), palette_index );
if( found_color_data.error_code ~= nil ) then
form = form.."label[2.2,3.0;"..found_color_data.error_code..".]";
return form;
@ -1686,18 +1642,23 @@ end
-- determines the name of the dye that was used to create the current param2 value;
-- transforms param2 to the value as suitable if dye dye_node_name is applied;
-- old_node_name is just passed on
colormachine.identify_color_by_param2_and_palette = function( dye_node_name, param2, faktor, palette_index, old_node_name )
colormachine.identify_color_by_param2_and_palette = function( dye_node_name, param2, faktor, old_node_name, palette_name )
if( not( colormachine.dye_palette[ palette_name ] )) then
return;
end
local palette = colormachine.dye_palette[ palette_name ];
local old_dye_name = nil;
local color = math.floor(( param2 - (param2%faktor))/faktor);
local new_param2 = param2;
for k,v in pairs( dye_palette_nr ) do
-- data structure of entries in palette: c(olor), s(hade), g(reyscale), dye_name, param2_value, color_code
for i,c in ipairs( palette ) do
-- find out the name of the old dye that had been used
if( v[ palette_index ] == color ) then
old_dye_name = k;
if( c[5] == color ) then -- param2_value
old_dye_name = c[4]; -- dye_name
end
-- adjust param2 to the new color
if( dye_node_name == k and v[ palette_index ]>-1) then
new_param2 = (new_param2%faktor) + (v[ palette_index ]*faktor);
if( dye_node_name == c[4] and c[5]>-1) then
new_param2 = (new_param2%faktor) + (c[5]*faktor);
end
end
-- the color can be translated to the color-palette from the dye mod
@ -1731,11 +1692,11 @@ colormachine.get_node_name_painted = function( old_node_name, dye_node_name, par
-- use normal dyes for nodes using colorfacedir_palette
if( def.palette and def.palette == "colorfacedir_palette.png" and def.paramtype2=="colorfacedir") then
return colormachine.identify_color_by_param2_and_palette( dye_node_name, param2,32, 1, old_node_name );
return colormachine.identify_color_by_param2_and_palette( dye_node_name, param2, 32, old_node_name, def.palette );
end
if( def.palette and def.palette == "unifieddyes_palette_colorwallmounted.png" and anz_color==32) then
return colormachine.identify_color_by_param2_and_palette( dye_node_name, param2, 8, 2, old_node_name );
return colormachine.identify_color_by_param2_and_palette( dye_node_name, param2, 8, old_node_name, def.palette );
end
--[[
@ -1840,7 +1801,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(),
@ -1902,7 +1863,7 @@ 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
@ -1960,14 +1921,14 @@ 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();
if( listname == "output" ) then
-- in creative mode, no pigments are consumed
if( minetest.setting_getbool("creative_mode") ) then
if( colormachine.owner_has_creative_priv( meta )) then
-- update the main menu
meta:set_string( 'formspec', colormachine.main_menu_formspec( pos, "analyze" ));
return;
@ -2255,6 +2216,7 @@ colormachine.init_hardware_colored = function()
palette = def.palette,
paramtype2 = def.paramtype2,
texture_name= texture,
installed = 1,
similar_blocks = { k }};
nr_add = nr_add + 1;
else
@ -2452,7 +2414,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 );
@ -2474,7 +2436,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 "" )..")");
@ -2491,7 +2453,7 @@ minetest.register_node("colormachine:colormachine", {
fields.page = 0;
end
local meta = minetest.env:get_meta(pos);
local meta = minetest:get_meta(pos);
for k,v in pairs( fields ) do
if( k == 'main_menu' ) then
meta:set_string( 'formspec', colormachine.main_menu_formspec(pos, "analyze") );
@ -2595,7 +2557,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