using Newtonsoft.Json; using ServerCommon; using ServerCore; using ServerBase; namespace GameServer; using Contents.GameMode.Helper; public class BattleRoomHelper { public static Result checkBattleActive(EPlaceType type) { var result = new Result(); var server_logic = GameServerApp.getServerLogic(); var server_config = server_logic.getServerConfig(); bool is_battle_system_active = server_config.BattleSystemEnable; if (type == EPlaceType.BattleRoom && is_battle_system_active) return result; string err_msg = $"BattleSystem Not Active!!!! type : {type}, is_battle_system_active : {is_battle_system_active}"; result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg); Log.getLogger().error(result.toBasicString()); return result; } public static bool checkBattleActive() { var server_logic = GameServerApp.getServerLogic(); var server_config = server_logic.getServerConfig(); bool is_battle_system_active = server_config.BattleSystemEnable; if (is_battle_system_active) return true; return false; } public static (Result, string) getRandomCombatPodAnchorGuid(BattleInstanceSnapshotAttribute attribute, BattleInstanceRoom battleInstanceRoom) { var result = new Result(); string err_msg = string.Empty; var keys = new List(battleInstanceRoom.m_battle_pod_storage_guid_group.Keys); if (keys.Count == 0) { err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta Keys Count is zero battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } Random random = new Random(); for(int i = 0; i < 10; i++) { // 첫 번째 랜덤: battle_group_id 선택 int random_group_idx = random.Next(keys.Count); int selected_battle_group_id = keys[random_group_idx]; // 선택된 battle_group_id의 List 가져오기 if (false == battleInstanceRoom.m_battle_pod_storage_guid_group.TryGetValue(selected_battle_group_id, out var battle_pos_metas)) { err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } // 두 번째 랜덤: List에서 BattlePosMeta 선택 List pos_metas = battle_pos_metas.ToList(); if (pos_metas.Count == 0) continue; int random_idx = random.Next(pos_metas.Count); var anchor_guid = pos_metas[random_idx]; return (result, anchor_guid); } err_msg = $"not exist anchorGuid {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } public static (Result, string) getRandomRespawnPos(BattleInstanceSnapshotAttribute attribute, BattleInstanceRoom battleInstanceRoom) { List active_respawns = new(); var now = DateTimeHelper.Current; foreach (var respawn_info in attribute.m_combat_pod_mode.m_respawns) { var key = respawn_info.Key; var next_respawn_time = respawn_info.Value; if(next_respawn_time <= now ) active_respawns.Add(key); } var result = new Result(); if (active_respawns.Count == 0) { var err_msg = $"respawn pos not exist now : {now}, respawnInfo : {JsonConvert.SerializeObject(attribute.m_combat_pod_mode.m_respawns)} "; result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg); return (result, string.Empty); } Random random = new Random(); int random_idx = random.Next(active_respawns.Count); var guid = active_respawns[random_idx]; return (result, guid); } public static (Result, string) getRandomPickupPod(int groupId, int idx, BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); string err_msg = string.Empty; Random random = new Random(); //선택된 battle_group_id의 List 가져오기 if (false == battleInstanceRoom.m_battle_pickup_pod_guid_group.TryGetValue(groupId, out var pickup_pod_guid_group)) { err_msg = $"battle_instance_room.m_battle_pickup_pod_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } // 두 번째 랜덤: List에서 BattlePosMeta 선택 //bool is_duplicate = false; HashSet old_allocated_guids = new(); foreach (var infos in attribute.m_combat_pod_mode.m_pickup_pod_generated_info) { var generated_info = infos.Value; var group_id = infos.Key.Item1; var generated_idx = infos.Key.Item2; if (false == generated_info.m_anchor_guid.Equals(string.Empty)) { old_allocated_guids.Add(generated_info.m_anchor_guid); } if (false == generated_info.m_before_anchor_guid.Equals(string.Empty) && generated_idx == idx) { old_allocated_guids.Add(generated_info.m_before_anchor_guid); } } List guids = pickup_pod_guid_group.ToList(); foreach (var old_guid in old_allocated_guids) { guids.Remove(old_guid); } if (guids.Count == 0) { err_msg = $"guids count is zero..so can't assing pickup pod reward... old_allocated_guids : {JsonConvert.SerializeObject(old_allocated_guids)}, " + $"pickup pod info : {JsonConvert.SerializeObject(attribute.m_combat_pod_mode.m_pickup_pod_generated_info)}"; result.setFail(ServerErrorCode.BattleInstancePickupPodRewardAllocateError, err_msg); return (result, string.Empty); } int random_idx = random.Next(guids.Count); var anchor_guid = guids[random_idx]; return (result, anchor_guid); } public static SystemBattleEvent? getBattleRoomStartTimeByEventId(string roomId) { //instanceroom:battle_instance:0:1017006:timestamp:5978:info//룸ID의 형태 var event_id = getBattleEventIdFromRoomId(roomId); if (event_id == 0) { return null; } if (false == BattleInstanceManager.It.getSystemBattleEvent(event_id, out var battleEvent)) { Log.getLogger().error($"system battle event not exist eventId : {event_id}, total events : {JsonConvert.SerializeObject(BattleInstanceManager.It.getSystemBattleEvents())}"); return null; } return battleEvent; } public static int getBattleEventIdFromRoomId(string roomId) { var arr_room_tokens = roomId.Split(":"); var event_tokens = arr_room_tokens[1].Split("_"); if (false == int.TryParse(event_tokens[0], out var eventId)) { Log.getLogger().error($"arr_room_tokens parse error !!!! roomId : {arr_room_tokens}"); return 0; } return eventId; } public static DateTime calculateDestroyedTime(DateTime startTime, Int32 configId, Int32 roundCount) { if (false == MetaData.Instance._BattleFFAConfigMetaTable.TryGetValue(configId, out var meta)) { Log.getLogger().error($"Not Exist _BattleFFAConfigMetaTable configId : {configId}"); return DateTimeHelper.Current.AddSeconds(-10); } if (roundCount < 1) { Log.getLogger().error($"roundCount less than 1 roundCount : {roundCount}"); return DateTimeHelper.Current.AddSeconds(-10); } var round_time = meta.RoundTime; var wait_time = meta.NextRoundWaitTime; var result_time = meta.ResultUIWaitTime; var process_time_sec = (round_time * roundCount) + (wait_time * (roundCount - 1)) + result_time; return startTime.AddSeconds(process_time_sec); } public static DateTime calculateRoomJoinableTime(DateTime startTime, Int32 configId, Int32 roundCount) { if (false == MetaData.Instance._BattleFFAConfigMetaTable.TryGetValue(configId, out var meta)) { Log.getLogger().error($"Not Exist _BattleFFAConfigMetaTable configId : {configId}"); return DateTimeHelper.Current.AddSeconds(-10); } if (roundCount < 1) { Log.getLogger().error($"roundCount less than 1 roundCount : {roundCount}"); return DateTimeHelper.Current.AddSeconds(-10); } var round_time = meta.RoundTime; var wait_time = meta.NextRoundWaitTime; var process_time_sec = (round_time * roundCount) + (wait_time * (roundCount - 1)) - meta.EntranceClosingTime; return startTime.AddSeconds(process_time_sec); } public static IHostMigrator createHostMigrator(BattlePlayMode mode) { switch (mode) { case BattlePlayMode.PodCombat: return HostMigrationFactory.createCommonHostMigrator((int) BattlePlayMode.PodCombat, GameServerApp.getServerLogic()); //return new BattleFFAModeHostMigrator(); default: Log.getLogger($"createHostMigrator Not implements mode : {mode}"); throw new NotImplementedException(); } } }