|  |  |  | extends Node3D | 
					
						
							|  |  |  | class_name LevelManager | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var target: int | 
					
						
							|  |  |  | var level: Level | 
					
						
							|  |  |  | var cur_level_instance: LevelInstance | 
					
						
							|  |  |  | var level_instance_dict: Dictionary = {} | 
					
						
							|  |  |  | var level_loading_rate: float | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _ready(): | 
					
						
							|  |  |  |     Global.level_mgr = self | 
					
						
							|  |  |  |     SignalManager.character_create.connect(on_character_create) | 
					
						
							|  |  |  |     SignalManager.character_pos_changed.connect(on_character_pos_changed) | 
					
						
							|  |  |  |     SignalManager.character_destroy.connect(on_character_destroy) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init(): | 
					
						
							|  |  |  |     var level_scene: PackedScene = load("res://scene/level/level.tscn") | 
					
						
							|  |  |  |     level = level_scene.instantiate() as Level | 
					
						
							|  |  |  |     add_child(level) | 
					
						
							|  |  |  |     var level_instance_list: Array[LevelInstance] = level.get_level_instance_list() | 
					
						
							|  |  |  |     for level_instance in level_instance_list: | 
					
						
							|  |  |  |         var level_id_list: Array[Vector3i] = get_level_id_list(level_instance.get_global_position(), level_instance.size) | 
					
						
							|  |  |  |         for level_id in level_id_list: | 
					
						
							|  |  |  |             if level_id in level_instance_dict: | 
					
						
							|  |  |  |                 print("关卡id重复", level_id) | 
					
						
							|  |  |  |             level_instance_dict[level_id] = level_instance | 
					
						
							|  |  |  |     level.init() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _process(delta) -> void: | 
					
						
							|  |  |  |     if not level: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     if level_loading_rate < 1: | 
					
						
							|  |  |  |         level_loading_rate += delta *2 | 
					
						
							|  |  |  |         if level_loading_rate > 1: | 
					
						
							|  |  |  |             level_loading_rate = 1 | 
					
						
							|  |  |  |         level.set_level_loading_rate(level_loading_rate) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_born_pos() -> Vector3: | 
					
						
							|  |  |  |     return level.get_born_pos() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func on_character_create(id: int, type: int, pos: Vector3): | 
					
						
							|  |  |  |     if type == Enum.ECharacterType.Player: | 
					
						
							|  |  |  |         target = id | 
					
						
							|  |  |  |         on_character_pos_changed(id, pos) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func on_character_pos_changed(id: int, pos: Vector3): | 
					
						
							|  |  |  |     if id == target: | 
					
						
							|  |  |  |         set_player_position(pos) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func on_character_destroy(id: int): target = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func set_player_position(pos: Vector3) -> void: | 
					
						
							|  |  |  |     level.set_player_position(pos) | 
					
						
							|  |  |  |     var new_id: Vector3i                  = Util.get_level_id(pos) | 
					
						
							|  |  |  |     var new_level_instance: LevelInstance = level_instance_dict.get(new_id) | 
					
						
							|  |  |  |     if not new_level_instance: | 
					
						
							|  |  |  |         return #todo 不存在的关卡 主角直接死亡 | 
					
						
							|  |  |  |     if cur_level_instance: | 
					
						
							|  |  |  |         if new_level_instance == cur_level_instance: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         cur_level_instance.set_focus_from(true) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |     SignalManager.level_loading_start.emit() | 
					
						
							|  |  |  |     #创建关卡内角色 | 
					
						
							|  |  |  |     for character_spot: LevelInstance.ChacacterSpot in new_level_instance.get_character_spots(): | 
					
						
							|  |  |  |         if not character_spot.cfg: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         Global.character_mgr.create_character(character_spot.cfg, Enum.ETeam.Monster, character_spot.pos) | 
					
						
							|  |  |  |     new_level_instance.set_focus_to(true) | 
					
						
							|  |  |  |     cur_level_instance = new_level_instance | 
					
						
							|  |  |  |     level_loading_rate = 1-level_loading_rate | 
					
						
							|  |  |  |     level.set_level_loading_rate(level_loading_rate) | 
					
						
							|  |  |  |     SignalManager.level_size_change.emit(cur_level_instance.level_size()) | 
					
						
							|  |  |  |     SignalManager.level_pos_change.emit(cur_level_instance.level_pos()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SignalManager.level_loading_end.emit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_level_id_list(pos: Vector3, size: Vector3i) -> Array[Vector3i]: | 
					
						
							|  |  |  |     var size_basic: Vector3  = Setting.size_basic | 
					
						
							|  |  |  |     var ret: Array[Vector3i] = [] | 
					
						
							|  |  |  |     for x in range(size.x): | 
					
						
							|  |  |  |         for y in range(size.y): | 
					
						
							|  |  |  |             for z in range(size.z): | 
					
						
							|  |  |  |                 var pos_sub: Vector3 = pos +Vector3(x*size_basic.x, y*size_basic.y, z*size_basic.z) | 
					
						
							|  |  |  |                 ret.append(Util.get_level_id(pos_sub)) | 
					
						
							|  |  |  |     return ret |