mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-03-17 20:58:13 +02:00
160 lines
4.8 KiB
Lua
160 lines
4.8 KiB
Lua
|
|
local Global = require 'utils.global'
|
|
local Event = require 'utils.event'
|
|
|
|
local Module = {}
|
|
|
|
local settings = {
|
|
enabled = true,
|
|
registered_forces = {},
|
|
roboport_limit = 50,
|
|
logi_robot_limit = 500,
|
|
cons_robot_limit = 500,
|
|
damage_amount = 10
|
|
}
|
|
Global.register(
|
|
settings,
|
|
function(tbl)
|
|
settings = tbl
|
|
end
|
|
)
|
|
|
|
local function alert(entity)
|
|
local messages = {
|
|
['roboport'] = 'Too many roboports in the network, they start to deteriorate!',
|
|
['logistic-robot'] = 'Too many logistic robots in same network, they collide with each other often!',
|
|
['construction-robot'] = 'Too many construction robots in same network, they collide with each other often!',
|
|
}
|
|
for _, player in pairs(game.connected_players) do
|
|
player.add_custom_alert(entity, {type = 'virtual', name = 'signal-deny'}, messages[entity.type], true)
|
|
player.play_sound({path = 'utility/alert_destroyed'})
|
|
end
|
|
end
|
|
|
|
local function damage_entity(entity)
|
|
entity.health = entity.health - settings.damage_amount
|
|
if entity.health <= 0 then
|
|
alert(entity)
|
|
entity.die(entity.force, entity)
|
|
end
|
|
end
|
|
|
|
local function restrict_roboports(custom_force)
|
|
local force = custom_force or game.forces.player
|
|
local surface_networks = force.logistic_networks
|
|
for _, surface_network in pairs(surface_networks) do
|
|
for _, network in pairs(surface_network) do
|
|
if #network.cells > settings.roboport_limit then
|
|
for _, cell in pairs(network.cells) do
|
|
--cell.owner.active = false -- doesn't currently work REEEEEEEEEEEEEE, can't disable roboports
|
|
if math.random(1, 3) == 1 then
|
|
damage_entity(cell.owner)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
local function restrict_robots(custom_force)
|
|
local force = custom_force or game.forces.player
|
|
local surface_networks = force.logistic_networks
|
|
for _, surface_network in pairs(surface_networks) do
|
|
for _, network in pairs(surface_network) do
|
|
if network.all_logistic_robots > settings.logi_robot_limit then
|
|
for _, robot in pairs(network.logistic_robots) do
|
|
--robot.active = false --works but is graphically meh
|
|
if math.random(1, 8) == 1 then
|
|
damage_entity(robot)
|
|
end
|
|
end
|
|
end
|
|
if network.all_construction_robots > settings.cons_robot_limit then
|
|
for _, robot in pairs(network.construction_robots) do
|
|
--robot.active = false --works but is graphically meh
|
|
if math.random(1, 8) == 1 then
|
|
damage_entity(robot)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function do_tick()
|
|
if not settings.enabled then return end
|
|
for _, force in pairs(settings.registered_forces) do
|
|
if force.enabled then
|
|
restrict_roboports(force.force)
|
|
restrict_robots(force.force)
|
|
end
|
|
end
|
|
end
|
|
|
|
---Gets the amount of damage dealt per second
|
|
function Module.get_damage()
|
|
return settings.damage_amount
|
|
end
|
|
|
|
---Sets the amount of damage dealt per second
|
|
---@param number integer
|
|
function Module.set_damage(number)
|
|
settings.damage_amount = number
|
|
end
|
|
|
|
---Gets the limit to number of logistic robots in single network
|
|
function Module.get_logistic_robot_limit()
|
|
return settings.logi_robot_limit
|
|
end
|
|
|
|
---Sets the limit to number of logistic robots in single network
|
|
---@param number integer
|
|
function Module.set_logistic_robot_limit(number)
|
|
settings.logi_robot_limit = number
|
|
end
|
|
|
|
---Gets the limit to number of construction robots in single network
|
|
function Module.get_construction_robot_limit()
|
|
return settings.cons_robot_limit
|
|
end
|
|
|
|
---Sets the limit to number of construction robots in single network
|
|
---@param number integer
|
|
function Module.set_construction_robot_limit(number)
|
|
settings.cons_robot_limit = number
|
|
end
|
|
|
|
---Gets the limit to number of roboports in single network
|
|
function Module.get_roboport_limit()
|
|
return settings.roboport_limit
|
|
end
|
|
|
|
---Sets the limit to number of roboports in single network
|
|
---@param number integer
|
|
function Module.set_roboport_limit(number)
|
|
settings.roboport_limit = number
|
|
end
|
|
|
|
---Enables the module
|
|
---@param enabled boolean
|
|
function Module.enable(enabled)
|
|
settings.enabled = enabled
|
|
end
|
|
|
|
---Register or modify the force to be scanned and modified by this module
|
|
---@param force LuaForce
|
|
---@param enabled boolean
|
|
function Module.register_force(force, enabled)
|
|
settings.registered_forces[force.index] = {force = force, enabled = enabled}
|
|
end
|
|
|
|
local function on_init()
|
|
Module.register_force(game.forces.player, true)
|
|
end
|
|
|
|
Event.on_init(on_init)
|
|
Event.on_nth_tick(60, do_tick)
|
|
|
|
return Module |