Files
factorio-scenario-ExpCluster/modules/SpawnArea/control.lua
2019-01-11 22:32:30 +00:00

126 lines
5.3 KiB
Lua

--- Creates a safe spawn area with chests and auto refilling turrets.
-- @module SpawnArea@4.0.0
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
-- @alias ThisModule
-- Module Require
local Game = require('FactorioStdLib.Game')
-- Local Variables
local turret_enabled = true
local turret_ammo = 'uranium-rounds-magazine'
local tile_positions = require(module_path..'/src/spawn_tiles')
local entity_positions = require(module_path..'/src/spawn_entities')
local global_offset = {x=0,y=-2}
local decon_radius = 20
local decon_tile = 'concrete'
local pattern_radius = 50
local pattern_tile = 'stone-path'
-- Module Define
local module_verbose = false
local ThisModule = {}
-- Global Define
-- location of auto refill turrets
local global = global{
{1,-3,-3},
{1,-3,3},
{1,3,-3},
{1,3,3}
}
-- Function Define
function ThisModule.afk_belt(surface,offset)
local belts = {{-0.5,-0.5,2},{0.5,-0.5,4},{-0.5,0.5,0},{0.5,0.5,6}}
for _,pos in pairs(belts) do
local position = {pos[1]+offset[1],pos[2]+offset[2]}
local belt = surface.create_entity{name='transport-belt',position=position,force='neutral',direction=pos[3]}
belt.destructible = false; belt.health = 0; belt.minable = false; belt.rotatable = false
end
end
function ThisModule.auto_turret(surface,pos)
if not turret_enabled then error('Auto Turrets are disabled.') end
-- adds a new turret to the global list, returns index
local _return
if surface then
surface = Game.get_surface(surface)
if not surface then error('Surface is not valid.') end
local posx = pos.x or pos[1] or error('Position is not valid.')
local posy = pos.y or pos[2] or error('Position is not valid.')
_return = table.insert(global,{surface.index,posx,posy})
end
-- spawns turrets and refills them
if not game.forces['spawn'] then game.create_force('spawn').set_cease_fire('player',true) game.forces['player'].set_cease_fire('spawn',true) end
for _,pos in pairs(global) do
surface = game.surfaces[pos[1]]
local turret = surface.find_entity('gun-turret',{pos[2],pos[3]})
if not turret then
turret = surface.create_entity{name='gun-turret',position={pos[2],pos[3]},force='spawn'}
turret.destructible = false; turret.health = 0; turret.minable = false; turret.rotatable = false; turret.operable = false; turret.health = 0
end
if turret.get_inventory(defines.inventory.turret_ammo).can_insert{name=turret_ammo,count=10} then
turret.get_inventory(defines.inventory.turret_ammo).insert{name=turret_ammo,count=10}
end
end
end
-- Event Handlers Define
if turret_enabled then
script.on_event(defines.events.on_tick,function(event)
if event.tick % 3600 then
ThisModule.auto_turret()
end
end)
end
script.on_event(defines.events.on_player_created, function(event)
if event.player_index == 1 then
local player = Game.get_player(event)
local surface = player.surface
local offset = {x=0,y=0}
local pattern_base_tile = surface.get_tile(player.position).name
if pattern_base_tile == 'deepwater' or pattern_base_tile == 'water' then pattern_base_tile = 'grass-1' end
local base_tiles = {}
local tiles = {}
-- generates a safe area of land and removes all entities
for x = -pattern_radius, pattern_radius do
for y = -pattern_radius, pattern_radius do
if x^2+y^2 < decon_radius^2 then
table.insert(base_tiles,{name=decon_tile,position={x+offset.x,y+offset.y}})
local entities = surface.find_entities_filtered{area={{x+offset.x-1,y+offset.y-1},{x+offset.x,y+offset.y}}}
for _,entity in pairs(entities) do if entity.name ~= 'player' then entity.destroy() end end
elseif x^2+y^2 < pattern_radius^2 then
table.insert(base_tiles,{name=pattern_base_tile,position={x+offset.x,y+offset.y}})
end
end
end
surface.set_tiles(base_tiles)
-- creates the pattern in the spawn
for _,position in pairs(tile_positions) do
table.insert(tiles,{name=pattern_tile,position={position[1]+offset.x+global_offset.x,position[2]+offset.y+global_offset.y}})
end
surface.set_tiles(tiles)
-- spawns all the entities in spawn
for _,entity in pairs(entity_positions) do
entity = surface.create_entity{name=entity[1],position={entity[2]+offset.x+global_offset.x,entity[3]+offset.y+global_offset.y},force='neutral'}
entity.destructible = false; entity.health = 0; entity.minable = false; entity.rotatable = false
end
-- generates spawn turrets and afk belts
if turret_enabled then ThisModule.auto_turret() end
ThisModule.afk_belt(surface,{offset.x-5,offset.y-5})
ThisModule.afk_belt(surface,{offset.x+5,offset.y-5})
ThisModule.afk_belt(surface,{offset.x-5,offset.y+5})
ThisModule.afk_belt(surface,{offset.x+5,offset.y+5})
-- sets the spawn and moves the first player there
player.force.set_spawn_position(offset,surface)
player.teleport(offset,surface)
end
end)
-- Module Return
return ThisModule