z_mirror/Krastorio2
git clone https://git.raiguard.me/z_mirror/Krastorio2
041f29c4
santichu95/patch-1
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 . active =false 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 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 207local planetary_teleporter ={} 208 209function planetary_teleporter . on_init () 210--- @type table<uint, PlanetaryTeleporterData> 211storage . planetary_teleporter ={} 212--- @type table<UnitNumber, PlayerIndex[]> 213storage . planetary_teleporter_players ={} 214end 215 216planetary_teleporter . events ={ 217[ defines . events . on_built_entity ] =on_entity_built , 218[ defines . events . on_entity_cloned ] =on_entity_built , 219[ defines . events . on_entity_died ] =on_entity_destroyed , 220[ defines . events . on_player_mined_entity ] =on_entity_destroyed , 221[ defines . events . on_player_setup_blueprint ] =on_player_setup_blueprint , 222[ defines . events . on_robot_built_entity ] =on_entity_built , 223[ defines . events . on_robot_mined_entity ] =on_entity_destroyed , 224[ defines . events . on_script_trigger_effect ] =on_script_trigger_effect , 225[ defines . events . on_tick ] =on_tick , 226[ defines . events . script_raised_built ] =on_entity_built , 227[ defines . events . script_raised_destroy ] =on_entity_destroyed , 228[ defines . events . script_raised_revive ] =on_entity_built , 229[ defines . events . on_space_platform_built_entity ] =on_entity_built , 230[ defines . events . on_space_platform_mined_entity ] =on_entity_destroyed , 231} 232 233return planetary_teleporter