z_mirror/EditorExtensions
git clone https://git.raiguard.me/z_mirror/EditorExtensions
0ec1237
trunk
1local flib_gui =require ( "__flib__.gui" ) 2local flib_table =require ( "__flib__.table" ) 3 4--- @param entity LuaEntity 5--- @param speed double 6local function set_speed ( entity , speed ) 7entity . set_fluid ( 2 , { 8name ="ee-super-pump-speed-fluid" , 9amount =100000000000 , 10temperature =speed + 0.01 , -- avoid floating point imprecision 11} ) 12end 13 14--- @param entity LuaEntity 15local function get_speed ( entity ) 16return math . floor ( entity . get_fluid ( 2 ). temperature ) 17end 18 19local slider_to_temperature ={ 20[ 0 ] =0 , 21[ 1 ] =100 , 22[ 2 ] =200 , 23[ 3 ] =300 , 24[ 4 ] =400 , 25[ 5 ] =500 , 26[ 6 ] =600 , 27[ 7 ] =700 , 28[ 8 ] =800 , 29[ 9 ] =900 , 30[ 10 ] =1000 , 31[ 11 ] =2000 , 32[ 12 ] =3000 , 33[ 13 ] =4000 , 34[ 14 ] =5000 , 35[ 15 ] =6000 , 36[ 16 ] =7000 , 37[ 17 ] =8000 , 38[ 18 ] =9000 , 39[ 19 ] =10000 , 40[ 20 ] =15000 , 41[ 21 ] =20000 , 42[ 22 ] =25000 , 43[ 23 ] =30000 , 44} 45local temperature_to_slider =flib_table . inverted ( slider_to_temperature ) 46 47--- @param speed double 48--- @return double 49local function to_slider_value ( speed ) 50local index 51if speed == 0 then 52index =0 53elseif speed < 1000 then 54index =math . floor ( speed / 100 ) * 100 55elseif speed < 10000 then 56index =math . floor ( speed / 1000 ) * 1000 57elseif speed < 30000 then 58index =math . floor ( speed / 5000 ) * 5000 59else 60index =30000 61end 62return temperature_to_slider [ index ] 63end 64 65--- @param value double 66--- @return double 67local function from_slider_value ( value ) 68return slider_to_temperature [ value ] 69end 70 71--- @param entity LuaEntity 72--- @param flow LuaGuiElement 73local function update_gui ( entity , flow ) 74local speed =get_speed ( entity ) 75 76local textfield =flow . speed_textfield --[[@as LuaGuiElement]] 77textfield . style ="ee_slider_textfield" 78textfield . text =tostring ( speed ) 79 80local slider =flow . speed_slider --[[@as LuaGuiElement]] 81slider . slider_value =to_slider_value ( speed ) 82end 83 84local handlers ={ 85--- @param entity LuaEntity 86--- @param e EventData.on_gui_value_changed 87on_pump_speed_slider_value_changed =function ( entity , e ) 88local new_speed =from_slider_value ( e . element . slider_value ) 89set_speed ( entity , new_speed ) 90update_gui ( entity , e . element . parent ) 91end , 92 93--- @param entity LuaEntity 94--- @param e EventData.on_gui_text_changed 95on_pump_speed_textfield_changed =function ( entity , e ) 96local textfield =e . element 97local text =textfield . text 98local speed =tonumber ( text ) 99 100if not speed or speed > 600000 then 101textfield . style ="ee_invalid_slider_textfield" 102return 103end 104 105set_speed ( entity , speed ) 106update_gui ( entity , e . element . parent ) 107end , 108} 109 110flib_gui . add_handlers ( handlers , function ( e , handler ) 111local player =game . get_player ( e . player_index ) 112if not player or player . opened_gui_type ~= defines . gui_type . entity then 113return 114end 115local entity =player . opened 116if not entity or not entity . valid then 117return 118end 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 132flib_gui . 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 . pump_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_mods ={ vertical_align ="center" } , 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 . 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 =e . stack or e . record 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 212--- @param e EventData.on_entity_settings_pasted 213local function on_entity_settings_pasted ( e ) 214local source , destination =e . source , e . destination 215if not source . valid or not destination . valid then 216return 217end 218if source . name ~= "ee-super-pump" or destination . name ~= "ee-super-pump" then 219return 220end 221set_speed ( destination , get_speed ( source )) 222end 223 224--- @param e EventData.on_gui_opened 225local function on_gui_opened ( e ) 226local player =game . get_player ( e . player_index ) 227if not player or player . opened_gui_type ~= defines . gui_type . entity then 228return 229end 230local entity =e . entity 231if not entity or not entity . valid then 232return 233end 234if entity . name ~= "ee-super-pump" then 235return 236end 237 238update_gui ( entity , player . gui . relative . ee_super_pump_window . inner_frame . inner_flow ) 239end 240 241--- @param e EventData.on_player_created 242local function on_player_created ( e ) 243local player =game . get_player ( e . player_index ) 244if not player then 245return 246end 247 248create_gui ( player ) 249end 250 251local super_pump ={} 252 253super_pump . on_configuration_changed =function () 254for _ , player in pairs ( game . players ) do 255create_gui ( player ) 256end 257end 258 259super_pump . events ={ 260[ defines . events . on_built_entity ] =on_entity_built , 261[ defines . events . on_entity_cloned ] =on_entity_built , 262[ defines . events . on_entity_settings_pasted ] =on_entity_settings_pasted , 263[ defines . events . on_gui_opened ] =on_gui_opened , 264[ defines . events . on_player_created ] =on_player_created , 265[ defines . events . on_player_setup_blueprint ] =on_player_setup_blueprint , 266[ defines . events . on_robot_built_entity ] =on_entity_built , 267[ defines . events . script_raised_built ] =on_entity_built , 268[ defines . events . script_raised_revive ] =on_entity_built , 269[ defines . events . on_space_platform_built_entity ] =on_entity_built , 270} 271 272return super_pump