z_mirror/Krastorio2
git clone https://git.raiguard.me/z_mirror/Krastorio2
dc27c4a3
trunk
1local flib_table =require ( "__flib__.table" ) 2 3--- @class PlanetaryTeleporterData 4--- @field entities PlanetaryTeleporterEntities 5--- @field force LuaForce 6--- @field name string? 7--- @field position MapPosition 8--- @field surface LuaSurface 9--- @field turret_unit_number UnitNumber 10 11--- @class PlanetaryTeleporterEntities 12--- @field base LuaEntity 13--- @field turret LuaEntity 14--- @field collision_1 LuaEntity 15--- @field collision_2 LuaEntity 16--- @field collision_3 LuaEntity 17--- @field front_layer LuaEntity 18 19local collision_entity_offsets ={ 20{ x =0 , y =0 } , 21{ x =- 2 , y =2 } , 22{ x =2 , y =2 } , 23} 24 25--- @param base_entity LuaEntity 26--- @return PlanetaryTeleporterEntities? 27local function create_entities ( base_entity ) 28local entities ={ 29base =base_entity , 30} 31local surface =base_entity . surface 32local position =base_entity . position 33 34-- Building the turret can fail due to AAI vehicles 35entities . turret =surface . create_entity ( { 36name ="kr-planetary-teleporter-turret" , 37position ={ x =position . x , y =position . y + 1.15 } , 38force ="kr-internal-turrets" , 39create_build_effect_smoke =false , 40raise_built =true , 41} ) 42 43if not entities . turret or not entities . turret . valid then 44game . ( 45"Building planetary teleporter failed due to AAI Programmable Vehicles. This teleporter will not function." 46) 47base_entity . disabled_by_script =true 48return 49end 50 51for i , offset in ipairs ( collision_entity_offsets ) do 52entities [ "collision_" .. i ] =surface . create_entity ( { 53name ="kr-planetary-teleporter-collision-" .. i , 54position ={ x =position . x + offset . x , y =position . y + offset . y } , 55create_build_effect_smoke =false , 56raise_built =true , 57} ) 58end 59entities . front_layer =surface . create_entity ( { 60name ="kr-planetary-teleporter-front-layer" , 61position =position , 62create_build_effect_smoke =false , 63raise_built =true , 64} ) 65for name , entity in pairs ( entities ) do 66if name ~= "base" then 67entity . destructible =false 68end 69end 70return entities 71end 72 73--- @param e EntityBuiltEvent 74local function on_entity_built ( e ) 75local entity =e . entity or e . destination 76if not entity or not entity . valid then 77return 78end 79local entity_name =entity . name 80 81-- Don't keep cloned internal entities. 82if 83e . name == defines . events . on_entity_cloned 84and ( 85entity_name == "kr-planetary-teleporter-front-layer" 86or entity_name == "kr-planetary-teleporter-turret" 87or string . find ( entity_name , "kr-planetary-teleporter-collision" , nil , true ) 88) 89then 90entity . destroy () 91return 92end 93 94if entity_name ~= "kr-planetary-teleporter" then 95return 96end 97 98-- If revived from a blueprint and it has a name, get it from the tags 99local name =e . tags and e . tags . kr_planetary_teleporter_name or nil --[[@as string?]] 100local entities =create_entities ( entity ) 101if not entities then 102return 103end 104 105storage . planetary_teleporter [ entity . unit_number ] ={ 106entities =entities , 107force =entity . force --[[@as LuaForce]] , 108name =name , 109position =entity . position , 110surface =entity . surface , 111turret_unit_number =entities . turret . unit_number , 112} 113end 114 115--- @param e EntityDestroyedEvent 116local function on_entity_destroyed ( e ) 117local entity =e . entity 118if not entity or not entity . valid or entity . name ~= "kr-planetary-teleporter" then 119return 120end 121local unit_number =entity . unit_number --[[@as uint]] 122local data =storage . planetary_teleporter [ unit_number ] 123-- AAI vehicles will destroy the entity before we have an opportuity to create data. 124if not data then 125return 126end 127for _ , entity_to_destroy in pairs ( data . entities ) do 128if entity_to_destroy . valid then 129entity_to_destroy . destroy () 130end 131end 132storage . planetary_teleporter [ unit_number ] =nil 133end 134 135--- @param e EventData.on_player_setup_blueprint 136local function on_player_setup_blueprint ( e ) 137local player =game . get_player ( e . player_index ) 138if not player then 139return 140end 141 142-- Get blueprint 143local bp =player . blueprint_to_setup 144if not bp or not bp . valid_for_read then 145bp =player . cursor_stack 146if not bp then 147return 148end 149if bp . type == "blueprint-book" then 150local item_inventory =bp . get_inventory ( defines . inventory . item_main ) 151if item_inventory then 152bp =item_inventory [ bp . active_index ] 153else 154return 155end 156end 157end 158 159local entities =bp . get_blueprint_entities () 160if not entities then 161return 162end 163 164-- Iterate each entity 165for i =1 , # entities do 166local entity =entities [ i ] 167local entity_name =entity . name 168if entity_name == "kr-planetary-teleporter" then 169local real_entity =player . surface . find_entity ( "kr-planetary-teleporter" , entity . position ) 170if real_entity then 171local unit_number =real_entity . unit_number --[[@as uint]] 172local data =storage . planetary_teleporter [ unit_number ] 173if data and data . name then 174bp . set_blueprint_entity_tag ( i , "kr_planetary_teleporter_name" , data . name ) 175end 176end 177end 178end 179end 180 181--- @param e EventData.on_script_trigger_effect 182local function on_script_trigger_effect ( e ) 183if e . effect_id ~= "kr-planetary-teleporter-character-trigger" then 184return 185end 186 187if not e . source_entity . valid or not e . target_entity . valid or e . target_entity . type ~= "character" then 188return 189end 190 191local player =e . target_entity . player 192if not player or not player . valid then 193return 194end 195 196table . insert ( 197flib_table . get_or_insert ( storage . planetary_teleporter_players , e . source_entity . unit_number , {} ), 198player . index 199) 200end 201 202-- on_tick is executed before on_script_trigger_effect 203local function on_tick () 204storage . planetary_teleporter_players ={} 205end 206 207-- Get all planetary teleporters on each surface 208-- Get the name from old storage 209-- Nuke old storage 210-- Re-init 211-- Call build functions for each existing teleporter 212 213--- @class PlanetaryTeleporterHandler : event_handler 214local planetary_teleporter ={} 215 216function planetary_teleporter . on_init () 217--- @type table<uint, PlanetaryTeleporterData> 218storage . planetary_teleporter ={} 219--- @type table<UnitNumber, PlayerIndex[]> 220storage . planetary_teleporter_players ={} 221end 222 223planetary_teleporter . events ={ 224[ defines . events . on_built_entity ] =on_entity_built , 225[ defines . events . on_entity_cloned ] =on_entity_built , 226[ defines . events . on_entity_died ] =on_entity_destroyed , 227[ defines . events . on_player_mined_entity ] =on_entity_destroyed , 228[ defines . events . on_player_setup_blueprint ] =on_player_setup_blueprint , 229[ defines . events . on_robot_built_entity ] =on_entity_built , 230[ defines . events . on_robot_mined_entity ] =on_entity_destroyed , 231[ defines . events . on_script_trigger_effect ] =on_script_trigger_effect , 232[ defines . events . on_tick ] =on_tick , 233[ defines . events . script_raised_built ] =on_entity_built , 234[ defines . events . script_raised_destroy ] =on_entity_destroyed , 235[ defines . events . script_raised_revive ] =on_entity_built , 236[ defines . events . on_space_platform_built_entity ] =on_entity_built , 237[ defines . events . on_space_platform_mined_entity ] =on_entity_destroyed , 238} 239 240--- Only to be used for pre-2.0 migrations. 241--- @param entity LuaEntity 242--- @param name string? 243function planetary_teleporter . migrate_teleporter ( entity , name ) 244on_entity_built ( { 245name =defines . events . on_built_entity , 246tick =game . tick , 247entity =entity , 248tags ={ kr_planetary_teleporter_name =name } , --- @diagnostic disable-line: assign-type-mismatch 249} ) 250end 251 252return planetary_teleporter