2020-06-07 13:33:24 +02:00
require ' maps.mountain_fortress_v3.generate '
require ' maps.mountain_fortress_v3.commands '
require ' maps.mountain_fortress_v3.breached_wall '
2020-08-05 21:36:20 +02:00
require ' maps.mountain_fortress_v3.ic.main '
2020-06-07 13:33:24 +02:00
2020-07-28 11:24:16 +02:00
require ' modules.rpg.main '
2020-07-26 17:14:57 +02:00
require ' modules.autofill '
2020-06-07 13:33:24 +02:00
require ' modules.dynamic_landfill '
require ' modules.shotgun_buff '
require ' modules.no_deconstruction_of_neutral_entities '
require ' modules.rocks_yield_ore_veins '
require ' modules.spawners_contain_biters '
require ' modules.biters_yield_coins '
require ' modules.wave_defense.main '
require ' modules.mineable_wreckage_yields_scrap '
2020-07-24 17:33:28 +02:00
require ' modules.charging_station '
2020-06-07 13:33:24 +02:00
2020-08-09 20:31:50 +02:00
local IC = require ' maps.mountain_fortress_v3.ic.table '
2020-06-07 23:25:01 +02:00
local Autostash = require ' modules.autostash '
2020-07-28 16:48:55 +02:00
local Group = require ' comfy_panel.group '
2020-07-26 22:06:19 +02:00
local PL = require ' comfy_panel.player_list '
2020-05-20 09:09:39 +02:00
local CS = require ' maps.mountain_fortress_v3.surface '
2020-06-05 18:01:32 +02:00
local Map_score = require ' comfy_panel.map_score '
2020-05-17 12:23:55 +02:00
local Server = require ' utils.server '
local Explosives = require ' modules.explosives '
2020-06-03 20:09:00 +02:00
local Balance = require ' maps.mountain_fortress_v3.balance '
2020-05-17 12:23:55 +02:00
local Entities = require ' maps.mountain_fortress_v3.entities '
2020-05-23 21:18:18 +02:00
local Gui_mf = require ' maps.mountain_fortress_v3.gui '
2020-05-17 12:23:55 +02:00
local ICW = require ' maps.mountain_fortress_v3.icw.main '
2020-06-10 00:11:35 +02:00
local ICW_Func = require ' maps.mountain_fortress_v3.icw.functions '
2020-05-17 12:23:55 +02:00
local WD = require ' modules.wave_defense.table '
local Map = require ' modules.map_info '
2020-07-25 17:22:04 +02:00
local RPG_Settings = require ' modules.rpg.table '
2020-07-28 11:24:16 +02:00
local RPG_Func = require ' modules.rpg.functions '
2020-05-17 12:23:55 +02:00
local Terrain = require ' maps.mountain_fortress_v3.terrain '
2020-07-14 21:50:56 +02:00
local Functions = require ' maps.mountain_fortress_v3.functions '
2020-05-17 12:23:55 +02:00
local Event = require ' utils.event '
local WPT = require ' maps.mountain_fortress_v3.table '
2020-06-10 00:11:35 +02:00
local Locomotive = require ' maps.mountain_fortress_v3.locomotive '
2020-05-17 12:23:55 +02:00
local Score = require ' comfy_panel.score '
local Poll = require ' comfy_panel.poll '
local Collapse = require ' modules.collapse '
local Difficulty = require ' modules.difficulty_vote '
2020-05-20 09:09:39 +02:00
local Task = require ' utils.task '
2020-07-25 17:22:04 +02:00
local Token = require ' utils.token '
2020-06-07 13:33:24 +02:00
local Alert = require ' utils.alert '
2020-07-01 19:35:38 +02:00
local AntiGrief = require ' antigrief '
2020-06-03 20:09:00 +02:00
--local HD = require 'modules.hidden_dimension.main'
2020-05-23 21:18:18 +02:00
2020-05-17 12:23:55 +02:00
local Public = { }
2020-08-09 20:22:33 +02:00
local floor = math.floor
2020-08-10 23:15:29 +02:00
local random = math.random
local tile_damage = 50
2020-06-03 20:09:00 +02:00
-- local raise_event = script.raise_event
2020-05-17 12:23:55 +02:00
2020-05-20 09:09:39 +02:00
local starting_items = { [ ' pistol ' ] = 1 , [ ' firearm-magazine ' ] = 16 , [ ' rail ' ] = 16 , [ ' wood ' ] = 16 , [ ' explosives ' ] = 32 }
2020-05-17 12:23:55 +02:00
2020-09-02 08:33:13 +02:00
local collapse_kill = {
entities = {
[ ' laser-turret ' ] = true ,
[ ' flamethrower-turret ' ] = true ,
[ ' gun-turret ' ] = true ,
[ ' artillery-turret ' ] = true ,
[ ' landmine ' ] = true ,
[ ' locomotive ' ] = true ,
[ ' cargo-wagon ' ] = true ,
[ ' car ' ] = true ,
[ ' tank ' ] = true ,
[ ' assembling-machine ' ] = true ,
[ ' furnace ' ] = true ,
[ ' steel-chest ' ] = true
} ,
enabled = true
}
2020-08-10 23:15:29 +02:00
local death_messages = {
' should have watched where they walked! ' ,
' was not careful enough! ' ,
' angered the overlords! ' ,
' tried to walk the simple path! ' ,
' melted away! ' ,
' got obliterated! ' ,
' tried to cheat their way north! '
}
2020-06-07 13:33:24 +02:00
local disable_recipes = function ( )
2020-06-03 20:09:00 +02:00
local force = game.forces . player
force.recipes [ ' cargo-wagon ' ] . enabled = false
force.recipes [ ' fluid-wagon ' ] . enabled = false
2020-07-30 17:47:50 +02:00
force.recipes [ ' car ' ] . enabled = false
2020-08-05 21:36:20 +02:00
force.recipes [ ' tank ' ] . enabled = false
2020-06-03 20:09:00 +02:00
force.recipes [ ' artillery-wagon ' ] . enabled = false
force.recipes [ ' locomotive ' ] . enabled = false
force.recipes [ ' pistol ' ] . enabled = false
end
2020-08-10 23:15:29 +02:00
local show_text = function ( msg , pos , color , surface )
if color == nil then
surface.create_entity ( { name = ' flying-text ' , position = pos , text = msg } )
else
surface.create_entity ( { name = ' flying-text ' , position = pos , text = msg , color = color } )
end
end
local init_new_force = function ( )
local new_force = game.forces . protectors
local enemy = game.forces . enemy
if not new_force then
new_force = game.create_force ( ' protectors ' )
end
new_force.set_friend ( ' enemy ' , true )
enemy.set_friend ( ' protectors ' , true )
end
2020-06-07 13:33:24 +02:00
local disable_tech = function ( )
2020-05-17 12:23:55 +02:00
game.forces . player.technologies [ ' landfill ' ] . enabled = false
2020-08-21 13:56:01 +02:00
game.forces . player.technologies [ ' spidertron ' ] . enabled = false
game.forces . player.technologies [ ' spidertron ' ] . researched = false
2020-05-17 12:23:55 +02:00
game.forces . player.technologies [ ' optics ' ] . researched = true
2020-05-20 09:09:39 +02:00
game.forces . player.technologies [ ' railway ' ] . researched = true
2020-05-17 12:23:55 +02:00
game.forces . player.technologies [ ' land-mine ' ] . enabled = false
2020-06-03 20:09:00 +02:00
disable_recipes ( )
2020-05-17 12:23:55 +02:00
end
2020-06-07 13:33:24 +02:00
local set_difficulty = function ( )
2020-05-17 12:23:55 +02:00
local Diff = Difficulty.get ( )
local wave_defense_table = WD.get_table ( )
2020-08-05 21:36:20 +02:00
local collapse_speed = WPT.get ( ' collapse_speed ' )
2020-08-09 20:31:50 +02:00
local collapse_amount = WPT.get ( ' collapse_amount ' )
2020-05-17 12:23:55 +02:00
local player_count = # game.connected_players
if not Diff.difficulty_vote_value then
Diff.difficulty_vote_value = 0.1
end
2020-07-08 22:57:43 +02:00
wave_defense_table.max_active_biters = 888 + player_count * ( 90 * Diff.difficulty_vote_value )
2020-05-17 12:23:55 +02:00
-- threat gain / wave
wave_defense_table.threat_gain_multiplier = 1.2 + player_count * Diff.difficulty_vote_value * 0.1
2020-08-09 20:22:33 +02:00
local amount = player_count * 0.25 + 6
amount = floor ( amount )
if amount > 10 then
amount = 10
2020-05-17 12:23:55 +02:00
end
2020-08-04 12:10:15 +02:00
local difficulty = Difficulty.get ( )
local name = difficulty.difficulties [ difficulty.difficulty_vote_index ] . name
if name == ' Insane ' then
Collapse.set_amount ( 15 )
2020-08-05 21:36:20 +02:00
elseif collapse_amount then
Collapse.set_amount ( collapse_amount )
2020-08-04 12:10:15 +02:00
else
Collapse.set_amount ( amount )
end
2020-05-17 12:23:55 +02:00
2020-08-04 12:10:15 +02:00
if name == ' Insane ' then
2020-07-08 22:57:43 +02:00
Collapse.set_speed ( 5 )
2020-08-05 21:36:20 +02:00
elseif collapse_speed then
Collapse.set_speed ( collapse_speed )
2020-08-04 12:10:15 +02:00
else
if player_count >= 8 and player_count <= 12 then
Collapse.set_speed ( 8 )
2020-08-21 13:56:01 +02:00
elseif player_count >= 20 and player_count <= 24 then
2020-08-04 12:10:15 +02:00
Collapse.set_speed ( 6 )
elseif player_count >= 35 then
Collapse.set_speed ( 5 )
end
2020-07-08 22:57:43 +02:00
end
2020-08-04 12:10:15 +02:00
if name == ' Insane ' then
2020-05-17 12:23:55 +02:00
wave_defense_table.wave_interval = 1800
2020-08-04 12:10:15 +02:00
else
wave_defense_table.wave_interval = 3600 - player_count * 60
if wave_defense_table.wave_interval < 1800 then
wave_defense_table.wave_interval = 1800
end
end
end
2020-06-07 13:33:24 +02:00
local render_direction = function ( surface )
2020-05-20 09:09:39 +02:00
local counter = WPT.get ( ' soft_reset_counter ' )
if counter then
rendering.draw_text {
text = ' Welcome to Mountain Fortress v3! \n Run: ' .. counter ,
surface = surface ,
target = { - 0 , 10 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
else
rendering.draw_text {
text = ' Welcome to Mountain Fortress v3! ' ,
surface = surface ,
target = { - 0 , 10 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
end
2020-05-17 12:23:55 +02:00
rendering.draw_text {
text = ' ▼ ' ,
surface = surface ,
target = { - 0 , 20 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
rendering.draw_text {
text = ' ▼ ' ,
surface = surface ,
target = { - 0 , 30 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
rendering.draw_text {
text = ' ▼ ' ,
surface = surface ,
target = { - 0 , 40 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
rendering.draw_text {
text = ' ▼ ' ,
surface = surface ,
target = { - 0 , 50 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
rendering.draw_text {
text = ' ▼ ' ,
surface = surface ,
target = { - 0 , 60 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
rendering.draw_text {
text = ' Biters will attack this area. ' ,
surface = surface ,
target = { - 0 , 70 } ,
color = { r = 0.98 , g = 0.66 , b = 0.22 } ,
scale = 3 ,
font = ' heading-1 ' ,
alignment = ' center ' ,
scale_with_zoom = false
}
2020-05-20 09:09:39 +02:00
local x_min = - Terrain.level_width / 2
local x_max = Terrain.level_width / 2
surface.create_entity ( { name = ' electric-beam ' , position = { x_min , 74 } , source = { x_min , 74 } , target = { x_max , 74 } } )
surface.create_entity ( { name = ' electric-beam ' , position = { x_min , 74 } , source = { x_min , 74 } , target = { x_max , 74 } } )
2020-05-17 12:23:55 +02:00
end
function Public . reset_map ( )
local Diff = Difficulty.get ( )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
local wave_defense_table = WD.get_table ( )
2020-05-19 23:00:52 +02:00
for _ , player in pairs ( game.players ) do
if player.controller_type == defines.controllers . editor then
player.toggle_map_editor ( )
end
end
2020-06-07 13:33:24 +02:00
this.active_surface_index = CS.create_surface ( )
2020-05-17 12:23:55 +02:00
2020-06-07 23:25:01 +02:00
Autostash.insert_into_furnace ( true )
2020-05-17 12:23:55 +02:00
Poll.reset ( )
ICW.reset ( )
2020-08-09 20:31:50 +02:00
IC.reset ( )
IC.allowed_surface ( ' mountain_fortress_v3 ' )
2020-07-14 21:50:56 +02:00
Functions.reset_table ( )
2020-05-17 12:23:55 +02:00
game.reset_time_played ( )
WPT.reset_table ( )
2020-06-05 18:01:32 +02:00
Map_score.reset_score ( )
2020-07-28 11:24:16 +02:00
RPG_Func.rpg_reset_all_players ( )
2020-07-25 17:22:04 +02:00
RPG_Settings.set_surface_name ( ' mountain_fortress_v3 ' )
RPG_Settings.enable_health_and_mana_bars ( true )
RPG_Settings.enable_wave_defense ( true )
RPG_Settings.enable_mana ( true )
RPG_Settings.enable_flame_boots ( true )
RPG_Settings.personal_tax_rate ( 0.3 )
RPG_Settings.enable_stone_path ( true )
RPG_Settings.enable_one_punch ( true )
RPG_Settings.enable_one_punch_globally ( false )
2020-08-20 11:35:52 +02:00
RPG_Settings.enable_auto_allocate ( true )
2020-07-29 20:23:37 +02:00
RPG_Settings.disable_cooldowns_on_spells ( )
2020-05-17 12:23:55 +02:00
2020-07-28 16:48:55 +02:00
Group.reset_groups ( )
2020-07-30 19:09:18 +02:00
Group.alphanumeric_only ( false )
2020-07-28 16:48:55 +02:00
2020-05-17 12:23:55 +02:00
disable_tech ( )
2020-08-10 23:15:29 +02:00
init_new_force ( )
2020-05-17 12:23:55 +02:00
local surface = game.surfaces [ this.active_surface_index ]
2020-05-19 23:00:52 +02:00
Explosives.set_surface_whitelist ( { [ surface.name ] = true } )
game.forces . player.set_spawn_position ( { - 27 , 25 } , surface )
2020-05-23 21:18:18 +02:00
2020-06-03 20:09:00 +02:00
Balance.init_enemy_weapon_damage ( )
2020-05-17 12:23:55 +02:00
2020-06-05 18:01:32 +02:00
global.custom_highscore . description = ' Wagon distance reached: '
Entities.set_scores ( )
2020-07-01 19:35:38 +02:00
AntiGrief.log_tree_harvest ( true )
AntiGrief.whitelist_types ( ' tree ' , true )
2020-08-17 20:18:06 +02:00
AntiGrief.enable_capsule_warning ( false )
2020-08-14 17:16:04 +02:00
AntiGrief.enable_damage_warning ( false )
2020-07-28 16:48:55 +02:00
AntiGrief.enable_capsule_cursor_warning ( false )
2020-07-30 17:47:50 +02:00
AntiGrief.enable_jail ( true )
2020-07-31 12:04:46 +02:00
AntiGrief.damage_entity_threshold ( 20 )
AntiGrief.explosive_threshold ( 32 )
2020-07-26 22:06:19 +02:00
PL.show_roles_in_list ( true )
2020-07-11 09:32:36 +02:00
local players = game.connected_players
for i = 1 , # players do
local player = players [ i ]
Score.init_player_table ( player )
end
2020-07-07 16:30:04 +02:00
Difficulty.reset_difficulty_poll ( { difficulty_poll_closing_timeout = game.tick + 36000 } )
2020-08-21 13:56:01 +02:00
game.map_settings . path_finder.max_work_done_per_tick = 4000
2020-05-23 21:18:18 +02:00
Diff.gui_width = 20
2020-05-17 12:23:55 +02:00
2020-09-02 08:33:13 +02:00
Collapse.set_kill_entities ( false )
Collapse.set_kill_specific_entities ( collapse_kill )
2020-05-17 12:23:55 +02:00
Collapse.set_speed ( 8 )
Collapse.set_amount ( 1 )
2020-05-19 23:00:52 +02:00
Collapse.set_max_line_size ( Terrain.level_width )
2020-05-17 12:23:55 +02:00
Collapse.set_surface ( surface )
2020-05-23 21:18:18 +02:00
Collapse.set_position ( { 0 , 130 } )
2020-05-17 12:23:55 +02:00
Collapse.set_direction ( ' north ' )
Collapse.start_now ( false )
this.locomotive_health = 10000
this.locomotive_max_health = 10000
2020-06-10 00:11:35 +02:00
Locomotive.locomotive_spawn ( surface , { x = - 18 , y = 25 } )
Locomotive.render_train_hp ( )
2020-05-17 12:23:55 +02:00
render_direction ( surface )
WD.reset_wave_defense ( )
wave_defense_table.surface_index = this.active_surface_index
2020-06-03 20:09:00 +02:00
wave_defense_table.target = this.locomotive
2020-05-17 12:23:55 +02:00
wave_defense_table.nest_building_density = 32
wave_defense_table.game_lost = false
wave_defense_table.spawn_position = { x = 0 , y = 100 }
2020-06-07 13:33:24 +02:00
WD.alert_boss_wave ( true )
2020-06-25 17:59:16 +02:00
WD.clear_corpses ( false )
2020-08-17 20:18:06 +02:00
WD.remove_entities ( false )
2020-08-09 20:22:33 +02:00
WD.enable_threat_log ( true )
WD.check_collapse_position ( true )
2020-05-17 12:23:55 +02:00
set_difficulty ( )
2020-05-23 21:18:18 +02:00
if not surface.is_chunk_generated ( { - 20 , 22 } ) then
surface.request_to_generate_chunks ( { - 20 , 22 } , 0.1 )
surface.force_generate_chunk_requests ( )
end
game.forces . player.set_spawn_position ( { - 27 , 25 } , surface )
2020-07-08 00:08:19 +02:00
Task.start_queue ( )
2020-08-31 20:37:27 +02:00
Task.set_queue_speed ( 16 )
2020-05-17 12:23:55 +02:00
2020-06-07 13:33:24 +02:00
this.chunk_load_tick = game.tick + 1200
2020-08-09 20:31:50 +02:00
this.game_lost = false
2020-05-17 12:23:55 +02:00
end
2020-06-07 13:33:24 +02:00
local on_player_changed_position = function ( event )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
local player = game.players [ event.player_index ]
local map_name = ' mountain_fortress_v3 '
if string.sub ( player.surface . name , 0 , # map_name ) ~= map_name then
return
end
local position = player.position
local surface = game.surfaces [ this.active_surface_index ]
2020-08-10 23:15:29 +02:00
if not player.character then
return
end
if not player.character . valid then
return
end
local p = { x = player.position . x , y = player.position . y }
local get_tile = surface.get_tile ( p )
2020-08-31 20:37:27 +02:00
local config_tile = WPT.get ( ' void_or_tile ' )
if config_tile == ' lab-dark-2 ' then
if get_tile.valid and get_tile.name == ' lab-dark-2 ' then
2020-08-10 23:15:29 +02:00
if random ( 1 , 2 ) == 1 then
2020-08-31 20:37:27 +02:00
if random ( 1 , 2 ) == 1 then
show_text ( ' This path is not for players! ' , p , { r = 0.98 , g = 0.66 , b = 0.22 } , surface )
end
player.surface . create_entity ( { name = ' fire-flame ' , position = player.position } )
player.character . health = player.character . health - tile_damage
if player.character . health == 0 then
player.character . die ( )
local message = player.name .. ' ' .. death_messages [ random ( 1 , # death_messages ) ]
game.print ( message , { r = 0.98 , g = 0.66 , b = 0.22 } )
end
2020-08-10 23:15:29 +02:00
end
end
end
2020-05-17 12:23:55 +02:00
if position.y >= 74 then
player.teleport ( { position.x , position.y - 1 } , surface )
player.print ( ' Forcefield does not approve. ' , { r = 0.98 , g = 0.66 , b = 0.22 } )
if player.character then
player.character . health = player.character . health - 5
player.character . surface.create_entity ( { name = ' water-splash ' , position = position } )
if player.character . health <= 0 then
player.character . die ( ' enemy ' )
end
end
end
end
2020-06-07 13:33:24 +02:00
local on_player_joined_game = function ( event )
2020-06-05 18:01:32 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
local player = game.players [ event.player_index ]
2020-06-05 18:01:32 +02:00
local surface = game.surfaces [ this.active_surface_index ]
2020-06-07 13:33:24 +02:00
local comfy = ' [color=blue]Comfylatron:[/color] \n '
2020-05-17 12:23:55 +02:00
2020-06-03 20:09:00 +02:00
set_difficulty ( )
2020-05-17 12:23:55 +02:00
2020-06-10 00:11:35 +02:00
ICW_Func.is_minimap_valid ( player , surface )
2020-06-05 18:01:32 +02:00
if not this.players [ player.index ] then
2020-07-06 15:45:09 +02:00
this.players [ player.index ] = { }
2020-06-07 13:33:24 +02:00
local message = comfy .. ' Greetings, ' .. player.name .. ' ! \n Please read the map info. '
2020-06-07 23:25:01 +02:00
Alert.alert_player ( player , 15 , message )
2020-05-23 21:18:18 +02:00
for item , amount in pairs ( starting_items ) do
player.insert ( { name = item , count = amount } )
end
end
2020-05-21 23:08:23 +02:00
2020-06-05 18:01:32 +02:00
if player.surface . index ~= this.active_surface_index then
2020-05-23 21:18:18 +02:00
player.teleport (
surface.find_non_colliding_position ( ' character ' , game.forces . player.get_spawn_position ( surface ) , 3 , 0 , 5 ) ,
surface
)
else
local p = { x = player.position . x , y = player.position . y }
2020-06-25 17:59:16 +02:00
local get_tile = surface.get_tile ( p )
if get_tile.valid and get_tile.name == ' out-of-map ' then
2020-05-21 23:08:23 +02:00
player.teleport (
2020-05-23 21:18:18 +02:00
surface.find_non_colliding_position (
2020-05-21 23:08:23 +02:00
' character ' ,
2020-05-23 21:18:18 +02:00
game.forces . player.get_spawn_position ( surface ) ,
2020-05-21 23:08:23 +02:00
3 ,
0 ,
5
) ,
2020-05-23 21:18:18 +02:00
surface
2020-05-21 23:08:23 +02:00
)
end
2020-05-17 12:23:55 +02:00
end
2020-07-28 11:24:16 +02:00
if not this.locomotive or not this.locomotive . valid then
return
end
if player.position . y > this.locomotive . position.y then
player.teleport (
surface.find_non_colliding_position ( ' character ' , game.forces . player.get_spawn_position ( surface ) , 3 , 0 , 5 ) ,
surface
)
end
2020-05-17 12:23:55 +02:00
end
2020-06-07 13:33:24 +02:00
local on_player_left_game = function ( )
2020-05-17 12:23:55 +02:00
set_difficulty ( )
end
2020-06-07 13:33:24 +02:00
local on_pre_player_left_game = function ( event )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
local player = game.players [ event.player_index ]
2020-06-10 00:11:35 +02:00
local tick = game.tick
2020-05-17 12:23:55 +02:00
if player.character then
2020-06-03 20:09:00 +02:00
if not this.offline_players_enabled then
2020-06-10 00:11:35 +02:00
return
2020-05-23 21:18:18 +02:00
end
2020-05-19 23:00:52 +02:00
this.offline_players [ # this.offline_players + 1 ] = {
index = event.player_index ,
name = player.name ,
2020-05-23 21:18:18 +02:00
tick = tick
2020-05-19 23:00:52 +02:00
}
2020-05-17 12:23:55 +02:00
end
end
2020-06-07 13:33:24 +02:00
local remove_offline_players = function ( )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-23 21:18:18 +02:00
if not this.offline_players_enabled then
2020-06-10 00:11:35 +02:00
return
2020-05-23 21:18:18 +02:00
end
2020-05-19 23:00:52 +02:00
local offline_players = WPT.get ( ' offline_players ' )
local active_surface_index = WPT.get ( ' active_surface_index ' )
local surface = game.surfaces [ active_surface_index ]
2020-06-05 23:53:58 +02:00
local keeper = ' [color=blue]Cleaner:[/color] \n '
2020-05-19 23:00:52 +02:00
local player_inv = { }
local items = { }
if # offline_players > 0 then
2020-05-17 12:23:55 +02:00
local later = { }
2020-05-19 23:00:52 +02:00
for i = 1 , # offline_players , 1 do
if
offline_players [ i ] and game.players [ offline_players [ i ] . index ] and
game.players [ offline_players [ i ] . index ] . connected
then
this.offline_players [ i ] = nil
2020-05-17 12:23:55 +02:00
else
2020-08-21 13:56:01 +02:00
if offline_players [ i ] and offline_players [ i ] . tick < game.tick - 34000 then
2020-05-19 23:00:52 +02:00
local name = offline_players [ i ] . name
player_inv [ 1 ] =
game.players [ offline_players [ i ] . index ] . get_inventory ( defines.inventory . character_main )
player_inv [ 2 ] =
game.players [ offline_players [ i ] . index ] . get_inventory ( defines.inventory . character_armor )
player_inv [ 3 ] =
game.players [ offline_players [ i ] . index ] . get_inventory ( defines.inventory . character_guns )
player_inv [ 4 ] =
game.players [ offline_players [ i ] . index ] . get_inventory ( defines.inventory . character_ammo )
player_inv [ 5 ] =
game.players [ offline_players [ i ] . index ] . get_inventory ( defines.inventory . character_trash )
local pos = game.forces . player.get_spawn_position ( surface )
2020-05-17 12:23:55 +02:00
local e =
surface.create_entity (
{
name = ' character ' ,
2020-05-19 23:00:52 +02:00
position = pos ,
2020-05-17 12:23:55 +02:00
force = ' neutral '
}
)
local inv = e.get_inventory ( defines.inventory . character_main )
for ii = 1 , 5 , 1 do
if player_inv [ ii ] . valid then
for iii = 1 , # player_inv [ ii ] , 1 do
if player_inv [ ii ] [ iii ] . valid then
items [ # items + 1 ] = player_inv [ ii ] [ iii ]
end
end
end
end
if # items > 0 then
for item = 1 , # items , 1 do
if items [ item ] . valid then
inv.insert ( items [ item ] )
end
end
2020-06-05 23:53:58 +02:00
local message = keeper .. name .. ' has left his goodies! '
local data = {
position = pos
}
Alert.alert_all_players_location ( data , message )
2020-05-19 23:00:52 +02:00
2020-05-17 12:23:55 +02:00
e.die ( ' neutral ' )
else
e.destroy ( )
end
for ii = 1 , 5 , 1 do
if player_inv [ ii ] . valid then
player_inv [ ii ] . clear ( )
end
end
2020-05-19 23:00:52 +02:00
this.offline_players [ i ] = nil
2020-05-17 12:23:55 +02:00
else
2020-05-19 23:00:52 +02:00
later [ # later + 1 ] = offline_players [ i ]
2020-05-17 12:23:55 +02:00
end
end
end
2020-05-19 23:00:52 +02:00
this.offline_players = { }
2020-05-17 12:23:55 +02:00
if # later > 0 then
for i = 1 , # later , 1 do
2020-05-19 23:00:52 +02:00
this.offline_players [ # offline_players + 1 ] = later [ i ]
2020-05-17 12:23:55 +02:00
end
end
end
end
2020-06-07 13:33:24 +02:00
local on_research_finished = function ( event )
2020-08-21 13:56:01 +02:00
disable_tech ( )
2020-05-23 21:18:18 +02:00
local research = event.research
local this = WPT.get ( )
research.force . character_inventory_slots_bonus = game.forces . player.mining_drill_productivity_bonus * 50 -- +5 Slots / level
2020-05-17 12:23:55 +02:00
local mining_speed_bonus = game.forces . player.mining_drill_productivity_bonus * 5 -- +50% speed / level
2020-05-23 21:18:18 +02:00
if research.force . technologies [ ' steel-axe ' ] . researched then
2020-05-17 12:23:55 +02:00
mining_speed_bonus = mining_speed_bonus + 0.5
end -- +50% speed for steel-axe research
2020-07-08 22:57:43 +02:00
if this.breached_wall <= 2 then
research.force . manual_mining_speed_modifier = this.force_mining_speed . speed + mining_speed_bonus
else
research.force . manual_mining_speed_modifier = mining_speed_bonus
end
2020-05-23 21:18:18 +02:00
local force_name = research.force . name
if not force_name then
return
end
2020-08-31 20:37:27 +02:00
this.flamethrower_damage [ force_name ] = - 0.85
2020-05-23 21:18:18 +02:00
if research.name == ' military ' then
game.forces [ force_name ] . set_turret_attack_modifier ( ' flamethrower-turret ' , this.flamethrower_damage [ force_name ] )
game.forces [ force_name ] . set_ammo_damage_modifier ( ' flamethrower ' , this.flamethrower_damage [ force_name ] )
end
if string.sub ( research.name , 0 , 18 ) == ' refined-flammables ' then
this.flamethrower_damage [ force_name ] = this.flamethrower_damage [ force_name ] + 0.10
game.forces [ force_name ] . set_turret_attack_modifier ( ' flamethrower-turret ' , this.flamethrower_damage [ force_name ] )
game.forces [ force_name ] . set_ammo_damage_modifier ( ' flamethrower ' , this.flamethrower_damage [ force_name ] )
end
2020-05-17 12:23:55 +02:00
end
2020-06-07 13:33:24 +02:00
local is_locomotive_valid = function ( )
2020-05-23 21:18:18 +02:00
local locomotive = WPT.get ( ' locomotive ' )
if not locomotive.valid then
2020-05-17 12:23:55 +02:00
Entities.loco_died ( )
end
end
2020-06-07 13:33:24 +02:00
local has_the_game_ended = function ( )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
if this.game_reset_tick then
2020-07-08 22:57:43 +02:00
if this.game_reset_tick < 0 then
return
end
this.game_reset_tick = this.game_reset_tick - 30
if this.game_reset_tick % 1800 == 0 then
if this.game_reset_tick > 0 then
local cause_msg
if this.restart then
cause_msg = ' restart '
elseif this.shutdown then
cause_msg = ' shutdown '
elseif this.soft_reset then
cause_msg = ' soft-reset '
end
game.print (
' Game will ' .. cause_msg .. ' in ' .. this.game_reset_tick / 60 .. ' seconds! ' ,
{ r = 0.22 , g = 0.88 , b = 0.22 }
)
end
if this.soft_reset and this.game_reset_tick == 0 then
2020-05-17 12:23:55 +02:00
this.game_reset_tick = nil
Public.reset_map ( )
2020-06-07 23:25:01 +02:00
return
end
2020-07-08 22:57:43 +02:00
if this.restart and this.game_reset_tick == 0 then
2020-06-07 23:25:01 +02:00
if not this.announced_message then
2020-07-25 22:22:21 +02:00
game.print (
' Soft-reset is disabled! Server will restart from scenario to load new changes. ' ,
{ r = 0.22 , g = 0.88 , b = 0.22 }
)
local message = ' Soft-reset is disabled! Server will restart from scenario to load new changes. '
2020-06-07 23:25:01 +02:00
Server.to_discord_bold ( table.concat { ' *** ' , message , ' *** ' } )
2020-07-09 14:26:07 +02:00
Server.start_scenario ( ' Mountain_Fortress_v3 ' )
2020-06-07 23:25:01 +02:00
this.announced_message = true
return
end
end
2020-07-08 22:57:43 +02:00
if this.shutdown and this.game_reset_tick == 0 then
2020-06-07 23:25:01 +02:00
if not this.announced_message then
2020-07-25 22:22:21 +02:00
game.print (
' Soft-reset is disabled! Server will shutdown. Most likely because of updates. ' ,
{ r = 0.22 , g = 0.88 , b = 0.22 }
)
local message = ' Soft-reset is disabled! Server will shutdown. Most likely because of updates. '
2020-06-03 20:09:00 +02:00
Server.to_discord_bold ( table.concat { ' *** ' , message , ' *** ' } )
Server.stop_scenario ( )
2020-06-07 23:25:01 +02:00
this.announced_message = true
return
2020-06-03 20:09:00 +02:00
end
2020-05-17 12:23:55 +02:00
end
end
end
end
2020-07-06 15:45:09 +02:00
local boost_difficulty = function ( )
local difficulty_set = WPT.get ( ' difficulty_set ' )
2020-07-08 22:57:43 +02:00
local force_mining_speed = WPT.get ( ' force_mining_speed ' )
2020-07-06 15:45:09 +02:00
if difficulty_set then
return
end
local difficulty = Difficulty.get ( )
2020-08-04 12:10:15 +02:00
local name = difficulty.difficulties [ difficulty.difficulty_vote_index ] . name
2020-07-06 15:45:09 +02:00
if game.tick < difficulty.difficulty_poll_closing_timeout then
return
end
2020-07-25 17:22:04 +02:00
local rpg_extra = RPG_Settings.get ( ' rpg_extra ' )
2020-07-06 15:45:09 +02:00
Difficulty.get ( ) . name = name
Difficulty.get ( ) . button_tooltip = difficulty.tooltip [ difficulty.difficulty_vote_index ]
Difficulty.difficulty_gui ( )
local message = ' Difficulty has been set! Game has been set to: [color=green] ' .. name .. ' [/color] '
local data = {
position = WPT.get ( ' locomotive ' ) . position
}
Alert.alert_all_players_location ( data , message )
if name == ' Easy ' then
rpg_extra.difficulty = 1
2020-07-09 14:26:07 +02:00
game.forces . player.manual_mining_speed_modifier = 1
2020-07-08 22:57:43 +02:00
force_mining_speed.speed = game.forces . player.manual_mining_speed_modifier
2020-07-06 15:45:09 +02:00
game.forces . player.character_running_speed_modifier = 0.2
2020-07-09 14:26:07 +02:00
game.forces . player.manual_crafting_speed_modifier = 0.3
2020-08-14 17:16:04 +02:00
WPT.set ( ) . coin_amount = 2
WPT.set ( ' upgrades ' ) . flame_turret.limit = 25
WPT.set ( ' upgrades ' ) . landmine.limit = 100
2020-08-22 20:15:56 +02:00
WPT.set ( ) . locomotive_health = 15000
WPT.set ( ) . locomotive_max_health = 15000
2020-08-14 17:16:04 +02:00
WPT.set ( ) . bonus_xp_on_join = 700
2020-07-24 17:33:28 +02:00
WD.set ( ) . next_wave = game.tick + 3600 * 20
2020-08-14 17:16:04 +02:00
WPT.set ( ) . spidertron_unlocked_at_wave = 11
WPT.set ( ) . difficulty_set = true
2020-07-06 15:45:09 +02:00
elseif name == ' Normal ' then
rpg_extra.difficulty = 0.5
2020-07-09 14:26:07 +02:00
game.forces . player.manual_mining_speed_modifier = 0.5
2020-07-08 22:57:43 +02:00
force_mining_speed.speed = game.forces . player.manual_mining_speed_modifier
2020-07-06 15:45:09 +02:00
game.forces . player.character_running_speed_modifier = 0.1
2020-07-09 14:26:07 +02:00
game.forces . player.manual_crafting_speed_modifier = 0.1
2020-08-14 17:16:04 +02:00
WPT.set ( ) . coin_amount = 1
WPT.set ( ' upgrades ' ) . flame_turret.limit = 10
WPT.set ( ' upgrades ' ) . landmine.limit = 50
WPT.set ( ) . locomotive_health = 10000
WPT.set ( ) . locomotive_max_health = 10000
WPT.set ( ) . bonus_xp_on_join = 300
2020-07-24 17:33:28 +02:00
WD.set ( ) . next_wave = game.tick + 3600 * 15
2020-08-14 17:16:04 +02:00
WPT.set ( ) . spidertron_unlocked_at_wave = 16
WPT.set ( ) . difficulty_set = true
2020-07-06 15:45:09 +02:00
elseif name == ' Hard ' then
rpg_extra.difficulty = 0
game.forces . player.manual_mining_speed_modifier = 0
2020-07-08 22:57:43 +02:00
force_mining_speed.speed = game.forces . player.manual_mining_speed_modifier
2020-07-06 15:45:09 +02:00
game.forces . player.character_running_speed_modifier = 0
game.forces . player.manual_crafting_speed_modifier = 0
2020-08-14 17:16:04 +02:00
WPT.set ( ) . coin_amount = 1
WPT.set ( ' upgrades ' ) . flame_turret.limit = 3
WPT.set ( ' upgrades ' ) . landmine.limit = 10
WPT.set ( ) . locomotive_health = 5000
WPT.set ( ) . locomotive_max_health = 5000
WPT.set ( ) . bonus_xp_on_join = 50
2020-07-24 17:33:28 +02:00
WD.set ( ) . next_wave = game.tick + 3600 * 10
2020-08-14 17:16:04 +02:00
WPT.set ( ) . spidertron_unlocked_at_wave = 21
WPT.set ( ) . difficulty_set = true
2020-08-04 12:10:15 +02:00
elseif name == ' Insane ' then
rpg_extra.difficulty = 0
game.forces . player.manual_mining_speed_modifier = 0
force_mining_speed.speed = game.forces . player.manual_mining_speed_modifier
game.forces . player.character_running_speed_modifier = 0
game.forces . player.manual_crafting_speed_modifier = 0
2020-08-14 17:16:04 +02:00
WPT.set ( ) . coin_amount = 1
WPT.set ( ' upgrades ' ) . flame_turret.limit = 0
WPT.set ( ' upgrades ' ) . landmine.limit = 0
WPT.set ( ) . locomotive_health = 1000
WPT.set ( ) . locomotive_max_health = 1000
WPT.set ( ) . bonus_xp_on_join = 0
2020-08-04 12:10:15 +02:00
WD.set ( ) . next_wave = game.tick + 3600 * 5
2020-08-14 17:16:04 +02:00
WPT.set ( ) . spidertron_unlocked_at_wave = 26
WPT.set ( ) . difficulty_set = true
2020-07-06 15:45:09 +02:00
end
end
2020-06-07 13:33:24 +02:00
local chunk_load = function ( )
2020-05-23 21:18:18 +02:00
local chunk_load_tick = WPT.get ( ' chunk_load_tick ' )
if chunk_load_tick then
if chunk_load_tick < game.tick then
WPT.get ( ) . chunk_load_tick = nil
2020-08-31 20:37:27 +02:00
Task.set_queue_speed ( 3 )
2020-05-17 12:23:55 +02:00
end
end
end
2020-07-25 17:22:04 +02:00
local collapse_message =
Token.register (
function ( data )
local pos = data.position
2020-08-04 12:10:15 +02:00
local message = data.message
2020-07-25 17:22:04 +02:00
local collapse_position = {
position = pos
}
Alert.alert_all_players_location ( collapse_position , message )
end
)
local collapse_after_wave_100 = function ( )
local collapse_grace = WPT.get ( ' collapse_grace ' )
if not collapse_grace then
return
end
if Collapse.start_now ( ) then
return
end
2020-08-04 12:10:15 +02:00
local difficulty = Difficulty.get ( )
local name = difficulty.difficulties [ difficulty.difficulty_vote_index ] . name
local difficulty_set = WPT.get ( ' difficulty_set ' )
if not difficulty_set and name == ' Insane ' then
return
end
2020-07-25 17:22:04 +02:00
local wave_number = WD.get_wave ( )
2020-08-04 12:10:15 +02:00
if wave_number >= 100 or name == ' Insane ' then
local keeper = ' [color=blue]Mapkeeper:[/color] \n '
2020-07-25 17:22:04 +02:00
Collapse.start_now ( true )
local data = {
position = Collapse.get_position ( )
}
2020-08-04 12:10:15 +02:00
if name == ' Insane ' then
data.message = keeper .. ' Warning, Collapse has begun - god speed! '
else
data.message = keeper .. ' Warning, Collapse has begun - wave limit has been reached! '
end
2020-07-25 17:22:04 +02:00
Task.set_timeout_in_ticks ( 550 , collapse_message , data )
end
end
2020-05-17 12:23:55 +02:00
local on_tick = function ( )
2020-05-20 09:09:39 +02:00
local active_surface_index = WPT.get ( ' active_surface_index ' )
local surface = game.surfaces [ active_surface_index ]
2020-05-23 21:18:18 +02:00
local update_gui = Gui_mf.update_gui
2020-08-04 12:10:15 +02:00
local tick = game.tick
if tick % 60 == 0 then
2020-05-17 12:23:55 +02:00
for _ , player in pairs ( game.connected_players ) do
update_gui ( player )
end
2020-05-23 21:18:18 +02:00
is_locomotive_valid ( )
has_the_game_ended ( )
chunk_load ( )
2020-08-04 12:10:15 +02:00
if tick % 1200 == 0 then
2020-05-23 21:18:18 +02:00
remove_offline_players ( )
2020-07-06 15:45:09 +02:00
boost_difficulty ( )
2020-07-25 17:22:04 +02:00
collapse_after_wave_100 ( )
2020-05-23 21:18:18 +02:00
Entities.set_scores ( )
2020-08-31 20:37:27 +02:00
local spawn_near_collapse = WPT.get ( ' spawn_near_collapse ' )
if spawn_near_collapse then
local collapse_pos = Collapse.get_position ( )
local position = surface.find_non_colliding_position ( ' rocket-silo ' , collapse_pos , 128 , 1 )
if position then
WD.set_spawn_position ( position )
end
2020-05-17 12:23:55 +02:00
end
end
end
end
local on_init = function ( )
2020-05-20 09:09:39 +02:00
local this = WPT.get ( )
2020-05-17 12:23:55 +02:00
Public.reset_map ( )
2020-05-23 21:18:18 +02:00
local difficulties = {
[ 1 ] = {
name = ' Easy ' ,
value = 0.75 ,
color = { r = 0.00 , g = 0.25 , b = 0.00 } ,
print_color = { r = 0.00 , g = 0.4 , b = 0.00 }
} ,
[ 2 ] = {
name = ' Normal ' ,
value = 1 ,
color = { r = 0.00 , g = 0.00 , b = 0.25 } ,
print_color = { r = 0.0 , g = 0.0 , b = 0.5 }
} ,
[ 3 ] = {
name = ' Hard ' ,
value = 1.5 ,
2020-08-04 12:10:15 +02:00
color = { r = 0.25 , g = 0.25 , b = 0.00 } ,
print_color = { r = 0.4 , g = 0.0 , b = 0.00 }
} ,
[ 4 ] = {
name = ' Insane ' ,
value = 3 ,
2020-05-23 21:18:18 +02:00
color = { r = 0.25 , g = 0.00 , b = 0.00 } ,
print_color = { r = 0.4 , g = 0.0 , b = 0.00 }
}
}
local tooltip = {
2020-08-22 20:15:56 +02:00
[ 1 ] = ' Wave Defense is based on amount of players. \n XP Extra reward points = 1. \n Mining speed boosted = 1.5. \n Running speed boosted = 0.2. \n Crafting speed boosted = 0.4. \n Coin amount per harvest = 2. \n Flame Turret limit = 25. \n Landmine limit = 100. \n Locomotive health = 15000. \n Hidden Treasure has higher chance to spawn. \n Grace period: 20 minutes \n Spidertrons unlocks at zone 10. ' ,
2020-08-14 17:16:04 +02:00
[ 2 ] = ' Wave Defense is based on amount of players. \n XP Extra reward points = 0.5. \n Mining speed boosted = 1. \n Running speed boosted = 0.1. \n Crafting speed boosted = 0.2. \n Coin amount per harvest = 1. \n Flame Turret limit = 10. \n Landmine limit = 50. \n Locomotive health = 10000. \n Hidden Treasure has normal chance to spawn. \n Grace period: 15 minutes \n Spidertrons unlocks at zone 15. ' ,
[ 3 ] = ' Wave Defense is based on amount of players. \n XP Extra reward points = 0. \n Mining speed boosted = 0. \n Running speed boosted = 0. \n Crafting speed boosted = 0. \n Coin amount per harvest = 1. \n Flame Turret limit = 3. \n Landmine limit = 10. \n Locomotive health = 5000. \n Hidden Treasure has lower chance to spawn. \n Grace period: 10 minutes \n Spidertrons unlocks at zone 20. ' ,
[ 4 ] = ' Wave Defense is based on amount of players. \n XP Extra reward points = 0. \n Mining speed boosted = 0. \n Running speed boosted = 0. \n Crafting speed boosted = 0. \n Coin amount per harvest = 1. \n Flame Turret limit = 0. \n Landmine limit = 0. \n Locomotive health = 1000. \n Hidden Treasure has lower chance to spawn. \n Grace period: 5 minutes \n Biters are way more aggressive. \n Collapse starts after difficulty poll has ended. \n Collapse is much faster. \n Spidertrons unlocks at zone 25. '
2020-05-23 21:18:18 +02:00
}
Difficulty.set_difficulties ( difficulties )
Difficulty.set_tooltip ( tooltip )
2020-05-17 12:23:55 +02:00
this.rocks_yield_ore_maximum_amount = 500
this.type_modifier = 1
2020-08-09 20:22:33 +02:00
this.rocks_yield_ore_base_amount = 100
2020-05-17 12:23:55 +02:00
this.rocks_yield_ore_distance_modifier = 0.025
local T = Map.Pop_info ( )
2020-06-25 17:59:16 +02:00
T.localised_category = ' mountain_fortress_v3 '
2020-05-17 12:23:55 +02:00
T.main_caption_color = { r = 150 , g = 150 , b = 0 }
T.sub_caption_color = { r = 0 , g = 150 , b = 0 }
Explosives.set_destructible_tile ( ' out-of-map ' , 1500 )
Explosives.set_destructible_tile ( ' water ' , 1000 )
Explosives.set_destructible_tile ( ' water-green ' , 1000 )
Explosives.set_destructible_tile ( ' deepwater-green ' , 1000 )
Explosives.set_destructible_tile ( ' deepwater ' , 1000 )
Explosives.set_destructible_tile ( ' water-shallow ' , 1000 )
2020-05-23 21:18:18 +02:00
Explosives.set_destructible_tile ( ' water-mud ' , 1000 )
2020-08-21 13:56:01 +02:00
Explosives.set_destructible_tile ( ' lab-dark-2 ' , 1000 )
2020-07-06 15:45:09 +02:00
Explosives.set_whitelist_entity ( ' straight-rail ' )
Explosives.set_whitelist_entity ( ' curved-rail ' )
2020-07-27 11:07:32 +02:00
Explosives.set_whitelist_entity ( ' character ' )
if global.biter_command and global.biter_command . whitelist then
global.biter_command . whitelist = {
[ ' Hanakocz ' ] = true ,
[ ' mewmew ' ] = true ,
[ ' Gerkiz ' ] = true
}
2020-08-31 20:37:27 +02:00
global.biter_command . enabled = false
2020-07-27 11:07:32 +02:00
end
2020-05-17 12:23:55 +02:00
end
2020-08-31 20:37:27 +02:00
Event.on_nth_tick ( 15 , on_tick )
2020-05-17 12:23:55 +02:00
Event.on_init ( on_init )
Event.add ( defines.events . on_player_joined_game , on_player_joined_game )
Event.add ( defines.events . on_player_left_game , on_player_left_game )
Event.add ( defines.events . on_player_changed_position , on_player_changed_position )
Event.add ( defines.events . on_research_finished , on_research_finished )
Event.add ( defines.events . on_pre_player_left_game , on_pre_player_left_game )
return Public