177 lines
5.0 KiB
Lua
177 lines
5.0 KiB
Lua
local flammable_types
|
|
|
|
init_flammable_types = function()
|
|
global.flammable_types =
|
|
{
|
|
|
|
--[[
|
|
["crude-oil"] = true,
|
|
["heavy-oil"] = true,
|
|
["light-oil"] = true,
|
|
["lubricant"] = true,
|
|
["gas-hydrogen"] = true,
|
|
["gas-methane"] = true,
|
|
["gas-ethane"] = true,
|
|
["gas-butane"] = true,
|
|
["gas-propene"] = true,
|
|
["liquid-naphtha"] = true,
|
|
["liquid-mineral-oil"] = true,
|
|
["liquid-fuel-oil"] = true,
|
|
["gas-methanol"] = true,
|
|
["gas-ethylene"] = true,
|
|
["gas-benzene"] = true,
|
|
["gas-synthesis"] = true,
|
|
["gas-butadiene"] = true,
|
|
["liquid-phenol"] = true,
|
|
["liquid-ethylbenzene"] = true,
|
|
["liquid-styrene"] = true,
|
|
["gas-formaldehyde"] = true,
|
|
["liquid-polyethylene"] = true,
|
|
["liquid-glycerol"] = true,
|
|
["gas-natural-1"] = true,
|
|
["liquid-multi-phase-oil"] = true,
|
|
["gas-raw-1"] = true,
|
|
["liquid-condensates"] = true,
|
|
["liquid-ngl"] = true,
|
|
["gas-chlor-methane"] = true,
|
|
["hydrogen"] = true,
|
|
["liquid-fuel"] = true,
|
|
["diesel-fuel"] = true,
|
|
["petroleum-gas"] = true
|
|
]]--
|
|
|
|
["gas-hydrogen"] = true,
|
|
["hydrogen"] = true,
|
|
["liquid-multi-phase-oil"] = true,
|
|
["crude-oil"] = true,
|
|
["heavy-oil"] = true,
|
|
["liquid-naphtha"] = true,
|
|
["light-oil"] = true,
|
|
["liquid-fuel"] = true,
|
|
["liquid-fuel-oil"] = true,
|
|
["diesel"] = true,
|
|
["diesel-fuel"] = true,
|
|
["gasoline"] = true,
|
|
["kerosene"] = true,
|
|
["petroleum-gas"] = true,
|
|
["gas-natural-1"] = true,
|
|
["gas-raw-1"] = true,
|
|
["gas-methane"] = true,
|
|
["gas-ethane"] = true,
|
|
["gas-butane"] = true,
|
|
["gas-propene"] = true,
|
|
["gas-ethylene"] = true,
|
|
["gas-benzene"] = true,
|
|
["gas-butadiene"] = true,
|
|
["liquid-ethylbenzene"] = true,
|
|
["acetylene"] = true,
|
|
["gas-synthesis"] = true,
|
|
["gas-residual"] = true,
|
|
["gas-methanol"] = true,
|
|
["methanol"] = true,
|
|
["gas-acetone"] = true,
|
|
["coal-gas"] = true,
|
|
["syngas"] = true,
|
|
["liquid-toluene"] = true,
|
|
["gas-hydrazine"] = true,
|
|
["gas-ammonia"] = true,
|
|
["gas-hydrogen-sulfide"] = true,
|
|
["combustion-mixture1"] = true,
|
|
["combustion-mixture2"] = true,
|
|
["diborane"] = true,
|
|
["refsyngas"] = true,
|
|
["xylenol"] = true
|
|
|
|
}
|
|
flammable_types = global.flammable_types
|
|
end
|
|
|
|
script.on_init(init_flammable_types)
|
|
script.on_configuration_changed(function()
|
|
if not global.flammable_types then
|
|
init_flammable_types()
|
|
end
|
|
flammable_types = global.flammable_types
|
|
end)
|
|
|
|
script.on_load(function()
|
|
flammable_types = global.flammable_types
|
|
end)
|
|
|
|
remote.add_interface("flammable_oils",
|
|
{
|
|
add_flammable_type = function(name)
|
|
global.flammable_types[name] = true
|
|
end,
|
|
remove_flammable_type = function(name)
|
|
global.flammable_types[name] = nil
|
|
end,
|
|
get_flammable_types = function()
|
|
return global.flammable_types
|
|
end
|
|
})
|
|
|
|
|
|
|
|
script.on_event(defines.events.on_entity_died, function(event)
|
|
local entity = event.entity
|
|
local boxes = entity.fluidbox
|
|
local num_pots = #boxes
|
|
if num_pots == 0 then return end
|
|
local fluids = game.fluid_prototypes
|
|
for k = 1, num_pots do
|
|
local pot = boxes[k]
|
|
if pot then
|
|
if flammable_types[pot.name] then
|
|
local fraction = pot.amount/boxes.get_capacity(k)
|
|
if fraction > 0.025 then
|
|
return flammable_explosion(entity, fraction)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
function flammable_explosion(entity, fraction)
|
|
|
|
if not entity.valid then return end
|
|
local pos = entity.position
|
|
local surface = entity.surface
|
|
local radius = 0.5 * ((entity.bounding_box.right_bottom.x - pos.x) + (entity.bounding_box.right_bottom.y - pos.y))
|
|
local width = radius * 2
|
|
local area = {{pos.x - (radius + 0.5),pos.y - (radius + 0.5)},{pos.x + (radius + 0.5),pos.y + (radius + 0.5)}}
|
|
local damage = math.random(30, 60) * fraction --DrD 20, 40
|
|
|
|
if width <= 1 then
|
|
entity.surface.create_entity{name = "explosion", position = pos}
|
|
entity.surface.create_entity{name = "oil-fire-flame", position = pos, raise_built =true}
|
|
else
|
|
surface.create_entity{name = "medium-explosion", position = {pos.x+math.random(-radius,radius), pos.y+math.random(-radius,radius)}}
|
|
for k = 1, math.ceil(width) do
|
|
surface.create_entity{name = "oil-fire-flame", position = {pos.x+math.random(-radius,radius), pos.y+math.random(-radius,radius)}, raise_built =true}
|
|
for j = 1, math.ceil(4 * fraction) do
|
|
local burst = width + (2 * fraction)
|
|
surface.create_entity{name = "oil-fire-flame", position = {pos.x+math.random(-burst,burst), pos.y+math.random(-burst,burst)}, raise_built =true}
|
|
end
|
|
end
|
|
end
|
|
|
|
if entity.type == "pipe-to-ground" then
|
|
if entity.neighbours then
|
|
for k, neighbour in pairs (entity.neighbours[1]) do
|
|
if neighbour and neighbour.valid and (neighbour.type == "pipe-to-ground") then
|
|
surface.create_entity{name = "oil-fire-flame", position = neighbour.position, raise_built =true}
|
|
neighbour.damage(damage, entity.force, "explosion")
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for k, nearby in pairs (surface.find_entities(area)) do
|
|
if nearby.valid and nearby.health then
|
|
nearby.damage(damage, entity.force, "explosion")
|
|
end
|
|
end
|
|
|
|
end |