mirror of
https://github.com/Xevion/project-cybersyn.git
synced 2025-12-15 08:12:47 -06:00
added wagon comb functionality for refuelers
This commit is contained in:
@@ -112,7 +112,7 @@ Date: 2022-12-3
|
||||
Features:
|
||||
- Fixed a bug with SE compat preventing players from joining multiplayer games
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Version: 1.0.10
|
||||
Version: 1.1.0
|
||||
Date: 2022-12-5
|
||||
Features:
|
||||
- Added the ability to use the priority signal as input to optional station control so one can override priority on items with optional station control thresholds
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cybersyn",
|
||||
"version": "1.0.10",
|
||||
"version": "1.1.0",
|
||||
"title": "Project Cybersyn",
|
||||
"author": "Mami",
|
||||
"factorio_version": "1.1",
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
---@field public trains_total int
|
||||
---@field public accepted_layouts {[uint]: true?}
|
||||
---@field public layout_pattern (0|1|2|3)[]?
|
||||
---@field public wagon_combs {[int]: LuaEntity}?--NOTE: allowed to be invalid entities or combinators with the wrong operation, these must be checked and lazy deleted when found
|
||||
---@field public allows_all_trains boolean
|
||||
---@field public priority int
|
||||
---@field public network_name string?
|
||||
|
||||
@@ -17,13 +17,19 @@ local function table_compare(t0, t1)
|
||||
return true
|
||||
end
|
||||
|
||||
---@param a any[]
|
||||
---@param i uint
|
||||
local function iterr(a, i)
|
||||
i = i + 1
|
||||
if i <= #a then
|
||||
return i, a[#a - i + 1]
|
||||
local r = a[#a - i + 1]
|
||||
return i, r
|
||||
else
|
||||
return nil, nil
|
||||
end
|
||||
end
|
||||
|
||||
---@param a any[]
|
||||
local function irpairs(a)
|
||||
return iterr, a, 0
|
||||
end
|
||||
@@ -327,20 +333,83 @@ function set_r_wagon_combs(map_data, station, train)
|
||||
end
|
||||
end
|
||||
|
||||
---@param map_data MapData
|
||||
---@param station Station
|
||||
function unset_wagon_combs(map_data, station)
|
||||
if not station.wagon_combs then return end
|
||||
|
||||
for i, comb in pairs(station.wagon_combs) do
|
||||
---@param map_data MapData
|
||||
---@param refueler Refueler
|
||||
---@param train Train
|
||||
function set_refueler_combs(map_data, refueler, train)
|
||||
if not refueler.wagon_combs then return end
|
||||
local carriages = train.entity.carriages
|
||||
|
||||
local signals = {}
|
||||
|
||||
local is_reversed = get_train_direction(refueler.entity_stop, train.entity)
|
||||
local ivpairs = is_reversed and irpairs or ipairs
|
||||
for carriage_i, carriage in ivpairs(carriages) do
|
||||
---@type LuaEntity?
|
||||
local comb = refueler.wagon_combs[carriage_i]
|
||||
if comb and not comb.valid then
|
||||
comb = nil
|
||||
refueler.wagon_combs[carriage_i] = nil
|
||||
if next(refueler.wagon_combs) == nil then
|
||||
refueler.wagon_combs = nil
|
||||
break
|
||||
end
|
||||
end
|
||||
local inv = carriage.get_fuel_inventory()
|
||||
if inv then
|
||||
local wagon_signals
|
||||
if comb then
|
||||
wagon_signals = {}
|
||||
local array = carriage.prototype.items_to_place_this
|
||||
if array then
|
||||
local a = array[1]
|
||||
local name
|
||||
if type(a) == "string" then
|
||||
name = a
|
||||
else
|
||||
name = a.name
|
||||
end
|
||||
if game.item_prototypes[name] then
|
||||
wagon_signals[1] = {index = 1, signal = {type = "item", name = a.name}, count = 1}
|
||||
end
|
||||
end
|
||||
end
|
||||
for stack_i = 1, #inv do
|
||||
local stack = inv[stack_i]
|
||||
if stack.valid_for_read then
|
||||
if comb then
|
||||
local i = #wagon_signals + 1
|
||||
wagon_signals[i] = {index = i, signal = {type = "item", name = stack.name}, count = stack.count}
|
||||
end
|
||||
local j = #signals + 1
|
||||
signals[j] = {index = j, signal = {type = "item", name = stack.name}, count = stack.count}
|
||||
end
|
||||
end
|
||||
if comb then
|
||||
set_combinator_output(map_data, comb, wagon_signals)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
set_combinator_output(map_data, refueler.entity_comb, signals)
|
||||
end
|
||||
|
||||
|
||||
---@param map_data MapData
|
||||
---@param stop Station|Refueler
|
||||
function unset_wagon_combs(map_data, stop)
|
||||
if not stop.wagon_combs then return end
|
||||
|
||||
for i, comb in pairs(stop.wagon_combs) do
|
||||
if comb.valid then
|
||||
set_combinator_output(map_data, comb, nil)
|
||||
else
|
||||
station.wagon_combs[i] = nil
|
||||
stop.wagon_combs[i] = nil
|
||||
end
|
||||
end
|
||||
if next(station.wagon_combs) == nil then
|
||||
station.wagon_combs = nil
|
||||
if next(stop.wagon_combs) == nil then
|
||||
stop.wagon_combs = nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -448,7 +517,7 @@ function reset_stop_layout(map_data, stop, is_station_or_refueler, forbidden_ent
|
||||
supports_fluid = true
|
||||
end
|
||||
end
|
||||
elseif entity.name == COMBINATOR_NAME and is_station_or_refueler then
|
||||
elseif entity.name == COMBINATOR_NAME then
|
||||
local param = map_data.to_comb_params[entity.unit_number]
|
||||
if param.operation == OPERATION_WAGON_MANIFEST then
|
||||
local pos = entity.position
|
||||
@@ -484,8 +553,14 @@ function reset_stop_layout(map_data, stop, is_station_or_refueler, forbidden_ent
|
||||
end
|
||||
end
|
||||
stop.layout_pattern = layout_pattern
|
||||
for id, layout in pairs(map_data.layouts) do
|
||||
stop.accepted_layouts[id] = is_layout_accepted(layout_pattern, layout) or nil
|
||||
if is_station_or_refueler then
|
||||
for id, layout in pairs(map_data.layouts) do
|
||||
stop.accepted_layouts[id] = is_layout_accepted(layout_pattern, layout) or nil
|
||||
end
|
||||
else
|
||||
for id, layout in pairs(map_data.layouts) do
|
||||
stop.accepted_layouts[id] = is_refuel_layout_accepted(layout_pattern, layout) or nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ local migrations_table = {
|
||||
station.update_display = nil
|
||||
end
|
||||
end,
|
||||
["1.0.10"] = function()
|
||||
["1.1.0"] = function()
|
||||
---@type MapData
|
||||
local map_data = global
|
||||
map_data.tick_state = STATE_INIT
|
||||
|
||||
@@ -248,8 +248,9 @@ end
|
||||
---@param train Train
|
||||
local function on_train_arrives_refueler(map_data, refueler_id, train_id, train)
|
||||
if train.status == STATUS_TO_F then
|
||||
--local refueler = map_data.refuelers[refueler_id]
|
||||
local refueler = map_data.refuelers[refueler_id]
|
||||
train.status = STATUS_F
|
||||
set_refueler_combs(map_data, refueler, train)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -357,6 +358,8 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train)
|
||||
train.refueler_id = nil
|
||||
refueler.trains_total = refueler.trains_total - 1
|
||||
add_available_train(map_data, train_id, train)
|
||||
unset_wagon_combs(map_data, refueler)
|
||||
set_combinator_output(map_data, refueler.entity_comb, nil)
|
||||
elseif train.status == STATUS_D then
|
||||
--The train is leaving the depot without a manifest, the player likely intervened
|
||||
local depot = map_data.depots[train.parked_at_depot_id--[[@as uint]]]
|
||||
|
||||
Reference in New Issue
Block a user