250501 커밋
This commit is contained in:
@@ -1,18 +1,18 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
using GameServer.Contents.Battle.Tickers;
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
using NeoSmart.AsyncLock;
|
||||
using Newtonsoft.Json;
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
using Constant = System.Reflection.Metadata.Constant;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
@@ -20,191 +20,19 @@ namespace GameServer;
|
||||
public class BattleInstanceManager : Singleton<BattleInstanceManager>
|
||||
{
|
||||
private AsyncLock m_lock_init = new();
|
||||
public AsyncLock m_lock_data_load = new();
|
||||
|
||||
private ConcurrentDictionary<string, BattleInstanceRoom> m_battle_instances = new(); //인스턴스 생성 삭제를 주로 관리 하기 위한 Dictionary ... 아...이거 구조 별론데,....
|
||||
//private ConcurrentDictionary<string, BattleInstanceRoom> m_battle_instances = new(); //인스턴스 생성 삭제를 주로 관리 하기 위한 Dictionary ... 아...이거 구조 별론데,....
|
||||
|
||||
private ConcurrentDictionary<Int32 /*event_id*/, SystemBattleEvent> m_battle_events = new();
|
||||
|
||||
|
||||
public async Task onInit()
|
||||
{
|
||||
//1. 이벤트 관리하는 Task 추가
|
||||
var result = await createBattleEventCheckerTask();
|
||||
}
|
||||
|
||||
public bool hasBattleInstance(string roomId)
|
||||
{
|
||||
return m_battle_instances.ContainsKey(roomId);
|
||||
}
|
||||
|
||||
public BattleInstanceRoom? getBattleInstanceRoom(string roomId)
|
||||
{
|
||||
if (false == m_battle_instances.TryGetValue(roomId, out var room))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return room;
|
||||
|
||||
}
|
||||
|
||||
public ConcurrentDictionary<string, BattleInstanceRoom> getBattleInstanceRooms()
|
||||
{
|
||||
return m_battle_instances;
|
||||
}
|
||||
|
||||
//
|
||||
// public bool isLoadComplete(string roomId)
|
||||
// {
|
||||
// if (false == m_battle_instances.TryGetValue(roomId, out var battleInstanceRoom))
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// return battleInstanceRoom.m_is_load_complete;
|
||||
// }
|
||||
|
||||
public async Task<Result> battleInstanceInit(InstanceRoom instanceRoom, string roomId)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
using (await m_lock_init.LockAsync())
|
||||
{
|
||||
//1. 배틀 인스턴스에 대한 정보 생성
|
||||
Log.getLogger().info($"Battle Instance Create And Init : {roomId}");
|
||||
if (hasBattleInstance(roomId)) return result;
|
||||
|
||||
// instance 정보 추가 등록
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
DateTime start_time = DateTimeHelper.Current;
|
||||
Int32 config_id = 1;
|
||||
Int32 reward_id = 1;
|
||||
Int32 hot_time = 1;
|
||||
Int32 round_count = 8;
|
||||
var system_battle_event = BattleRoomHelper.getBattleRoomStartTimeByEventId(roomId);
|
||||
if (system_battle_event is null)
|
||||
{
|
||||
Log.getLogger().error($"system_battle_event is null!!! : {result.toBasicString()} - instanceRoomId:{roomId}");
|
||||
}
|
||||
else
|
||||
{
|
||||
start_time = system_battle_event.m_start_time;
|
||||
config_id = system_battle_event.m_ffa_config_data_id;
|
||||
reward_id = system_battle_event.m_ffa_reward_group_id;
|
||||
hot_time = system_battle_event.m_ffa_hot_time;
|
||||
round_count = system_battle_event.m_round_count;
|
||||
}
|
||||
|
||||
|
||||
result = await instance_room_storage.setInstanceRoomExtraInfo(roomId, EPlaceType.BattleRoom, start_time);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Failed to BattleRoom setInstanceRoomExtraInfo() !!! : {result.toBasicString()} - instanceRoomId:{roomId}");
|
||||
return result;
|
||||
}
|
||||
|
||||
BattleInstanceRoom battle_instance_room = new BattleInstanceRoom(instanceRoom, start_time, config_id, reward_id, hot_time, round_count);
|
||||
|
||||
if (false == m_battle_instances.TryAdd(roomId, battle_instance_room))
|
||||
{
|
||||
//이미 존재하는 경우는 onInit 절차를 거쳤다고 생각하고, init 처리 안해주고 리턴
|
||||
err_msg = $"Battle Instance Room Already exist room_id : {roomId}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoAlreadyExist, err_msg);
|
||||
Log.getLogger().warn(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//2. 초기화
|
||||
result = await battle_instance_room.init();
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().warn(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Log.getLogger().info($"battleInstanceInit done roomId : {roomId}");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public Result addOrUpatePlayer(string roomId, Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
if (false == m_battle_instances.TryGetValue(roomId, out var battle_instance_room))
|
||||
{
|
||||
err_msg = $"m_battle_instances not exist battleRoomInstance, roomId : {roomId}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
//유저 정보 추가 해줘야 한다.
|
||||
result = battle_instance_room.AddOrUpdatePlayer(player);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<Result> createBattleEventCheckerTask()
|
||||
{
|
||||
|
||||
var result = new Result();
|
||||
|
||||
var battle_entity_ticker_initializers = new Initializers();
|
||||
|
||||
//채널 인던 다 필요한가?
|
||||
//이벤트 인스턴스 관련 생성 삭제에 대한 관리 Ticker
|
||||
|
||||
//battle_entity_ticker_initializers.appendInitializer(new BattleEventCheckTicker(1000, null));
|
||||
//battle_entity_ticker_initializers.appendInitializer(new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null));
|
||||
|
||||
result = await battle_entity_ticker_initializers.init("BattleEntityTickers");
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Failed to init() !!! : {result.toBasicString()}");
|
||||
return result;
|
||||
}
|
||||
|
||||
var battle_event_check_ticker = new BattleEventCheckTicker(BattleConstant.BATTLE_EVENT_CHECK_INTERVAL, null);
|
||||
await battle_event_check_ticker.onInit();
|
||||
await createTask(battle_event_check_ticker);
|
||||
var battle_event_notify_ticker = new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null);
|
||||
await battle_event_check_ticker.onInit();
|
||||
await createTask(battle_event_notify_ticker);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<Result> createTask(EntityTicker ticker)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
await Task.CompletedTask;
|
||||
try
|
||||
{
|
||||
|
||||
new PeriodicTaskTimer( ticker.getTypeName() , ticker.getOnTickIntervalMilliseconds(), ticker.getCancelToken(), ticker.onTaskTick);
|
||||
Log.getLogger().debug("createTask done");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e}";
|
||||
result.setFail(ServerErrorCode.TryCatchException, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task tryLeaveBattelInstance(Player player, string instanceRoomId)
|
||||
{
|
||||
if (false == BattleRoomHelper.checkBattleActive()) return;
|
||||
|
||||
Log.getLogger().debug($"tryLeaveBattelInstance start instanceRoomId : {instanceRoomId}");
|
||||
|
||||
var location_attribute = player.getEntityAttribute<LocationAttribute>();
|
||||
@@ -214,87 +42,74 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
|
||||
if (instanceRoomId == string.Empty)
|
||||
{
|
||||
Log.getLogger().warn($"tryLeaveBattelInstance IntanceRoomId is Empty");
|
||||
removeBattlePlayer(player.getUserGuid());
|
||||
return;
|
||||
}
|
||||
if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom))
|
||||
|
||||
if (false == GameModeManager.It.tryGetGameMode(instanceRoomId, out var gameMode))
|
||||
{
|
||||
removeBattlePlayer(player.getUserGuid());
|
||||
return;
|
||||
}
|
||||
|
||||
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}");
|
||||
|
||||
await ffa.removePodCombat(player);
|
||||
|
||||
await battleInstanceRoom.removePodCombat(player);
|
||||
|
||||
var host_user_guid = battleInstanceRoom.m_host_migrator.getHostUserGuid();
|
||||
var host_user_guid = ffa.m_host_migrator.getHostUserGuid();
|
||||
if (player.getUserGuid().Equals(host_user_guid))
|
||||
{
|
||||
using (var releaser = await battleInstanceRoom.getAsyncLock())
|
||||
using (var releaser = await ffa.getAsyncLock())
|
||||
{
|
||||
battleInstanceRoom.m_host_migrator.removeHost();
|
||||
ffa.m_host_migrator.removeHost();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//여기서 instanceroom 이 is Destroy 면 DestroyBattleRoom 호출 해줄것
|
||||
if (battleInstanceRoom.m_instance_room.isDestroy)
|
||||
if (ffa.getInstanceRoom().isDestroy)
|
||||
{
|
||||
m_battle_instances.TryRemove(instanceRoomId, out var _);
|
||||
await battleInstanceRoom.destroyBattleRoom();
|
||||
//kihoon todo : 이부분 수정 필요
|
||||
//m_battle_instances.TryRemove(instanceRoomId, out var _);
|
||||
//await battleInstanceRoom.destroyBattleRoom();
|
||||
Log.getLogger().debug($"tryLeaveBattelInstance destroy battle room instanceRoomId : {instanceRoomId}");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task tryDestroyBattleRoom(string instanceRoomId)
|
||||
{
|
||||
if (false == BattleRoomHelper.checkBattleActive()) return;
|
||||
|
||||
if (false == instanceRoomId.Contains(BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID)) return;
|
||||
|
||||
if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom))
|
||||
{
|
||||
Log.getLogger().error($"instanceRoomId : {instanceRoomId} is not exist instnaces");
|
||||
return;
|
||||
}
|
||||
|
||||
var is_destroy = battleInstanceRoom.m_instance_room.isDestroy;
|
||||
if (is_destroy)
|
||||
{
|
||||
await battleInstanceRoom.destroyBattleRoom();
|
||||
m_battle_instances.TryRemove(instanceRoomId, out _);
|
||||
}
|
||||
}
|
||||
// public async Task tryDestroyBattleRoom(string instanceRoomId)
|
||||
// {
|
||||
// await Task.CompletedTask;
|
||||
// if (false == instanceRoomId.Contains(BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID)) return;
|
||||
//
|
||||
// // if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom))
|
||||
// // {
|
||||
// // Log.getLogger().error($"instanceRoomId : {instanceRoomId} is not exist instnaces");
|
||||
// // return;
|
||||
// // }
|
||||
//
|
||||
// // var is_destroy = battleInstanceRoom.m_instance_room.isDestroy;
|
||||
// // if (is_destroy)
|
||||
// // {
|
||||
// // await battleInstanceRoom.destroyBattleRoom();
|
||||
// // //m_battle_instances.TryRemove(instanceRoomId, out _);
|
||||
// // }
|
||||
// }
|
||||
|
||||
|
||||
private void removeBattlePlayer(string userGuid)
|
||||
{
|
||||
foreach (var battle_instance_room in m_battle_instances.Values)
|
||||
{
|
||||
battle_instance_room.removeBattlePlayerIfExist(userGuid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public async Task<bool> LeaveBattleRoom(Player player, string instanceRoomId, bool disconnected = false)
|
||||
{
|
||||
|
||||
if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleRoom))
|
||||
{
|
||||
Log.getLogger().info($"LeaveBattleRoom m_battle_instances.TryGetValue false instanceRoomId : {instanceRoomId}");
|
||||
return false;
|
||||
}
|
||||
|
||||
await battleRoom.LeaveBattleRoom(player, instanceRoomId, disconnected);
|
||||
(var result, var leeave_handler) = GameModeHelper.getGameModeLeaveHandler(player, instanceRoomId);
|
||||
if (result.isFail() || leeave_handler is null) return false;
|
||||
|
||||
// if (battleRoom.m_instance_room.isDestroy)
|
||||
// {
|
||||
// InstanceRoomManager.Instance.DestroyRoom(instanceRoomId);
|
||||
// }
|
||||
await leeave_handler.gameModeLeave();
|
||||
Log.getLogger().debug($"leave battle room player : {player.toBasicString()}, instanceRoomId : {instanceRoomId}");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<Result> sendNtfAboutBattleInstance(BattleInstanceRoom battieInstanceRoom, Player player)
|
||||
public async Task<Result> sendNtfAboutBattleInstance(GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battieInstanceRoom, Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
@@ -313,7 +128,7 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
|
||||
}
|
||||
|
||||
|
||||
private void sendNtfBattleObjectsState(BattleInstanceRoom battleInstanceRoom, Player player)
|
||||
private void sendNtfBattleObjectsState(GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battleInstanceRoom, Player player)
|
||||
{
|
||||
List<BattleObjectInfo> infos = new();
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
@@ -496,6 +311,55 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<Result> createBattleEventCheckerTask()
|
||||
{
|
||||
|
||||
var result = new Result();
|
||||
|
||||
public BattleInstanceManager Self => this;
|
||||
var battle_entity_ticker_initializers = new Initializers();
|
||||
|
||||
//채널 인던 다 필요한가?
|
||||
//이벤트 인스턴스 관련 생성 삭제에 대한 관리 Ticker
|
||||
|
||||
//battle_entity_ticker_initializers.appendInitializer(new BattleEventCheckTicker(1000, null));
|
||||
//battle_entity_ticker_initializers.appendInitializer(new BattleEventNotifyTicker(Constant.EVENT_UPDATE_INTERVAL_MMIN, null));
|
||||
|
||||
result = await battle_entity_ticker_initializers.init("BattleEntityTickers");
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Failed to init() !!! : {result.toBasicString()}");
|
||||
return result;
|
||||
}
|
||||
|
||||
var battle_event_check_ticker = new BattleEventCheckTicker(BattleConstant.BATTLE_EVENT_CHECK_INTERVAL, null);
|
||||
await battle_event_check_ticker.onInit();
|
||||
await createTask(battle_event_check_ticker);
|
||||
var battle_event_notify_ticker = new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null);
|
||||
await battle_event_check_ticker.onInit();
|
||||
await createTask(battle_event_notify_ticker);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<Result> createTask(EntityTicker ticker)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
await Task.CompletedTask;
|
||||
try
|
||||
{
|
||||
|
||||
new PeriodicTaskTimer( ticker.getTypeName() , ticker.getOnTickIntervalMilliseconds(), ticker.getCancelToken(), ticker.onTaskTick);
|
||||
Log.getLogger().debug("createTask done");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e}";
|
||||
result.setFail(ServerErrorCode.TryCatchException, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user