140 lines
4.5 KiB
Lua

local Belt = {}
Belt.color = {r = 0, g = 183/255, b = 0}
Belt.entity_types = {'transport-belt', 'underground-belt', 'loader', 'loader-1x1', 'linked-belt', 'splitter'}
Belt.unlocked = function(force) return true end
Belt.indicator_settings = {'d0'}
local opposite = {
[defines.direction.north] = defines.direction.south, [defines.direction.south] = defines.direction.north,
[defines.direction.east] = defines.direction.west, [defines.direction.west] = defines.direction.east,
}
local function get_belt_type(entity)
if entity.type == 'loader' or entity.type == 'loader-1x1' then
return entity.loader_type
elseif entity.type == 'linked-belt' then
return entity.linked_belt_type
elseif entity.type == 'underground-belt' then
return entity.belt_to_ground_type
end
end
local function get_conn_facing(outside_entity, inside_entity, direction_out, direction_in)
local ot, it = outside_entity.type, inside_entity.type
local outside_dir, inside_dir = outside_entity.direction, inside_entity.direction
if ot ~= 'transport-belt' and ot ~= 'splitter' then
if get_belt_type(outside_entity) == 'input' then
if direction_out ~= outside_dir then return nil end
else
if direction_in ~= outside_dir then return nil end
end
end
if it ~= 'transport-belt' and it ~= 'splitter' then
if get_belt_type(inside_entity) == 'input' then
if direction_in ~= inside_dir then return nil end
else
if direction_out ~= inside_dir then return nil end
end
end
if outside_dir ~= inside_dir then return nil end
return outside_dir
end
Belt.connect = function(factory, cid, cpos, outside_entity, inside_entity)
local conn_facing = get_conn_facing(outside_entity, inside_entity, cpos.direction_out, cpos.direction_in)
if not (conn_facing == cpos.direction_in or conn_facing == cpos.direction_out) then return end
if not game.entity_prototypes['factory-linked-' .. inside_entity.name] or not game.entity_prototypes['factory-linked-' .. outside_entity.name] then return end
local inside_link = inside_entity.surface.create_entity{
name = 'factory-linked-' .. inside_entity.name,
position = {factory.inside_x + cpos.inside_x + cpos.indicator_dx, factory.inside_y + cpos.inside_y + cpos.indicator_dy},
create_build_effect_smoke = false,
raise_built = false,
force = inside_entity.force
}
inside_link.destructible = false
local outside_link = outside_entity.surface.create_entity{
name = 'factory-linked-' .. outside_entity.name,
position = {factory.outside_x + cpos.outside_x - cpos.indicator_dx, factory.outside_y + cpos.outside_y - cpos.indicator_dy},
create_build_effect_smoke = false,
raise_built = false,
force = outside_entity.force
}
outside_link.destructible = false
local connection
if conn_facing == cpos.direction_in then
connection = {
from = outside_entity,
to = inside_entity,
from_link = outside_link,
to_link = inside_link,
facing = cpos.direction_in,
spill_location = inside_entity.position,
do_tick_update = false
}
else
connection = {
from = inside_entity,
to = outside_entity,
from_link = inside_link,
to_link = outside_link,
facing = cpos.direction_out,
spill_location = inside_entity.position,
do_tick_update = false
}
end
connection.from_link.linked_belt_type = 'input'
connection.to_link.linked_belt_type = 'output'
connection.to_link.connect_linked_belts(connection.from_link)
connection.to_link.direction = connection.from.direction
connection.from_link.direction = connection.from.direction
return connection
end
Belt.recheck = function(conn)
return conn.from.valid and conn.to.valid and conn.to_link.valid and conn.from_link.valid and
conn.facing == get_conn_facing(conn.from, conn.to, opposite[conn.facing], conn.facing)
end
Belt.direction = function(conn)
return 'd0', conn.facing
end
Belt.rotate = Connections.beep
Belt.adjust = Connections.beep
local function spill_link_items(belt, link, surface, position)
for _, i in pairs{1, 2} do
local line = link.get_transport_line(i)
for item, count in pairs(line.get_contents()) do
surface.spill_item_stack(position, {name = item, count = count}, true, link.force, false)
end
end
end
Belt.destroy = function(conn)
local surface = conn._factory.inside_surface
local position = conn.spill_location
if conn.from_link.valid then
spill_link_items(conn.from, conn.from_link, surface, position)
conn.from_link.destroy()
end
if conn.to_link.valid then
spill_link_items(conn.to, conn.to_link, surface, position)
conn.to_link.destroy()
end
end
return Belt