summaryrefslogtreecommitdiff
path: root/compat-chests.lua
diff options
context:
space:
mode:
authorForbiddenJ <justinscomputercreations@gmail.com>2017-06-17 13:32:10 -0500
committerForbiddenJ <justinscomputercreations@gmail.com>2017-06-17 13:32:10 -0500
commit018accd1aebb71557e7005c5236766dd97c18886 (patch)
tree204d69049a9a13b9c28a3c04a361b65cedb2a6a2 /compat-chests.lua
parent2eff6e36ea322e3cc603074da42ad7febf15e617 (diff)
downloadpipeworks-018accd1aebb71557e7005c5236766dd97c18886.tar
pipeworks-018accd1aebb71557e7005c5236766dd97c18886.tar.gz
pipeworks-018accd1aebb71557e7005c5236766dd97c18886.tar.bz2
pipeworks-018accd1aebb71557e7005c5236766dd97c18886.tar.xz
pipeworks-018accd1aebb71557e7005c5236766dd97c18886.zip
Change compat-chests.lua to handle modern chests and be clean. (Addresses https://github.com/minetest-mods/pipeworks/issues/177)
Diffstat (limited to 'compat-chests.lua')
-rw-r--r--compat-chests.lua284
1 files changed, 164 insertions, 120 deletions
diff --git a/compat-chests.lua b/compat-chests.lua
index ac5c219..6c5a445 100644
--- a/compat-chests.lua
+++ b/compat-chests.lua
@@ -4,26 +4,31 @@
-- the formspecs found here are basically copies of the ones from minetest_game
-- plus bits from pipeworks' sorting tubes
+-- Pipeworks Specific
local fs_helpers = pipeworks.fs_helpers
+local tube_entry = "^pipeworks_tube_connection_wooden.png"
-tube_entry = "^pipeworks_tube_connection_wooden.png"
+-- Chest Locals
+local open_chests = {}
-local base_chest_formspec = "size[8,9]" ..
- default.gui_bg ..
- default.gui_bg_img ..
- default.gui_slots ..
- "list[current_player;main;0,4.85;8,1;]" ..
- "list[current_player;main;0,6.08;8,3;8]" ..
- "listring[current_player;main]" ..
- default.get_hotbar_bg(0,4.85)
+local function get_chest_formspec(pos)
+ local spos = pos.x .. "," .. pos.y .. "," .. pos.z
+ local formspec =
+ "size[8,9]" ..
+ default.gui_bg ..
+ default.gui_bg_img ..
+ default.gui_slots ..
+ "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
+ "list[current_player;main;0,4.85;8,1;]" ..
+ "list[current_player;main;0,6.08;8,3;8]" ..
+ "listring[nodemeta:" .. spos .. ";main]" ..
+ "listring[current_player;main]" ..
+ default.get_hotbar_bg(0,4.85)
-local function update_chest_formspec(pos)
- local meta = minetest.get_meta(pos)
- local formspec = base_chest_formspec ..
- "list[current_name;main;0,0.3;8,4;]" ..
- "listring[current_name;main]" ..
+ -- Pipeworks Switch
+ formspec = formspec ..
fs_helpers.cycling_button(
- meta,
+ minetest.get_meta(pos),
pipeworks.button_base,
"splitstacks",
{
@@ -31,19 +36,95 @@ local function update_chest_formspec(pos)
pipeworks.button_on
}
)..pipeworks.button_label
- meta:set_string("formspec", formspec)
+
+ return formspec
+end
+
+local function chest_lid_obstructed(pos)
+ local above = { x = pos.x, y = pos.y + 1, z = pos.z }
+ local def = minetest.registered_nodes[minetest.get_node(above).name]
+ -- allow ladders, signs, wallmounted things and torches to not obstruct
+ if def.drawtype == "airlike" or
+ def.drawtype == "signlike" or
+ def.drawtype == "torchlike" or
+ (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then
+ return false
+ end
+ return true
end
-minetest.override_item("default:chest", {
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ if formname == "pipeworks:chest_formspec" and player then
+ local pn = player:get_player_name()
+ if open_chests[pn] then
+ local pos = open_chests[pn].pos
+ if fields.quit then
+ local sound = open_chests[pn].sound
+ local swap = open_chests[pn].swap
+ local node = minetest.get_node(pos)
+
+ open_chests[pn] = nil
+ for k, v in pairs(open_chests) do
+ if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
+ return true
+ end
+ end
+ minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap,
+ param2 = node.param2 })
+ minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10})
+ end
+
+ -- Pipeworks Switch
+ if pipeworks.may_configure(pos, player) and not fields.quit then
+ fs_helpers.on_receive_fields(pos, fields)
+ minetest.show_formspec(player:get_player_name(), "pipeworks:chest_formspec", get_chest_formspec(pos))
+ end
+ end
+ end
+
+ return true
+end)
+
+-- Original Definitions
+local old_chest_def = table.copy(minetest.registered_items["default:chest"])
+local old_chest_open_def = table.copy(minetest.registered_items["default:chest_open"])
+local old_chest_locked_def = table.copy(minetest.registered_items["default:chest_locked"])
+local old_chest_locked_open_def = table.copy(minetest.registered_items["default:chest_locked_open"])
+
+-- Override Construction
+local override_protected, override, override_open, override_protected_open
+override_protected = {
tiles = {
"default_chest_top.png"..tube_entry,
"default_chest_top.png"..tube_entry,
"default_chest_side.png"..tube_entry,
"default_chest_side.png"..tube_entry,
- "default_chest_side.png"..tube_entry,
- "default_chest_front.png"
+ "default_chest_lock.png",
+ "default_chest_inside.png"
},
- groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1},
+ after_place_node = function(pos, placer)
+ old_chest_locked_def.after_place_node(pos, placer)
+ pipeworks.after_place(pos)
+ end,
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+ if not default.can_interact_with_node(clicker, pos) then
+ return itemstack
+ end
+
+ minetest.sound_play(old_chest_locked_def.sound_open, {gain = 0.3,
+ pos = pos, max_hear_distance = 10})
+ if not chest_lid_obstructed(pos) then
+ minetest.swap_node(pos,
+ { name = "default:" .. "chest_locked" .. "_open",
+ param2 = node.param2 })
+ end
+ minetest.after(0.2, minetest.show_formspec,
+ clicker:get_player_name(),
+ "pipeworks:chest_formspec", get_chest_formspec(pos))
+ open_chests[clicker:get_player_name()] = { pos = pos,
+ sound = old_chest_locked_def.sound_close, swap = "chest_locked" }
+ end,
+ groups = table.copy(old_chest_locked_def.groups),
tube = {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
@@ -58,59 +139,34 @@ minetest.override_item("default:chest", {
end
return inv:room_for_item("main", stack)
end,
- input_inventory = "main",
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
},
- after_place_node = pipeworks.after_place,
- after_dig_node = pipeworks.after_dig,
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- inv:set_size("main", 8*4)
- update_chest_formspec(pos)
- end,
- on_receive_fields = function(pos, formname, fields, sender)
- if not pipeworks.may_configure(pos, sender) then return end
- fs_helpers.on_receive_fields(pos, fields)
- update_chest_formspec(pos)
- end,
-})
-
--- =====================
-
-local function get_locked_chest_formspec(pos)
- local spos = pos.x .. "," .. pos.y .. "," .. pos.z
- local formspec = base_chest_formspec ..
- "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
- "listring[nodemeta:" .. spos .. ";main]"
- return formspec
-end
-
-local function setup_locked_formspec(pos, meta)
- meta:set_string("formspec",
- get_locked_chest_formspec(pos) ..
- fs_helpers.cycling_button(
- meta,
- pipeworks.button_base,
- "splitstacks",
- {
- pipeworks.button_off,
- pipeworks.button_on
- }
- )..pipeworks.button_label
- )
-end
-
-minetest.override_item("default:chest_locked", {
+ after_dig_node = pipeworks.after_dig
+}
+override = {
tiles = {
"default_chest_top.png"..tube_entry,
"default_chest_top.png"..tube_entry,
"default_chest_side.png"..tube_entry,
"default_chest_side.png"..tube_entry,
- "default_chest_side.png"..tube_entry,
- "default_chest_lock.png"
+ "default_chest_front.png",
+ "default_chest_inside.png"
},
- groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1},
+ on_rightclick = function(pos, node, clicker)
+ minetest.sound_play(old_chest_def.sound_open, {gain = 0.3, pos = pos,
+ max_hear_distance = 10})
+ if not chest_lid_obstructed(pos) then
+ minetest.swap_node(pos, {
+ name = "default:" .. "chest" .. "_open",
+ param2 = node.param2 })
+ end
+ minetest.after(0.2, minetest.show_formspec,
+ clicker:get_player_name(),
+ "pipeworks:chest_formspec", get_chest_formspec(pos))
+ open_chests[clicker:get_player_name()] = { pos = pos,
+ sound = old_chest_def.sound_close, swap = "chest" }
+ end,
+ groups = table.copy(old_chest_def.groups),
tube = {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
@@ -125,63 +181,51 @@ minetest.override_item("default:chest_locked", {
end
return inv:room_for_item("main", stack)
end,
+ input_inventory = "main",
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
},
- 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")..")")
- pipeworks.after_place(pos)
- end,
- on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
- if default.can_interact_with_node(clicker, pos) then
- local meta = minetest.get_meta(pos)
- local formspec = meta:get_string("formspec")
- print("on_rightclick")
- print(dump(formspec))
- setup_locked_formspec(pos, meta, clicker)
- minetest.show_formspec(
- clicker:get_player_name(),
- "default:chest_locked",
- get_locked_chest_formspec(pos)
- )
- end
- return itemstack
- end,
- on_key_use = function(pos, player)
- local secret = minetest.get_meta(pos):get_string("key_lock_secret")
- local itemstack = player:get_wielded_item()
- local key_meta = itemstack:get_meta()
+ after_place_node = pipeworks.after_place,
+ after_dig_node = pipeworks.after_dig
+}
+--[[local override_common = {
+
+}
+for k,v in pairs(override_common) do
+ override_protected[k] = v
+ override[k] = v
+end]]
- if key_meta:get_string("secret") == "" then
- key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret)
- itemstack:set_metadata("")
- end
+override_open = table.copy(override)
+override_open.groups = table.copy(old_chest_open_def.groups)
- if secret ~= key_meta:get_string("secret") then
- return
- end
- setup_locked_formspec(pos, minetest.get_meta(pos))
- end,
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- inv:set_size("main", 8*4)
- setup_locked_formspec(pos, meta)
- end,
- on_receive_fields = function(pos, formname, fields, sender)
- if not pipeworks.may_configure(pos, sender) then return end
- fs_helpers.on_receive_fields(pos, fields)
- local formspec = get_locked_chest_formspec(pos)
- print("on_receive_fields")
- print(dump(formspec))
+override_protected_open = table.copy(override_protected)
+override_protected_open.groups = table.copy(old_chest_locked_open_def.groups)
+override_protected.tiles = { -- Rearranged according to the chest registration in Minetest_Game.
+ "default_chest_top.png"..tube_entry,
+ "default_chest_top.png"..tube_entry,
+ "default_chest_side.png"..tube_entry.."^[transformFX",
+ "default_chest_side.png"..tube_entry,
+ "default_chest_side.png"..tube_entry,
+ "default_chest_lock.png",
+}
+override.tiles = {
+ "default_chest_top.png"..tube_entry,
+ "default_chest_top.png"..tube_entry,
+ "default_chest_side.png"..tube_entry.."^[transformFX",
+ "default_chest_side.png"..tube_entry,
+ "default_chest_side.png"..tube_entry,
+ "default_chest_front.png",
+}
+
+-- Add the extra groups
+for i,v in ipairs({override_protected, override, override_open, override_protected_open}) do
+ v.groups.tubedevice = 1
+ v.groups.tubedevice_receiver = 1
+end
+
+-- Override with the new modifications.
+minetest.override_item("default:chest", override)
+minetest.override_item("default:chest_open", override_open)
+minetest.override_item("default:chest_locked", override_protected)
+minetest.override_item("default:chest_locked_open", override_protected_open)
- if formspec == "" then
- meta:set_string("formspec", formspec)
- else
- setup_locked_formspec(pos, minetest.get_meta(pos))
- end
- end,
- after_dig_node = pipeworks.after_dig
-})