logistica-cd2025/api/wireless_transmitter.lua
2024-04-20 20:56:28 +01:00

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