-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #484 from ComfyFactory/robot_limiting
robot limiter initial version
- Loading branch information
Showing
1 changed file
with
160 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
|
||
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 |