z_mirror/EditorExtensions
git clone https://git.raiguard.me/z_mirror/EditorExtensions
e65a4b6
Quezler/patch-1
1local util =require ( "scripts.util" ) 2 3--- @param objects LuaRenderObject[] 4--- @param color Color 5--- @param dashed boolean 6--- @param player_index uint 7--- @param source LuaEntity 8--- @param destination LuaEntity? 9local function draw_connection ( objects , color , dashed , player_index , source , destination ) 10for _ , entity in pairs ( { source , destination } ) do 11objects [ # objects + 1 ] =rendering . draw_circle ( { 12color =color , 13radius =0.15 , 14width =2 , 15filled =not dashed , 16target =entity . position , 17surface =entity . surface , 18players ={ player_index } , 19} ) 20end 21if destination and source . surface == destination . surface then 22objects [ # objects + 1 ] =rendering . draw_line ( { 23color =color , 24width =2 , 25gap_length =dashed and 0.3 or 0 , 26dash_length =dashed and 0.3 or 0 , 27from =source . position , 28to =destination . position , 29surface =source . surface , 30players ={ player_index } , 31} ) 32end 33end 34 35--- @type table<string, Color> 36local colors ={ 37red ={ r =1 , g =0.5 , b =0.5 } , 38green ={ r =0.3 , g =0.8 , b =0.3 } , 39teal ={ r =0.5 , g =1 , b =1 } , 40} 41 42--- @param player LuaPlayer 43local function render_connection ( player ) 44local objects =storage . linked_belt_render_objects [ player . index ] or {} 45for i =# objects , 1 , - 1 do 46objects [ i ]. destroy () 47objects [ i ] =nil 48end 49 50local source =storage . linked_belt_source [ player . index ] 51local selected =player . selected 52if selected and selected . name ~= "ee-linked-belt" then 53selected =nil 54end 55 56if selected then 57local neighbour =selected . linked_belt_neighbour 58if neighbour and neighbour ~= source then 59draw_connection ( objects , colors . green , false , player . index , selected , neighbour ) 60end 61end 62 63if source and source . valid then 64local neighbour =source . linked_belt_neighbour 65if neighbour then 66draw_connection ( objects , colors . red , false , player . index , source , neighbour ) 67end 68if selected and selected ~= neighbour then 69draw_connection ( objects , colors . teal , true , player . index , source , selected ) 70end 71draw_connection ( objects , colors . teal , true , player . index , source ) 72end 73 74if objects [ 1 ] then 75storage . linked_belt_render_objects [ player . index ] =objects 76else 77storage . linked_belt_render_objects [ player . index ] =nil 78end 79end 80 81--- @param player LuaPlayer 82--- @param entity LuaEntity 83--- @param shift boolean? 84local function start_connection ( player , entity , shift ) 85local neighbour =entity . linked_belt_neighbour 86local source 87if neighbour then 88if shift then 89source =neighbour 90else 91source =entity 92end 93else 94source =entity 95end 96storage . linked_belt_source [ player . index ] =source 97 98render_connection ( player ) 99end 100 101--- @param player LuaPlayer 102--- @param entity LuaEntity 103--- @param shift boolean? 104local function finish_connection ( player , entity , shift ) 105local source =storage . linked_belt_source [ player . index ] 106if not source or not source . valid then 107return 108end 109 110local neighbour =entity . linked_belt_neighbour 111if entity . unit_number == source . unit_number then 112return 113end 114if neighbour and not shift then 115util . flying_text ( player , { "message.ee-connection-blocked" } , true , entity . position ) 116return 117end 118if neighbour then 119entity . disconnect_linked_belts () 120end 121 122entity . linked_belt_type =source . linked_belt_type == "input" and "output" or "input" 123entity . connect_linked_belts ( source ) 124 125storage . linked_belt_source [ player . index ] =nil 126 127render_connection ( player ) 128end 129 130--- @param player LuaPlayer 131local function cancel_connection ( player ) 132local source =storage . linked_belt_source [ player . index ] 133if not source then 134return 135end 136storage . linked_belt_source [ player . index ] =nil 137render_connection ( player ) 138end 139 140--- @param e EventData.on_player_rotated_entity 141local function on_player_rotated_entity ( e ) 142local entity =e . entity 143if not entity . valid or entity . name ~= "ee-linked-belt" then 144return 145end 146 147entity . direction =e . previous_direction 148 149local neighbour =entity . linked_belt_neighbour 150if neighbour then 151-- disconnect, flip both ends, reconnect 152entity . disconnect_linked_belts () 153entity . linked_belt_type =entity . linked_belt_type == "output" and "input" or "output" 154neighbour . linked_belt_type =neighbour . linked_belt_type == "output" and "input" or "output" 155entity . connect_linked_belts ( neighbour ) 156else 157entity . linked_belt_type =entity . linked_belt_type == "output" and "input" or "output" 158end 159end 160 161--- @param e EventData.on_selected_entity_changed 162local function on_selected_entity_changed ( e ) 163local player =game . get_player ( e . player_index ) 164if not player then 165return 166end 167 168render_connection ( player ) 169end 170 171--- @param e EventData.CustomInputEvent 172local function on_clear_cursor ( e ) 173local player =game . get_player ( e . player_index ) 174if not player then 175return 176end 177cancel_connection ( player ) 178end 179 180--- @param e EventData.CustomInputEvent 181local function on_left_click ( e ) 182local player =game . get_player ( e . player_index ) 183if not player then 184return 185end 186 187local selected =player . selected 188if not selected or selected . name ~= "ee-linked-belt" then 189return 190end 191 192local source =storage . linked_belt_source [ e . player_index ] 193if source then 194finish_connection ( player , selected ) 195else 196start_connection ( player , selected ) 197end 198end 199 200--- @param e EventData.CustomInputEvent 201local function on_shift_left_click ( e ) 202local player =game . get_player ( e . player_index ) 203if not player then 204return 205end 206 207local selected =player . selected 208if not selected or selected . name ~= "ee-linked-belt" then 209return 210end 211 212local source =storage . linked_belt_source [ e . player_index ] 213if source then 214finish_connection ( player , selected , true ) 215else 216start_connection ( player , selected , true ) 217end 218end 219 220--- @param e EventData.CustomInputEvent 221local function on_shift_right_click ( e ) 222local player =game . get_player ( e . player_index ) 223if not player then 224return 225end 226 227local selected =player . selected 228if not selected or selected . name ~= "ee-linked-belt" or not selected . linked_belt_neighbour then 229return 230end 231 232selected . disconnect_linked_belts () 233render_connection ( player ) 234end 235 236local linked_belt ={} 237 238linked_belt . on_init =function () 239--- @type table<uint, LuaEntity> 240storage . linked_belt_source ={} 241--- @type table<uint, LuaRenderObject[]> 242storage . linked_belt_render_objects ={} 243end 244 245linked_belt . events ={ 246[ defines . events . on_player_rotated_entity ] =on_player_rotated_entity , 247[ defines . events . on_selected_entity_changed ] =on_selected_entity_changed , 248[ "ee-linked-clear-cursor" ] =on_clear_cursor , 249[ "ee-linked-copy-entity-settings" ] =on_shift_right_click , 250[ "ee-linked-open-gui" ] =on_left_click , 251[ "ee-linked-paste-entity-settings" ] =on_shift_left_click , 252} 253 254return linked_belt