246 lines
8 KiB
Lua
246 lines
8 KiB
Lua
|
-- this bit of code modifies the default chests and furnaces to be compatible
|
||
|
-- with pipeworks.
|
||
|
--
|
||
|
-- 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"
|
||
|
|
||
|
-- Chest Locals
|
||
|
local open_chests = {}
|
||
|
|
||
|
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)
|
||
|
|
||
|
-- Pipeworks Switch
|
||
|
formspec = formspec ..
|
||
|
fs_helpers.cycling_button(
|
||
|
minetest.get_meta(pos),
|
||
|
pipeworks.button_base,
|
||
|
"splitstacks",
|
||
|
{
|
||
|
pipeworks.button_off,
|
||
|
pipeworks.button_on
|
||
|
}
|
||
|
)..pipeworks.button_label
|
||
|
|
||
|
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 not def then return true end
|
||
|
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.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, function()
|
||
|
minetest.swap_node(pos, { name = "default:" .. swap, param2 = node.param2 })
|
||
|
|
||
|
-- Pipeworks notification
|
||
|
pipeworks.after_place(pos)
|
||
|
end)
|
||
|
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
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
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_lock.png",
|
||
|
"default_chest_inside.png"
|
||
|
},
|
||
|
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)
|
||
|
local inv = meta:get_inventory()
|
||
|
return inv:add_item("main", stack)
|
||
|
end,
|
||
|
can_insert = function(pos, node, stack, direction)
|
||
|
local meta = minetest.get_meta(pos)
|
||
|
local inv = meta:get_inventory()
|
||
|
if meta:get_int("splitstacks") == 1 then
|
||
|
stack = stack:peek_item(1)
|
||
|
end
|
||
|
return inv:room_for_item("main", stack)
|
||
|
end,
|
||
|
input_inventory = "main",
|
||
|
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
|
||
|
},
|
||
|
after_dig_node = pipeworks.after_dig,
|
||
|
on_rotate = pipeworks.on_rotate
|
||
|
}
|
||
|
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_front.png",
|
||
|
"default_chest_inside.png"
|
||
|
},
|
||
|
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)
|
||
|
local inv = meta:get_inventory()
|
||
|
return inv:add_item("main", stack)
|
||
|
end,
|
||
|
can_insert = function(pos, node, stack, direction)
|
||
|
local meta = minetest.get_meta(pos)
|
||
|
local inv = meta:get_inventory()
|
||
|
if meta:get_int("splitstacks") == 1 then
|
||
|
stack = stack:peek_item(1)
|
||
|
end
|
||
|
return inv:room_for_item("main", stack)
|
||
|
end,
|
||
|
input_inventory = "main",
|
||
|
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
|
||
|
},
|
||
|
after_place_node = pipeworks.after_place,
|
||
|
after_dig_node = pipeworks.after_dig,
|
||
|
on_rotate = pipeworks.on_rotate
|
||
|
}
|
||
|
--[[local override_common = {
|
||
|
|
||
|
}
|
||
|
for k,v in pairs(override_common) do
|
||
|
override_protected[k] = v
|
||
|
override[k] = v
|
||
|
end]]
|
||
|
|
||
|
override_open = table.copy(override)
|
||
|
override_open.groups = table.copy(old_chest_open_def.groups)
|
||
|
override_open.tube = table.copy(override.tube)
|
||
|
override_open.tube.connect_sides = table.copy(override.tube.connect_sides)
|
||
|
override_open.tube.connect_sides.top = nil
|
||
|
|
||
|
override_protected_open = table.copy(override_protected)
|
||
|
override_protected_open.groups = table.copy(old_chest_locked_open_def.groups)
|
||
|
override_protected_open.tube = table.copy(override_protected.tube)
|
||
|
override_protected_open.tube.connect_sides = table.copy(override_protected.tube.connect_sides)
|
||
|
override_protected_open.tube.connect_sides.top = nil
|
||
|
|
||
|
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)
|
||
|
|