diff --git a/init.lua b/init.lua index 2391f87..e32a070 100644 --- a/init.lua +++ b/init.lua @@ -18,6 +18,7 @@ chesttools.update_price = { {'default:chest', 'default:steel_ingot', 0, 'normal', 1, 'nothing'}, {'default:chest_locked', 'default:steel_ingot', 1, 'locked', 2, 'steel ingot'}, {'chesttools:shared_chest', 'default:steel_ingot', 2, 'shared', 3, 'steel ingot(s)'}, + {'chesttools:shared_chest_wall', 'default:steel_ingot', 2, 'shared', 3, 'steel ingot(s)'}, {'locks:shared_locked_chest', 'default:steel_ingot', 3, 'locks', 4, 'steel ingot(s)'}, {'technic:iron_chest', 'technic:iron_chest', 1, 'iron', 5, 'Iron chest'}, {'technic:iron_locked_chest', 'technic:iron_locked_chest', 1, 'iron_locked', 6, 'Iron locked chest'}, @@ -33,22 +34,25 @@ chesttools.update_price = { chesttools.chest_add = {}; chesttools.chest_add.tiles = { - "chesttools_blue_chest_top.png", "chesttools_blue_chest_top.png", "chesttools_blue_chest_side.png", - "chesttools_blue_chest_side.png", "chesttools_blue_chest_side.png", "chesttools_blue_chest_lock.png"}; +-- "chesttools_blue_chest_top.png", "chesttools_blue_chest_top.png", "chesttools_blue_chest_side.png", +-- "chesttools_blue_chest_side.png", "chesttools_blue_chest_side.png", "chesttools_blue_chest_lock.png"}; + "chesttools_white_chest_top.png", "chesttools_white_chest_top.png", "chesttools_white_chest_side.png", + "chesttools_white_chest_side.png", "chesttools_white_chest_side.png", "chesttools_white_chest_lock.png"}; chesttools.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}; chesttools.chest_add.tube = {}; -- additional/changed definitions for pipeworks; -- taken from pipeworks/compat.lua -if( minetest.get_modpath( 'pipeworks' )) then +local has_pipeworks = minetest.get_modpath( 'pipeworks' ) +if( has_pipeworks ) then chesttools.chest_add.tiles = { - "chesttools_blue_chest_top.png^pipeworks_tube_connection_wooden.png", - "chesttools_blue_chest_top.png^pipeworks_tube_connection_wooden.png", - "chesttools_blue_chest_side.png^pipeworks_tube_connection_wooden.png", - "chesttools_blue_chest_side.png^pipeworks_tube_connection_wooden.png", - "chesttools_blue_chest_side.png^pipeworks_tube_connection_wooden.png", - "chesttools_blue_chest_lock.png"}; + chesttools.chest_add.tiles[1].."^pipeworks_tube_connection_wooden.png", + chesttools.chest_add.tiles[1].."^pipeworks_tube_connection_wooden.png", + chesttools.chest_add.tiles[3].."^pipeworks_tube_connection_wooden.png", + chesttools.chest_add.tiles[3].."^pipeworks_tube_connection_wooden.png", + chesttools.chest_add.tiles[3].."^pipeworks_tube_connection_wooden.png", + chesttools.chest_add.tiles[6]}; chesttools.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, tubedevice = 1, tubedevice_receiver = 1 }; chesttools.chest_add.tube = { @@ -69,9 +73,11 @@ end chesttools.formspec = "size[9,10]".. "list[current_name;main;0.5,0.3;8,4;]".. - "label[0.0,9.7;Title/Content:]".. + "label[0.5,9.7;Name:]".. "field[1.8,10.0;6,0.5;chestname;;]".. - "button[7.5,9.7;1,0.5;set_chestname;Store]".. + "button[7.5,9.7;1,0.5;set_chestname;Store\nName]".. +-- "button[8.6,9.7;0.5,0.5;change_color;C]".. + "image_button[8.4,9.7;0.5,0.5;chesttools_palette.png;change_color;]".. "label[0.0,4.4;Main]".. "button[1.0,4.5;1,0.5;craft;Craft]".. "button[7.0,4.5;0.5,0.5;drop_all;DA]".. @@ -90,11 +96,14 @@ end chesttools.may_use = function( pos, player ) - if( not( player )) then + if not (pos and player and player.is_player and player:is_player() and not player.is_fake_player) then return false; end local name = player:get_player_name(); local meta = minetest.get_meta( pos ); + if(not(meta)) then + return false + end local owner = meta:get_string( 'owner' ) -- the owner can access the chest if( owner == name or owner == "" ) then @@ -114,10 +123,25 @@ chesttools.on_receive_fields = function(pos, formname, fields, player) return; end + if( fields.change_color ) then + local node = minetest.get_node( pos ) + local add = 0 + if(node and node.name and minetest.registered_nodes[node.name]) then + local def = minetest.registered_nodes[node.name] + if(def and def.paramtype2 == "colorfacedir") then + add = 32 + elseif(def and def.paramtype2 == "colorwallmounted") then + add = 8 + end + minetest.swap_node(pos, {name=node.name, param2=(node.param2 + add) % 256}) + return + end + end + local meta = minetest.get_meta( pos ); local chestname = meta:get_string( 'chestname' ); local spos = pos.x .. "," .. pos.y .. "," .. pos.z - if( fields.set_chestname and fields.chestname ) then + if( fields.set_chestname and fields.chestname and fields.chestname ~= chestname) then chestname = tostring( fields.chestname ); meta:set_string( 'chestname', chestname ); meta:set_string("infotext", "\""..chestname.."\" Chest (owned by "..meta:get_string("owner")..")") @@ -129,9 +153,11 @@ chesttools.on_receive_fields = function(pos, formname, fields, player) end local formspec = "size[9,10]".. - "label[0.0,9.7;Title/Content:]".. + "label[0.5,9.7;Name:]".. "field[1.8,10.0;6,0.5;chestname;;"..tostring( chestname or "unconfigured").."]".. - "button[7.5,9.7;1,0.5;set_chestname;Store]".. + "button[7.5,9.7;1,0.5;set_chestname;Store\nName]".. +-- "button[8.6,9.7;0.5,0.5;change_color;C]".. + "image_button[8.4,9.7;0.5,0.5;chesttools_palette.png;change_color;]".. "list[current_name;main;0.5,0.3;8,4;]".. "button[7.0,4.5;0.5,0.5;drop_all;DA]".. "button[7.5,4.5;0.5,0.5;take_all;TA]".. @@ -144,6 +170,7 @@ chesttools.on_receive_fields = function(pos, formname, fields, player) local b3 = "button[4.0,4.5;1,0.5;bag3;Bag 3]"; local b4 = "button[5.0,4.5;1,0.5;bag4;Bag 4]"; + local selected = ''; if( fields.drop_all or fields.take_all or fields.swap_all or fields.filter_all ) then -- check if the player has sufficient access to the chest @@ -164,7 +191,7 @@ chesttools.on_receive_fields = function(pos, formname, fields, player) selected = 'main'; end local inv_list = 'main'; - if( selected == 'main' ) then + if( selected == 'main' ) then inv_list = 'main'; elseif( selected == 'craft' ) then inv_list = 'craft'; @@ -362,17 +389,6 @@ chesttools.update_chest = function(pos, formname, fields, player) player_inv:add_item( 'main', old_price_item..' '..tostring(old_price_amount)); end - -- set the owner field - meta:set_string( 'owner', pname ); - - if( fields.locked ) then - meta:set_string("infotext", "Locked Chest (owned by "..meta:get_string("owner")..")") - elseif( fields.shared ) then - meta:set_string("infotext", "Shared Chest (owned by "..meta:get_string("owner")..")") - else - meta:set_string("infotext", "Chest") - end - -- copy the old inventory local inv = meta:get_inventory(); local main_inv = {}; @@ -387,6 +403,14 @@ chesttools.update_chest = function(pos, formname, fields, player) -- make sure the player owns the new chest meta:set_string("owner", pname); + if( fields.locked ) then + meta:set_string("infotext", "Locked Chest (owned by "..pname..")") + elseif( fields.shared ) then + meta:set_string("infotext", "Shared Chest (owned by "..pname..")") + else + meta:set_string("infotext", "Chest") + end + -- put the inventory back local new_inv = meta:get_inventory(); local new_inv_size = inv:get_size("main"); @@ -431,7 +455,7 @@ chesttools.form_input_handler = function( player, formname, fields) chesttools.update_chest( pos, formname, fields, player); return true; -- this function was responsible for handling the input end - + return; end end @@ -441,13 +465,15 @@ end minetest.register_on_player_receive_fields( chesttools.form_input_handler ); -minetest.register_node( 'chesttools:shared_chest', { - description = 'Shared chest which can be used by all who can build at that spot', - name = 'shared chest', - tiles = chesttools.chest_add.tiles, +chesttools.register_chest = function(node_name, desc, name, paramtype2, palette, tiles) + minetest.register_node( node_name, { + description = desc, + name = name, + tiles = tiles, groups = chesttools.chest_add.groups, tube = chesttools.chest_add.tube, - paramtype2 = "facedir", + paramtype2 = paramtype2, + palette = palette, legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), @@ -456,6 +482,9 @@ minetest.register_node( 'chesttools:shared_chest', { local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name() or "") meta:set_string("infotext", "Shared Chest (owned by "..meta:get_string("owner")..")") + if has_pipeworks then + pipeworks.after_place(pos) + end end, on_construct = function(pos) @@ -469,10 +498,11 @@ minetest.register_node( 'chesttools:shared_chest', { "listring[current_player;main]") end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); + can_dig = function(pos, player) + local player_name = (player and player.get_player_name and player:get_player_name()) or "" + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - return inv:is_empty("main") and player:get_player_name() == meta:get_string('owner'); + return player_name and inv:is_empty("main") and not minetest.is_protected(pos, player_name) end, allow_metadata_inventory_move = function(pos, from_list, from_index, @@ -573,11 +603,19 @@ minetest.register_node( 'chesttools:shared_chest', { formspec = 'size['..tostring(offset)..',6.5]'..formspec; -- only show the formspec if it really is a chest that can be updated if( can_be_upgraded ) then - minetest.show_formspec( name, "chesttools:update", formspec ); + minetest.show_formspec( name, "chesttools:update", formspec ); end return nil; end, }) +end + +chesttools.register_chest("chesttools:shared_chest", + 'Shared chest which can be used by all who can build at that spot', + 'shared chest', + 'colorfacedir', + 'chesttools_palette.png', + chesttools.chest_add.tiles) minetest.register_craft({ output = 'chesttools:shared_chest', @@ -585,4 +623,24 @@ minetest.register_craft({ recipe = { 'default:steel_ingot', 'default:chest_locked' }, }) +chesttools.register_chest("chesttools:shared_chest_wall", + 'Shared chest which can be used by all who can build at that spot (wallmounted)', + 'shared chest (wallmounted)', + 'colorwallmounted', + 'chesttools_palette_wallmounted.png', + {chesttools.chest_add.tiles[6], + chesttools.chest_add.tiles[3].."^[transformR180", + chesttools.chest_add.tiles[3].."^[transformR270", + chesttools.chest_add.tiles[3].."^[transformR90", + chesttools.chest_add.tiles[1].."^[transformR90", + chesttools.chest_add.tiles[1].."^[transformR90", + chesttools.chest_add.tiles[1], + }) + +minetest.register_craft({ + output = 'chesttools:shared_chest_wall', + type = 'shapeless', + recipe = { 'default:steel_ingot', 'chesttools:shared_chest' }, +}) + minetest.log("action", "[chesttools] loaded.") diff --git a/mod.conf b/mod.conf index 4d19f47..8c822f8 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,5 @@ name = chesttools -title = Chest Tools -description = This mod adds a shared locked chest with additional features to Minetest. +description = With these chests, you can access your bags and craft inventory with one click and move items between bag and chest. Other buttons speed up inventory movement even more: "DA": drop all from the selected inventory to the chest, "TA": take all from the chest and move it to your selected inventory, "SA": swap all items between chest and selected inventory and "FA": filter all - drop those items form your selected inventory to the chest of which there is already at least one in the chest. If the place where the chest stands is protected, everyone who can build there can access the chest (shared chest). You can also set a description text for the chests. Interaction with tubes is possible. depends = default +author = Sokomine +title = Very useful chests which allow quick access to your bags. diff --git a/textures/chesttools_blue_chest_front.png b/textures/chesttools_blue_chest_front.png new file mode 100644 index 0000000..359c7cf Binary files /dev/null and b/textures/chesttools_blue_chest_front.png differ diff --git a/textures/chesttools_blue_chest_lock.png b/textures/chesttools_blue_chest_lock.png deleted file mode 100644 index 96f5080..0000000 Binary files a/textures/chesttools_blue_chest_lock.png and /dev/null differ diff --git a/textures/chesttools_palette.png b/textures/chesttools_palette.png new file mode 100644 index 0000000..eab2dd1 Binary files /dev/null and b/textures/chesttools_palette.png differ diff --git a/textures/chesttools_palette_wallmounted.png b/textures/chesttools_palette_wallmounted.png new file mode 100644 index 0000000..8d3133b Binary files /dev/null and b/textures/chesttools_palette_wallmounted.png differ diff --git a/textures/chesttools_white_chest_lock.png b/textures/chesttools_white_chest_lock.png new file mode 100644 index 0000000..359c7cf Binary files /dev/null and b/textures/chesttools_white_chest_lock.png differ diff --git a/textures/chesttools_white_chest_side.png b/textures/chesttools_white_chest_side.png new file mode 100644 index 0000000..028ea15 Binary files /dev/null and b/textures/chesttools_white_chest_side.png differ diff --git a/textures/chesttools_white_chest_top.png b/textures/chesttools_white_chest_top.png new file mode 100644 index 0000000..03f2f1d Binary files /dev/null and b/textures/chesttools_white_chest_top.png differ