2017-10-25 01:51:49 +02:00
|
|
|
--Author: Valansch
|
|
|
|
|
|
|
|
local resource_types = {"copper-ore", "iron-ore", "coal", "stone", "uranium-ore", "crude-oil"}
|
|
|
|
|
2017-10-25 22:24:10 +02:00
|
|
|
global.current_portal_index = 1
|
2017-10-25 01:51:49 +02:00
|
|
|
global.portals = {}
|
2017-10-25 22:24:10 +02:00
|
|
|
--Sample Portal:
|
2017-10-26 10:40:14 +02:00
|
|
|
--{position : LuaPosition, source: LuaSurface, target : LuaPosition, target_surface : LuaSurface}
|
2017-10-25 22:24:10 +02:00
|
|
|
|
|
|
|
global.current_magic_chest_index = 1
|
|
|
|
global.magic_chests = {}
|
|
|
|
--{entity : LuaEntity, target : LuaEntity}
|
|
|
|
|
|
|
|
|
|
|
|
global.last_tp = {}
|
2017-10-26 10:40:14 +02:00
|
|
|
global.teleport_cooldown = 3
|
2017-10-26 16:28:08 +02:00
|
|
|
global.portal_radius = 2.5
|
2017-10-25 22:24:10 +02:00
|
|
|
|
2017-10-25 01:51:49 +02:00
|
|
|
|
2017-10-26 10:40:14 +02:00
|
|
|
local function get_nice_surface_name(surface)
|
|
|
|
local name = surface.name:gsub("-ore", ""):gsub("-oil", " Oil")
|
|
|
|
return name:sub(1,1):upper() .. name:sub(2)
|
|
|
|
end
|
|
|
|
|
2017-10-25 01:51:49 +02:00
|
|
|
--Creates autoplace_controls with only one resource type enabled
|
|
|
|
local function create_resource_setting(resource)
|
|
|
|
local settings = game.surfaces[1].map_gen_settings
|
|
|
|
for _,type in pairs(resource_types) do
|
|
|
|
settings.autoplace_controls[type] = {frequency = "none", size = "none", richness = "none"}
|
|
|
|
end
|
|
|
|
settings.autoplace_controls[resource] = {frequency = "normal", size = "big", richness = "good"}
|
|
|
|
return settings
|
|
|
|
end
|
|
|
|
local function init()
|
|
|
|
if not game.surfaces[2] then
|
|
|
|
for _,type in pairs(resource_types) do
|
|
|
|
game.create_surface(type, create_resource_setting(type))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function run_combined_module(event)
|
|
|
|
init()
|
|
|
|
end
|
|
|
|
|
2017-10-26 10:40:14 +02:00
|
|
|
local function teleport_nearby_players(portal)
|
2017-10-25 01:51:49 +02:00
|
|
|
for _,player in pairs(game.players) do
|
2017-10-26 10:40:14 +02:00
|
|
|
if player.connected and player.surface == portal.source then
|
2017-10-26 16:28:08 +02:00
|
|
|
if distance(portal.position, player.position) < global.portal_radius then
|
2017-10-25 22:24:10 +02:00
|
|
|
if not global.last_tp[player.name] or global.last_tp[player.name] + global.teleport_cooldown * 60 < game.tick then
|
2017-10-26 10:40:14 +02:00
|
|
|
player.teleport(portal.target, portal.target_surface)
|
2017-10-25 22:24:10 +02:00
|
|
|
global.last_tp[player.name] = game.tick
|
2017-10-26 10:40:14 +02:00
|
|
|
player.print("Wooosh! You are now in the " .. get_nice_surface_name(portal.target_surface) .. " dimention.")
|
2017-10-25 22:24:10 +02:00
|
|
|
end
|
2017-10-25 01:51:49 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-25 22:24:10 +02:00
|
|
|
local function teleport_players()
|
|
|
|
local num_portals = #global.portals
|
|
|
|
if num_portals > 0 then
|
|
|
|
local portal = global.portals[global.current_portal_index]
|
2017-10-26 10:40:14 +02:00
|
|
|
if portal.target then
|
|
|
|
teleport_nearby_players(portal)
|
2017-10-25 22:24:10 +02:00
|
|
|
end
|
|
|
|
global.current_portal_index = (global.current_portal_index) % num_portals + 1 --Next portal
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function teleport_stuff()
|
|
|
|
local num_chests = #global.magic_chests
|
|
|
|
if num_chests > 0 then
|
|
|
|
local chest = global.magic_chests[global.current_magic_chest_index]
|
|
|
|
if chest.entity and chest.target and chest.entity.valid and chest.target.valid then
|
|
|
|
local inv = chest.entity.get_inventory(defines.inventory.chest)
|
|
|
|
local target_inv = chest.target.get_inventory(defines.inventory.chest)
|
|
|
|
if inv and target_inv then
|
|
|
|
for item, count in pairs(inv.get_contents()) do
|
|
|
|
local n_inserted = target_inv.insert{name = item, count = count}
|
2017-10-26 10:40:14 +02:00
|
|
|
if n_inserted > 0 then
|
|
|
|
inv.remove{name = item, count = n_inserted}
|
|
|
|
end
|
2017-10-25 01:51:49 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2017-10-25 22:24:10 +02:00
|
|
|
global.current_magic_chest_index = (global.current_magic_chest_index) % num_chests + 1 --Next portal
|
2017-10-25 01:51:49 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-25 22:24:10 +02:00
|
|
|
local function dim_on_tick(event)
|
|
|
|
if game.tick % 2 == 0 then
|
|
|
|
teleport_stuff()
|
|
|
|
else
|
|
|
|
teleport_players()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
global.chest_selected = false
|
|
|
|
local function linkchests()
|
2017-10-26 10:40:14 +02:00
|
|
|
if game.player and game.player.admin and game.player.selected and (game.player.selected.type == "logistic-container" or game.player.selected.type == "container") then
|
2017-10-25 22:24:10 +02:00
|
|
|
game.player.selected.destructible = false
|
|
|
|
game.player.selected.minable = false
|
|
|
|
if global.chest_selected then
|
|
|
|
global.magic_chests[#global.magic_chests].target = game.player.selected
|
|
|
|
game.print("Link established.")
|
|
|
|
else
|
|
|
|
table.insert(global.magic_chests, {entity = game.player.selected})
|
|
|
|
game.print("Selected first chest.")
|
|
|
|
end
|
|
|
|
global.chest_selected = not global.chest_selected
|
|
|
|
else
|
|
|
|
game.print("failed.")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
global.portal_selected = false
|
|
|
|
local function linkportals()
|
2017-10-26 10:40:14 +02:00
|
|
|
if game.player and game.player.admin then
|
2017-10-25 22:24:10 +02:00
|
|
|
if global.portal_selected then
|
2017-10-26 10:40:14 +02:00
|
|
|
global.portals[#global.portals].target = game.player.position
|
|
|
|
global.portals[#global.portals].target_surface = game.player.surface
|
2017-10-25 22:24:10 +02:00
|
|
|
--Way back home:
|
2017-10-26 10:40:14 +02:00
|
|
|
table.insert(global.portals, {position = game.player.position, target = global.portals[#global.portals].position, source = game.player.surface, target_surface = global.portals[#global.portals].source})
|
2017-10-25 22:24:10 +02:00
|
|
|
game.print("Portal link established.")
|
|
|
|
else
|
2017-10-26 10:40:14 +02:00
|
|
|
table.insert(global.portals, {position = game.player.position, source = game.player.surface})
|
2017-10-25 22:24:10 +02:00
|
|
|
game.print("Selected first portal.")
|
|
|
|
end
|
|
|
|
global.portal_selected = not global.portal_selected
|
|
|
|
else
|
|
|
|
game.print("failed.")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
commands.add_command("linkchests", "Select a chest to link to another. Run this command again to select the other one.", linkchests)
|
|
|
|
commands.add_command("linkportals", "Select a portal to link to another. Run this command again to select the other one.", linkportals)
|
2017-10-25 01:51:49 +02:00
|
|
|
Event.register(defines.events.on_tick, dim_on_tick)
|