Compare commits
15 Commits
Author | SHA1 | Date |
---|---|---|
Joey De Pauw | c359a92d45 | |
JoeyDP | 986997ece2 | |
Joey De Pauw | 226be2bbef | |
John Bauer | 35e1c523af | |
John Bauer | 798ed388cf | |
John Bauer | 422e24bf32 | |
John Bauer | 680e2c09e0 | |
John Bauer | 181b9a71cd | |
John Bauer | a3394b3759 | |
Joey De Pauw | 76dbc156c7 | |
Joey De Pauw | e7f576a1b3 | |
JoeyDP | 1d42185a7d | |
Eldrinn Elantey | 6e9e8087dc | |
Eldrinn Elantey | f487bdbc1d | |
Joey De Pauw | d92ed1e91e |
|
@ -1,4 +1,24 @@
|
|||
---------------------------------------------------------------------------------------------------
|
||||
Version: 0.3.3
|
||||
Date: 2021.03.09
|
||||
Performance:
|
||||
- Merge pull request by AngledLuffa to optimize code for pollution suction (https://github.com/JoeyDP/Factorio-Better-Air-Filtering/pull/2).
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Version: 0.3.2
|
||||
Date: 2021.02.05
|
||||
Fixes:
|
||||
- Apply fix by boskid: https://forums.factorio.com/95616
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Version: 0.3.1
|
||||
Date: 2020.12.05
|
||||
Updates:
|
||||
- Updated to Factorio 1.1.
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Version: 0.3.0
|
||||
Date: 2020.01.24
|
||||
Updates:
|
||||
- Updated to Factorio 0.18.
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Version: 0.2.3
|
||||
Date: 2020.01.04
|
||||
Fixes:
|
||||
|
|
|
@ -58,18 +58,6 @@ function energyCraftingModifier(entity)
|
|||
end
|
||||
end
|
||||
|
||||
function getSuctionRate(entity)
|
||||
if not entity.is_crafting() and getSpaceForPollution(entity) == 0 then
|
||||
return 0
|
||||
else
|
||||
return getBasePurificationRate(entity) * entity.crafting_speed * energyCraftingModifier(entity)
|
||||
end
|
||||
end
|
||||
|
||||
function getAbsorptionRate(entity)
|
||||
return math.min(getSpaceForPollution(entity), getSuctionRate(entity))
|
||||
end
|
||||
|
||||
function pollutionInPollutedWater(amount)
|
||||
return amount * 6 / 10
|
||||
end
|
||||
|
@ -87,6 +75,26 @@ function getSpaceForPollution(entity)
|
|||
return capacity - pollution
|
||||
end
|
||||
|
||||
function getSuctionRate(entity)
|
||||
if not entity.is_crafting() and getSpaceForPollution(entity) == 0 then
|
||||
return 0
|
||||
else
|
||||
return getBasePurificationRate(entity) * entity.crafting_speed * energyCraftingModifier(entity)
|
||||
end
|
||||
end
|
||||
|
||||
function getAbsorptionRate(entity)
|
||||
return math.min(getSpaceForPollution(entity), getSuctionRate(entity))
|
||||
end
|
||||
|
||||
function getTotalAbsorptionRate(filters)
|
||||
local totalAbsorptionRate = 0.0
|
||||
for _, filter in pairs(filters) do
|
||||
totalAbsorptionRate = totalAbsorptionRate + getAbsorptionRate(filter)
|
||||
end
|
||||
return totalAbsorptionRate
|
||||
end
|
||||
|
||||
function inRadius(filter, radius)
|
||||
if filter.name == "air-filter-machine-1" then
|
||||
return radius <= 0
|
||||
|
@ -99,7 +107,6 @@ function inRadius(filter, radius)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
-- #####################
|
||||
-- # Update script #
|
||||
-- #####################
|
||||
|
@ -113,27 +120,31 @@ function absorbPollution(event)
|
|||
end
|
||||
|
||||
function absorbChunk(chunk)
|
||||
if chunk:get_pollution() == 0 then
|
||||
local chunk_pollution = chunk:get_pollution()
|
||||
if chunk_pollution == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local totalAbsorptionRate = chunk:getTotalAbsorptionRate()
|
||||
local filters = chunk:getFilters()
|
||||
local totalAbsorptionRate = getTotalAbsorptionRate(filters)
|
||||
|
||||
--game.print("totalAbsorptionRate: " .. totalAbsorptionRate)
|
||||
--game.print("filter count: " .. #chunk.filters)
|
||||
--game.print("filter count: " .. #filters)
|
||||
|
||||
if totalAbsorptionRate == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local toAbsorb = math.min(chunk:get_pollution(), totalAbsorptionRate)
|
||||
local toAbsorb = math.min(chunk_pollution, totalAbsorptionRate)
|
||||
-- game.print("To absorb: " .. toAbsorb)
|
||||
|
||||
local totalInsertedAmount = 0.0
|
||||
for _, filter in pairs(chunk:getFilters()) do
|
||||
local fluid = { name = "pollution", amount = 0.0 }
|
||||
for _, filter in pairs(filters) do
|
||||
local toInsert = (getAbsorptionRate(filter) / totalAbsorptionRate) * toAbsorb
|
||||
if toInsert > 0 then
|
||||
local insertedAmount = filter.insert_fluid({ name = "pollution", amount = toInsert })
|
||||
fluid.amount = toInsert
|
||||
local insertedAmount = filter.insert_fluid(fluid)
|
||||
game.pollution_statistics.on_flow(filter.name, -insertedAmount)
|
||||
totalInsertedAmount = totalInsertedAmount + insertedAmount
|
||||
end
|
||||
|
@ -149,10 +160,10 @@ function stepsToOrigin(x, y)
|
|||
-- Provide coordinates of possible 1-steps toward (0, 0)
|
||||
local steps = {}
|
||||
if x ~= 0 then
|
||||
table.insert(steps, { x = x - sign(x), y = y })
|
||||
table.insert(steps, { x - sign(x), y })
|
||||
end
|
||||
if y ~= 0 then
|
||||
table.insert(steps, { x = x, y = y - sign(y) })
|
||||
table.insert(steps, { x, y - sign(y) })
|
||||
end
|
||||
return steps
|
||||
end
|
||||
|
@ -167,23 +178,26 @@ function suctionUpdateChunk(chunkTo, dx, dy)
|
|||
-- game.print("From " .. dx .. ", " .. dy)
|
||||
-- game.print("suction: " .. totalSuction)
|
||||
|
||||
local chunkFrom = getFilteredChunk(chunkTo.surface, chunkTo.x + dx, chunkTo.y + dy)
|
||||
local pollution = chunkFrom:get_pollution()
|
||||
local surface = chunkTo.surface
|
||||
-- get_pollution can handle indexed x, y as well as named x, y
|
||||
local position = { (chunkTo.x + dx) * 32, (chunkTo.y + dy) * 32 }
|
||||
|
||||
local pollution = surface.get_pollution(position)
|
||||
if pollution > 0.1 then
|
||||
local toPollute = math.min(pollution, totalSuction)
|
||||
local chunksVia = {}
|
||||
for _, step in pairs(stepsToOrigin(dx, dy)) do
|
||||
local chunk = getFilteredChunk(chunkTo.surface, chunkTo.x + step.x, chunkTo.y + step.y)
|
||||
table.insert(chunksVia, chunk)
|
||||
end
|
||||
-- first, unpollute the chunkFrom
|
||||
surface.pollute(position, -toPollute)
|
||||
--game.print("Moving " .. toPollute .. " pollution")
|
||||
--game.print("From: " .. position[1] .. ", " .. position[2] .. " (" .. toPollute .. ")")
|
||||
|
||||
-- game.print("Moving " .. toPollute .. " pollution")
|
||||
-- game.print("From: " .. chunkFrom.x .. ", " .. chunkFrom.y)
|
||||
for _, chunkVia in pairs(chunksVia) do
|
||||
-- game.print("To: " .. chunkVia.x .. ", " .. chunkVia.y)
|
||||
chunkVia:pollute(toPollute / #chunksVia)
|
||||
local steps = stepsToOrigin(dx, dy)
|
||||
toPollute = toPollute / #steps
|
||||
for _, step in pairs(steps) do
|
||||
position[1] = (chunkTo.x + step[1]) * 32
|
||||
position[2] = (chunkTo.y + step[2]) * 32
|
||||
surface.pollute(position, toPollute)
|
||||
--game.print("To: " .. position[1] .. ", " .. position[2] .. " (" .. toPollute .. ")")
|
||||
end
|
||||
chunkFrom:pollute(-toPollute)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -374,15 +388,6 @@ function FilteredChunk:removeFromMap()
|
|||
--end
|
||||
end
|
||||
|
||||
function FilteredChunk:getTotalAbsorptionRate()
|
||||
local totalAbsorptionRate = 0.0
|
||||
for _, filter in pairs(self:getFilters()) do
|
||||
local absorptionRate = getAbsorptionRate(filter)
|
||||
totalAbsorptionRate = totalAbsorptionRate + absorptionRate
|
||||
end
|
||||
return totalAbsorptionRate
|
||||
end
|
||||
|
||||
function FilteredChunk:getTotalSuctionRate(distance)
|
||||
local totalSuctionRate = 0.0
|
||||
for _, filter in pairs(self:getFilters()) do
|
||||
|
@ -413,6 +418,9 @@ function FilteredChunk:addFilter(filter)
|
|||
end
|
||||
end
|
||||
|
||||
-- Remove a filter machine from its chunk
|
||||
-- If this is removing the last filter, the record
|
||||
-- for this chunk is dropped.
|
||||
function FilteredChunk:removeFilter(filter)
|
||||
for i, f in pairs(self.filters) do
|
||||
if f.unit_number == filter.unit_number then
|
||||
|
@ -425,6 +433,9 @@ function FilteredChunk:removeFilter(filter)
|
|||
end
|
||||
end
|
||||
|
||||
-- either return an existing FilteredChunk for the given coordinates,
|
||||
-- or create a new one at the corresponding coordinates if there are
|
||||
-- no existing filters on this chunk
|
||||
function getFilteredChunk(surface, x, y)
|
||||
local chunkListX = global.air_filtered_chunks_map[surface.name]
|
||||
if chunkListX ~= nil then
|
||||
|
@ -449,6 +460,8 @@ function isAirFilterMachine(entity)
|
|||
return starts_with(entity.name, "air-filter-machine-")
|
||||
end
|
||||
|
||||
-- when a new machine is created, add it to the list of filters
|
||||
-- on whichever chunk it is on
|
||||
function onEntityCreated(event)
|
||||
if isAirFilterMachine(event.created_entity) then
|
||||
local chunkPos = positionToChunk(event.created_entity.position)
|
||||
|
@ -566,6 +579,7 @@ script.on_load(load)
|
|||
|
||||
function init()
|
||||
-- gather all filters on every surface
|
||||
air_filtered_chunks = {}
|
||||
global.air_filtered_chunks_map = {}
|
||||
for _, surface in pairs(game.surfaces) do
|
||||
local filters = surface.find_entities_filtered {
|
||||
|
|
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.0 KiB |
|
@ -1,13 +1,13 @@
|
|||
{
|
||||
"name": "better-air-filtering",
|
||||
"version": "0.2.3",
|
||||
"version": "0.3.3",
|
||||
"title": "Better Air Filtering",
|
||||
"author": "Joey De Pauw",
|
||||
"contact": "joeydepauw@gmail.com",
|
||||
"homepage": "",
|
||||
"factorio_version": "0.17",
|
||||
"factorio_version": "1.1",
|
||||
"dependencies": [
|
||||
"base >= 0.17",
|
||||
"base >= 1.1",
|
||||
"!air-filtering",
|
||||
"!NauvisDay",
|
||||
"!CW-carbon-capture"
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
[entity-name]
|
||||
air-filter-machine-1=Машина для фильтрации воздуха 1
|
||||
air-filter-machine-2=Машина для фильтрации воздуха 2
|
||||
air-filter-machine-3=Машина для фильтрации воздуха 3
|
||||
|
||||
[entity-description]
|
||||
air-filter-machine-1=Пассивная установка для фильтрации воздуха, действует в радиусе 1 чанка. Для работы требуются воздушные фильтры.
|
||||
air-filter-machine-2=Активная установка для фильтрации воздуха, которая использует электричество, чтобы притягивать к себе загрязнения из области радиусом в 2 чанка.
|
||||
air-filter-machine-3=Мощная установка для фильтрации воздуха, способный очищать от загрязнений область радиусом 3 чанка.
|
||||
|
||||
|
||||
[item-name]
|
||||
expendable-air-filter=Одноразовый воздушный фильтр
|
||||
air-filter=Воздушный фильтр
|
||||
used-air-filter=Использованный воздушный фильтр
|
||||
liquid-filter=Жидкостный фильтр
|
||||
used-liquid-filter=Использованный жидкостный фильтр
|
||||
|
||||
|
||||
[fuel-category-name]
|
||||
pollution-filter=Воздушный фильтр
|
||||
|
||||
|
||||
[fluid-name]
|
||||
pollution=Загрязнение
|
||||
polluted-water=Загрязненная вода
|
||||
|
||||
|
||||
[recipe-name]
|
||||
filter-air=Фильтрация воздуха
|
||||
filter-air2=Фильтрация воздуха
|
||||
filter-air-expendable=Фильтрация воздуха
|
||||
liquid-pollution=Конденсировать загрязнения
|
||||
air-filter-recycling=Переработка использованных воздушных фильтров
|
||||
|
||||
|
||||
[technology-name]
|
||||
air-filtering=Фильтрация воздуха
|
||||
air-filter-recycling=Переработка использованных воздушных фильтров
|
||||
reusable-air-filters=Многоразовые воздушные фильтры
|
||||
|
||||
[technology-description]
|
||||
air-filtering-1=Позволяет создавать пассивные установки для фильтрации воздуха которые улучшают качества воздуха за счет уменьшения загрязнения.
|
||||
air-filtering-2=Позволяет создавать активные установки для фильтрации воздуха, который использует электричество, чтобы притягивать к себе загрязнения из области радиусом в 2 чанка.
|
||||
air-filtering-3=Позволяет создавать мощные установки для фильтрации воздуха, способный очищать от загрязнений область радиусом в 3 чанка.
|
||||
reusable-air-filters=Более прочные воздушные фильтры, которые можно переработать с помощью технологий будущего.
|
||||
air-filter-recycling=Отработанные воздушные фильтры можно повторно использовать после переработки, заправив их небольшим количеством угля. Помните, что существует небольшая вероятность того, что фильтр сломается в процессе переработки.
|
||||
|
||||
|
||||
[mod-setting-name]
|
||||
baf-update-interval=Интервал обновления
|
||||
|
||||
[mod-setting-description]
|
||||
baf-update-interval=Обновления выполняются эффективно и распределяются по интервалу ОБНОВЛЕНИЯ в тиках. По умолчанию 20 дает три обновления в секунду. Например, 30 приведет к 2 обновлениям в секунду.
|
||||
|
||||
|
|
@ -7,7 +7,7 @@ data:extend({
|
|||
gas_temperature = 0,
|
||||
base_color = { r = 0.95, g = 0.9, b = 0.9 },
|
||||
flow_color = { r = 0.95, g = 0.9, b = 0.9 },
|
||||
icon = "__base__/graphics/icons/fluid/pollution.png",
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/pollution.png",
|
||||
icon_size = 32,
|
||||
order = "a[fluid]-z[water]",
|
||||
auto_barrel = false
|
||||
|
@ -19,7 +19,7 @@ data:extend({
|
|||
max_temperature = 100,
|
||||
base_color = { r = 0.27, g = 0.30, b = 0.34 },
|
||||
flow_color = { r = 0.27, g = 0.30, b = 0.34 },
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/pollution.png",
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/polluted-water.png",
|
||||
icon_size = 32,
|
||||
order = "a[fluid]-z[pollution]",
|
||||
auto_barrel = false
|
||||
|
|
|
@ -114,7 +114,7 @@ data:extend({
|
|||
hide_from_stats = true,
|
||||
icons = {
|
||||
{
|
||||
icon = "__base__/graphics/icons/fluid/pollution.png"
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/pollution.png"
|
||||
},
|
||||
{
|
||||
icon = "__better-air-filtering__/graphics/icons/recipe/filter-air.png",
|
||||
|
@ -140,7 +140,7 @@ data:extend({
|
|||
hide_from_stats = true,
|
||||
icons = {
|
||||
{
|
||||
icon = "__base__/graphics/icons/fluid/pollution.png"
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/pollution.png"
|
||||
},
|
||||
{
|
||||
icon = "__better-air-filtering__/graphics/icons/recipe/filter-air.png",
|
||||
|
@ -168,7 +168,7 @@ data:extend({
|
|||
hide_from_stats = true,
|
||||
icons = {
|
||||
{
|
||||
icon = "__base__/graphics/icons/fluid/pollution.png"
|
||||
icon = "__better-air-filtering__/graphics/icons/fluid/pollution.png"
|
||||
},
|
||||
{
|
||||
icon = "__better-air-filtering__/graphics/icons/recipe/filter-air.png",
|
||||
|
|
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.0 KiB |