z_mirror/FluidMustFlow
git clone https://git.raiguard.me/z_mirror/FluidMustFlow
390a5b8
trunk
1-- The only thing we're doing is auto-join, so don't even bother if it's not enabled 2if not settings . startup [ "fmf-enable-duct-auto-join" ]. value then 3return 4end 5 6--- Calculates the midpoint between two positions. 7--- @param pos_1 MapPosition 8--- @param pos_2 MapPosition 9--- @return MapPosition 10local function get_midpoint ( pos_1 , pos_2 ) 11return { 12x =( pos_1 . x + pos_2 . x ) / 2 , 13y =( pos_1 . y + pos_2 . y ) / 2 , 14} 15end 16 17--- @param e EventData.on_built_entity|EventData.on_robot_built_entity|EventData.script_raised_built|EventData.script_raised_revive 18local function join_ducts ( e ) 19--- @type LuaEntity 20local entity =e . entity 21if not entity or not entity . valid then 22return 23end 24 25for _ , connection in pairs ( entity . get_fluid_box_pipe_connections ( 1 )) do 26local neighbour =entity . surface . find_entity ( { name =entity . name , quality =entity . quality } , connection . target_position ) 27if neighbour then 28local direction =entity . direction 29local force =entity . force 30local last_user =entity . last_user 31local name =entity . name == "duct-small" and "duct" or "duct-long" 32local quality =entity . quality 33local position =get_midpoint ( entity . position , neighbour . position ) 34local surface =entity . surface 35 36entity . destroy ( { raise_destroy =true } ) 37neighbour . destroy ( { raise_destroy =true } ) 38 39surface . create_entity ( { 40name =name , 41quality =quality , 42position =position , 43direction =direction , 44force =force , 45player =last_user , 46raise_built =true , 47create_build_effect_smoke =false , 48} ) 49 50-- Only do one join per build 51break 52end 53end 54end 55 56local event_filter ={ { filter ="name" , name ="duct-small" } , { filter ="name" , name ="duct" } } 57 58script . on_event ( defines . events . on_built_entity , join_ducts , event_filter ) 59script . on_event ( defines . events . on_robot_built_entity , join_ducts , event_filter ) 60script . on_event ( defines . events . script_raised_built , join_ducts , event_filter ) 61script . on_event ( defines . events . script_raised_revive , join_ducts , event_filter )