264 lines
9.9 KiB
C#
264 lines
9.9 KiB
C#
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<int>(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<BattlePosMeta> 가져오기
|
|
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>에서 BattlePosMeta 선택
|
|
List<string> 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<string> 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<BattlePosMeta> 가져오기
|
|
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>에서 BattlePosMeta 선택
|
|
//bool is_duplicate = false;
|
|
HashSet<string> 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<string> 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();
|
|
|
|
}
|
|
}
|
|
}
|