Factorio: energy link bridge improvements (#4182)
* improve energy link performance on large surfaces * Add Energy link bridge storage table to initialization. * Fix event based energy link for Factorio 2.0 * Adjust energy link bridge for quality.
This commit is contained in:
parent
7eb12174b7
commit
a3d6036939
|
@ -105,8 +105,8 @@ function on_player_changed_position(event)
|
||||||
end
|
end
|
||||||
local target_direction = exit_table[outbound_direction]
|
local target_direction = exit_table[outbound_direction]
|
||||||
|
|
||||||
local target_position = {(CHUNK_OFFSET[target_direction][1] + last_x_chunk) * 32 + 16,
|
local target_position = {(CHUNK_OFFSET[target_direction][1] + last_x_chunk) * 32 + 16,
|
||||||
(CHUNK_OFFSET[target_direction][2] + last_y_chunk) * 32 + 16}
|
(CHUNK_OFFSET[target_direction][2] + last_y_chunk) * 32 + 16}
|
||||||
target_position = character.surface.find_non_colliding_position(character.prototype.name,
|
target_position = character.surface.find_non_colliding_position(character.prototype.name,
|
||||||
target_position, 32, 0.5)
|
target_position, 32, 0.5)
|
||||||
if target_position ~= nil then
|
if target_position ~= nil then
|
||||||
|
@ -134,40 +134,96 @@ end
|
||||||
|
|
||||||
script.on_event(defines.events.on_player_changed_position, on_player_changed_position)
|
script.on_event(defines.events.on_player_changed_position, on_player_changed_position)
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
function count_energy_bridges()
|
||||||
|
local count = 0
|
||||||
|
for i, bridge in pairs(storage.energy_link_bridges) do
|
||||||
|
if validate_energy_link_bridge(i, bridge) then
|
||||||
|
count = count + 1 + (bridge.quality.level * 0.3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
function get_energy_increment(bridge)
|
||||||
|
return ENERGY_INCREMENT + (ENERGY_INCREMENT * 0.3 * bridge.quality.level)
|
||||||
|
end
|
||||||
function on_check_energy_link(event)
|
function on_check_energy_link(event)
|
||||||
--- assuming 1 MJ increment and 5MJ battery:
|
--- assuming 1 MJ increment and 5MJ battery:
|
||||||
--- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing
|
--- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing
|
||||||
if event.tick % 60 == 30 then
|
if event.tick % 60 == 30 then
|
||||||
local surface = game.get_surface(1)
|
|
||||||
local force = "player"
|
local force = "player"
|
||||||
local bridges = surface.find_entities_filtered({name="ap-energy-bridge", force=force})
|
local bridges = storage.energy_link_bridges
|
||||||
local bridgecount = table_size(bridges)
|
local bridgecount = count_energy_bridges()
|
||||||
storage.forcedata[force].energy_bridges = bridgecount
|
storage.forcedata[force].energy_bridges = bridgecount
|
||||||
if storage.forcedata[force].energy == nil then
|
if storage.forcedata[force].energy == nil then
|
||||||
storage.forcedata[force].energy = 0
|
storage.forcedata[force].energy = 0
|
||||||
end
|
end
|
||||||
if storage.forcedata[force].energy < ENERGY_INCREMENT * bridgecount * 5 then
|
if storage.forcedata[force].energy < ENERGY_INCREMENT * bridgecount * 5 then
|
||||||
for i, bridge in ipairs(bridges) do
|
for i, bridge in pairs(bridges) do
|
||||||
if bridge.energy > ENERGY_INCREMENT*3 then
|
if validate_energy_link_bridge(i, bridge) then
|
||||||
storage.forcedata[force].energy = storage.forcedata[force].energy + (ENERGY_INCREMENT * ENERGY_LINK_EFFICIENCY)
|
energy_increment = get_energy_increment(bridge)
|
||||||
bridge.energy = bridge.energy - ENERGY_INCREMENT
|
if bridge.energy > energy_increment*3 then
|
||||||
|
storage.forcedata[force].energy = storage.forcedata[force].energy + (energy_increment * ENERGY_LINK_EFFICIENCY)
|
||||||
|
bridge.energy = bridge.energy - energy_increment
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for i, bridge in ipairs(bridges) do
|
for i, bridge in pairs(bridges) do
|
||||||
if storage.forcedata[force].energy < ENERGY_INCREMENT then
|
if validate_energy_link_bridge(i, bridge) then
|
||||||
break
|
energy_increment = get_energy_increment(bridge)
|
||||||
end
|
if storage.forcedata[force].energy < energy_increment and bridge.quality.level == 0 then
|
||||||
if bridge.energy < ENERGY_INCREMENT*2 and storage.forcedata[force].energy > ENERGY_INCREMENT then
|
break
|
||||||
storage.forcedata[force].energy = storage.forcedata[force].energy - ENERGY_INCREMENT
|
end
|
||||||
bridge.energy = bridge.energy + ENERGY_INCREMENT
|
if bridge.energy < energy_increment*2 and storage.forcedata[force].energy > energy_increment then
|
||||||
|
storage.forcedata[force].energy = storage.forcedata[force].energy - energy_increment
|
||||||
|
bridge.energy = bridge.energy + energy_increment
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
function string_starts_with(str, start)
|
||||||
|
return str:sub(1, #start) == start
|
||||||
|
end
|
||||||
|
function validate_energy_link_bridge(unit_number, entity)
|
||||||
|
if not entity then
|
||||||
|
if storage.energy_link_bridges[unit_number] == nil then return false end
|
||||||
|
storage.energy_link_bridges[unit_number] = nil
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if not entity.valid then
|
||||||
|
if storage.energy_link_bridges[unit_number] == nil then return false end
|
||||||
|
storage.energy_link_bridges[unit_number] = nil
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
function on_energy_bridge_constructed(entity)
|
||||||
|
if entity and entity.valid then
|
||||||
|
if string_starts_with(entity.prototype.name, "ap-energy-bridge") then
|
||||||
|
storage.energy_link_bridges[entity.unit_number] = entity
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function on_energy_bridge_removed(entity)
|
||||||
|
if string_starts_with(entity.prototype.name, "ap-energy-bridge") then
|
||||||
|
if storage.energy_link_bridges[entity.unit_number] == nil then return end
|
||||||
|
storage.energy_link_bridges[entity.unit_number] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
if (ENERGY_INCREMENT) then
|
if (ENERGY_INCREMENT) then
|
||||||
script.on_event(defines.events.on_tick, on_check_energy_link)
|
script.on_event(defines.events.on_tick, on_check_energy_link)
|
||||||
|
|
||||||
|
script.on_event({defines.events.on_built_entity}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||||
|
script.on_event({defines.events.on_robot_built_entity}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||||
|
script.on_event({defines.events.on_entity_cloned}, function(event) on_energy_bridge_constructed(event.destination) end)
|
||||||
|
|
||||||
|
script.on_event({defines.events.script_raised_revive}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||||
|
script.on_event({defines.events.script_raised_built}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||||
|
|
||||||
|
script.on_event({defines.events.on_entity_died}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||||
|
script.on_event({defines.events.on_player_mined_entity}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||||
|
script.on_event({defines.events.on_robot_mined_entity}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
{% if not imported_blueprints -%}
|
{% if not imported_blueprints -%}
|
||||||
|
@ -410,6 +466,7 @@ script.on_init(function()
|
||||||
{% if not imported_blueprints %}set_permissions(){% endif %}
|
{% if not imported_blueprints %}set_permissions(){% endif %}
|
||||||
storage.forcedata = {}
|
storage.forcedata = {}
|
||||||
storage.playerdata = {}
|
storage.playerdata = {}
|
||||||
|
storage.energy_link_bridges = {}
|
||||||
-- Fire dummy events for all currently existing forces.
|
-- Fire dummy events for all currently existing forces.
|
||||||
local e = {}
|
local e = {}
|
||||||
for name, _ in pairs(game.forces) do
|
for name, _ in pairs(game.forces) do
|
||||||
|
|
Loading…
Reference in New Issue