commit 6f181d19365d55413d98f02be667b5caadf8e35e Author: HybridDog Date: Mon Jun 2 20:38:58 2014 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9c069a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +## Generic ignorable patterns and files +*~ +.*.swp +debug.txt diff --git a/default_chest_lock.png b/default_chest_lock.png new file mode 100644 index 0000000..368a60b Binary files /dev/null and b/default_chest_lock.png differ diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..5e78c21 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default? diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..5f8b57c --- /dev/null +++ b/init.lua @@ -0,0 +1,227 @@ +local load_time_start = os.clock() + +local function get_pointed_info(pointed_thing) + if not pointed_thing then + return + end + local pu = minetest.get_pointed_thing_position(pointed_thing) + local pa = minetest.get_pointed_thing_position(pointed_thing, true) + if not (pu and pa) then + return + end + if pu.y ~= pa.y then + return + end + local nd_u = minetest.get_node(pu) + if nd_u.name ~= "default:chest" then + return + end + return pu, pa, nd_u.param2 +end + +local big_chest_formspec = + "size[13,9]".. + "list[current_name;main;0,0;13,5;]".. + "list[current_player;main;2.5,5.2;8,4;]" + +local param_tab = { + ["-1 0"] = 0, + ["1 0"] = 2, + ["0 -1"] = 3, + ["0 1"] = 1, +} + +local pars = {[0]=2, 3, 0, 1} + +local function connect_chests(pu, pa, old_param2) + local stuff = minetest.get_meta(pu):get_inventory():get_list("main") + + local par = param_tab[pu.x-pa.x.." "..pu.z-pa.z] + if param_tab[pa.x-pu.x.." "..pa.z-pu.z] == old_param2 then + pu, pa = pa, pu + par = pars[par] + end + minetest.add_node(pu, {name="connected_chests:chest_left", param2=par}) + minetest.add_node(pa, {name="connected_chests:chest_right", param2=par}) + + local meta = minetest.get_meta(pu) + meta:set_string("formspec", big_chest_formspec) + meta:set_string("infotext", "Big Chest") + local inv = meta:get_inventory() + inv:set_size("main", 65) + inv:set_list("main", stuff) +end + +local place_chest = minetest.registered_nodes["default:chest"].on_place +minetest.override_item("default:chest", { + on_place = function(itemstack, placer, pointed_thing) + if not placer then + return + end + local pu, pa, nd_u = get_pointed_info(pointed_thing) + if not pu then + return place_chest(itemstack, placer, pointed_thing) + end + local protected = minetest.is_protected(pa, placer:get_player_name()) + if protected then + return + end + connect_chests(pu, pa, nd_u) + itemstack:take_item() + return itemstack + end +}) + + +minetest.register_node("connected_chests:chest_left", { + tiles = {"connected_chests_top.png", "connected_chests_top.png", "default_obsidian_glass.png", + "default_chest_side.png", "connected_chests_side.png^[transformFX", "connected_chests_side.png^connected_chests_front.png"}, + paramtype2 = "facedir", + drop = "default:chest 2", + groups = {choppy=2,oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 1.5, 0.5, 0.5}, + }, + }, + can_dig = function(pos) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + after_dig_node = function(pos, oldnode) + local p1 = oldnode.param2 + for p,param in pairs(param_tab) do + if param == p1 then + p1 = p + break + end + end + local x, z = unpack(string.split(p1, " ")) + pos.x = pos.x-x + pos.z = pos.z-z + minetest.remove_node(pos) + end, + on_metadata_inventory_move = function(pos, _, _, _, _, _, player) + minetest.log("action", player:get_player_name().. + " moves stuff in big chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, _, _, _, player) + minetest.log("action", player:get_player_name().. + " moves stuff to big chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, _, _, _, player) + minetest.log("action", player:get_player_name().. + " takes stuff from big chest at "..minetest.pos_to_string(pos)) + end, +}) + +minetest.register_node("connected_chests:chest_right", { + tiles = {"connected_chests_top.png^[transformFX", "connected_chests_top.png^[transformFX", "default_chest_side.png", + "default_obsidian_glass.png", "connected_chests_side.png", "connected_chests_side.png^connected_chests_front.png^[transformFX"}, + paramtype2 = "facedir", + drop = "", + is_ground_content = false, + pointable = false, + can_dig = function() + return false + end, +}) + +--[[ +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + default.get_locked_chest_formspec(pos) + ) + end + end, +})]] + + +print(string.format("[connected_chest] loaded after ca. %.2fs", os.clock() - load_time_start)) diff --git a/textures/connected_chests_front.png b/textures/connected_chests_front.png new file mode 100644 index 0000000..0fdc92e Binary files /dev/null and b/textures/connected_chests_front.png differ diff --git a/textures/connected_chests_side.png b/textures/connected_chests_side.png new file mode 100644 index 0000000..b0b19a7 Binary files /dev/null and b/textures/connected_chests_side.png differ diff --git a/textures/connected_chests_top.png b/textures/connected_chests_top.png new file mode 100644 index 0000000..1056ef5 Binary files /dev/null and b/textures/connected_chests_top.png differ