z_mirror/EditorExtensions
git clone https://git.raiguard.me/z_mirror/EditorExtensions
864e346
1.14
1local gui =require ( "__flib__/gui-lite" ) 2local math =require ( "__flib__/math" ) 3local table =require ( "__flib__/table" ) 4 5local util =require ( "__EditorExtensions__/scripts/util" ) 6 7--- @param entity LuaEntity 8--- @param speed double 9local function set_speed ( entity , speed ) 10entity . fluidbox [ 2 ] ={ 11name ="ee-super-pump-speed-fluid" , 12amount =100000000000 , 13temperature =speed + 0.01 , -- avoid floating point imprecision 14} 15end 16 17--- @param entity LuaEntity 18local function get_speed ( entity ) 19return math . floor ( entity . fluidbox [ 2 ]. temperature ) 20end 21 22local slider_to_temperature ={ 23[ 0 ] =0 , 24[ 1 ] =100 , 25[ 2 ] =200 , 26[ 3 ] =300 , 27[ 4 ] =400 , 28[ 5 ] =500 , 29[ 6 ] =600 , 30[ 7 ] =700 , 31[ 8 ] =800 , 32[ 9 ] =900 , 33[ 10 ] =1000 , 34[ 11 ] =2000 , 35[ 12 ] =3000 , 36[ 13 ] =4000 , 37[ 14 ] =5000 , 38[ 15 ] =6000 , 39[ 16 ] =7000 , 40[ 17 ] =8000 , 41[ 18 ] =9000 , 42[ 19 ] =10000 , 43[ 20 ] =15000 , 44[ 21 ] =20000 , 45[ 22 ] =25000 , 46[ 23 ] =30000 , 47} 48local temperature_to_slider =table . invert ( slider_to_temperature ) 49 50--- @param speed double 51--- @return double 52local function to_slider_value ( speed ) 53local index 54if speed == 0 then 55index =0 56elseif speed < 1000 then 57index =math . floor ( speed / 100 ) * 100 58elseif speed < 10000 then 59index =math . floor ( speed / 1000 ) * 1000 60elseif speed < 30000 then 61index =math . floor ( speed / 5000 ) * 5000 62else 63index =30000 64end 65return temperature_to_slider [ index ] 66end 67 68--- @param value double 69--- @return double 70local function from_slider_value ( value ) 71return slider_to_temperature [ value ] 72end 73 74--- @param entity LuaEntity 75--- @param flow LuaGuiElement 76local function update_gui ( entity , flow ) 77local speed =get_speed ( entity ) 78 79local textfield =flow . speed_textfield --[[@as LuaGuiElement]] 80textfield . style ="ee_slider_textfield" 81textfield . text =tostring ( speed ) 82 83local slider =flow . speed_slider --[[@as LuaGuiElement]] 84slider . slider_value =to_slider_value ( speed ) 85end 86 87local handlers ={ 88--- @param entity LuaEntity 89--- @param e EventData.on_gui_value_changed 90on_pump_speed_slider_value_changed =function ( entity , e ) 91local new_speed =from_slider_value ( e . element . slider_value ) 92set_speed ( entity , new_speed ) 93update_gui ( entity , e . element . parent ) 94end , 95 96--- @param entity LuaEntity 97--- @param e EventData.on_gui_text_changed 98on_pump_speed_textfield_changed =function ( entity , e ) 99local textfield =e . element 100local text =textfield . text 101local speed =tonumber ( text ) 102 103if not speed or speed > 600000 then 104textfield . style ="ee_invalid_slider_textfield" 105return 106end 107 108set_speed ( entity , speed ) 109update_gui ( entity , e . element . parent ) 110end , 111} 112 113gui . add_handlers ( handlers , function ( e , handler ) 114local player =game . get_player ( e . player_index ) 115if not player or player . opened_gui_type ~= defines . gui_type . entity then 116return 117end 118local entity =player . opened --[[@as LuaEntity]] 119if entity . name ~= "ee-super-pump" then 120return 121end 122handler ( entity , e ) 123end ) 124 125--- @param player LuaPlayer 126local function create_gui ( player ) 127local existing =player . gui . relative . ee_super_pump_window 128if existing then 129existing . destroy () 130end 131 132gui . add ( player . gui . relative , { 133type ="frame" , 134name ="ee_super_pump_window" , 135style ="frame_with_even_paddings" , 136style_mods ={ width =448 } , 137anchor ={ 138gui =defines . relative_gui_type . entity_with_energy_source_gui , 139position =defines . relative_gui_position . bottom , 140name ="ee-super-pump" , 141} , 142{ 143type ="frame" , 144name ="inner_frame" , 145style ="inside_shallow_frame_with_padding" , 146{ 147type ="flow" , 148name ="inner_flow" , 149style ="centering_horizontal_flow" , 150{ type ="label" , caption ={ "gui.ee-speed" } , tooltip ={ "gui.ee-speed-tooltip" } } , 151{ 152type ="slider" , 153name ="speed_slider" , 154style_mods ={ horizontally_stretchable =true , margin ={ 0 , 8 , 0 , 8 } } , 155minimum_value =0 , 156maximum_value =23 , 157value =0 , 158handler ={ [ defines . events . on_gui_value_changed ] =handlers . on_pump_speed_slider_value_changed } , 159} , 160{ 161type ="textfield" , 162name ="speed_textfield" , 163style ="ee_slider_textfield" , 164numeric =true , 165clear_and_focus_on_right_click =true , 166handler ={ [ defines . events . on_gui_text_changed ] =handlers . on_pump_speed_textfield_changed } , 167} , 168} , 169} , 170} ) 171end 172 173--- @param e BuiltEvent 174local function on_entity_built ( e ) 175local entity =e . created_entity or e . entity or e . destination 176if not entity or not entity . valid or entity . name ~= "ee-super-pump" then 177return 178end 179local speed =12000 180local tags =e . tags 181if tags and tags . EditorExtensions then 182speed =tags . EditorExtensions . speed --[[@as double]] 183end 184set_speed ( entity , speed ) 185end 186 187--- @param e EventData.on_player_setup_blueprint 188local function on_player_setup_blueprint ( e ) 189local blueprint =util . get_blueprint ( e ) 190if not blueprint then 191return 192end 193 194local entities =blueprint . get_blueprint_entities () 195if not entities then 196return 197end 198for i , entity in pairs ( entities ) do 199--- @cast i uint 200if entity . name ~= "ee-super-pump" then 201goto continue 202end 203local real_entity =e . surface . find_entity ( entity . name , entity . position ) 204if not real_entity then 205goto continue 206end 207blueprint . set_blueprint_entity_tag ( i , "EditorExtensions" , { speed =get_speed ( real_entity ) } ) 208:: continue :: 209end 210end 211 212local function on_entity_settings_pasted ( e ) 213local source , destination =e . source , e . destination 214if not source . valid or not destination . valid then 215return 216end 217if source . name ~= "ee-super-pump" or destination . name ~= "ee-super-pump" then 218return 219end 220set_speed ( destination , get_speed ( source )) 221end 222 223--- @param e EventData.on_gui_opened 224local function on_gui_opened ( e ) 225local player =game . get_player ( e . player_index ) 226if not player or player . opened_gui_type ~= defines . gui_type . entity then 227return 228end 229local entity =player . opened --[[@as LuaEntity]] 230if entity . name ~= "ee-super-pump" then 231return 232end 233 234update_gui ( entity , player . gui . relative . ee_super_pump_window . inner_frame . inner_flow ) 235end 236 237--- @param e EventData.on_player_created 238local function on_player_created ( e ) 239local player =game . get_player ( e . player_index ) 240if not player then 241return 242end 243 244create_gui ( player ) 245end 246 247local super_pump ={} 248 249super_pump . on_configuration_changed =function () 250for _ , player in pairs ( game . players ) do 251create_gui ( player ) 252end 253end 254 255super_pump . events ={ 256[ defines . events . on_built_entity ] =on_entity_built , 257[ defines . events . on_entity_cloned ] =on_entity_built , 258[ defines . events . on_entity_settings_pasted ] =on_entity_settings_pasted , 259[ defines . events . on_gui_opened ] =on_gui_opened , 260[ defines . events . on_player_created ] =on_player_created , 261[ defines . events . on_player_setup_blueprint ] =on_player_setup_blueprint , 262[ defines . events . on_robot_built_entity ] =on_entity_built , 263[ defines . events . script_raised_built ] =on_entity_built , 264[ defines . events . script_raised_revive ] =on_entity_built , 265} 266 267return super_pump