z_mirror/Krastorio2
git clone https://git.raiguard.me/z_mirror/Krastorio2
0415cb88
trunk
1local util =require ( "scripts.util" ) 2 3--- @class ShelterData 4--- @field container LuaEntity 5--- @field electric LuaEntity 6--- @field light LuaEntity 7--- @field former_spawn_point MapPosition 8 9--- @param force LuaForce 10local function init_force ( force ) 11if not storage . shelter then 12return 13end 14storage . shelter . forces [ force . index ] ={} 15end 16 17local function spawn_flying_texts () 18for unit_number , entity in pairs ( storage . shelter . inactive ) do 19if entity . valid then 20util . entity_flying_text ( entity , { "message.kr-shelter-is-inactive" } , { r =1 } ) 21else 22storage . shelter . inactive [ unit_number ] =nil 23end 24end 25end 26 27--- @param shelter_data ShelterData 28local function all_are_valid ( shelter_data ) 29return shelter_data . container . valid and shelter_data . electric . valid and shelter_data . light . valid 30end 31 32--- @param entity LuaEntity 33local function destroy_if_valid ( entity ) 34if entity . valid then 35entity . destroy () 36end 37end 38 39--- @param e EntityBuiltEvent 40local function on_entity_built ( e ) 41local entity =e . entity or e . destination 42if not entity . valid then 43return 44end 45if entity . name ~= "kr-shelter-container" and entity . name ~= "kr-shelter-plus-container" then 46return 47end 48--- @cast entity LuaEntity 49 50local force =entity . force 51local surface =entity . surface 52local force_shelters =storage . shelter . forces [ force . index ] 53 54local existing_shelter_data =force_shelters [ surface . index ] 55if existing_shelter_data then 56if all_are_valid ( existing_shelter_data ) then 57local name =entity . name : gsub ( "kr%-" , "kr-inactive-" ): gsub ( "%-container" , "" ) 58local position =entity . position 59local force =entity . force 60local player =entity . last_user 61local surface =entity . surface 62entity . destroy () 63 64local new_entity =surface . create_entity ( { 65name =name , 66position =position , 67force =force , 68player =player , 69create_build_effect_smoke =false , 70raise_built =true , 71} ) 72if new_entity and new_entity . valid then 73storage . shelter . inactive [ new_entity . unit_number ] =new_entity 74end 75return 76else 77force . set_spawn_position ( existing_shelter_data . former_spawn_point , surface ) 78destroy_if_valid ( existing_shelter_data . container ) 79destroy_if_valid ( existing_shelter_data . electric ) 80destroy_if_valid ( existing_shelter_data . light ) 81force_shelters [ force . index ] =nil 82end 83end 84 85local _ , _ , base_name =string . find ( entity . name , "^(.*)%-container" ) 86--- @type ShelterData 87local shelter_data ={ container =entity } 88 89for key , suffix in pairs ( { electric ="" , light ="-light" } ) do 90local name =base_name .. suffix 91shelter_data [ key ] =surface . create_entity ( { 92name =name , 93position =entity . position , 94force =force , 95player =entity . last_user , 96create_build_effect_smoke =false , 97raise_built =true , 98} ) 99end 100 101shelter_data . former_spawn_point =force . get_spawn_position ( surface ) 102force . set_spawn_position ( { x =entity . position . x , y =entity . position . y + 3.5 } , surface ) 103 104force_shelters [ surface . index ] =shelter_data 105end 106 107--- @param e EntityDestroyedEvent 108local function on_entity_destroyed ( e ) 109local entity =e . entity 110if not entity or not entity . valid then 111return 112end 113if entity . name ~= "kr-shelter-container" and entity . name ~= "kr-shelter-plus-container" then 114return 115end 116 117local inactive =storage . shelter . inactive [ entity . unit_number ] 118if inactive then 119storage . shelter . inactive [ entity . unit_number ] =nil 120else 121local force =entity . force 122 123local force_shelters =storage . shelter . forces [ force . index ] 124if not force_shelters then 125return 126end 127 128local surface_index =entity . surface . index 129local shelter_data =force_shelters [ surface_index ] 130if not shelter_data then 131return 132end 133 134destroy_if_valid ( shelter_data . electric ) 135destroy_if_valid ( shelter_data . light ) 136force_shelters [ surface_index ] =nil 137 138force . set_spawn_position ( shelter_data . former_spawn_point , surface_index ) 139end 140end 141 142--- @param e EventData.on_force_created 143local function on_force_created ( e ) 144if e . force . valid then 145init_force ( e . force ) 146end 147end 148 149--- @class ShelterHandler : event_handler 150local shelter ={} 151 152function shelter . on_init () 153storage . shelter ={ 154--- @type table<uint, table<uint, ShelterData>> 155forces ={} , 156--- @type table<uint, LuaEntity> 157inactive ={} , 158} 159 160for _ , force in pairs ( game . forces ) do 161init_force ( force ) 162end 163end 164 165shelter . events ={ 166[ defines . events . on_built_entity ] =on_entity_built , 167[ defines . events . on_entity_cloned ] =on_entity_built , 168[ defines . events . on_entity_died ] =on_entity_destroyed , 169[ defines . events . on_force_created ] =on_force_created , 170[ defines . events . on_player_mined_entity ] =on_entity_destroyed , 171[ defines . events . on_robot_built_entity ] =on_entity_built , 172[ defines . events . on_robot_mined_entity ] =on_entity_destroyed , 173[ defines . events . script_raised_built ] =on_entity_built , 174[ defines . events . script_raised_destroy ] =on_entity_destroyed , 175[ defines . events . script_raised_revive ] =on_entity_built , 176[ defines . events . on_space_platform_built_entity ] =on_entity_built , 177[ defines . events . on_space_platform_mined_entity ] =on_entity_destroyed , 178} 179 180shelter . on_nth_tick ={ 181[ 180 ] =spawn_flying_texts , 182} 183 184return shelter