mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, fields, player)
|
||||
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
if not player_name then
|
||||
return false, S("The give player is not a player")
|
||||
end -- this should never happen, but just in case
|
||||
|
||||
if not minetest.check_player_privs(player_name, { interact=true }) then
|
||||
return false, S("There is no player with interact privilege named '@1'. Aborting.", player_name)
|
||||
end
|
||||
|
||||
local pos = node_info.pos
|
||||
local meta = node_info.meta
|
||||
local station_name = fields.station_name or node_info.props.station_name
|
||||
local station_network = fields.station_network or node_info.props.station_network
|
||||
local owner_name = fields.owner_name or node_info.props.owner_name
|
||||
|
||||
-- if it is an elevator, determine the network name through x and z coordinates
|
||||
local is_elevator = node_info.props.is_elevator
|
||||
|
||||
if is_elevator then
|
||||
station_network = travelnet.elevator_network(pos)
|
||||
if travelnet.is_falsey_string(station_name) then
|
||||
station_name = S("at @1 m", tostring(pos.y))
|
||||
end
|
||||
end
|
||||
|
||||
if travelnet.is_falsey_string(station_name) then
|
||||
return false, S("Please provide a name for this station.")
|
||||
end
|
||||
|
||||
if travelnet.is_falsey_string(station_network) then
|
||||
return false, S("Please provide the name of the network this station ought to be connected to.")
|
||||
end
|
||||
|
||||
if travelnet.is_falsey_string(owner_name) or owner_name == player_name or is_elevator then -- elevator networks
|
||||
owner_name = player_name
|
||||
elseif not minetest.get_player_privs(player_name)[travelnet.attach_priv]
|
||||
and not travelnet.allow_attach(player_name, owner_name, station_network)
|
||||
then
|
||||
return false, S("You do not have the travelnet_attach priv which is required to attach your box to " ..
|
||||
"the network of someone else. Aborting.")
|
||||
end
|
||||
|
||||
local travelnets = travelnet.get_travelnets(owner_name)
|
||||
local network = travelnets[station_network]
|
||||
if not network then
|
||||
network = {}
|
||||
travelnets[station_network] = network
|
||||
end
|
||||
|
||||
-- lua doesn't allow efficient counting here
|
||||
local station_count = 1 -- start at one, assume the station about to be created already exists
|
||||
for existing_station_name in pairs(network) do
|
||||
if existing_station_name == station_name then
|
||||
return false, S("A station named '@1' already exists on this network. Please choose a different name!", station_name)
|
||||
end
|
||||
station_count = station_count+1
|
||||
end
|
||||
|
||||
-- we don't want too many stations in the same network because that would get confusing when displaying the targets
|
||||
if travelnet.MAX_STATIONS_PER_NETWORK ~= 0 and station_count > travelnet.MAX_STATIONS_PER_NETWORK then
|
||||
return false, S("Network '@1', already contains the maximum number (@2) of allowed stations per network. " ..
|
||||
"Please choose a different/new network name.", station_network, travelnet.MAX_STATIONS_PER_NETWORK)
|
||||
end
|
||||
|
||||
-- add this station
|
||||
local creation_timestamp = os.time()
|
||||
network[station_name] = {
|
||||
pos = pos,
|
||||
timestamp = creation_timestamp
|
||||
}
|
||||
|
||||
-- save the updated network data
|
||||
travelnet.log("action", "adding station '" .. station_name .. "' to network '" .. station_network ..
|
||||
"' for player '" .. owner_name .. "'")
|
||||
travelnet.set_travelnets(owner_name, travelnets)
|
||||
|
||||
-- do we have a new node to set up? (and are not just reading from a safefile?)
|
||||
if meta then
|
||||
minetest.chat_send_player(player_name,
|
||||
S("Station '@1'" .. " " ..
|
||||
"has been added to the network '@2'" ..
|
||||
", which now consists of @3 station(s).", station_name, station_network, station_count))
|
||||
|
||||
meta:set_string("station_name", station_name)
|
||||
meta:set_string("station_network", station_network)
|
||||
meta:set_string("owner", owner_name)
|
||||
meta:set_int ("timestamp", creation_timestamp)
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Station '@1'" .. " " ..
|
||||
"on network '@2' (owned by @3)" .. " " ..
|
||||
"ready for usage.",
|
||||
tostring(station_name), tostring(station_network), tostring(owner_name)))
|
||||
|
||||
return true, { formspec = travelnet.formspecs.primary, options = {
|
||||
station_name = station_name,
|
||||
station_network = station_network,
|
||||
owner_name = owner_name
|
||||
} }
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,75 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
-- does the player want to move this station one position up in the list?
|
||||
-- only the owner and players with the travelnet_attach priv can change the order of the list
|
||||
-- Note: With elevators, only the "G"(round) marking is actually moved
|
||||
if fields and (fields.move_up or fields.move_down)
|
||||
and not travelnet.is_falsey_string(node_info.props.owner_name)
|
||||
and (
|
||||
(node_info.props.owner_name == player_name)
|
||||
or (minetest.get_player_privs(player_name)[travelnet.attach_priv])
|
||||
)
|
||||
then
|
||||
local travelnets = travelnet.get_travelnets(node_info.props.owner_name)
|
||||
local network = travelnets[node_info.props.station_network]
|
||||
|
||||
if not network then
|
||||
return false, S("This station does not have a network.")
|
||||
end
|
||||
local stations = travelnet.get_ordered_stations(
|
||||
node_info.props.owner_name,
|
||||
node_info.props.station_network,
|
||||
node_info.props.is_elevator
|
||||
)
|
||||
|
||||
local current_pos = -1
|
||||
for index, k in ipairs(stations) do
|
||||
if k == node_info.props.station_name then
|
||||
current_pos = index
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
local swap_with_pos
|
||||
if fields.move_up then
|
||||
swap_with_pos = current_pos-1
|
||||
else
|
||||
swap_with_pos = current_pos+1
|
||||
end
|
||||
|
||||
-- handle errors
|
||||
if swap_with_pos < 1 then
|
||||
return false, S("This station is already the first one on the list.")
|
||||
elseif swap_with_pos > #stations then
|
||||
return false, S("This station is already the last one on the list.")
|
||||
else
|
||||
local current_station = stations[current_pos]
|
||||
local swap_with_station = stations[swap_with_pos]
|
||||
|
||||
-- swap the actual data by which the stations are sorted
|
||||
local old_timestamp = network[swap_with_station].timestamp
|
||||
network[swap_with_station].timestamp = network[current_station].timestamp
|
||||
network[current_station].timestamp = old_timestamp
|
||||
|
||||
-- for elevators, only the "G"(round) marking is moved; no point in swapping stations
|
||||
if not node_info.props.is_elevator then
|
||||
-- actually swap the stations
|
||||
stations[swap_with_pos] = current_station
|
||||
stations[current_pos] = swap_with_station
|
||||
end
|
||||
|
||||
-- store the changed order
|
||||
travelnet.log("action", "saving changed order for network '" .. node_info.props.station_network ..
|
||||
"' player '" .. node_info.props.owner_name .. "'")
|
||||
travelnet.set_travelnets(node_info.props.owner_name, travelnets)
|
||||
return true, { formspec = travelnet.formspecs.primary }
|
||||
end
|
||||
end
|
||||
return false, S("This @1 belongs to @2. You can't edit it.",
|
||||
node_info.props.description,
|
||||
tostring(node_info.props.owner_name)
|
||||
)
|
||||
end
|
||||
@@ -0,0 +1,117 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
local player_formspec_data = travelnet.player_formspec_data
|
||||
|
||||
travelnet.actions = {}
|
||||
|
||||
function travelnet.actions.navigate_page(node_info, fields, _)
|
||||
local page = 1
|
||||
local network = travelnet.get_network(node_info.props.owner_name, node_info.props.station_network)
|
||||
local station_count = 0
|
||||
for _ in pairs(network) do
|
||||
station_count = station_count+1
|
||||
end
|
||||
local page_size = 7*3
|
||||
local pages = math.ceil(station_count/page_size)
|
||||
|
||||
if fields.last_page then
|
||||
page = pages
|
||||
else
|
||||
local current_page = tonumber(fields.page_number)
|
||||
if current_page then
|
||||
if fields.next_page then
|
||||
page = math.min(current_page+1, pages)
|
||||
elseif fields.prev_page then
|
||||
page = math.max(current_page-1, 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
return true, { formspec = travelnet.formspecs.primary, options = { page_number = page } }
|
||||
end
|
||||
|
||||
function travelnet.actions.remove_station(node_info, _, player)
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
-- players with travelnet_remove priv can dig the station
|
||||
if
|
||||
not minetest.get_player_privs(player_name)[travelnet.remove_priv]
|
||||
-- the function travelnet.allow_dig(..) may allow additional digging
|
||||
and not travelnet.allow_dig(player_name, node_info.props.owner_name, node_info.props.station_network, node_info.pos)
|
||||
-- the owner can remove the station
|
||||
and node_info.props.owner_name ~= player_name
|
||||
-- stations without owner can be removed/edited by anybody
|
||||
and node_info.props.owner_name ~= ""
|
||||
then
|
||||
return false,
|
||||
S("This @1 belongs to @2. You can't remove it.", node_info.props.description, node_info.props.owner_name)
|
||||
end
|
||||
|
||||
-- remove station
|
||||
local player_inventory = player:get_inventory()
|
||||
if not player_inventory:room_for_item("main", node_info.node.name) then
|
||||
return false, S("You do not have enough room in your inventory.")
|
||||
end
|
||||
|
||||
-- give the player the box
|
||||
player_inventory:add_item("main", node_info.node.name)
|
||||
-- remove the box from the data structure
|
||||
travelnet.remove_box(node_info.pos, nil, node_info.meta:to_table(), player)
|
||||
-- remove the node as such
|
||||
minetest.remove_node(node_info.pos)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function travelnet.actions.edit_station(node_info, _, player)
|
||||
local player_name = player:get_player_name()
|
||||
-- abort if user isn't owner
|
||||
if node_info.props.owner_name ~= player_name
|
||||
and not minetest.check_player_privs(player_name, { protection_bypass=true })
|
||||
then
|
||||
minetest.record_protection_violation(node_info.pos, player_name)
|
||||
return false, S("This @1 belongs to @2. You can't edit it.",
|
||||
node_info.props.description,
|
||||
tostring(node_info.props.owner_name)
|
||||
)
|
||||
end
|
||||
|
||||
return true, {
|
||||
formspec = node_info.props.is_elevator
|
||||
and travelnet.formspecs.edit_elevator
|
||||
or travelnet.formspecs.edit_travelnet
|
||||
}
|
||||
end
|
||||
|
||||
function travelnet.actions.update_station(node_info, fields, player)
|
||||
if node_info.props.is_elevator then
|
||||
return travelnet.actions.update_elevator(node_info, fields, player)
|
||||
else
|
||||
return travelnet.actions.update_travelnet(node_info, fields, player)
|
||||
end
|
||||
end
|
||||
|
||||
function travelnet.actions.toggle_door(node_info, _, player)
|
||||
travelnet.open_close_door(node_info.pos, player, "toggle")
|
||||
return true
|
||||
end
|
||||
|
||||
function travelnet.actions.instruct_player(_, _, player)
|
||||
minetest.chat_send_player(player:get_player_name(), S("Please click on the target you want to travel to."))
|
||||
return true
|
||||
end
|
||||
|
||||
function travelnet.actions.end_input(_, _, player)
|
||||
player_formspec_data[player:get_player_name()] = nil
|
||||
return true
|
||||
end
|
||||
|
||||
function travelnet.actions.return_to_form()
|
||||
return true, { formspec = travelnet.formspecs.current }
|
||||
end
|
||||
|
||||
travelnet.actions.repair_station = dofile(travelnet.path .. "/actions/repair_station.lua")
|
||||
travelnet.actions.change_order = dofile(travelnet.path .. "/actions/change_order.lua")
|
||||
travelnet.actions.add_station = dofile(travelnet.path .. "/actions/add_station.lua")
|
||||
travelnet.actions.transport_player = dofile(travelnet.path .. "/actions/transport_player.lua")
|
||||
travelnet.actions.update_elevator = dofile(travelnet.path .. "/actions/update_elevator.lua")
|
||||
travelnet.actions.update_travelnet = dofile(travelnet.path .. "/actions/update_travelnet.lua")
|
||||
@@ -0,0 +1,47 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, _, player)
|
||||
local owner_name = node_info.props.owner_name
|
||||
local station_name = node_info.props.station_name
|
||||
local station_network = node_info.props.station_network
|
||||
|
||||
if not owner_name
|
||||
or not station_name
|
||||
or travelnet.is_falsey_string(station_network)
|
||||
then
|
||||
if node_info.props.is_elevator then
|
||||
return travelnet.actions.add_station(node_info, _, player)
|
||||
end
|
||||
return false, S("Update failed! Resetting this box on the travelnet.")
|
||||
end
|
||||
|
||||
local travelnets = travelnet.get_travelnets(owner_name)
|
||||
local network = travelnets[station_network]
|
||||
if not network then
|
||||
network = {}
|
||||
travelnets[station_network] = network
|
||||
end
|
||||
|
||||
-- if the station got lost from the network for some reason (savefile corrupted?) then add it again
|
||||
if not network[station_name] then
|
||||
local timestamp = node_info.meta:get_int("timestamp")
|
||||
if not timestamp or type(timestamp) ~= "number" or timestamp < 100000 then
|
||||
timestamp = os.time()
|
||||
end
|
||||
|
||||
-- add this station
|
||||
network[station_name] = {
|
||||
pos = node_info.pos,
|
||||
timestamp = timestamp
|
||||
}
|
||||
|
||||
minetest.chat_send_player(owner_name,
|
||||
S("Station '@1'" .. " " ..
|
||||
"has been reattached to the network '@2'.", station_name, station_network))
|
||||
|
||||
travelnet.log("action", "repared station '" .. owner_name .. "' on network '" .. station_network ..
|
||||
"' for player '" .. owner_name .. "'")
|
||||
travelnet.set_travelnets(owner_name, travelnets)
|
||||
end
|
||||
return true, { formspec = travelnet.formspecs.primary }
|
||||
end
|
||||
@@ -0,0 +1,106 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, fields, player)
|
||||
|
||||
local network = travelnet.get_network(node_info.props.owner_name, node_info.props.station_network)
|
||||
|
||||
if node_info.node ~= nil and node_info.props.is_elevator then
|
||||
for k,_ in pairs(network) do
|
||||
if network[k].nr == fields.target then
|
||||
fields.target = k
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local target_station = network[fields.target]
|
||||
|
||||
-- if the target station is gone
|
||||
if not target_station then
|
||||
return false, S("Station '@1' does not exist (anymore?)" ..
|
||||
" " .. "on this network.", fields.target or "?")
|
||||
end
|
||||
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
if not travelnet.allow_travel(
|
||||
player_name,
|
||||
node_info.props.owner_name,
|
||||
node_info.props.station_network,
|
||||
node_info.props.station_name,
|
||||
fields.target
|
||||
) then
|
||||
return false, S("You are not allowed to travel to this station.")
|
||||
end
|
||||
|
||||
if travelnet.travelnet_sound_enabled then
|
||||
if node_info.props.is_elevator then
|
||||
minetest.sound_play("travelnet_bell", {
|
||||
pos = node_info.pos,
|
||||
gain = 0.75,
|
||||
max_hear_distance = 10
|
||||
})
|
||||
else
|
||||
minetest.sound_play("travelnet_travel", {
|
||||
pos = node_info.pos,
|
||||
gain = 0.75,
|
||||
max_hear_distance = 10
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
if travelnet.travelnet_effect_enabled then
|
||||
minetest.add_entity(vector.add(node_info.pos, { x=0, y=0.5, z=0 }), "travelnet:effect")
|
||||
end
|
||||
|
||||
-- close the doors at the sending station
|
||||
travelnet.open_close_door(node_info.pos, player, "close")
|
||||
|
||||
-- transport the player to the target location
|
||||
|
||||
-- may be 0.0 for some versions of MT 5 player model
|
||||
local player_model_bottom = tonumber(minetest.settings:get("player_model_bottom")) or -.5
|
||||
local player_model_vec = vector.new(0, player_model_bottom, 0)
|
||||
local target_pos = target_station.pos
|
||||
|
||||
local top_pos = vector.add(node_info.pos, { x=0, y=1, z=0 })
|
||||
local top_node = minetest.get_node(top_pos)
|
||||
if top_node.name ~= "travelnet:hidden_top" then
|
||||
local def = minetest.registered_nodes[top_node.name]
|
||||
if def and def.buildable_to then
|
||||
minetest.set_node(top_pos, { name="travelnet:hidden_top" })
|
||||
end
|
||||
end
|
||||
|
||||
minetest.load_area(target_pos)
|
||||
|
||||
local tnode = minetest.get_node(target_pos)
|
||||
-- check if the box has at the other end has been removed.
|
||||
if minetest.get_item_group(tnode.name, "travelnet") == 0 and minetest.get_item_group(tnode.name, "elevator") == 0 then
|
||||
-- provide information necessary to identify the removed box
|
||||
local oldmetadata = {
|
||||
fields = {
|
||||
owner = node_info.props.owner_name,
|
||||
station_name = fields.target,
|
||||
station_network = node_info.props.station_network
|
||||
}
|
||||
}
|
||||
|
||||
local success, reason = travelnet.remove_box_action(oldmetadata)
|
||||
if not success then
|
||||
return false, reason
|
||||
end
|
||||
|
||||
travelnet.remove_box_message(oldmetadata, player)
|
||||
else
|
||||
-- add player model offset
|
||||
target_pos = vector.add(target_pos, player_model_vec)
|
||||
-- add travelnet bottom plate offset
|
||||
target_pos = vector.add(target_pos, { x=0, y=0.05, z=0 })
|
||||
|
||||
player:set_pos(target_pos)
|
||||
travelnet.rotate_player(target_pos, player)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
@@ -0,0 +1,89 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, fields, player)
|
||||
local pos = node_info.pos
|
||||
local meta = node_info.meta
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
local owner_name = node_info.props.owner_name
|
||||
local station_network = node_info.props.station_network
|
||||
local station_name = node_info.props.station_name
|
||||
local description = node_info.props.description
|
||||
|
||||
if not description then
|
||||
return false, S("Unknown node.")
|
||||
end
|
||||
|
||||
if not pos or not fields or not meta or not player_name then
|
||||
return false, S("Invalid data or node.")
|
||||
end
|
||||
|
||||
-- sanitize inputs
|
||||
if travelnet.is_falsey_string(fields.station_name) then
|
||||
fields.station_name = S("at @1 m", tostring(pos.y))
|
||||
end
|
||||
|
||||
-- nothing changed?
|
||||
if station_name == fields.station_name then
|
||||
return true, { formspecs = "primary" }
|
||||
end
|
||||
|
||||
-- players with travelnet_remove priv can dig the station
|
||||
if not minetest.get_player_privs(player_name)[travelnet.remove_priv]
|
||||
-- the function travelnet.allow_dig(..) may allow additional digging
|
||||
and not travelnet.allow_dig(player_name, owner_name, station_network, pos)
|
||||
-- the owner can remove the station
|
||||
and owner_name ~= player_name
|
||||
-- stations without owner can be removed/edited by anybody
|
||||
and owner_name ~= ""
|
||||
then
|
||||
return false, S("This @1 belongs to @2. You can't edit it.",
|
||||
description,
|
||||
tostring(owner_name)
|
||||
)
|
||||
end
|
||||
|
||||
local travelnets = travelnet.get_travelnets(owner_name)
|
||||
local network = travelnets[station_network]
|
||||
if not network then
|
||||
network = {}
|
||||
travelnets[station_name] = network
|
||||
end
|
||||
|
||||
-- does a station with the new name already exist?
|
||||
if network[fields.station_name] then
|
||||
return false, S('Station "@1" already exists on network "@2".',
|
||||
fields.station_name, station_network)
|
||||
end
|
||||
|
||||
-- get the old station table
|
||||
local old_station = network[station_name]
|
||||
if not old_station then
|
||||
return false, S("Station does exist.")
|
||||
end
|
||||
-- apply the old table to the new station
|
||||
network[fields.station_name] = old_station
|
||||
-- remove old station
|
||||
network[station_name] = nil
|
||||
-- update station name in node meta
|
||||
meta:set_string("station_name", fields.station_name)
|
||||
|
||||
minetest.chat_send_player(player_name,
|
||||
S('Station "@1" has been renamed to "@2" on network "@3".',
|
||||
station_name, fields.station_name, station_network))
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Station '@1'" .. " " ..
|
||||
"on network '@2' (owned by @3)" .. " " ..
|
||||
"ready for usage.",
|
||||
tostring(fields.station_name), tostring(station_network), tostring(owner_name)))
|
||||
|
||||
-- save the updated network data in a savefile over server restart
|
||||
travelnet.log("action", "renamed elevator '" .. fields.station_name .. "' on network '" .. station_network ..
|
||||
"' for player '" .. owner_name .. "'")
|
||||
travelnet.set_travelnets(owner_name, travelnets)
|
||||
|
||||
return true, { formspec = travelnet.formspecs.primary, options = {
|
||||
station_name = fields.station_name
|
||||
} }
|
||||
end
|
||||
@@ -0,0 +1,246 @@
|
||||
local S = minetest.get_translator("travelnet")
|
||||
|
||||
return function (node_info, fields, player)
|
||||
local pos = node_info.pos
|
||||
local meta = node_info.meta
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
if not pos or not fields or not meta or not player_name then
|
||||
return false, S("Invalid data or node.")
|
||||
end
|
||||
|
||||
local owner_name = node_info.props.owner_name
|
||||
local station_network = node_info.props.station_network
|
||||
local station_name = node_info.props.station_name
|
||||
local description = node_info.props.description
|
||||
|
||||
local new_owner_name, new_station_network, new_station_name
|
||||
|
||||
if not description then
|
||||
return false, S("Unknown node.")
|
||||
end
|
||||
|
||||
if owner_name == fields.owner_name
|
||||
and station_network == fields.station_network
|
||||
and station_name == fields.station_name
|
||||
then
|
||||
return true, { formspec = travelnet.formspecs.primary }
|
||||
end
|
||||
|
||||
-- sanitize inputs
|
||||
local error_message = ''
|
||||
if travelnet.is_falsey_string(fields.station_name) then
|
||||
error_message = S('Please provide a station name.')
|
||||
end
|
||||
if travelnet.is_falsey_string(fields.station_network) then
|
||||
error_message = error_message .. ' '
|
||||
..S('Please provide a network name.')
|
||||
end
|
||||
if travelnet.is_falsey_string(fields.owner_name) then
|
||||
error_message = error_message .. ' '
|
||||
..S('Please provide an owner.')
|
||||
end
|
||||
if '' ~= error_message then
|
||||
return false, error_message
|
||||
end
|
||||
|
||||
-- players with travelnet_remove priv can dig the station
|
||||
if not minetest.get_player_privs(player_name)[travelnet.remove_priv]
|
||||
-- the function travelnet.allow_dig(..) may allow additional digging
|
||||
and not travelnet.allow_dig(player_name, owner_name, station_network, pos)
|
||||
-- the owner can remove the station
|
||||
and owner_name ~= player_name
|
||||
-- stations without owner can be removed/edited by anybody
|
||||
and owner_name ~= ""
|
||||
then
|
||||
return false, S("This @1 belongs to @2. You can't edit it.",
|
||||
description,
|
||||
tostring(owner_name)
|
||||
)
|
||||
end
|
||||
|
||||
local timestamp = os.time()
|
||||
if owner_name ~= fields.owner_name then
|
||||
if not minetest.get_player_privs(player_name)[travelnet.attach_priv]
|
||||
and not travelnet.allow_attach(player_name, owner_name, fields.station_network) then
|
||||
minetest.record_protection_violation(pos, player_name)
|
||||
return false, S("You don't have permission to change the owner of this travelnet")
|
||||
end
|
||||
|
||||
-- new owner -> remove station from old network then add to new owner
|
||||
-- but only if there is space on the network
|
||||
-- get the new network
|
||||
|
||||
local old_travelnets = travelnet.get_travelnets(owner_name)
|
||||
local new_travelnets = travelnet.get_travelnets(fields.owner_name)
|
||||
|
||||
local new_network = new_travelnets[fields.station_network]
|
||||
if not new_network then
|
||||
new_network = {}
|
||||
new_travelnets[fields.station_network] = new_network
|
||||
end
|
||||
|
||||
-- does a station with the new name already exist?
|
||||
if new_network[fields.station_name] then
|
||||
return false, S('Station "@1" already exists on network "@2" of player "@3".',
|
||||
fields.station_name, fields.station_network, fields.owner_name)
|
||||
end
|
||||
|
||||
-- does the new network have space at all?
|
||||
if travelnet.MAX_STATIONS_PER_NETWORK ~= 0 and 1 + #new_network > travelnet.MAX_STATIONS_PER_NETWORK then
|
||||
return false,
|
||||
S('Network "@1", already contains the maximum number (@2) of '
|
||||
.. 'allowed stations per network. Please choose a '
|
||||
.. 'different network name.', fields.station_network,
|
||||
travelnet.MAX_STATIONS_PER_NETWORK)
|
||||
end
|
||||
|
||||
-- get the old network
|
||||
local old_network = old_travelnets[station_network]
|
||||
if not old_network then
|
||||
print("TRAVELNET: failed to get old network when re-owning "
|
||||
.. "travelnet/elevator at pos " .. minetest.pos_to_string(pos))
|
||||
return false, S("Station does not have network.")
|
||||
end
|
||||
|
||||
-- remove old station from old network
|
||||
old_network[station_name] = nil
|
||||
-- add new station to new network
|
||||
new_network[fields.station_name] = { pos = pos, timestamp = timestamp }
|
||||
|
||||
-- update meta
|
||||
meta:set_string("station_name", fields.station_name)
|
||||
meta:set_string("station_network", fields.station_network)
|
||||
meta:set_string("owner", fields.owner_name)
|
||||
meta:set_int ("timestamp", timestamp)
|
||||
|
||||
minetest.chat_send_player(player_name,
|
||||
S('Station "@1" has been renamed to "@2", '
|
||||
.. 'moved from network "@3" to network "@4" '
|
||||
.. 'and from owner "@5" to owner "@6".',
|
||||
station_name, fields.station_name,
|
||||
station_network, fields.station_network,
|
||||
owner_name, fields.owner_name))
|
||||
|
||||
new_owner_name = fields.owner_name
|
||||
new_station_network = fields.station_network
|
||||
new_station_name = fields.station_name
|
||||
|
||||
travelnet.log("action", "changed station '" .. station_name .. "' to '" .. fields.station_name ..
|
||||
"' moved network from '" .. station_network .. "' to '" .. fields.station_network .. "'" ..
|
||||
"' from player '" .. owner_name .. "' to '" .. fields.owner_name .. "'")
|
||||
|
||||
travelnet.set_travelnets(owner_name, old_travelnets)
|
||||
travelnet.set_travelnets(fields.owner_name, new_travelnets)
|
||||
|
||||
elseif station_network ~= fields.station_network then
|
||||
-- same owner but different network -> remove station from old network
|
||||
-- but only if there is space on the new network and no other station with that name
|
||||
-- get the new network
|
||||
local travelnets = travelnet.get_travelnets(owner_name)
|
||||
local network = travelnets[fields.station_network]
|
||||
if not network then
|
||||
network = {}
|
||||
travelnets[fields.station_network] = network
|
||||
end
|
||||
|
||||
-- does a station with the new name already exist?
|
||||
if network[fields.station_name] then
|
||||
return false, S('Station "@1" already exists on network "@2".',
|
||||
fields.station_name, fields.station_network)
|
||||
end
|
||||
|
||||
-- does the new network have space at all?
|
||||
if travelnet.MAX_STATIONS_PER_NETWORK ~= 0 and 1 + #network > travelnet.MAX_STATIONS_PER_NETWORK then
|
||||
return false,
|
||||
S('Network "@1", already contains the maximum number (@2) of '
|
||||
.. 'allowed stations per network. Please choose a '
|
||||
.. 'different network name.', fields.station_network,
|
||||
travelnet.MAX_STATIONS_PER_NETWORK)
|
||||
end
|
||||
-- get the old network
|
||||
local old_network = travelnets[station_network]
|
||||
if not old_network then
|
||||
print("TRAVELNET: failed to get old network when re-networking "
|
||||
.. "travelnet/elevator at pos " .. minetest.pos_to_string(pos))
|
||||
return false, S("Station does not have network.")
|
||||
end
|
||||
-- remove old station from old network
|
||||
old_network[station_name] = nil
|
||||
-- add new station to new network
|
||||
network[fields.station_name] = { pos = pos, timestamp = timestamp }
|
||||
-- update meta
|
||||
meta:set_string("station_name", fields.station_name)
|
||||
meta:set_string("station_network", fields.station_network)
|
||||
meta:set_int ("timestamp", timestamp)
|
||||
|
||||
minetest.chat_send_player(player_name,
|
||||
S('Station "@1" has been renamed to "@2" and moved '
|
||||
.. 'from network "@3" to network "@4".',
|
||||
station_name, fields.station_name,
|
||||
station_network, fields.station_network))
|
||||
|
||||
new_station_network = fields.station_network
|
||||
new_station_name = fields.station_name
|
||||
|
||||
travelnet.log("action", "changed station '" .. station_name .. "' to '" .. fields.station_name ..
|
||||
"' moved network from '" .. station_network .. "' to '" .. fields.station_network .. "'" ..
|
||||
"' for player '" .. owner_name .. "'")
|
||||
|
||||
travelnet.set_travelnets(owner_name, travelnets)
|
||||
|
||||
else
|
||||
-- only name changed -> change name but keep timestamp to preserve order
|
||||
local travelnets = travelnet.get_travelnets(owner_name)
|
||||
local network = travelnets[station_network]
|
||||
if not network then
|
||||
network = {}
|
||||
travelnets[station_network] = network
|
||||
end
|
||||
|
||||
-- does a station with the new name already exist?
|
||||
if network[fields.station_name] then
|
||||
return false, S('Station "@1" already exists on network "@2".',
|
||||
fields.station_name, station_network)
|
||||
end
|
||||
|
||||
-- get the old station table
|
||||
local old_station = network[station_name]
|
||||
if not old_station then
|
||||
return false, S("Station does exist.")
|
||||
end
|
||||
-- apply the old table to the new station
|
||||
network[fields.station_name] = old_station
|
||||
-- remove old station
|
||||
network[station_name] = nil
|
||||
-- update station name in node meta
|
||||
meta:set_string("station_name", fields.station_name)
|
||||
|
||||
minetest.chat_send_player(player_name,
|
||||
S('Station "@1" has been renamed to "@2" on network "@3".',
|
||||
station_name, fields.station_name, station_network))
|
||||
|
||||
new_station_name = fields.station_name
|
||||
|
||||
travelnet.log("action", "changed station '" .. station_name .. "' to '" .. fields.station_name ..
|
||||
"' on network '" .. station_network .. "'" ..
|
||||
"' for player '" .. owner_name .. "'")
|
||||
|
||||
travelnet.set_travelnets(owner_name, travelnets)
|
||||
end
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Station '@1'" .. " " ..
|
||||
"on network '@2' (owned by @3)" .. " " ..
|
||||
"ready for usage.",
|
||||
tostring(new_station_name or station_name),
|
||||
tostring(new_station_network or station_network),
|
||||
tostring(new_owner_name or owner_name)
|
||||
))
|
||||
|
||||
return true, { formspec = travelnet.formspecs.primary, options = {
|
||||
station_name = new_station_name or station_name,
|
||||
station_network = new_station_network or station_network,
|
||||
owner_name = new_owner_name or owner_name
|
||||
} }
|
||||
end
|
||||
Reference in New Issue
Block a user