151 lines
5.4 KiB
Lua
151 lines
5.4 KiB
Lua
local S = logistica.TRANSLATOR
|
|
|
|
local FORMSPEC_NAME = "logwifitr"
|
|
local forms = {}
|
|
|
|
local INAVLID_PLACEMENT_MSG = minetest.colorize("#FF4444", S("Invalid Placement!"))
|
|
local INVALID_PLACEMENT_MSG2 = S("Transmitter must be placed on top of a Network Controller")
|
|
|
|
local function color_node(pos, isValid)
|
|
local node = minetest.get_node(pos)
|
|
node.param2 = isValid and 0 or 128
|
|
minetest.swap_node(pos, node)
|
|
end
|
|
|
|
local function get_formspec(pos, playerName)
|
|
local networkName = logistica.get_network_name_or_nil(pos) or ""
|
|
|
|
local nodeUnder = minetest.get_node(vector.add(pos, vector.new(0,-1,0)))
|
|
local content = ""
|
|
if not logistica.GROUPS.controllers.is(nodeUnder.name) then
|
|
content = "label[0.2,1.0;"..INAVLID_PLACEMENT_MSG.."\n"..INVALID_PLACEMENT_MSG2.."]"
|
|
-- color_node(pos, false)
|
|
else
|
|
local receivers = logistica.wifi_network_get_connected_receivers_for_transmitter(pos) or {}
|
|
local numConnected = #receivers
|
|
local maxReceivers = logistica.settings.max_receivers_per_transmitter
|
|
content = "label[0.2,1.0;"..S("Transmitting Network: ")..networkName.."]"..
|
|
"label[0.2,1.6;"..S("Receivers connected: ")..numConnected..S(" out of max: ")..maxReceivers.."]"
|
|
-- color_node(pos, true)
|
|
end
|
|
return "formspec_version[4]" ..
|
|
"size[8.5,2.2]" ..
|
|
"label[0.2,0.4;"..S("Wireless Transmitter").."]"..
|
|
logistica.ui.background..
|
|
content
|
|
end
|
|
|
|
local function show_formspec(pos, playerName)
|
|
forms[playerName] = {position = pos}
|
|
minetest.show_formspec(playerName, FORMSPEC_NAME, get_formspec(pos, playerName))
|
|
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].position
|
|
if not pos then return false end
|
|
if minetest.is_protected(pos, playerName) then return true end
|
|
|
|
if fields.quit and not fields.key_enter_field then
|
|
forms[playerName] = nil
|
|
end
|
|
return true
|
|
end
|
|
|
|
local function on_rightclick(pos, node, clicker, itemstack, pointed_thing)
|
|
logistica.wifi_network_register_transmitter_for_player(pos) -- clicker may not be owner
|
|
if clicker and clicker:is_player() then
|
|
show_formspec(pos, clicker:get_player_name())
|
|
end
|
|
end
|
|
|
|
local function after_place(pos, placer, itemstack, pointed_thing)
|
|
local playerName = ""
|
|
if placer:is_player() then
|
|
playerName = placer:get_player_name()
|
|
end
|
|
local posBelow = vector.add(pos, vector.new(0,-1,0))
|
|
local nodeUnder = minetest.get_node(posBelow)
|
|
local networkName = logistica.get_network_name_or_nil(posBelow)
|
|
local meta = minetest.get_meta(pos)
|
|
if not networkName or not logistica.GROUPS.controllers.is(nodeUnder.name) then
|
|
logistica.show_popup(playerName, INAVLID_PLACEMENT_MSG)
|
|
color_node(pos, false)
|
|
else
|
|
logistica.wifi_transmitter_set_infotext(pos, networkName)
|
|
logistica.on_wifi_transmitter_change(pos, nil, nil, playerName)
|
|
logistica.wifi_network_after_place_transmitter(pos, playerName)
|
|
end
|
|
end
|
|
|
|
local function after_dig(pos, oldNode, oldMeta, digger)
|
|
local playerName = ""
|
|
if digger:is_player() then
|
|
playerName = digger:get_player_name()
|
|
end
|
|
logistica.wifi_network_after_destroy_transmitter(pos, oldMeta)
|
|
logistica.on_wifi_transmitter_change(pos, oldNode, oldMeta, playerName)
|
|
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
|
|
- logistica table
|
|
]]
|
|
function logistica.register_wireless_transmitter(name, def)
|
|
--local group = logistica.TIER_ALL
|
|
local transmitterName = "logistica:" .. string.lower(name:gsub(" ", "_"))
|
|
logistica.GROUPS.wireless_transmitters.register(transmitterName)
|
|
|
|
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 = transmitterName
|
|
def.on_rightclick = on_rightclick
|
|
if not def.logistica then def.logistica = {} end
|
|
def.logistica.on_connect_to_network = function(pos, networkId)
|
|
logistica.wifi_network_register_transmitter_for_player(pos)
|
|
local netName = logistica.get_network_by_id_or_nil(networkId).name
|
|
logistica.wifi_transmitter_set_infotext(pos, netName)
|
|
end
|
|
|
|
def._mcl_hardness = 1.5
|
|
def._mcl_blast_resistance = 10
|
|
|
|
minetest.register_node(transmitterName, 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
|
|
def_disabled.logistica = {}
|
|
|
|
minetest.register_node(transmitterName.."_disabled", def_disabled)
|
|
end
|