초기커밋
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleEvent : EntityBase, IWithLogActor
|
||||
{
|
||||
public BattleEvent(EntityType entityType) : base(EntityType.BattleEvent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public ILogActor toLogActor()
|
||||
{
|
||||
//var server_logic = ServerLogicApp.getServerLogicApp();
|
||||
var log_info = new BattleEventLog(0);
|
||||
|
||||
return log_info;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
using Nettention.Proud;
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using SESSION_ID = System.Int32;
|
||||
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class BattleFFAModeHostMigrator : IHostMigrator
|
||||
{
|
||||
private string m_host_user_guid = string.Empty;
|
||||
|
||||
public Result defineHost(HostID p2pGroupId, SuperPeerSelectionPolicy policy, HostID[] excludes)
|
||||
{
|
||||
var pround_net_listener = GameServerApp.getServerLogic().getProudNetListener();
|
||||
var net_server = pround_net_listener.getNetServer();
|
||||
|
||||
var host_id = net_server.GetMostSuitableSuperPeerInGroup(p2pGroupId, policy, excludes);
|
||||
//net_server.GetClientInfo(host_id);
|
||||
|
||||
string err_msg = string.Empty;
|
||||
var result = new Result();
|
||||
|
||||
if (host_id == 0)
|
||||
{
|
||||
err_msg = $"there is not suitable super peer !!!! host_id : {host_id}";
|
||||
result.setFail(ServerErrorCode.NotFoundUser, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
var session = pround_net_listener.onLookupEntityWithSession((SESSION_ID)host_id);
|
||||
if (session is null)
|
||||
{
|
||||
err_msg = $"session is null!!!! host_id : {host_id}";
|
||||
result.setFail(ServerErrorCode.NotFoundUser, err_msg);
|
||||
return result;
|
||||
}
|
||||
var player = session as Player;
|
||||
if (player is null)
|
||||
{
|
||||
err_msg = $"player is null!!!! host_id : {host_id}";
|
||||
result.setFail(ServerErrorCode.NotFoundUser, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
m_host_user_guid = player.getUserGuid();
|
||||
return result;
|
||||
}
|
||||
|
||||
public Result modifyHost(string userGuid)
|
||||
{
|
||||
m_host_user_guid = userGuid;
|
||||
return new Result();
|
||||
}
|
||||
|
||||
public Result removeHost()
|
||||
{
|
||||
m_host_user_guid = string.Empty;
|
||||
return new Result();
|
||||
}
|
||||
|
||||
public string getHostUserGuid()
|
||||
{
|
||||
return m_host_user_guid;
|
||||
}
|
||||
|
||||
public (Result, bool) migrateCheck(bool ignoreInterval)
|
||||
{
|
||||
return (new Result(), false);
|
||||
}
|
||||
|
||||
public void setGroupHostId(HostID groupId)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class BattleInstanceInitHandler : GameModeInitHandlerBase
|
||||
{
|
||||
public BattleInstanceInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.BattleRoom)
|
||||
{
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceInitValidate()
|
||||
{
|
||||
var result = BattleRoomHelper.checkBattleActive(m_place_type);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceInit()
|
||||
{
|
||||
var result = BattleInstanceManager.It.battleInstanceInit(m_instance_room, m_instance_room.getMap().m_room_id).Result; //kihoon todo :이거 리팩토링 대상
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class BattleInstanceJoinHandler : GameModeJoinHandlerBase
|
||||
{
|
||||
public BattleInstanceJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.BattleRoom)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceJoinValidate(EPlaceType placeType)
|
||||
{
|
||||
var result = BattleRoomHelper.checkBattleActive(m_place_type);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceJoin(Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
//instanceroom 정보는 남아있는데 battleinstance만 없어지는 케이스가 있어서 예외 처리를 위해 넣어놓음
|
||||
var room_id = m_instance_room.getMap().m_room_id;
|
||||
|
||||
var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); //리팩토링 대상
|
||||
if (battle_instance_room is null)
|
||||
{
|
||||
Log.getLogger().error($"Battle Room Instance is null.. so init start roomId : {room_id}");
|
||||
|
||||
result = Task.Run(() => BattleInstanceManager.It.battleInstanceInit(m_instance_room, room_id)).GetAwaiter().GetResult();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"BattleIntanceJoin init error, _roomId : {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase
|
||||
{
|
||||
private readonly BattleInstanceRoom m_battle_instance_room;
|
||||
public BattleInstanceJoinSuccessHandler(Player player, InstanceRoom instanceRoom)
|
||||
: base(player, EPlaceType.BattleRoom)
|
||||
{
|
||||
var room_id = instanceRoom.getMap().m_room_id;
|
||||
var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"m_battle_instance_room is null !!!");
|
||||
|
||||
m_battle_instance_room = battle_instance_room;
|
||||
}
|
||||
|
||||
public override Result joinSuccessValidate()
|
||||
{
|
||||
var result = BattleRoomHelper.checkBattleActive(m_place_type);
|
||||
if (result.isFail()) return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task<Result> joinSuccessConfirmation()
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id;
|
||||
var battle_instance_attribute = m_battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!");
|
||||
|
||||
(result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(battle_instance_attribute, m_battle_instance_room);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (false == m_battle_instance_room.m_respawn_pos_anchors_meta.Contains(pos_meta_guid))
|
||||
{
|
||||
err_msg = $"respawn pos meta not exist idx : {pos_meta_guid}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
using (var releaser = await m_battle_instance_room.getAsyncLock())
|
||||
{
|
||||
var now = DateTimeHelper.Current;
|
||||
var next_respawn_time = now.AddSeconds(m_battle_instance_room.m_ffa_config_meta.PlayerRespawnTime);
|
||||
|
||||
battle_instance_attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time);
|
||||
|
||||
var location_action = m_player.getEntityAction<LocationAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {m_player.toBasicString()}");
|
||||
|
||||
|
||||
var currenct_pos = location_action.getCurrentPos();
|
||||
if (false == m_battle_instance_room.m_instance_room.getMap().getAnchors().TryGetValue(pos_meta_guid, out var anchorInfo))
|
||||
{
|
||||
err_msg = $"anchorInfo not exist idx : {pos_meta_guid}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
currenct_pos = anchorInfo.AnchorPos.Clone();
|
||||
currenct_pos.Z += 100;
|
||||
location_action.tryUpdateCurrentPos(currenct_pos);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task<Result> joinSuccessNotify()
|
||||
{
|
||||
var result = new Result();
|
||||
m_player.send_S2C_NTF_SET_LOCATION();
|
||||
result = await BattleInstanceManager.It.sendNtfAboutBattleInstance(m_battle_instance_room, m_player);
|
||||
if (result.isFail()) return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public override void joinSuccessWriteLog()
|
||||
{
|
||||
var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id;
|
||||
var user_guid = m_player.getUserGuid();
|
||||
var user_nickname = m_player.getUserNickname();
|
||||
|
||||
var battle_instance_attribute = m_battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!");
|
||||
|
||||
var currenct_round = battle_instance_attribute.m_combat_pod_mode.m_current_round;
|
||||
|
||||
var log_action = new LogActionEx(LogActionType.BattleInstanceJoin);
|
||||
var invoker = new BattleRoomJoinBusinessLog(user_guid, user_nickname, room_id, currenct_round);
|
||||
BusinessLogger.collectLogs(log_action, m_player, new List<ILogInvoker>(){invoker});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,501 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
|
||||
using NeoSmart.AsyncLock;
|
||||
using Newtonsoft.Json;
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
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<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>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"location attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
//var instanceRoomId = location_attribute.CurrentIndunLocation.InstanceRoomId;
|
||||
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))
|
||||
{
|
||||
removeBattlePlayer(player.getUserGuid());
|
||||
return;
|
||||
}
|
||||
|
||||
await battleInstanceRoom.removePodCombat(player);
|
||||
|
||||
var host_user_guid = battleInstanceRoom.m_host_migrator.getHostUserGuid();
|
||||
if (player.getUserGuid().Equals(host_user_guid))
|
||||
{
|
||||
using (var releaser = await battleInstanceRoom.getAsyncLock())
|
||||
{
|
||||
battleInstanceRoom.m_host_migrator.removeHost();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//여기서 instanceroom 이 is Destroy 면 DestroyBattleRoom 호출 해줄것
|
||||
if (battleInstanceRoom.m_instance_room.isDestroy)
|
||||
{
|
||||
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 _);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
||||
// if (battleRoom.m_instance_room.isDestroy)
|
||||
// {
|
||||
// InstanceRoomManager.Instance.DestroyRoom(instanceRoomId);
|
||||
// }
|
||||
Log.getLogger().debug($"leave battle room player : {player.toBasicString()}, instanceRoomId : {instanceRoomId}");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<Result> sendNtfAboutBattleInstance(BattleInstanceRoom battieInstanceRoom, Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_BATTLE_INSTANCE_STATE(battieInstanceRoom, player);
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_POD_COMBAT_STATE(battieInstanceRoom, player);
|
||||
sendNtfBattleObjectsState(battieInstanceRoom, player);
|
||||
|
||||
var host_user_guid = battieInstanceRoom.m_host_migrator.getHostUserGuid();
|
||||
if (!host_user_guid.Equals(string.Empty))
|
||||
{
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_P2P_HOST_UPDATE(player, host_user_guid);
|
||||
}
|
||||
|
||||
await Task.CompletedTask;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void sendNtfBattleObjectsState(BattleInstanceRoom battleInstanceRoom, Player player)
|
||||
{
|
||||
List<BattleObjectInfo> infos = new();
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var now = DateTimeHelper.Current;
|
||||
|
||||
foreach (var weapon in attribute.m_combat_pod_mode.m_weapons.Values)
|
||||
{
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = weapon.m_anchor_guid;
|
||||
info.IsActive = weapon.m_active_time <= now ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
}
|
||||
|
||||
foreach (var buff in attribute.m_combat_pod_mode.m_buffs.Values)
|
||||
{
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = buff.m_anchor_guid;
|
||||
info.IsActive = buff.m_active_time <= now ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
}
|
||||
|
||||
foreach (BattleObjectPodStorage storage in attribute.m_combat_pod_mode.m_pod_storages.Values)
|
||||
{
|
||||
//storage.m_is_active = true;
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = storage.m_anchor_guid;
|
||||
info.IsActive = storage.m_is_active ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
}
|
||||
|
||||
foreach (BattleObjectPickupPod pickup in attribute.m_combat_pod_mode.m_pickup_pods.Values)
|
||||
{
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = pickup.m_anchor_guid;
|
||||
info.IsActive = pickup.m_is_active ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
Log.getLogger().info($"pickup pod info anchor_guid : {info.AnchorGuid}, is Active : {info.IsActive}");
|
||||
}
|
||||
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(infos, player);
|
||||
}
|
||||
|
||||
public bool isBattleInstance(Player player)
|
||||
{
|
||||
var location_action = player.getEntityAction<LocationAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var current_indun_location = location_action.getCurrentLocation() as IndunLocation;
|
||||
NullReferenceCheckHelper.throwIfNull(current_indun_location, () => $"current_indun_location is null !!! - {player.toBasicString()}");
|
||||
|
||||
var instance_room_Id = current_indun_location.InstanceRoomId;
|
||||
if (instance_room_Id == string.Empty) return false;
|
||||
|
||||
Log.getLogger().debug($"is Battle Instance check : instance room id : {instance_room_Id}");
|
||||
if (instance_room_Id.Contains("battle_instance"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
//result.setFail(ServerErrorCode.BattleInstnaceNotUsedPacket, "");
|
||||
|
||||
}
|
||||
|
||||
|
||||
public List<BattleEventInfo> getAllProtoBattleEvents()
|
||||
{
|
||||
List<BattleEventInfo> infos = new();
|
||||
foreach(var system_battle_event in m_battle_events.Values.ToList())
|
||||
{
|
||||
BattleEventInfo battle_event_info = new();
|
||||
|
||||
battle_event_info.EventId = system_battle_event.m_event_id;
|
||||
battle_event_info.InstanceId = system_battle_event.m_instance_id;
|
||||
battle_event_info.StartTime = Timestamp.FromDateTime(system_battle_event.m_start_time);
|
||||
battle_event_info.ConfigDataId = system_battle_event.m_ffa_config_data_id;
|
||||
battle_event_info.RewardGroupId = system_battle_event.m_ffa_reward_group_id;
|
||||
battle_event_info.HotTime = system_battle_event.m_ffa_hot_time;
|
||||
battle_event_info.RoundCount = system_battle_event.m_round_count;
|
||||
infos.Add(battle_event_info);
|
||||
}
|
||||
|
||||
return infos;
|
||||
}
|
||||
|
||||
public BattleEventInfo makeProtoBattleEvent(SystemBattleEvent battleEvent)
|
||||
{
|
||||
BattleEventInfo battle_event_info = new();
|
||||
|
||||
battle_event_info.EventId = battleEvent.m_event_id;
|
||||
battle_event_info.InstanceId = battleEvent.m_instance_id;
|
||||
battle_event_info.StartTime = Timestamp.FromDateTime(battleEvent.m_start_time);
|
||||
battle_event_info.ConfigDataId = battleEvent.m_ffa_config_data_id;
|
||||
battle_event_info.RewardGroupId = battleEvent.m_ffa_reward_group_id;
|
||||
battle_event_info.HotTime = battleEvent.m_ffa_hot_time;
|
||||
battle_event_info.RoundCount = battleEvent.m_round_count;
|
||||
|
||||
return battle_event_info;
|
||||
}
|
||||
|
||||
// public async Task setBattleEventAttribs(List<BattleEventAttrib> battleEventAttribs)
|
||||
// {
|
||||
// using (await m_lock_data_load.LockAsync())
|
||||
// {
|
||||
// m_battle_event_attribs.Clear();
|
||||
// m_battle_event_attribs = battleEventAttribs;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
// public async Task<List<BattleEventAttrib>> copyBattleEventAttribs()
|
||||
// {
|
||||
// List<BattleEventAttrib> attribs = new();
|
||||
// using (await m_lock_data_load.LockAsync())
|
||||
// {
|
||||
// foreach (var attrib in m_battle_event_attribs)
|
||||
// {
|
||||
// attribs.Add(attrib.clone());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return attribs;
|
||||
// }
|
||||
|
||||
|
||||
public ConcurrentDictionary<Int32 /*event_id*/, SystemBattleEvent> getSystemBattleEvents()
|
||||
{
|
||||
return m_battle_events;
|
||||
}
|
||||
|
||||
public bool getSystemBattleEvent(Int32 eventId, [MaybeNullWhen(false)]out SystemBattleEvent battleEvent)
|
||||
{
|
||||
if (false == m_battle_events.TryGetValue(eventId, out battleEvent))
|
||||
{
|
||||
Log.getLogger($"Not exsist Battle event !!! eventId : {eventId}");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void removeSystemBattleEvents(List<Int32> events)
|
||||
{
|
||||
foreach (var event_id in events)
|
||||
{
|
||||
if (false == m_battle_events.TryRemove(event_id, out var ev))
|
||||
{
|
||||
Log.getLogger().warn($"remove battle event fali event_id : {event_id}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool existSystemBattleEvent(Int32 eventId)
|
||||
{
|
||||
return m_battle_events.ContainsKey(eventId);
|
||||
}
|
||||
|
||||
public void logSystemBattleEvents()
|
||||
{
|
||||
Log.getLogger().info($"updated system battle events : {JsonConvert.SerializeObject(m_battle_events)}");
|
||||
}
|
||||
|
||||
public void setSystemBattleEvents(ConcurrentDictionary<Int32 /*event_id*/, SystemBattleEvent> newEvents)
|
||||
{
|
||||
m_battle_events = newEvents;
|
||||
}
|
||||
|
||||
public bool addNewSystemBattleEvent(SystemBattleEvent ev, bool needErrroLog)
|
||||
{
|
||||
if (false == m_battle_events.TryAdd(ev.m_event_id, ev))
|
||||
{
|
||||
if (needErrroLog)
|
||||
{
|
||||
Log.getLogger().error($"System battle Event try Add Fail, eventId : {ev.m_event_id}, events : {JsonConvert.SerializeObject(m_battle_events)}");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public BattleInstanceManager Self => this;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleInstanceRespawn
|
||||
{
|
||||
public int m_spawn_idx { get; set; } = 0;
|
||||
public DateTime m_next_usable_time = DateTimeHelper.Current;
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public partial class InstanceRoom
|
||||
{
|
||||
public async Task<bool> battleInstanceInit()
|
||||
{
|
||||
var result = await BattleInstanceManager.It.battleInstanceInit(this, _roomId);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<Result> sendGameModeInstanceJoinSuccess(Player player)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
//var game_mod_handler = GameModeManager.It.getGameModeJoinHandler(_placeType);
|
||||
return new();
|
||||
}
|
||||
|
||||
|
||||
public bool tryGetInstanceMember(string userGuid, [MaybeNullWhen(false)] out Player out_player)
|
||||
{
|
||||
out_player = null;
|
||||
if (false == m_players.TryGetValue(userGuid, out var player))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
out_player = player;
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public List<BattleRoundingExistUsers> tryGetInstanceExistUserForLog()
|
||||
{
|
||||
List<BattleRoundingExistUsers> users = new();
|
||||
foreach (var player in m_players.Values)
|
||||
{
|
||||
BattleRoundingExistUsers user = new(player.getUserGuid(), player.getUserNickname());
|
||||
users.Add(user);
|
||||
}
|
||||
|
||||
return users;
|
||||
}
|
||||
|
||||
public async Task LeaveBattleInstanceRoom(Player player, bool disconnected)
|
||||
{
|
||||
var user_guid = player.getUserGuid();
|
||||
|
||||
Log.getLogger().info($"BattleInstanceRoom.Leave() Start !!! - userGuid:{user_guid}, instanceRoomId:{_roomId}, sessionCount:{SessionCount}, addConnectedUser:{getMap().getCurrCountAsAddConnectedUser()}");
|
||||
|
||||
if (m_players.TryRemove(player.getUserGuid(), out _))
|
||||
{
|
||||
await BattleInstanceRoomHandler.leaveBattleInstanceRoom(user_guid, _roomId);
|
||||
}
|
||||
|
||||
var location_attribute = player.getEntityAttribute<LocationAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"LocationAttribute is null !!! - player:{player.toBasicString()}");
|
||||
location_attribute.CurrentIndunLocation.clear();
|
||||
|
||||
var game_zone_action = player.getEntityAction<GameZoneAction>();
|
||||
await game_zone_action.tryLeaveGameZone();
|
||||
|
||||
if (SessionCount + getMap().getCurrCountAsAddConnectedUser() == 0)
|
||||
{
|
||||
if (!_isPartyInstance || _concertEnd)
|
||||
{
|
||||
await destroyRoom();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
ClientToGame clientToGame = new ClientToGame();
|
||||
clientToGame.Message = new ClientToGameMessage();
|
||||
clientToGame.Message.LeaveInstanceRoomMember = new ClientToGameMessage.Types.LeaveInstanceRoomMember();
|
||||
clientToGame.Message.LeaveInstanceRoomMember.MemberGuid = player.getUserGuid();
|
||||
|
||||
Broadcast(clientToGame);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Log.getLogger().info($"InstanceRoom.Leave() Finish !!! - userGuid:{user_guid}, instanceRoomId:{_roomId}, sessionCount:{SessionCount}, addConnectedUser:{getMap().getCurrCountAsAddConnectedUser()}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
using Newtonsoft.Json;
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleInstanceRoomHandler
|
||||
{
|
||||
private string m_user_guid = string.Empty;
|
||||
private InstanceMetaData m_instance_meta_data = new(new InstanceMetaDataMutable());
|
||||
public BattleInstanceRoomHandler(string userGuid, InstanceMetaData instanceMetaData)
|
||||
{
|
||||
m_user_guid = userGuid;
|
||||
m_instance_meta_data = instanceMetaData;
|
||||
}
|
||||
|
||||
public async Task<(Result, string)> joinBattleInstance(string userGuid, Int32 eventId, Timestamp eventStartTS, Int32 instanceMetaId) //BattleInstanceType battleInstanceType
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
var instance_room_id = string.Empty;
|
||||
|
||||
(result, instance_room_id) = await joinBattleInstanceRoom(userGuid, eventId, eventStartTS);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to joinInstanceRoom() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
return (result, instance_room_id);
|
||||
}
|
||||
|
||||
public async Task<(Result, string)> joinBattleInstanceRoom(string userGuid, Int32 eventId, Timestamp eventStartTS)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
long timestampInSeconds = eventStartTS.Seconds;
|
||||
|
||||
//long start_seqs_num = timestampInSeconds / 100; //방의 시퀀스번호를 정하는 시작 번호
|
||||
int start_seqs_num = 1; //방의 시퀀스번호를 정하는 시작 번호
|
||||
|
||||
//인스턴스 이름 base로 들어가는 문자열 생성
|
||||
var instance_room_id_base = makeBattleInstanceRoomIdBase(eventId, timestampInSeconds, m_instance_meta_data.Id);
|
||||
var instance_room_id = string.Empty;
|
||||
|
||||
//1.전체 roomList,와 스코어를 먼저 가져온다.
|
||||
var battle_instance_room_storage = new BattleInstanceRoomStorage();
|
||||
battle_instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
(result, var total_room_list) = await battle_instance_room_storage.getBattleInstanceTotalRoomListWithScore(instance_room_id_base, m_instance_meta_data.LimitCount);
|
||||
if (result.isFail() || total_room_list == null)
|
||||
{
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
var ordered_available_room = await battle_instance_room_storage.getBattleInstanceRoomList(instance_room_id_base, m_instance_meta_data.LimitCount);
|
||||
var total_room_length = total_room_list.Length;
|
||||
|
||||
Log.getLogger().info($"join battle instance.. room capacity state.. " +
|
||||
$"totalroomlist : {JsonConvert.SerializeObject(total_room_list)}, available room : {JsonConvert.SerializeObject(ordered_available_room)}");
|
||||
|
||||
//total_room_list가 없고 비어있는 방도 없으면, 신규 생성
|
||||
if(total_room_length == 0 && ordered_available_room.Count == 0)
|
||||
{
|
||||
(result, instance_room_id) = await createAndJoinBattleInstance(instance_room_id_base, start_seqs_num, userGuid);
|
||||
if (result.isFail()) return (result, instance_room_id);
|
||||
Log.getLogger().info($"join battle instance..make new first room instance_room_id : {instance_room_id}");
|
||||
}
|
||||
//기존 방은 있으나 지금 입장 가능한 방이 없는경우 모든 방이 풀방이므로 비어있는 시퀀스 찾아서 방생성
|
||||
else if (total_room_length > 0 && ordered_available_room.Count == 0)
|
||||
{
|
||||
//total_room_list 에서 생성되어 있는 roomSeq를 확인한다.
|
||||
HashSet<Int32> using_room_seqs = new();
|
||||
|
||||
foreach (var room_entry in total_room_list)
|
||||
{
|
||||
var room_id = room_entry.Element.ToString();
|
||||
|
||||
var room_element = room_id.Split(":");
|
||||
if (false == int.TryParse(room_element[^1], out var seq))
|
||||
{
|
||||
err_msg = $"Failed to try parse room_element !!! room_id : {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceSeqParseError, err_msg);
|
||||
return (result, string.Empty);
|
||||
}
|
||||
using_room_seqs.Add(seq);
|
||||
}
|
||||
|
||||
var not_using_seq = findNotUsingSeqNum(using_room_seqs, start_seqs_num);
|
||||
|
||||
(result, instance_room_id) = await createAndJoinBattleInstance(instance_room_id_base, not_using_seq, userGuid);
|
||||
if (result.isFail()) return (result, instance_room_id);
|
||||
|
||||
Log.getLogger().info($"join battle instance..make new another room instance_room_id : {instance_room_id}");
|
||||
}
|
||||
//비어 있는 방이 있는 경우
|
||||
else if(ordered_available_room.Count > 0)
|
||||
{
|
||||
//빈방이 있는 경우 로직 처리
|
||||
foreach (var room_id in ordered_available_room)
|
||||
{
|
||||
var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id);
|
||||
if (instance_room_Info == null)
|
||||
{
|
||||
await InstanceRoomHandler.deleteInstanceRoom(room_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
result = await joinBattleInstanceRoomFromRedis(userGuid, room_id, instance_room_id_base);
|
||||
if (result.isSuccess())
|
||||
{
|
||||
instance_room_id = room_id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Log.getLogger().info($"join battle instance..join exists room instance_room_id : {instance_room_id}");
|
||||
}
|
||||
|
||||
if (instance_room_id == string.Empty)
|
||||
{
|
||||
var new_seq = total_room_length + 1;
|
||||
//위 로직을 전부 태웠는데도 방이 안만들어졌으면 전체 방수 + 1해서 만든다...
|
||||
Log.getLogger().warn($"instance room id is still empty... so make new instance instance_room_id_base : {instance_room_id_base}, new_seq : {new_seq}");
|
||||
(result, instance_room_id) = await createAndJoinBattleInstance(instance_room_id_base, new_seq, userGuid);
|
||||
}
|
||||
|
||||
return (result, instance_room_id);
|
||||
}
|
||||
|
||||
private async Task<(Result, string)> createAndJoinBattleInstance(string instanceRoomIdBase, int seq, string userGuid)
|
||||
{
|
||||
string err_msg = string.Empty;
|
||||
(var result, var instance_room_id) = await createBattleInstanceRoomFromRedis(instanceRoomIdBase, m_instance_meta_data.Id, seq);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
result = await joinBattleInstanceRoomFromRedis(userGuid, instance_room_id, instanceRoomIdBase);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
Log.getLogger().info($"create and join battle instance instanceRoomIdBase : {instanceRoomIdBase}, seq : {seq}, userGuid : {userGuid}");
|
||||
|
||||
return (result, instance_room_id);
|
||||
|
||||
}
|
||||
|
||||
private int findNotUsingSeqNum(HashSet<Int32> usingRoomSeqs, int startSeqNum)
|
||||
{
|
||||
var loop_count = usingRoomSeqs.Count + 1;
|
||||
|
||||
var start_seq = startSeqNum;
|
||||
|
||||
for (int i = 1; i <= loop_count; i++)
|
||||
{
|
||||
if (usingRoomSeqs.Contains(start_seq))
|
||||
{
|
||||
start_seq++;
|
||||
continue;
|
||||
}
|
||||
|
||||
return start_seq;
|
||||
}
|
||||
|
||||
return start_seq;
|
||||
}
|
||||
|
||||
public async Task<(Result, string)> createBattleInstanceRoomFromRedis(string instanceRoomIdBase, int instanceMetaId, int startSeqsNum)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
(result, var instance_server_info) = await InstanceRoomHandler.getBestInstanceServerForCreateInstance(m_instance_meta_data.LimitCount);
|
||||
if (result.isFail() || instance_server_info == null)
|
||||
{
|
||||
err_msg = $"Failed to getBestInstanceServerForCreateInstance() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
if (instance_server_info.Address == string.Empty || instance_server_info.Port == 0)
|
||||
{
|
||||
err_msg = $"ServerInfo is invalid !!! Address:{instance_server_info.Address}, Port:{instance_server_info.Port}";
|
||||
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
var instance_room_id = makeBattleInstanceRoomId(instanceRoomIdBase, startSeqsNum);
|
||||
|
||||
(result, var is_created) = await instance_room_storage.createInstanceRoom(instance_room_id, instance_server_info.Address, instance_server_info.Port, instanceMetaId);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to createInstanceRoom() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
if (is_created)
|
||||
{
|
||||
|
||||
var battle_instance_room_storage = new BattleInstanceRoomStorage();
|
||||
battle_instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
result = await battle_instance_room_storage.addBattleInstanceRoomList(instanceRoomIdBase, instance_room_id);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to addInstanceRoomList() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
return (result, instance_room_id);
|
||||
}
|
||||
|
||||
public static string makeBattleInstanceRoomIdBase(Int32 eventId, long timestampInSeconds, Int32 instanceId)
|
||||
{
|
||||
if (eventId == 0)
|
||||
{
|
||||
return $"{BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID}:{eventId}_1234567890_{instanceId}";
|
||||
}
|
||||
|
||||
return $"{BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID}:{eventId}_{timestampInSeconds}_{instanceId}";
|
||||
}
|
||||
|
||||
static string makeBattleInstanceRoomId(string instanceRoomIdBase, int startSeqsNum)
|
||||
{
|
||||
//var server_logic = GameServerApp.getServerLogic();
|
||||
//var instance_room_storage = new InstanceRoomStorage();
|
||||
// instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
// var room_id_seq = await instance_room_storage.getRoomIdSeq();
|
||||
// if (room_id_seq == 0)
|
||||
// return string.Empty;
|
||||
|
||||
return $"{instanceRoomIdBase}:{startSeqsNum}";
|
||||
}
|
||||
|
||||
|
||||
// async Task<(Result, string)> joinBattleInstanceRoom(string userGuid, BattleInstanceType instanceType, int instanceMetaId)
|
||||
// {
|
||||
// var result = new Result();
|
||||
// string err_msg;
|
||||
//
|
||||
// var server_logic = GameServerApp.getServerLogic();
|
||||
//
|
||||
// var battle_instance_room_storage = new BattleInstanceRoomStorage();
|
||||
// battle_instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
//
|
||||
// if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
||||
// {
|
||||
// err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
||||
// result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
||||
// Log.getLogger().error(result.toBasicString());
|
||||
//
|
||||
// return (result, string.Empty);
|
||||
// }
|
||||
// var instance_room_id_base = makeBattleInstanceRoomIdBase(instanceType, instanceMetaId);
|
||||
// var instance_room_id = string.Empty;
|
||||
//
|
||||
// //인스턴스 정보가 redis에 없으면 roomlist에서 제거 처리
|
||||
// var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, instance_meta_data.LimitCount);
|
||||
// foreach (var room_id in room_list)
|
||||
// {
|
||||
// var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id);
|
||||
// if (instance_room_Info == null)
|
||||
// {
|
||||
// await InstanceRoomHandler.deleteInstanceRoom(room_id);
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// result = await joinBattleInstanceRoomFromRedis(userGuid, room_id, instanceMetaId, instance_room_id_base, instance_room_Info.UgcNpcCount);
|
||||
// if (result.isSuccess())
|
||||
// {
|
||||
// instance_room_id = room_id;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (instance_room_id == string.Empty)
|
||||
// {
|
||||
// (result, instance_room_id) = await createBattleInstanceRoomFromRedis(instance_room_id_base, instanceMetaId);
|
||||
// if (result.isFail())
|
||||
// {
|
||||
// err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
||||
// Log.getLogger().error(err_msg);
|
||||
//
|
||||
// return (result, string.Empty);
|
||||
// }
|
||||
//
|
||||
// result = await joinBattleInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, 0);
|
||||
// if (result.isFail())
|
||||
// {
|
||||
// err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
||||
// Log.getLogger().error(err_msg);
|
||||
//
|
||||
// return (result, string.Empty);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return (result, instance_room_id);
|
||||
// }
|
||||
public async Task<Result> joinBattleInstanceRoomFromRedis(string userGuid, string instanceRoomId, string instanceRoomIdBase)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
result = await instance_room_storage.joinInstanceRoom(userGuid, instanceRoomId, m_instance_meta_data.LimitCount);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to TryJoinInstanceRoom() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().debug(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await instance_room_storage.increaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId);
|
||||
if (result.isFail())
|
||||
{
|
||||
await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId);
|
||||
|
||||
err_msg = $"Failed to increaseInstanceRoomScore() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
||||
Log.getLogger().debug(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static async Task<Result> leaveBattleInstanceRoom(string userGuid, string instanceRoomId)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId);
|
||||
|
||||
var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId);
|
||||
await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, instanceRoomId);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static string getInstanceRoomIdBaseFromInstanceRoomId(string instanceRoomId)
|
||||
{
|
||||
var instance_room_Id_element = instanceRoomId.Split(":");
|
||||
|
||||
if (instance_room_Id_element.Length >= 2)
|
||||
{
|
||||
return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}";
|
||||
}
|
||||
Log.getLogger().error($"Instance room id weired : {instanceRoomId}");
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public partial class MapManager
|
||||
{
|
||||
public Pos GetBattleInstnaceRespawnPos(string mapFileName, string roomId)
|
||||
{
|
||||
Pos startPos = new();
|
||||
|
||||
|
||||
var startPosAnchorGuid = MapDataTable.Instance.GetRoomStartPosAnchorGuid(mapFileName);
|
||||
|
||||
if (!AnchorTrees.TryGetValue(startPosAnchorGuid, out var startPosAnchor))
|
||||
{
|
||||
return startPos;
|
||||
}
|
||||
|
||||
startPos.X = startPosAnchor.AnchorPos.X;
|
||||
startPos.Y = startPosAnchor.AnchorPos.Y;
|
||||
startPos.Z = startPosAnchor.AnchorPos.Z + 100;
|
||||
|
||||
return startPos;
|
||||
}
|
||||
|
||||
public List<Anchor> getAllRespawnPos(string mapFileName)
|
||||
{
|
||||
List<Anchor> anchors = new();
|
||||
|
||||
//바꿔야 된다. 배틀인스턴스 스폰 포인트로 바꿔야 한다. 아직 안바꿨음
|
||||
if (false == MapDataTable.Instance.getMapData(mapFileName, out var mapData))
|
||||
{
|
||||
//여기는 error 다. 로그만 찍고 startPos는 그대로 보낸다.
|
||||
Log.getLogger().error($"not exist map data namd : {mapFileName}");
|
||||
return anchors;
|
||||
}
|
||||
|
||||
foreach (var anchor in mapData.Anchors)
|
||||
{
|
||||
if (anchor.Type == "AT_RespawnPos")
|
||||
{
|
||||
anchors.Add(anchor);
|
||||
}
|
||||
}
|
||||
return anchors;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user