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