178 lines
6.6 KiB
Lua
178 lines
6.6 KiB
Lua
local S = logistica.TRANSLATOR
|
|
|
|
local CONNECT_BUTTON = "logconbtn"
|
|
local FORMSPEC_NAME = "logwifirc"
|
|
local TR_DROP_PICKER = "trdpdwn"
|
|
local forms = {}
|
|
|
|
local CLR_RED = "#FF3333"
|
|
local CLR_GRN = "#33FF11"
|
|
|
|
local function get_dropdown_list_and_index_str(pos, playerName)
|
|
local items = logistica.wifi_network_get_available_transmitters_for_player(playerName)
|
|
-- save the table since it may change while the formspec is open
|
|
local formData = forms[playerName] or {}
|
|
formData.items = {}
|
|
forms[playerName] = formData
|
|
local selPos = logistica.wifi_network_get_connected_transmitter_for_receiver(pos)
|
|
local selIdx = 0
|
|
local itemList = logistica.table_to_list_indexed(items, function(key, trTbl, index)
|
|
local trPos = trTbl.pos
|
|
if selIdx == 0 and selPos and vector.equals(selPos, trPos) then selIdx = index end
|
|
formData.items[index] = trTbl
|
|
logistica.load_position(trPos)
|
|
local networkName = logistica.get_network_name_or_nil(trPos)
|
|
if not networkName then return 0
|
|
else return minetest.formspec_escape(networkName) end
|
|
end)
|
|
itemList = logistica.list_filter(itemList, function(v) return type(v) == "string" end)
|
|
forms[playerName] = formData
|
|
return table.concat(itemList,",")..";"..tostring(selIdx)
|
|
end
|
|
|
|
local function get_formspec(pos, playerName, msg)
|
|
local dropdownItems = get_dropdown_list_and_index_str(pos, playerName)
|
|
return "formspec_version[4]" ..
|
|
"size[10.0,3.5]" ..
|
|
logistica.ui.background..
|
|
"label[0.2,0.4;"..S("Wireless Receiver").."]"..
|
|
"label[2.5,0.9;"..S("Choose a network to connect to.").."]"..
|
|
"dropdown[2.5,1.1;3,0.8;"..TR_DROP_PICKER..";"..dropdownItems..";true]" ..
|
|
"button[5.6,1.1;3,0.8;"..CONNECT_BUTTON..";"..S("Connect").."]"..
|
|
"label[2.5,2.1;"..(msg or "").."]"..
|
|
"label[0.2,2.5;"..S("Only your networks with a Wireless Transmitter can be connected to.").."]"..
|
|
"label[0.2,2.9;"..S("If a network isn't showing up, go near its controller to reactivate it.").."]"
|
|
end
|
|
|
|
local function show_formspec(pos, playerName, msg)
|
|
forms[playerName] = {position = pos}
|
|
minetest.show_formspec(playerName, FORMSPEC_NAME, get_formspec(pos, playerName, msg))
|
|
end
|
|
|
|
local function on_receive_fields(player, formname, fields)
|
|
if formname ~= FORMSPEC_NAME then return end
|
|
local playerName = player:get_player_name()
|
|
local pos = (forms[playerName] or {}).position
|
|
if not pos then return false end
|
|
if minetest.is_protected(pos, playerName) then return true end
|
|
|
|
if fields.quit then
|
|
forms[playerName] = nil
|
|
elseif fields[CONNECT_BUTTON] then
|
|
local formData = forms[playerName]
|
|
if not fields[TR_DROP_PICKER] or not formData.items then return true end
|
|
local selItem = formData.items[tonumber(fields[TR_DROP_PICKER])]
|
|
if not selItem or not selItem.pos then return true end
|
|
|
|
logistica.wifi_network_disconect_receiver_from_current_transmitter(pos)
|
|
logistica.remove_receiver_from_network(pos)
|
|
local addSuccess = logistica.wifi_network_connect_receiver_to_transmitter(selItem.pos, pos)
|
|
local msg = nil
|
|
if addSuccess then
|
|
local trNet = logistica.get_network_or_nil(selItem.pos)
|
|
if trNet then
|
|
local scanSuccess = logistica.add_receiver_to_network(trNet, pos)
|
|
if not scanSuccess then
|
|
logistica.wifi_network_disconect_receiver_from_current_transmitter(pos)
|
|
minetest.close_formspec(playerName, formname)
|
|
return true
|
|
end
|
|
msg = minetest.colorize(CLR_GRN, S("Connected!"))
|
|
end
|
|
end
|
|
if not msg then msg = minetest.colorize(CLR_RED, S("Failed to connect!")) end
|
|
show_formspec(pos, playerName, msg)
|
|
elseif fields[TR_DROP_PICKER] then -- this check should be below the CONNECT_BUTTON
|
|
-- hmmm
|
|
end
|
|
return true
|
|
end
|
|
|
|
local function after_place(pos, placer, itemstack, pointed_thing)
|
|
local playerName = ""
|
|
if placer:is_player() then
|
|
playerName = placer:get_player_name()
|
|
end
|
|
logistica.on_wifi_receiver_change(pos, nil, nil, placer)
|
|
logistica.wifi_network_after_place_receiver(pos, playerName)
|
|
end
|
|
|
|
local function after_dig(pos, oldNode, oldMeta, digger)
|
|
logistica.wifi_network_after_destroy_receiver(pos, oldMeta)
|
|
logistica.on_wifi_receiver_change(pos, oldNode, oldMeta, digger)
|
|
end
|
|
|
|
----------------------------------------------------------------
|
|
-- registration stuff
|
|
----------------------------------------------------------------
|
|
|
|
minetest.register_on_player_receive_fields(on_receive_fields)
|
|
|
|
minetest.register_on_leaveplayer(function(objRef, timed_out)
|
|
if objRef:is_player() then
|
|
forms[objRef:get_player_name()] = nil
|
|
end
|
|
end)
|
|
|
|
----------------------------------------------------------------
|
|
-- Public Registration API
|
|
----------------------------------------------------------------
|
|
|
|
--[[
|
|
The definition table will get the fololwing fields overriden (and currently originals are not called):
|
|
- on_construct
|
|
- after_dig_node
|
|
- after_place_node
|
|
- drop
|
|
- on_rightclick
|
|
]]
|
|
function logistica.register_wireless_receiver(name, def)
|
|
local group = logistica.TIER_ALL
|
|
local receiverName = "logistica:" .. string.lower(name:gsub(" ", "_"))
|
|
logistica.GROUPS.wireless_receivers.register(receiverName)
|
|
|
|
if not def.groups then
|
|
def.groups = {}
|
|
end
|
|
def.groups[group] = 1
|
|
def.after_dig_node = after_dig
|
|
def.after_place_node = after_place
|
|
def.drop = receiverName
|
|
def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
|
if clicker and clicker:is_player() then
|
|
logistica.try_to_wake_up_network(pos) -- as to not erase data
|
|
show_formspec(pos, clicker:get_player_name())
|
|
end
|
|
end
|
|
def._mcl_hardness = 1.5
|
|
def._mcl_blast_resistance = 10
|
|
|
|
minetest.register_node(receiverName, def)
|
|
|
|
local def_disabled = table.copy(def)
|
|
local tiles_disabled = def.tiles_disabled or logistica.table_map(def.tiles, function(s) return s.."^logistica_disabled.png" end)
|
|
def_disabled.tiles = tiles_disabled
|
|
def_disabled.groups = { oddly_breakable_by_hand = 3, cracky = 3, choppy = 3, not_in_creative_inventory = 1, pickaxey = 1, handy = 1, axey = 1 }
|
|
def_disabled.on_construct = nil
|
|
def_disabled.after_dig_node = nil
|
|
def_disabled.on_timer = nil
|
|
def_disabled.on_rightclick = nil
|
|
|
|
minetest.register_node(receiverName.."_disabled", def_disabled)
|
|
end
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
local nodeNames = logistica.group_get_all_nodes_for_group(logistica.GROUPS.wireless_receivers.name)
|
|
if #nodeNames == 0 then return end
|
|
minetest.register_abm({
|
|
label = "receiver_rescanning",
|
|
nodenames = nodeNames,
|
|
interval = 15.2,
|
|
chance = 1,
|
|
catch_up = false,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
logistica.try_to_wake_up_network(pos)
|
|
end
|
|
})
|
|
end)
|