local mod_gui = require("mod-gui") function gui_add_title(gui, title, button_name, drag_target) gui.add({ type = "flow", name = "title_flow" }) gui.title_flow.add({ type = "label", name = "title", style = "frame_title", caption = title }) gui.title_flow.add({ type = "empty-widget", name = "filler", style = "bob_draggable_header" }) gui.title_flow.add({ type = "sprite-button", name = button_name, style = "frame_action_button", sprite = "utility/close_white", }) if drag_target then gui.title_flow.title.drag_target = gui gui.title_flow.filler.drag_target = gui end end if not bobmods then bobmods = {} end if not bobmods.inserters then bobmods.inserters = {} end if not bobmods.logistics then bobmods.logistics = {} end if not bobmods.logistics.inserters then bobmods.logistics.inserters = {} end if not bobmods.math then bobmods.math = {} end function bobmods.math.mod(number, div) if number < 0 then local newnumber = 0 - number local mod = newnumber % div return 0 - mod else return number % div end end function bobmods.math.floor(number) local num if number < 0 then num = number - 0.1 else num = number + 0.1 end return math.floor(num - bobmods.math.mod(num, 1)) end function bobmods.math.round(number) local num if number < 0 then num = number - 0.5 else num = number + 0.5 end return math.floor(num - bobmods.math.mod(num, 1)) end function bobmods.math.offset(number) local num = bobmods.math.mod(number, 1) if num < 0 then if num > -0.5 then return num else return num + 1 end else if num < 0.5 then return num else return num - 1 end end end bobmods.inserters.long_technology = "long-inserters-1" bobmods.inserters.long2_technology = "long-inserters-2" bobmods.inserters.near_technology = "near-inserters" bobmods.inserters.more_technology = "more-inserters-1" bobmods.inserters.more2_technology = "more-inserters-2" bobmods.inserters.offset = 0.2 changed_position_event = script.generate_event_name() bobmods.inserters.range1_4way = { table = { { x = 0, y = -1 }, { x = 1, y = 0 }, { x = 0, y = 1 }, { x = -1, y = 0 }, }, steps = 4, } bobmods.inserters.range1_8way = { table = { { x = 0, y = -1 }, { x = 1, y = -1 }, { x = 1, y = 0 }, { x = 1, y = 1 }, { x = 0, y = 1 }, { x = -1, y = 1 }, { x = -1, y = 0 }, { x = -1, y = -1 }, }, steps = 8, } bobmods.inserters.range2_4way = { table = { { x = 0, y = -2 }, { x = 2, y = 0 }, { x = 0, y = 2 }, { x = -2, y = 0 }, }, steps = 4, } bobmods.inserters.range2_8way = { table = { { x = 0, y = -2 }, { x = 2, y = -2 }, { x = 2, y = 0 }, { x = 2, y = 2 }, { x = 0, y = 2 }, { x = -2, y = 2 }, { x = -2, y = 0 }, { x = -2, y = -2 }, }, steps = 8, } bobmods.inserters.range2_16way = { table = { { x = 0, y = -2 }, { x = 1, y = -2 }, { x = 2, y = -2 }, { x = 2, y = -1 }, { x = 2, y = 0 }, { x = 2, y = 1 }, { x = 2, y = 2 }, { x = 1, y = 2 }, { x = 0, y = 2 }, { x = -1, y = 2 }, { x = -2, y = 2 }, { x = -2, y = 1 }, { x = -2, y = 0 }, { x = -2, y = -1 }, { x = -2, y = -2 }, { x = -1, y = -2 }, }, steps = 16, } bobmods.inserters.range3_4way = { table = { { x = 0, y = -3 }, { x = 3, y = 0 }, { x = 0, y = 3 }, { x = -3, y = 0 }, }, steps = 4, } bobmods.inserters.range3_8way = { table = { { x = 0, y = -3 }, { x = 3, y = -3 }, { x = 3, y = 0 }, { x = 3, y = 3 }, { x = 0, y = 3 }, { x = -3, y = 3 }, { x = -3, y = 0 }, { x = -3, y = -3 }, }, steps = 8, } bobmods.inserters.range3_24way = { table = { { x = 0, y = -3 }, { x = 1, y = -3 }, { x = 2, y = -3 }, { x = 3, y = -3 }, { x = 3, y = -2 }, { x = 3, y = -1 }, { x = 3, y = 0 }, { x = 3, y = 1 }, { x = 3, y = 2 }, { x = 3, y = 3 }, { x = 2, y = 3 }, { x = 1, y = 3 }, { x = 0, y = 3 }, { x = -1, y = 3 }, { x = -2, y = 3 }, { x = -3, y = 3 }, { x = -3, y = 2 }, { x = -3, y = 1 }, { x = -3, y = 0 }, { x = -3, y = -1 }, { x = -3, y = -2 }, { x = -3, y = -3 }, { x = -2, y = -3 }, { x = -1, y = -3 }, }, steps = 24, } bobmods.inserters.positions = { { x = -2, y = -2 }, { x = -1, y = -2 }, { x = 0, y = -2 }, { x = 1, y = -2 }, { x = 2, y = -2 }, { x = -2, y = -1 }, { x = -1, y = -1 }, { x = 0, y = -1 }, { x = 1, y = -1 }, { x = 2, y = -1 }, { x = -2, y = 0 }, { x = -1, y = 0 }, { x = 0, y = 0 }, { x = 1, y = 0 }, { x = 2, y = 0 }, { x = -2, y = 1 }, { x = -1, y = 1 }, { x = 0, y = 1 }, { x = 1, y = 1 }, { x = 2, y = 1 }, { x = -2, y = 2 }, { x = -1, y = 2 }, { x = 0, y = 2 }, { x = 1, y = 2 }, { x = 2, y = 2 }, { x = -3, y = -3 }, { x = -2, y = -3 }, { x = -1, y = -3 }, { x = 0, y = -3 }, { x = 1, y = -3 }, { x = 2, y = -3 }, { x = 3, y = -3 }, { x = -3, y = -2 }, { x = 3, y = -2 }, { x = -3, y = -1 }, { x = 3, y = -1 }, { x = -3, y = 0 }, { x = 3, y = 0 }, { x = -3, y = 1 }, { x = 3, y = 1 }, { x = -3, y = 2 }, { x = 3, y = 2 }, { x = -3, y = 3 }, { x = -2, y = 3 }, { x = -1, y = 3 }, { x = 0, y = 3 }, { x = 1, y = 3 }, { x = 2, y = 3 }, { x = 3, y = 3 }, } bobmods.inserters.offset_positions = { { x = -bobmods.inserters.offset, y = -bobmods.inserters.offset }, { x = 0, y = -bobmods.inserters.offset }, { x = bobmods.inserters.offset, y = -bobmods.inserters.offset }, { x = -bobmods.inserters.offset, y = 0 }, { x = 0, y = 0 }, { x = bobmods.inserters.offset, y = 0 }, { x = -bobmods.inserters.offset, y = bobmods.inserters.offset }, { x = 0, y = bobmods.inserters.offset }, { x = bobmods.inserters.offset, y = bobmods.inserters.offset }, } bobmods.logistics.inserters.range1 = { pickup = { { x = 0, y = -1 }, { x = 1, y = 0 }, { x = 0, y = 1 }, { x = -1, y = 0 }, }, drop = { { x = 0, y = 1 }, { x = -1, y = 0 }, { x = 0, y = -1 }, { x = 1, y = 0 }, }, } bobmods.logistics.inserters.range2 = { pickup = { { x = 0, y = -2 }, { x = 2, y = 0 }, { x = 0, y = 2 }, { x = -2, y = 0 }, }, drop = { { x = 0, y = 2 }, { x = -2, y = 0 }, { x = 0, y = -2 }, { x = 2, y = 0 }, }, } bobmods.logistics.inserters.offset_positions = { near = { { x = 0, y = -bobmods.inserters.offset }, { x = bobmods.inserters.offset, y = 0 }, { x = 0, y = bobmods.inserters.offset }, { x = -bobmods.inserters.offset, y = 0 }, }, far = { { x = 0, y = bobmods.inserters.offset }, { x = -bobmods.inserters.offset, y = 0 }, { x = 0, y = -bobmods.inserters.offset }, { x = bobmods.inserters.offset, y = 0 }, }, } function bobmods.inserters.create_global_table_basic() if not global then global = {} end if not global.bobmods then global.bobmods = {} end if not global.bobmods.inserters then global.bobmods.inserters = {} end if not global.bobmods.inserters.blacklist then global.bobmods.inserters.blacklist = {} end end function bobmods.inserters.create_global_table(player_index) bobmods.inserters.create_global_table_basic() if not global.bobmods.inserters[player_index] then global.bobmods.inserters[player_index] = {} end if not global.bobmods.logistics then global.bobmods.logistics = {} end if not global.bobmods.logistics[player_index] then global.bobmods.logistics[player_index] = {} end if not global.bobmods.logistics[player_index].enabled then global.bobmods.logistics[player_index].enabled = false end if not global.bobmods.logistics[player_index].long_in then global.bobmods.logistics[player_index].long_in = false end if not global.bobmods.logistics[player_index].long_out then global.bobmods.logistics[player_index].long_out = false end if not global.bobmods.logistics[player_index].near then global.bobmods.logistics[player_index].near = false end if not global.bobmods.logistics[player_index].show then global.bobmods.logistics[player_index].show = false end if not global.bobmods.logistics[player_index].enabled2 then global.bobmods.logistics[player_index].enabled2 = false end if not global.bobmods.logistics[player_index].pickup then global.bobmods.logistics[player_index].pickup = 18 end if not global.bobmods.logistics[player_index].drop then global.bobmods.logistics[player_index].drop = 8 end if not global.bobmods.logistics[player_index].offset then global.bobmods.logistics[player_index].offset = 2 end end script.on_event("bob-inserter-pickup-rotate", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.rotate_pickup(entity, player) end end) script.on_event("bob-inserter-drop-rotate", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.rotate_drop(entity, player) end end) script.on_event("bob-inserter-pickup-range", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.pickup_range(entity, player) end end) script.on_event("bob-inserter-drop-range", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.drop_range(entity, player) end end) script.on_event("bob-inserter-long", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.long_range(entity, player) end end) script.on_event("bob-inserter-near", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then bobmods.inserters.near_range(entity, player) end end) script.on_event("bob-inserter-open-gui", function(event) local player = game.players[event.player_index] local entity = player.selected if entity and entity.type == "inserter" and player.can_reach_entity(entity) and not global.bobmods.inserters.blacklist[entity.name] then global.bobmods.inserters[event.player_index].position = "center" bobmods.inserters.open_gui(entity, player) else bobmods.inserters.delete_gui(event.player_index) end end) script.on_event(defines.events.on_gui_opened, function(event) local player = game.players[event.player_index] if event.gui_type == defines.gui_type.entity and event.entity and event.entity.type == "inserter" then if event.entity.prototype.allow_custom_vectors and not global.bobmods.inserters.blacklist[event.entity.name] and settings.get_player_settings(player)["bobmods-inserters-gui-position"].value ~= "off" then global.bobmods.inserters[event.player_index].position = "left" bobmods.inserters.open_gui(event.entity, player) else bobmods.inserters.delete_gui(event.player_index) end end end) script.on_event(defines.events.on_gui_closed, function(event) -- this is checking for what GUI was just told to close. as we want to delete only when closing my GUI, or when closing the inserters GUI IF not opening mine. if global.bobmods.inserters[event.player_index].position == "center" and event.gui_type == defines.gui_type.custom and event.element and event.element.valid --the GUI actually exists. and event.element.name == "bob_inserter_gui" then bobmods.inserters.delete_gui(event.player_index) end end) script.on_event(defines.events.on_gui_checked_state_changed, function(event) local player = game.players[event.player_index] local entity = global.bobmods.inserters[event.player_index].entity if event.element.valid then if event.element.name == "bob_logistics_inserter_enabled" then global.bobmods.logistics[event.player_index].enabled = event.element.state if event.element.state then global.bobmods.logistics[event.player_index].enabled2 = false end bobmods.logistics.create_gui(event.player_index) elseif event.element.name == "bob_logistics_inserter_long_in" then global.bobmods.logistics[event.player_index].long_in = event.element.state elseif event.element.name == "bob_logistics_inserter_long_out" then global.bobmods.logistics[event.player_index].long_out = event.element.state elseif event.element.name == "bob_logistics_inserter_near" then global.bobmods.logistics[event.player_index].near = event.element.state elseif event.element.name == "bob_logistics_inserter_enabled2" then global.bobmods.logistics[event.player_index].enabled2 = event.element.state if event.element.state then global.bobmods.logistics[event.player_index].enabled = false end bobmods.logistics.create_gui(event.player_index) elseif string.sub(event.element.name, 1, 6) == "button" then local i = string.gsub(event.element.name, "button", "") + 0 if event.element.parent.name == "bob_logistics_pickup" then remote.call("bobinserters", "draw_button_position_check", { gui = event.element.parent, position = i }) global.bobmods.logistics[event.player_index].pickup = i elseif event.element.parent.name == "bob_logistics_drop" then remote.call("bobinserters", "draw_button_position_check", { gui = event.element.parent, position = i }) global.bobmods.logistics[event.player_index].drop = i elseif event.element.parent.name == "bob_logistics_offset" then remote.call("bobinserters", "draw_button_offset_check", { gui = event.element.parent, position = i }) global.bobmods.logistics[event.player_index].offset = i elseif entity and entity.valid and player.can_reach_entity(entity) then if event.element.parent.name == "bob_inserter_gui_pickup" then bobmods.inserters.gui_pickup_click(entity, event.element) elseif event.element.parent.name == "bob_inserter_gui_drop" then bobmods.inserters.gui_drop_click(entity, event.element) elseif event.element.parent.name == "bob_inserter_gui_offset" then bobmods.inserters.gui_offset_click(entity, event.element) end else bobmods.inserters.delete_gui(event.player_index) end end end end) script.on_event(defines.events.on_gui_click, function(event) local player = game.players[event.player_index] local entity = global.bobmods.inserters[event.player_index].entity if event.element.valid then if entity and entity.valid and player.can_reach_entity(entity) then if event.element.name == "bob_inserter_gui_close" then bobmods.inserters.delete_gui(event.player_index) end else bobmods.inserters.delete_gui(event.player_index) end end if event.element.valid and event.element.name == "bob_logistics_inserter_button" then if global.bobmods.logistics[event.player_index].show then global.bobmods.logistics[event.player_index].show = false else global.bobmods.logistics[event.player_index].show = true end bobmods.logistics.show_gui_options(event.player_index) end end) script.on_event(defines.events.on_player_rotated_entity, function(event) local player = game.players[event.player_index] local entity = global.bobmods.inserters[event.player_index].entity if entity == event.entity and player.can_reach_entity(entity) then if global.bobmods.inserters[player.index].gui and global.bobmods.inserters[player.index].gui.valid then bobmods.inserters.refresh_position_checkboxes(entity, player) end end end) script.on_event(defines.events.on_tick, function(event) if game.tick % 20 == 0 then if global and global.bobmods and global.bobmods.inserters then for i, player in pairs(game.connected_players) do if global.bobmods.inserters[player.index] then local entity = global.bobmods.inserters[player.index].entity if entity and (not entity.valid or not player.can_reach_entity(entity)) then bobmods.inserters.delete_gui(player.index) end else bobmods.inserters.create_global_table(player.index) -- Create for this specific online player. end end else for index, player in pairs(game.players) do -- Create for all if there are none. bobmods.inserters.create_global_table(index) end end end end) script.on_configuration_changed(function(event) for i, player in pairs(game.players) do bobmods.inserters.create_global_table(player.index) if player.gui.center.bob_inserter_gui then player.gui.center.bob_inserter_gui.destroy() end bobmods.inserters.delete_gui(player.index) bobmods.logistics.create_gui_button(player.index) player.gui.center.visible = true end end) script.on_init(function(event) for i, player in pairs(game.players) do bobmods.inserters.create_global_table(player.index) bobmods.logistics.create_gui_button(player.index) end end) script.on_event(defines.events.on_player_created, function(event) bobmods.inserters.create_global_table(event.player_index) bobmods.logistics.create_gui_button(event.player_index) end) script.on_event(defines.events.on_player_joined_game, function(event) bobmods.inserters.create_global_table(event.player_index) bobmods.logistics.create_gui_button(event.player_index) end) script.on_event(defines.events.on_research_finished, function(event) if event.research.name == bobmods.inserters.long_technology or event.research.name == bobmods.inserters.long2_technology or event.research.name == bobmods.inserters.near_technology or event.research.name == bobmods.inserters.more_technology or event.research.name == bobmods.inserters.more2_technology then for i, player in pairs(event.research.force.players) do local entity = global.bobmods.inserters[player.index].entity if entity and entity.valid and player.can_reach_entity(entity) then bobmods.inserters.open_gui(entity, player) end bobmods.logistics.show_gui_options(player.index) end end end) script.on_event(defines.events.on_built_entity, function(event) local player = game.players[event.player_index] local entity = event.created_entity local entity_name = entity.name if entity.type == "entity-ghost" then entity_name = entity.ghost_name end if event.item and event.item.place_result and event.item.place_result.type == "inserter" and (entity.type == "inserter" or (entity.type == "entity-ghost" and entity.ghost_type == "inserter")) and event.item.place_result.name == entity_name --probably don't even need this line anymore. and not global.bobmods.inserters.blacklist[entity_name] then bobmods.logistics.set_positions(entity, event.player_index) end end) script.on_event(defines.events.on_runtime_mod_setting_changed, function(event) if event.setting == "bobmods-inserters-button-enable" then bobmods.logistics.create_gui_button(event.player_index) end end) function tech_unlocked(force, tech) if force.technologies[tech] then return force.technologies[tech].researched end end ---private function, used by slimDropOffset andslimPickupOffset function _slimOffset(entity, l) -- inserters have tile_height=1, tile_width=1 this normal form is assumed by bobinserters -- for "slim" insertes we transform the position into this normal form and back. -- this saves us from having to adjust all the calculations of bobinserters local o = { x = 0, y = 0 } if entity.prototype.tile_height == 0 and entity.prototype.tile_width == 1 then -- this calculation is tested with mod arrow-inserter and slim-inserters if entity.direction == defines.direction.north then o.y = -0.5 + l elseif entity.direction == defines.direction.south then o.y = 0.5 - l elseif entity.direction == defines.direction.east then o.x = 0.5 - l elseif entity.direction == defines.direction.west then o.x = -0.5 + l end end return o end function slimDropOffset(entity) return _slimOffset(entity, 1) end function slimPickupOffset(entity) return _slimOffset(entity, 0) end function get_pickup_position(entity) local o = slimPickupOffset(entity) return { x = entity.pickup_position.x - entity.position.x + o.x, y = entity.pickup_position.y - entity.position.y + o.y, } end function get_drop_position(entity) local o = slimDropOffset(entity) return { x = entity.drop_position.x - entity.position.x + o.x, y = entity.drop_position.y - entity.position.y + o.y, } end function split_drop_position(full_drop_position) local drop_position = { x = bobmods.math.round(full_drop_position.x), y = bobmods.math.round(full_drop_position.y) } local drop_offset = { x = bobmods.math.offset(full_drop_position.x), y = bobmods.math.offset(full_drop_position.y) } return drop_position, drop_offset end function get_split_drop_position(entity) local full_drop_position = get_drop_position(entity) local drop_position = { x = bobmods.math.round(full_drop_position.x), y = bobmods.math.round(full_drop_position.y) } local drop_offset = { x = bobmods.math.offset(full_drop_position.x), y = bobmods.math.offset(full_drop_position.y) } return drop_position, drop_offset end function get_drop_tile_position(entity) local full_drop_position = get_drop_position(entity) return { x = bobmods.math.round(full_drop_position.x), y = bobmods.math.round(full_drop_position.y) } end function get_drop_offset_position(entity) local full_drop_position = get_drop_position(entity) return { x = bobmods.math.offset(full_drop_position.x), y = bobmods.math.offset(full_drop_position.y) } end function combine_drop_position(drop_position, drop_offset) return { x = drop_position.x + drop_offset.x, y = drop_position.y + drop_offset.y } end function set_pickup_position(entity, newpos) local o = slimPickupOffset(entity) local original_positions = { drop_position = entity.drop_position, pickup_position = entity.pickup_position } local new_positions = { drop_position = entity.drop_position, pickup_position = { x = entity.position.x + newpos.x - o.x, y = entity.position.y + newpos.y - o.y, }, } entity.pickup_position = new_positions.pickup_position entity.direction = entity.direction -- set direction to force update script.raise_event( changed_position_event, { entity = entity, new_positions = new_positions, original_positions = original_positions } ) -- Raise positions changed event. end function set_drop_position(entity, newpos) local o = slimDropOffset(entity) local original_positions = { drop_position = entity.drop_position, pickup_position = entity.pickup_position } local new_positions = { drop_position = { x = entity.position.x + newpos.x - o.x, y = entity.position.y + newpos.y - o.y, }, pickup_position = entity.pickup_position, } entity.drop_position = new_positions.drop_position entity.direction = entity.direction -- set direction to force update script.raise_event( changed_position_event, { entity = entity, new_positions = new_positions, original_positions = original_positions } ) -- Raise positions changed event. end function set_split_drop_position(entity, new_position, new_offset) return set_drop_position(entity, combine_drop_position(new_position, new_offset)) end function set_both_positions(entity, newpickup, newdrop) local od = slimDropOffset(entity) local op = slimPickupOffset(entity) local original_positions = { drop_position = entity.drop_position, pickup_position = entity.pickup_position } local new_positions = { drop_position = { x = entity.position.x + newdrop.x - od.x, y = entity.position.y + newdrop.y - od.y, }, pickup_position = { x = entity.position.x + newpickup.x - op.x, y = entity.position.y + newpickup.y - op.y, }, } entity.drop_position = new_positions.drop_position entity.pickup_position = new_positions.pickup_position entity.direction = entity.direction -- set direction to force update script.raise_event( changed_position_event, { entity = entity, new_positions = new_positions, original_positions = original_positions } ) -- Raise positions changed event. end function check_position(pos1, pos2) local pos = {} pos.x = pos1.x - pos2.x pos.y = pos1.y - pos2.y if pos.x < 0 then pos.x = 0 - pos.x end if pos.y < 0 then pos.y = 0 - pos.y end if pos.x < 0.1 and pos.y < 0.1 then return true else return false end end function bobmods.inserters.normalise_tile_offset(tile_offset) local new_offset = { x = 0, y = 0 } if tile_offset.x > 0.01 then new_offset.x = bobmods.inserters.offset end if tile_offset.x < -0.01 then new_offset.x = -bobmods.inserters.offset end if tile_offset.y > 0.01 then new_offset.y = bobmods.inserters.offset end if tile_offset.y < -0.01 then new_offset.y = -bobmods.inserters.offset end return new_offset end function bobmods.logistics.set_range(position_in, range) local position = { x = 0, y = 0 } if position_in.x > 0.1 then position.x = range elseif position_in.x < -0.1 then position.x = -range else position.x = 0 end if position_in.y > 0.1 then position.y = range elseif position_in.y < -0.1 then position.y = -range else position.y = 0 end return position end function calculate_new_drop_offset(drop_position, drop_offset, new_position) local new_offset = { x = drop_offset.x, y = drop_offset.y } if (drop_position.x > 0 and new_position.x < 0) or (drop_position.x < 0 and new_position.x > 0) then new_offset.x = 0 - drop_offset.x elseif drop_position.x == 0 and new_position.x ~= 0 then if (new_position.x > 0 and drop_position.y > 0) or (new_position.x < 0 and drop_position.y < 0) then new_offset.x = drop_offset.y else new_offset.x = 0 - drop_offset.y end elseif drop_position.x ~= 0 and new_position.x == 0 then new_offset.x = 0 end if (drop_position.y > 0 and new_position.y < 0) or (drop_position.y < 0 and new_position.y > 0) then new_offset.y = 0 - drop_offset.y elseif drop_position.y == 0 and new_position.y ~= 0 then if (new_position.y > 0 and drop_position.x > 0) or (new_position.y < 0 and drop_position.x < 0) then new_offset.y = drop_offset.x else new_offset.y = 0 - drop_offset.x end elseif drop_position.y ~= 0 and new_position.y == 0 then new_offset.y = 0 end return bobmods.inserters.normalise_tile_offset(new_offset) end function bobmods.logistics.set_positions(entity, player_index) if global.bobmods.logistics[player_index].enabled then local force = game.players[player_index].force local direction = (entity.direction / 2) + 1 local long_unlocked = tech_unlocked(force, bobmods.inserters.long_technology) local more_unlocked = tech_unlocked(force, bobmods.inserters.more_technology) local near_unlocked = tech_unlocked(force, bobmods.inserters.near_technology) local long_in = global.bobmods.logistics[player_index].long_in local long_out = global.bobmods.logistics[player_index].long_out local near = global.bobmods.logistics[player_index].near local pickup_position = get_pickup_position(entity) local drop_position, drop_offset = get_split_drop_position(entity) if long_unlocked then if more_unlocked then if long_in then pickup_position = bobmods.logistics.set_range(pickup_position, 2) else pickup_position = bobmods.logistics.set_range(pickup_position, 1) end if long_out then drop_position = bobmods.logistics.set_range(drop_position, 2) else drop_position = bobmods.logistics.set_range(drop_position, 1) end else if long_in then pickup_position = bobmods.logistics.set_range(pickup_position, 2) drop_position = bobmods.logistics.set_range(drop_position, 2) else pickup_position = bobmods.logistics.set_range(pickup_position, 1) drop_position = bobmods.logistics.set_range(drop_position, 1) end end end if near_unlocked then if near then drop_offset = bobmods.logistics.set_range(drop_position, -bobmods.inserters.offset) else drop_offset = bobmods.logistics.set_range(drop_position, bobmods.inserters.offset) end end local full_drop_position = combine_drop_position(drop_position, drop_offset) set_both_positions(entity, pickup_position, full_drop_position) end if global.bobmods.logistics[player_index].enabled2 and remote.interfaces.bobinserters then local pickup_position = remote.call("bobinserters", "get_position", { position = global.bobmods.logistics[player_index].pickup }) local drop_position = remote.call("bobinserters", "get_position", { position = global.bobmods.logistics[player_index].drop }) local drop_offset = remote.call("bobinserters", "get_offset", { position = global.bobmods.logistics[player_index].offset }) local direction = (entity.direction / 2) if direction == 2 then -- 2 is up, because inserters are backwards. pickup_position = pickup_position drop_position = drop_position drop_offset = drop_offset elseif direction == 3 then -- right pickup_position = { x = -pickup_position.y, y = pickup_position.x } drop_position = { x = -drop_position.y, y = drop_position.x } drop_offset = { x = -drop_offset.y, y = drop_offset.x } elseif direction == 0 then -- down pickup_position = { x = -pickup_position.x, y = -pickup_position.y } drop_position = { x = -drop_position.x, y = -drop_position.y } drop_offset = { x = -drop_offset.x, y = -drop_offset.y } elseif direction == 1 then -- left pickup_position = { x = pickup_position.y, y = -pickup_position.x } drop_position = { x = drop_position.y, y = -drop_position.x } drop_offset = { x = drop_offset.y, y = -drop_offset.x } end local near_unlocked = tech_unlocked(game.players[player_index].force, bobmods.inserters.near_technology) if not near_unlocked then local old_drop_position, old_drop_offset = get_split_drop_position(entity) drop_offset = calculate_new_drop_offset(old_drop_position, old_drop_offset, drop_position) end local full_drop_position = combine_drop_position(drop_position, drop_offset) set_both_positions(entity, pickup_position, full_drop_position) end end function bobmods.inserters.gui_pickup_click(entity, element) local pickup_position = get_pickup_position(entity) local i = string.gsub(element.name, "button", "") + 0 pickup_position = bobmods.inserters.positions[i] set_pickup_position(entity, pickup_position) entity.direction = entity.direction -- set direction to force update bobmods.inserters.draw_button_position_check(element.parent, pickup_position) end function bobmods.inserters.gui_drop_click(entity, element) local i = string.gsub(element.name, "button", "") + 0 local new_position = bobmods.inserters.positions[i] local drop_position, drop_offset = get_split_drop_position(entity) local new_offset = calculate_new_drop_offset(drop_position, drop_offset, new_position) set_split_drop_position(entity, new_position, new_offset) entity.direction = entity.direction -- set direction to force update bobmods.inserters.refresh_position_checkboxes(entity, game.players[element.player_index]) end function bobmods.inserters.gui_offset_click(entity, element) local i = string.gsub(element.name, "button", "") + 0 new_offset = bobmods.inserters.offset_positions[i] set_split_drop_position(entity, get_drop_tile_position(entity), new_offset) entity.direction = entity.direction -- set direction to force update bobmods.inserters.draw_button_offset_check(element.parent, new_offset) end function bobmods.inserters.rotate_position(force, pickup_position) local more_unlocked = tech_unlocked(force, bobmods.inserters.more_technology) local more2_unlocked = tech_unlocked(force, bobmods.inserters.more2_technology) local rotation = 1 local position = { table = {}, steps = 0 } -- Decide which position table to use if pickup_position.x > 2.1 or pickup_position.x < -2.1 or pickup_position.y > 2.1 or pickup_position.y < -2.1 then if more2_unlocked then position = bobmods.inserters.range3_24way elseif more_unlocked then position = bobmods.inserters.range3_8way else position = bobmods.inserters.range3_4way end elseif pickup_position.x > 1.1 or pickup_position.x < -1.1 or pickup_position.y > 1.1 or pickup_position.y < -1.1 then if more2_unlocked then position = bobmods.inserters.range2_16way elseif more_unlocked then position = bobmods.inserters.range2_8way else position = bobmods.inserters.range2_4way end else if more_unlocked then position = bobmods.inserters.range1_8way else position = bobmods.inserters.range1_4way end end -- Find current rotation for i, new_position in ipairs(position.table) do if check_position(pickup_position, new_position) then rotation = i end end -- Rotate rotation = rotation + 1 if rotation > position.steps then rotation = rotation - position.steps end return position.table[rotation] end function bobmods.inserters.rotate_pickup(entity, player) local pickup_position = get_pickup_position(entity) pickup_position = bobmods.inserters.rotate_position(player.force, pickup_position) set_pickup_position(entity, pickup_position) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end function bobmods.inserters.rotate_drop(entity, player) local drop_position, drop_offset = get_split_drop_position(entity) local new_position = bobmods.inserters.rotate_position(player.force, drop_position) local new_offset = calculate_new_drop_offset(drop_position, drop_offset, new_position) set_split_drop_position(entity, new_position, new_offset) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end function bobmods.inserters.pickup_range(entity, player) local long_unlocked = tech_unlocked(player.force, bobmods.inserters.long_technology) local long2_unlocked = tech_unlocked(player.force, bobmods.inserters.long2_technology) local pickup_position = get_pickup_position(entity) local islong = false local islong2 = false if pickup_position.x > 2.1 or pickup_position.x < -2.1 or pickup_position.y > 2.1 or pickup_position.y < -2.1 then islong2 = true elseif pickup_position.x > 1.1 or pickup_position.x < -1.1 or pickup_position.y > 1.1 or pickup_position.y < -1.1 then islong = true end if long_unlocked or long2_unlocked then if islong2 then pickup_position = bobmods.logistics.set_range(pickup_position, 1) elseif islong then if long2_unlocked then pickup_position = bobmods.logistics.set_range(pickup_position, 3) else pickup_position = bobmods.logistics.set_range(pickup_position, 1) end else pickup_position = bobmods.logistics.set_range(pickup_position, 2) end set_pickup_position(entity, pickup_position) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end end function bobmods.inserters.drop_range(entity, player) local long_unlocked = tech_unlocked(player.force, bobmods.inserters.long_technology) local long2_unlocked = tech_unlocked(player.force, bobmods.inserters.long2_technology) local drop_position, drop_offset = get_split_drop_position(entity) local islong = false local islong2 = false if drop_position.x > 2.1 or drop_position.x < -2.1 or drop_position.y > 2.1 or drop_position.y < -2.1 then islong2 = true elseif drop_position.x > 1.1 or drop_position.x < -1.1 or drop_position.y > 1.1 or drop_position.y < -1.1 then islong = true end if long_unlocked or long2_unlocked then if islong2 then drop_position = bobmods.logistics.set_range(drop_position, 1) elseif islong then if long2_unlocked then drop_position = bobmods.logistics.set_range(drop_position, 3) else drop_position = bobmods.logistics.set_range(drop_position, 1) end else drop_position = bobmods.logistics.set_range(drop_position, 2) end end set_split_drop_position(entity, drop_position, drop_offset) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end function bobmods.inserters.long_range(entity, player) local long_unlocked = tech_unlocked(player.force, bobmods.inserters.long_technology) local long2_unlocked = tech_unlocked(player.force, bobmods.inserters.long2_technology) local pickup_position = get_pickup_position(entity) local drop_position, drop_offset = get_split_drop_position(entity) local islong = false local islong2 = false if pickup_position.x > 2.1 or pickup_position.x < -2.1 or pickup_position.y > 2.1 or pickup_position.y < -2.1 then islong2 = true elseif pickup_position.x > 1.1 or pickup_position.x < -1.1 or pickup_position.y > 1.1 or pickup_position.y < -1.1 then islong = true end if long_unlocked or long2_unlocked then if islong2 then pickup_position = bobmods.logistics.set_range(pickup_position, 1) drop_position = bobmods.logistics.set_range(drop_position, 1) elseif islong then if long2_unlocked then pickup_position = bobmods.logistics.set_range(pickup_position, 3) drop_position = bobmods.logistics.set_range(drop_position, 3) else pickup_position = bobmods.logistics.set_range(pickup_position, 1) drop_position = bobmods.logistics.set_range(drop_position, 1) end else pickup_position = bobmods.logistics.set_range(pickup_position, 2) drop_position = bobmods.logistics.set_range(drop_position, 2) end end local full_drop_position = combine_drop_position(drop_position, drop_offset) set_both_positions(entity, pickup_position, full_drop_position) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end function bobmods.inserters.near_range(entity, player) local near_unlocked = tech_unlocked(player.force, bobmods.inserters.near_technology) local drop_position, drop_offset = get_split_drop_position(entity) if near_unlocked then if (drop_offset.x == 0 and drop_offset.y == 0) or (drop_offset.x == 0 and drop_position.x ~= 0) or (drop_offset.y == 0 and drop_position.y ~= 0) then drop_offset = bobmods.inserters.normalise_tile_offset({ x = drop_position.x, y = drop_position.y }) else if drop_position.x ~= 0 then drop_offset.x = 0 - drop_offset.x end if drop_position.y ~= 0 then drop_offset.y = 0 - drop_offset.y end end if (drop_position.y ~= 0 and drop_position.x ~= 0) and ( ( ((drop_position.x > 0 and drop_offset.x < 0) or (drop_offset.x > 0 and drop_position.x < 0)) -- x near and ((drop_position.y > 0 and drop_offset.y > 0) or (drop_offset.y < 0 and drop_position.y < 0)) ) -- y far or ( ((drop_position.x > 0 and drop_offset.x > 0) or (drop_offset.x < 0 and drop_position.x < 0)) -- x far and ((drop_position.y > 0 and drop_offset.y < 0) or (drop_offset.y > 0 and drop_position.y < 0)) ) -- y near ) then drop_offset = bobmods.inserters.normalise_tile_offset({ x = drop_position.x, y = drop_position.y }) end end set_split_drop_position(entity, drop_position, drop_offset) if entity == global.bobmods.inserters[player.index].entity then bobmods.inserters.refresh_position_checkboxes(entity, player) end end function bobmods.logistics.destroy_gui_button(player_index) local player = game.players[player_index] -- remove legacy GUI if player.gui.top.bob_logistics_inserter_gui then player.gui.top.bob_logistics_inserter_gui.destroy() end -- remove legacy button if player.gui.top.bob_logistics_inserter_button then player.gui.top.bob_logistics_inserter_button.destroy() end local gui = player.gui.top local flow = gui.mod_gui_button_flow or (gui.mod_gui_top_frame and gui.mod_gui_top_frame.mod_gui_inner_frame) if flow and flow.bob_logistics_inserter_button then flow.bob_logistics_inserter_button.destroy() -- Remove empty frame if we're the only thing there, remove the parent frame if we just removed the only child if #flow.children_names == 0 then local parent = flow.parent flow.destroy() if parent and parent.name ~= "top" and #parent.children_names == 0 then parent.destroy() end end end end function bobmods.logistics.create_gui_button(player_index) bobmods.logistics.destroy_gui_button(player_index) local player = game.players[player_index] if not settings.get_player_settings(player)["bobmods-inserters-button-enable"].value then return end mod_gui.get_button_flow(player).add({ type = "sprite-button", name = "bob_logistics_inserter_button", tooltip = { "gui.bob-inserter-open-gui" }, sprite = "item/fast-inserter", style = "mod_gui_button", visible = settings.get_player_settings(player)["bobmods-inserters-button-enable"].value, }) end function bobmods.logistics.show_gui_options(player_index) local player = game.players[player_index] if player.gui.left.bob_logistics_inserter_gui then player.gui.left.bob_logistics_inserter_gui.destroy() end if global.bobmods.logistics[player_index].show then bobmods.logistics.create_gui(player_index) end end function bobmods.logistics.create_gui(player_index) local player = game.players[player_index] local long_unlocked = tech_unlocked(game.players[player_index].force, bobmods.inserters.long_technology) local more_unlocked = tech_unlocked(game.players[player_index].force, bobmods.inserters.more_technology) local near_unlocked = tech_unlocked(game.players[player_index].force, bobmods.inserters.near_technology) if player.gui.left.bob_logistics_inserter_gui then player.gui.left.bob_logistics_inserter_gui.destroy() end if not settings.get_player_settings(player)["bobmods-inserters-button-enable"].value then return end local gui = player.gui.left.add({ type = "frame", name = "bob_logistics_inserter_gui", direction = "vertical" }) gui.style.bottom_padding = 8 gui.style.vertically_stretchable = false gui.style.horizontally_stretchable = false gui.add({ type = "table", name = "table", column_count = 1, style = "bob_table" }) if long_unlocked or near_unlocked then gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_enabled", state = global.bobmods.logistics[player_index].enabled, caption = { "gui.bob-logistics-enabled" }, }) end if global.bobmods.logistics[player_index].enabled then if long_unlocked then if more_unlocked then gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_long_in", state = global.bobmods.logistics[player_index].long_in, caption = { "gui.bob-logistics-pickup" }, }) gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_long_out", state = global.bobmods.logistics[player_index].long_out, caption = { "gui.bob-logistics-drop" }, }) else gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_long_in", state = global.bobmods.logistics[player_index].long_in, caption = { "gui.bob-logistics-long" }, }) end end if near_unlocked then gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_near", state = global.bobmods.logistics[player_index].near, caption = { "gui.bob-logistics-near" }, }) end end if remote.interfaces.bobinserters then gui.table.add({ type = "checkbox", name = "bob_logistics_inserter_enabled2", state = global.bobmods.logistics[player_index].enabled2, caption = { "gui.bob-logistics-enabled2" }, }) if global.bobmods.logistics[player_index].enabled2 then remote.call("bobinserters", "draw_gui", { player_index = player_index, gui = gui, name = "bob_logistics", pickup = global.bobmods.logistics[player_index].pickup, drop = global.bobmods.logistics[player_index].drop, offset = global.bobmods.logistics[player_index].offset, }) end end end function bobmods.inserters.delete_gui(player_index) local globtable = global.bobmods.inserters[player_index] if globtable then if globtable.gui and globtable.gui.valid then globtable.gui.destroy() end globtable.entity = nil globtable.gui = nil globtable.pickup = nil globtable.drop = nil globtable.offset = nil end end function bobmods.inserters.open_gui(entity, player) bobmods.inserters.delete_gui(player.index) local globtable = global.bobmods.inserters[player.index] globtable.entity = entity local long_unlocked = tech_unlocked(player.force, bobmods.inserters.long_technology) local long2_unlocked = tech_unlocked(player.force, bobmods.inserters.long2_technology) local more_unlocked = tech_unlocked(player.force, bobmods.inserters.more_technology) local more2_unlocked = tech_unlocked(player.force, bobmods.inserters.more2_technology) local near_unlocked = tech_unlocked(player.force, bobmods.inserters.near_technology) local pickup_position = get_pickup_position(entity) local full_drop_position = get_drop_position(entity) local drop_position = { x = bobmods.math.round(full_drop_position.x), y = bobmods.math.round(full_drop_position.y) } local offset_position = bobmods.inserters.normalise_tile_offset({ x = bobmods.math.offset(full_drop_position.x), y = bobmods.math.offset(full_drop_position.y), }) local gui local main_table if globtable.position == "left" then gui = player.gui.relative.add({ type = "frame", name = "bob_inserter_gui", direction = "vertical", caption = { "gui.bob-named-inserter-gui", entity.prototype.localised_name }, }) gui.anchor = { gui = defines.relative_gui_type.inserter_gui, position = defines.relative_gui_position[settings.get_player_settings(player)["bobmods-inserters-gui-position"].value], } globtable.pickup, globtable.drop, globtable.offset = bobmods.inserters.draw_inserter_gui_main_table( gui, "bob_inserter_gui", pickup_position, drop_position, offset_position, long_unlocked, long2_unlocked, more_unlocked, more2_unlocked, near_unlocked ) else gui = player.gui.screen.add({ type = "frame", name = "bob_inserter_gui", direction = "vertical" }) gui_add_title( gui, { "gui.bob-named-inserter-gui", entity.prototype.localised_name }, "bob_inserter_gui_close", true ) local main_table_target = gui if settings.get_player_settings(player)["bobmods-inserters-show-window"].value ~= "off" then local entity_flow = gui local frame_width = 400 if settings.get_player_settings(player)["bobmods-inserters-show-window"].value == "left" then gui.title_flow.title.caption = { "gui.bob-inserter-gui" } main_table_target = gui.add({ type = "flow", name = "main_flow", style = "horizontal_flow" }) gui.main_flow.style.horizontal_spacing = 12 entity_flow = gui.main_flow.add({ type = "table", name = "entity_flow", style = "bob_table", column_count = 1 }) entity_flow.add({ type = "label", name = "entity_name", style = "heading_2_label", caption = entity.prototype.localised_name, }) frame_width = 148 end entity_flow.add({ type = "frame", name = "entity_frame", style = "inside_shallow_frame" }) entity_flow.entity_frame.style.width = frame_width entity_flow.entity_frame.style.height = 148 entity_flow.entity_frame.style.horizontally_stretchable = "off" entity_flow.entity_frame.add({ type = "entity-preview", name = "entity_preview", style = "entity_button_base" }) entity_flow.entity_frame.entity_preview.style.width = frame_width entity_flow.entity_frame.entity_preview.style.height = 148 entity_flow.entity_frame.entity_preview.entity = entity end globtable.pickup, globtable.drop, globtable.offset = bobmods.inserters.draw_inserter_gui_main_table( main_table_target, "bob_inserter_gui", pickup_position, drop_position, offset_position, long_unlocked, long2_unlocked, more_unlocked, more2_unlocked, near_unlocked ) gui.auto_center = true player.opened = gui end globtable.gui = gui gui.style.bottom_padding = 8 gui.style.vertically_stretchable = false gui.style.horizontally_stretchable = false end function bobmods.inserters.draw_inserter_gui_main_table( gui, name, pickup_position, drop_position, offset_position, long_unlocked, long2_unlocked, more_unlocked, more2_unlocked, near_unlocked ) local isshort = false local islong = false local islong2 = false if pickup_position.x > 2.1 or pickup_position.x < -2.1 or pickup_position.y > 2.1 or pickup_position.y < -2.1 then islong2 = true elseif pickup_position.x > 1.1 or pickup_position.x < -1.1 or pickup_position.y > 1.1 or pickup_position.y < -1.1 then islong = true else isshort = true end if drop_position.x > 2.1 or drop_position.x < -2.1 or drop_position.y > 2.1 or drop_position.y < -2.1 then islong2 = true elseif drop_position.x > 1.1 or drop_position.x < -1.1 or drop_position.y > 1.1 or drop_position.y < -1.1 then islong = true else isshort = true end local main_table = gui.add({ type = "table", name = "main_table", column_count = 2, style = "bob_table" }) main_table.style.horizontal_spacing = 12 main_table.add({ type = "label", name = "pickup_label", style = "heading_2_label", caption = { "gui.bob-inserter-pickup" }, }) main_table.add({ type = "label", name = "drop_label", style = "heading_2_label", caption = { "gui.bob-inserter-drop" }, }) main_table.add({ type = "frame", name = "pickup", style = "inside_shallow_frame_with_padding" }) main_table.add({ type = "frame", name = "drop", style = "inside_shallow_frame_with_padding" }) main_table.drop.add({ type = "table", name = "table", column_count = 3, style = "bob_table" }) local column_count = 5 if long2_unlocked or islong2 then column_count = 7 elseif long_unlocked or islong then column_count = 5 else column_count = 3 end local gui_pickup = main_table.pickup.add({ type = "table", name = name .. "_pickup", column_count = column_count, style = "bob_table", }) local gui_drop = main_table.drop.table.add({ type = "table", name = name .. "_drop", column_count = column_count, style = "bob_table", }) local gui_offset = nil bobmods.inserters.draw_button_grid( gui_pickup, pickup_position, "bob_inserter_checkbox_pickup", long_unlocked, more_unlocked, islong, long2_unlocked, more2_unlocked, islong2, isshort ) bobmods.inserters.draw_button_grid( gui_drop, drop_position, "bob_inserter_checkbox_drop", long_unlocked, more_unlocked, islong, long2_unlocked, more2_unlocked, islong2, isshort ) if near_unlocked then main_table.drop.table.add({ type = "label", name = "spacer2", caption = " " }) main_table.drop.table.add({ type = "table", name = "offset", column_count = 1, style = "bob_table" }) main_table.drop.table.offset.add({ type = "label", name = "entity_name", caption = { "gui.bob-inserter-offset" }, style = "heading_2_label", }) gui_offset = main_table.drop.table.offset.add({ type = "table", name = name .. "_offset", column_count = 3, style = "bob_table", }) bobmods.inserters.draw_offset_grid(gui_offset, offset_position) end return gui_pickup, gui_drop, gui_offset end function bobmods.inserters.draw_offset_grid(gui, position) gui.add({ type = "checkbox", name = "button1", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button2", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button3", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button4", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button5", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button6", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button7", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button8", state = false, style = "bob_inserter_checkbox_small" }) gui.add({ type = "checkbox", name = "button9", state = false, style = "bob_inserter_checkbox_small" }) bobmods.inserters.draw_button_offset_check(gui, position) end function bobmods.inserters.draw_button_grid(gui, position, style, long, more, islong, long2, more2, islong2, isshort) if long2 or islong2 then if more then gui.add({ type = "checkbox", name = "button26", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank26", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button27", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank27", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button28", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank28", state = false, style = "bob_inserter_blank" }) end gui.add({ type = "checkbox", name = "button29", state = false, style = style }) if more2 then gui.add({ type = "checkbox", name = "button30", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank30", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button31", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank31", state = false, style = "bob_inserter_blank" }) end if more then gui.add({ type = "checkbox", name = "button32", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank32", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button33", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank33", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 or long or islong then if more and (long or islong) then gui.add({ type = "checkbox", name = "button1", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank1", state = false, style = "bob_inserter_blank" }) end if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button2", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank2", state = false, style = "bob_inserter_blank" }) end if long or islong then gui.add({ type = "checkbox", name = "button3", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank3", state = false, style = "bob_inserter_blank" }) end if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button4", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank4", state = false, style = "bob_inserter_blank" }) end if more and (long or islong) then gui.add({ type = "checkbox", name = "button5", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank5", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button34", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank34", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button35", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank35", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 or long or islong then if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button6", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank6", state = false, style = "bob_inserter_blank" }) end end if more and (long or long2 or isshort) then gui.add({ type = "checkbox", name = "button7", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank7", state = false, style = "bob_inserter_blank" }) end if long or long2 or isshort then gui.add({ type = "checkbox", name = "button8", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank8", state = false, style = "bob_inserter_blank" }) end if more and (long or long2 or isshort) then gui.add({ type = "checkbox", name = "button9", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank9", state = false, style = "bob_inserter_blank" }) end if long2 or islong2 or long or islong then if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button10", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank10", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button36", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank36", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then gui.add({ type = "checkbox", name = "button37", state = false, style = style }) end if long2 or islong2 or long or islong then if long or islong then gui.add({ type = "checkbox", name = "button11", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank11", state = false, style = "bob_inserter_blank" }) end end if long or long2 or isshort then gui.add({ type = "checkbox", name = "button12", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank12", state = false, style = "bob_inserter_blank" }) end gui.add({ type = "checkbox", name = "middle", state = false, style = "bob_inserter_middle" }) if long or long2 or isshort then gui.add({ type = "checkbox", name = "button14", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank14", state = false, style = "bob_inserter_blank" }) end if long2 or islong2 or long or islong then if long or islong then gui.add({ type = "checkbox", name = "button15", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank15", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then gui.add({ type = "checkbox", name = "button38", state = false, style = style }) end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button39", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank39", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 or long or islong then if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button16", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank16", state = false, style = "bob_inserter_blank" }) end end if more and (long or long2 or isshort) then gui.add({ type = "checkbox", name = "button17", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank17", state = false, style = "bob_inserter_blank" }) end if long or long2 or isshort then gui.add({ type = "checkbox", name = "button18", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank18", state = false, style = "bob_inserter_blank" }) end if more and (long or long2 or isshort) then gui.add({ type = "checkbox", name = "button19", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank19", state = false, style = "bob_inserter_blank" }) end if long2 or islong2 or long or islong then if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button20", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank20", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button40", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank40", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button41", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank41", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 or long or islong then if more and (long or islong) then gui.add({ type = "checkbox", name = "button21", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank21", state = false, style = "bob_inserter_blank" }) end if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button22", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank22", state = false, style = "bob_inserter_blank" }) end if long or islong then gui.add({ type = "checkbox", name = "button23", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank23", state = false, style = "bob_inserter_blank" }) end if more2 and (long or islong) then gui.add({ type = "checkbox", name = "button24", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank24", state = false, style = "bob_inserter_blank" }) end if more and (long or islong) then gui.add({ type = "checkbox", name = "button25", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank25", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more2 then gui.add({ type = "checkbox", name = "button42", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank42", state = false, style = "bob_inserter_blank" }) end end if long2 or islong2 then if more then gui.add({ type = "checkbox", name = "button43", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank43", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button44", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank44", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button45", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank45", state = false, style = "bob_inserter_blank" }) end gui.add({ type = "checkbox", name = "button46", state = false, style = style }) if more2 then gui.add({ type = "checkbox", name = "button47", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank47", state = false, style = "bob_inserter_blank" }) end if more2 then gui.add({ type = "checkbox", name = "button48", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank48", state = false, style = "bob_inserter_blank" }) end if more then gui.add({ type = "checkbox", name = "button49", state = false, style = style }) else gui.add({ type = "checkbox", name = "blank49", state = false, style = "bob_inserter_blank" }) end end bobmods.inserters.draw_button_position_check(gui, position) end function bobmods.inserters.draw_button_position_check(gui, position) for i, new_position in ipairs(bobmods.inserters.positions) do if gui["button" .. i] then gui["button" .. i].state = false if check_position(position, new_position) then gui["button" .. i].state = true end end end end function bobmods.inserters.draw_button_offset_check(gui, position) for i, new_position in ipairs(bobmods.inserters.offset_positions) do if gui["button" .. i] then gui["button" .. i].state = false if check_position(position, new_position) then gui["button" .. i].state = true end end end end function bobmods.inserters.refresh_position_checkboxes(entity, player) local pickup_position = get_pickup_position(entity) local drop_position, drop_offset = get_split_drop_position(entity) if global.bobmods.inserters[player.index].pickup then bobmods.inserters.draw_button_position_check(global.bobmods.inserters[player.index].pickup, pickup_position) end if global.bobmods.inserters[player.index].drop then bobmods.inserters.draw_button_position_check(global.bobmods.inserters[player.index].drop, drop_position) end if global.bobmods.inserters[player.index].offset then bobmods.inserters.draw_button_offset_check(global.bobmods.inserters[player.index].offset, drop_offset) end end remote.add_interface("bobinserters", { --[[ This function will draw the inserters grid GUI as used in the GUI added by this mod in any GUI you choose. This mod will not respond to those buttons being pressed. This function takes the following variables: gui: The GUI element to draw this GUI inside of. name: The name prefix for the main 3 tables. player_index: obvious pickup: the index in table bobmods.inserters.positions to define the pickup location. drop: the index in table bobmods.inserters.positions to define the drop location. offset: the index in table bobmods.inserters.offset_positions to define the offset location within the drop tile. ]] -- draw_gui = function(data) local force = game.players[data.player_index].force bobmods.inserters.draw_inserter_gui_main_table( data.gui, data.name, bobmods.inserters.positions[data.pickup], bobmods.inserters.positions[data.drop], bobmods.inserters.offset_positions[data.offset], tech_unlocked(force, bobmods.inserters.long_technology), tech_unlocked(force, bobmods.inserters.long2_technology), tech_unlocked(force, bobmods.inserters.more_technology), tech_unlocked(force, bobmods.inserters.more2_technology), tech_unlocked(force, bobmods.inserters.near_technology) ) end, --[[ This function will refresh the GUI checkboxes, designed to refresh a drawn GUI grid after you click one of it's buttons. This function takes the following variables: gui: the GUI table that the buttons are drawn inside of. position: the index in table bobmods.inserters.positions to define the pickup/drop location. ]] -- draw_button_position_check = function(data) bobmods.inserters.draw_button_position_check(data.gui, bobmods.inserters.positions[data.position]) end, --[[ This function will refresh the GUI checkboxes, designed to refresh a drawn GUI grid after you click one of it's buttons. This function takes the following variables: gui: the GUI table that the buttons are drawn inside of. position: the index in table bobmods.inserters.offset_positions to define the offset location. ]] -- draw_button_offset_check = function(data) bobmods.inserters.draw_button_offset_check(data.gui, bobmods.inserters.offset_positions[data.position]) end, --[[ This function will take the value position in the bobmods.inserters.positions table, and return the coordinates. ]] -- get_position = function(data) return bobmods.inserters.positions[data.position] end, --[[ This function will take the value position in the bobmods.inserters.offset_positions table, and return the coordinates. ]] -- get_offset = function(data) return bobmods.inserters.offset_positions[data.position] end, --[[ Pass this function the name of an inserter, and it will be ignored. EG: remote.call("bobinserters", "blacklist_inserter", "burner-inserter") will blacklist the burner inserter. ]] -- blacklist_inserter = function(data) bobmods.inserters.create_global_table_basic() global.bobmods.inserters.blacklist[data] = true end, --[[ Pass this function a table of names of inserters, and they will be ignored. EG: remote.call("bobinserters", "blacklist_inserters", {"burner-inserter"}) will blacklist the burner inserter. ]] -- blacklist_inserters = function(data) bobmods.inserters.create_global_table_basic() for i, inserter in pairs(data) do global.bobmods.inserters.blacklist[inserter] = true end end, --[[ Returns the ID number of the custom event Triggered event returns the following table: {entity = entity, new_positions = {drop_position = {x,y}, pickup_position = {x,y}}, original_positions = {drop_position = {x,y}, pickup_position = {x,y}}} ]] -- get_changed_position_event_id = function() return changed_position_event end, })