250501 커밋
This commit is contained in:
@@ -1,30 +0,0 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public abstract class GameModeInitHandlerBase : IGameModeInitHandler
|
||||
{
|
||||
protected readonly EPlaceType m_place_type;
|
||||
protected readonly InstanceRoom m_instance_room;
|
||||
|
||||
public GameModeInitHandlerBase(InstanceRoom instanceRoom, EPlaceType placeType)
|
||||
{
|
||||
m_instance_room = instanceRoom;
|
||||
m_place_type = placeType;
|
||||
|
||||
}
|
||||
|
||||
public abstract Result gamedModeInstanceInitValidate();
|
||||
|
||||
public abstract Result gamedModeInstanceInit();
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public abstract class GameModeJoinHandlerBase : IGameModeJoinHandler
|
||||
{
|
||||
protected readonly InstanceRoom m_instance_room;
|
||||
protected readonly EPlaceType m_place_type = EPlaceType.NONE;
|
||||
|
||||
public GameModeJoinHandlerBase(InstanceRoom instanceRoom, EPlaceType placeType)
|
||||
{
|
||||
m_instance_room = instanceRoom;
|
||||
m_place_type = placeType;
|
||||
}
|
||||
|
||||
public abstract Result gamedModeInstanceJoinValidate(EPlaceType placeType); //kihoon todo : 여기에 나중에 EPlaceType 대신 GameModeType이란걸 넣어야 한다.
|
||||
public abstract Result gamedModeInstanceJoin(Player player);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class GameRoomInitHandler : GameModeInitHandlerBase
|
||||
{
|
||||
public GameRoomInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.GameRoom)
|
||||
{
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceInitValidate()
|
||||
{
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceInit()
|
||||
{
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class GameRoomJoinHandler : GameModeJoinHandlerBase
|
||||
{
|
||||
public GameRoomJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.GameRoom)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceJoinValidate(EPlaceType placeType)
|
||||
{
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Result gamedModeInstanceJoin(Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class GameRoomJoinSuccessHandler: GameModeJoinSuccessHandlerBase
|
||||
{
|
||||
public GameRoomJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, EPlaceType.GameRoom)
|
||||
{
|
||||
}
|
||||
|
||||
public override Result joinSuccessValidate()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Task<Result> joinSuccessConfirmation()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
public override Task<Result> joinSuccessNotify()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
public override void joinSuccessWriteLog()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public interface IGameModeJoinHandler
|
||||
{
|
||||
public Result gamedModeInstanceJoinValidate(EPlaceType placeType); //kihoon todo : 여기에 나중에 EPlaceType 대신 GameModeType이란걸 넣어야 한다.
|
||||
public Result gamedModeInstanceJoin(Player player);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using GameServer.Contents.GameMode.Helper;
|
||||
using GameServer.Contents.GameMode.Manage;
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public abstract class GameModeInitHandlerBase : IGameModeInitHandler
|
||||
{
|
||||
protected readonly GameModeType m_game_mode_type;
|
||||
protected readonly InstanceRoom m_instance_room;
|
||||
|
||||
public GameModeInitHandlerBase(InstanceRoom instanceRoom, GameModeType gameModeType)
|
||||
{
|
||||
m_instance_room = instanceRoom;
|
||||
m_game_mode_type = gameModeType;
|
||||
|
||||
}
|
||||
|
||||
public abstract Result gamedModeInstanceInitValidate();
|
||||
|
||||
public virtual async Task<Result> gamedModeInstanceInit()
|
||||
{
|
||||
var result = await GameModeManager.It.createGameMode(m_instance_room, m_game_mode_type); //kihoon todo : 이렇게 짜는게 맞는지...고민좀 해보자
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var room_id = m_instance_room.getMap().m_room_id;
|
||||
if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
||||
{
|
||||
var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
var initializer = gameMode as IInitializer;
|
||||
NullReferenceCheckHelper.throwIfNull(initializer, () => $"initializer is null !!! casting error");
|
||||
|
||||
var gamd_mod_base = gameMode as GameModeBase;
|
||||
NullReferenceCheckHelper.throwIfNull(gamd_mod_base, () => $"gamd_mod_base is null !!! casting error");
|
||||
|
||||
//모드별로 필요한 내용 초기화
|
||||
using (var releaser = await gamd_mod_base.getAsyncLock())
|
||||
{
|
||||
if (gamd_mod_base.isLoadCompleted()) return result;
|
||||
|
||||
result = await initializer.onInit();
|
||||
if (result.isFail()) return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using ServerCommon;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage;
|
||||
|
||||
public abstract class GameModeJoinHandlerBase : IGameModeJoinHandler
|
||||
{
|
||||
protected readonly InstanceRoom m_instance_room;
|
||||
protected readonly GameModeType m_game_mode_type;
|
||||
|
||||
public GameModeJoinHandlerBase(InstanceRoom instanceRoom, GameModeType gameModeType)
|
||||
{
|
||||
m_instance_room = instanceRoom;
|
||||
m_game_mode_type = gameModeType;
|
||||
}
|
||||
|
||||
public abstract Result gamedModeInstanceJoinValidate();
|
||||
public abstract Result gamedModeInstanceJoin(Player player);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,29 +1,21 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
namespace GameServer.Contents.GameMode.Manage;
|
||||
|
||||
public abstract class GameModeJoinSuccessHandlerBase : IGameModeJoinSuccessHandler
|
||||
{
|
||||
protected Player m_player;
|
||||
//protected InstanceRoom m_instance_room;
|
||||
protected EPlaceType m_place_type;
|
||||
protected GameModeType m_game_mode_type;
|
||||
protected List<ILogInvoker> m_log_invorkers;
|
||||
protected InstanceRoom m_instance_room;
|
||||
|
||||
public GameModeJoinSuccessHandlerBase(Player player, EPlaceType placeType)
|
||||
public GameModeJoinSuccessHandlerBase(Player player, GameModeType gameModeType, InstanceRoom instanceRoom)
|
||||
{
|
||||
m_player = player;
|
||||
//m_instance_room = instanceRoom;
|
||||
m_place_type = placeType;
|
||||
m_game_mode_type = gameModeType;
|
||||
m_log_invorkers = new();
|
||||
m_instance_room = instanceRoom;
|
||||
}
|
||||
|
||||
public async Task<Result> joinSuccess()
|
||||
@@ -3,5 +3,5 @@
|
||||
public interface IGameModeInitHandler
|
||||
{
|
||||
public Result gamedModeInstanceInitValidate();
|
||||
public Result gamedModeInstanceInit();
|
||||
public Task<Result> gamedModeInstanceInit();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using ServerCommon;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage;
|
||||
|
||||
public interface IGameModeJoinHandler
|
||||
{
|
||||
public Result gamedModeInstanceJoinValidate();
|
||||
public Result gamedModeInstanceJoin(Player player);
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
|
||||
namespace GameServer;
|
||||
namespace GameServer.Contents.GameMode.Manage;
|
||||
|
||||
public interface IGameModeJoinSuccessHandler
|
||||
{
|
||||
@@ -0,0 +1,76 @@
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage.LeaveManage;
|
||||
|
||||
public abstract class GameModeDestroyHandlerBase : IGameModeDestroyHandler
|
||||
{
|
||||
protected readonly GameModeType m_game_mode_type;
|
||||
protected string m_room_id;
|
||||
protected IGameMode? m_game_mode;
|
||||
|
||||
public GameModeDestroyHandlerBase(string roomId, GameModeType gameModeType)
|
||||
{
|
||||
m_game_mode_type = gameModeType;
|
||||
m_room_id = roomId;
|
||||
}
|
||||
|
||||
public abstract Task<Result> postDestroy(IGameMode gameMode);
|
||||
|
||||
public async Task<Result> gameModeDestroy()
|
||||
{
|
||||
var result = new Result();
|
||||
if (false == GameModeManager.It.tryGetGameMode(m_room_id, out var gameMode))
|
||||
{
|
||||
var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_mode_base = gameMode as GameModeBase;
|
||||
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!! casting error");
|
||||
|
||||
using (var releaser = await game_mode_base.getAsyncLock())
|
||||
{
|
||||
var ticker = game_mode_base.getEntityTicker();
|
||||
if (ticker is not null)
|
||||
{
|
||||
try
|
||||
{
|
||||
ticker.cancel();
|
||||
ticker = null;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
var err_msg = $"Exception !!!, Failed to cancel ||| : Exception:{e}";
|
||||
Log.getLogger().debug(err_msg);
|
||||
}
|
||||
}
|
||||
|
||||
//모드별 destroy 처리
|
||||
await postDestroy(gameMode);
|
||||
|
||||
if (false == GameModeManager.It.tryRemoveGameMode(m_room_id, out var _))
|
||||
{
|
||||
var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}";
|
||||
Log.getLogger().warn(err_msg);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
using GameServer.Contents.GameMode.Helper;
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage.LeaveManage;
|
||||
|
||||
public abstract class GameModeLeaveHandlerBase : IGameModeLeaveHandler
|
||||
{
|
||||
protected readonly GameModeType m_game_mode_type;
|
||||
protected Player m_player;
|
||||
protected string m_room_id;
|
||||
|
||||
public GameModeLeaveHandlerBase(Player player, string roomId, GameModeType gameModeType)
|
||||
{
|
||||
m_game_mode_type = gameModeType;
|
||||
m_player = player;
|
||||
m_room_id = roomId;
|
||||
}
|
||||
|
||||
public virtual async Task<Result> gameModeLeave()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
if (false == GameModeManager.It.tryGetGameMode(m_room_id, out var gameMode))
|
||||
{
|
||||
var err_msg = $"battle_instance_room is null : room_id - {m_room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
await removeUserFromInstanceRoom(m_player, gameMode);
|
||||
await leaveGameZone(gameMode);
|
||||
await removeHost(gameMode);
|
||||
|
||||
|
||||
result = await postLeave(gameMode);
|
||||
if(result.isFail()) return result;
|
||||
|
||||
result = await notifyAfterLeave(gameMode);
|
||||
if(result.isFail()) return result;
|
||||
|
||||
result = await logAfterLeave(gameMode);
|
||||
if(result.isFail()) return result;
|
||||
|
||||
|
||||
|
||||
await destroyCheck(gameMode);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task removeUserFromInstanceRoom(Player player, IGameMode gameMode)
|
||||
{
|
||||
var game_mode_base = GameModeHelper.toGameModeBase(gameMode);
|
||||
await Task.CompletedTask;
|
||||
|
||||
var instance_room = game_mode_base.getInstanceRoom();
|
||||
var user_guid = player.getUserGuid();
|
||||
|
||||
var result = instance_room.getMap().tryRemovePlayer(player);
|
||||
if (result.isFail()) return;
|
||||
|
||||
await GameModeHelper.leaveGameInstanceRoom(user_guid, m_room_id);
|
||||
|
||||
}
|
||||
|
||||
public async Task removeHost(IGameMode gameMode)
|
||||
{
|
||||
var game_mode_base = GameModeHelper.toGameModeBase(gameMode);
|
||||
var host_user_guid = game_mode_base.m_host_migrator.getHostUserGuid();
|
||||
if (m_player.getUserGuid().Equals(host_user_guid))
|
||||
{
|
||||
using (var releaser = await game_mode_base.getAsyncLock())
|
||||
{
|
||||
game_mode_base.m_host_migrator.removeHost();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task leaveGameZone(IGameMode gameMode)
|
||||
{
|
||||
var game_mode_base = GameModeHelper.toGameModeBase(gameMode);
|
||||
await Task.CompletedTask;
|
||||
var location_attribute = m_player.getEntityAttribute<LocationAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"LocationAttribute is null !!! - player:{m_player.toBasicString()}");
|
||||
location_attribute.CurrentIndunLocation.clear();
|
||||
|
||||
var game_zone_action = m_player.getEntityAction<GameZoneAction>();
|
||||
await game_zone_action.tryLeaveGameZone();
|
||||
|
||||
var instance_room = game_mode_base.getInstanceRoom();
|
||||
|
||||
if (instance_room.SessionCount + instance_room.getMap().getCurrCountAsAddConnectedUser() > 0)
|
||||
{
|
||||
ClientToGame clientToGame = new ClientToGame();
|
||||
clientToGame.Message = new ClientToGameMessage();
|
||||
clientToGame.Message.LeaveInstanceRoomMember = new ClientToGameMessage.Types.LeaveInstanceRoomMember();
|
||||
clientToGame.Message.LeaveInstanceRoomMember.MemberGuid = m_player.getUserGuid();
|
||||
|
||||
instance_room.Broadcast(clientToGame);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task destroyCheck(IGameMode gameMode)
|
||||
{
|
||||
var game_mode_base = GameModeHelper.toGameModeBase(gameMode);
|
||||
if (game_mode_base.getInstanceRoom().isDestroy)
|
||||
{
|
||||
(var result, var destroy_handler) = GameModeHelper.getGameModeDestroyHandler(game_mode_base.getRoomId());
|
||||
if (result.isSuccess() && destroy_handler is not null)
|
||||
{
|
||||
await destroy_handler.gameModeDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public abstract Task<Result> postLeave(IGameMode gameMode);
|
||||
public abstract Task<Result> notifyAfterLeave(IGameMode gameMode);
|
||||
|
||||
public abstract Task<Result> logAfterLeave(IGameMode gameMode);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.LeaveManage;
|
||||
|
||||
public interface IGameModeDestroyHandler
|
||||
{
|
||||
Task<Result> gameModeDestroy();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.LeaveManage;
|
||||
|
||||
public interface IGameModeLeaveHandler
|
||||
{
|
||||
Task<Result> gameModeLeave();
|
||||
}
|
||||
135
GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs
Normal file
135
GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs
Normal file
@@ -0,0 +1,135 @@
|
||||
using Amazon.DynamoDBv2.Model;
|
||||
using GameServer.Contents.GameMode.Helper;
|
||||
using GameServer.Contents.GameMode.Manage.StateManage;
|
||||
using NeoSmart.AsyncLock;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
public abstract class GameModeBase : EntityBase, IGameMode, IWithLogActor
|
||||
{
|
||||
protected bool m_is_init_completed = false;
|
||||
protected InstanceRoom m_instance_room;
|
||||
public readonly IHostMigrator m_host_migrator;
|
||||
protected EntityTicker? m_ticker;
|
||||
protected Int32 m_ticker_interval_msecs = GameModeConstants.GAME_MODE_DEFAULT_INTERVAL_MSECS;
|
||||
protected IGameModeState? m_current_game_mode_state; //kihoon todo: 이거 수정해야된다. IGameMode를 받으면 안될듯...아니면 받더래도
|
||||
|
||||
public GameModeBase(EntityType type, InstanceRoom instanceRoom) : base(type)
|
||||
{
|
||||
m_is_init_completed = false;
|
||||
m_instance_room = instanceRoom;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(instanceRoom, () => $"GameModeBase constructor instanceRoom is null !!!");
|
||||
m_host_migrator = HostMigrationFactory.createCommonHostMigrator(1, GameServerApp.getServerLogic()); //kihoon todo : gamemodeID를 넘겨야 한다;
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
//action 추가
|
||||
addEntityActions();
|
||||
|
||||
//GameModeBase 쪽 로직 더 넣을것 있으면 여기에
|
||||
|
||||
result = await base.onInit();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
|
||||
//init이 다 되면 ticker 만든다.
|
||||
result = await createTask();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
//타이머 생성후 초기해야될 것이 있으면 한다.
|
||||
await initAfterTimerCreate();
|
||||
|
||||
m_is_init_completed = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public void addEntityActions()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public string getRoomId()
|
||||
{
|
||||
return m_instance_room.getMap().m_room_id;
|
||||
}
|
||||
|
||||
private async Task<Result> createTask()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
m_ticker = createTaskTicker();
|
||||
NullReferenceCheckHelper.throwIfNull(m_ticker, () => $"m_ticker is null !!! - id");
|
||||
await m_ticker.onInit();
|
||||
|
||||
await Task.CompletedTask;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public EntityTicker createTaskTicker() //나중에 모드별로 별도 정의 필요하면 그때 virtual로
|
||||
{
|
||||
var ticker = new GameModeLifeCycleTicker(this, m_ticker_interval_msecs, gameModeTaskTick);
|
||||
return ticker;
|
||||
}
|
||||
|
||||
private async Task gameModeTaskTick()
|
||||
{
|
||||
if (!m_is_init_completed) return;
|
||||
|
||||
try
|
||||
{
|
||||
await taskUpdate();
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Log.getLogger().error($"Exception !!!, new gameModeTaskTick() : exception:{e}, basicString : {toBasicString()}");
|
||||
}
|
||||
}
|
||||
|
||||
public abstract Task taskUpdate();
|
||||
public abstract Task initAfterTimerCreate();
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
var basic_string = base.toBasicString() + $"GameModeBase.... room_id : {getRoomId()}";
|
||||
return basic_string;
|
||||
}
|
||||
|
||||
public bool isLoadCompleted()
|
||||
{
|
||||
return m_is_init_completed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public IGameModeState getGameModeState()
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(m_current_game_mode_state, () => $"m_current_game_mode_state is null !!");
|
||||
return m_current_game_mode_state;
|
||||
}
|
||||
|
||||
public void setGameModeState(IGameModeState state)
|
||||
{
|
||||
m_current_game_mode_state = state;
|
||||
}
|
||||
|
||||
public InstanceRoom getInstanceRoom() => m_instance_room;
|
||||
public EntityTicker? getEntityTicker() => m_ticker;
|
||||
public ILogActor toLogActor()
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var region_id = server_logic.getServerConfig().getRegionId();
|
||||
var server_name = server_logic.getServerName();
|
||||
|
||||
var log_info = new BattleInstanceActorLog(region_id, server_name, getRoomId(), m_instance_room.getInstanceId());
|
||||
return log_info;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
using System.Diagnostics;
|
||||
using Amazon.Runtime;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class GameModeLifeCycleTicker : EntityTicker
|
||||
{
|
||||
private Func<Task> m_task_tick;
|
||||
public GameModeLifeCycleTicker(EntityBase parent, Int32 onTickIntervalMilliseconds, Func<Task> taskTick)
|
||||
: base(EntityType.GameModeLifeCycleTicker, parent, onTickIntervalMilliseconds, null)
|
||||
{
|
||||
m_task_tick = taskTick;
|
||||
}
|
||||
public override async Task onTaskTick()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
Stopwatch? stopwatch = null;
|
||||
var event_tid = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var server_config = server_logic.getServerConfig();
|
||||
var seasonPassManager = server_logic.getSeasonPassManager();
|
||||
|
||||
if (true == server_config.PerformanceCheckEnable)
|
||||
{
|
||||
event_tid = System.Guid.NewGuid().ToString("N");
|
||||
stopwatch = Stopwatch.StartNew();
|
||||
}
|
||||
//logic 처리
|
||||
await m_task_tick();
|
||||
|
||||
if (null != stopwatch)
|
||||
{
|
||||
var elapsed_msec = stopwatch.ElapsedMilliseconds;
|
||||
stopwatch.Stop();
|
||||
Log.getLogger().debug($"{GetType()} Ticker Stopwatch Stop : ETID:{event_tid}, ElapsedMSec:{elapsed_msec}, TickIntervalMSec:{getOnTickIntervalMilliseconds()}");
|
||||
}
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"{this.getTypeName()}";
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()}";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using GameServer.Contents.GameMode.Helper;
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using ServerCore;
|
||||
using NeoSmart.AsyncLock;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class GameModeManager : Singleton<GameModeManager>
|
||||
{
|
||||
private AsyncLock m_lock = new();
|
||||
private ConcurrentDictionary<string, IGameMode> m_game_modes = new(); /**/
|
||||
|
||||
public async Task onInit()
|
||||
{
|
||||
//1. 이벤트 관리하는 Task 추가
|
||||
//var result = await createBattleEventCheckerTask(); //kihoon todo : 이부분은 GameModeEventCheckerTask라는 걸로 변경 처리 해준다. 여기서 처리 안해줄수 도 있다.
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
public async Task<Result> createGameMode(InstanceRoom instanceRoom, GameModeType gameModeType)
|
||||
{
|
||||
(var result, var game_mode) = GameModeHelper.createGameMode(instanceRoom, gameModeType);
|
||||
if (result.isFail()) return result;
|
||||
if (game_mode is null)
|
||||
{
|
||||
var err_msg = $"game_mode is null !!!! gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg);
|
||||
return result;
|
||||
}
|
||||
var room_id = instanceRoom.getMap().m_room_id;
|
||||
|
||||
if (false == tryAdd(room_id, game_mode))
|
||||
{
|
||||
//이미 들어가져 있으므로 로그만 남겨놓고 리턴
|
||||
Log.getLogger().warn($"game_mode already exist...... gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}");
|
||||
}
|
||||
|
||||
await Task.CompletedTask;
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool tryGetGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode)
|
||||
{
|
||||
var ret = m_game_modes.TryGetValue(roomId, out gameMode);
|
||||
|
||||
if (ret == false)
|
||||
{
|
||||
var err_msg = $"gameMode is null : room_id - {roomId}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public bool tryRemoveGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode)
|
||||
{
|
||||
return m_game_modes.TryRemove(roomId, out gameMode);
|
||||
}
|
||||
|
||||
public bool tryAdd(string roomId, IGameMode gameMode)
|
||||
{
|
||||
return m_game_modes.TryAdd(roomId, gameMode);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
public interface IDeadHandler
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
public interface IGameMode
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
public interface IGameModeGenre
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
public interface IGameObject
|
||||
{
|
||||
Task<Result> interact(string anchorGuid, DateTime interactionTime);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.Contents.GameMode.Manage.StateManage;
|
||||
|
||||
|
||||
|
||||
public abstract class GameModeStateBase : IGameModeState
|
||||
{
|
||||
protected IGameMode m_game_mode;
|
||||
protected GameModeBase m_game_mode_base;
|
||||
private GameModeState m_state = GameModeState.None;
|
||||
protected DateTime m_next_state_change_time;
|
||||
|
||||
|
||||
public GameModeStateBase(IGameMode gameMode, GameModeState state)
|
||||
{
|
||||
m_game_mode = gameMode;
|
||||
var game_mode_base = m_game_mode as GameModeBase;
|
||||
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!");
|
||||
m_game_mode_base = game_mode_base;
|
||||
|
||||
|
||||
m_next_state_change_time = DateTimeHelper.Current.AddSeconds(10); //kihoon todo: 대기시간은 나중에 meta로 반영해야 된다.
|
||||
m_state = state;
|
||||
}
|
||||
|
||||
public abstract void enter();
|
||||
public abstract void update();
|
||||
public abstract void exit();
|
||||
public abstract GameModeState checkState();
|
||||
|
||||
public GameModeState getStateType()
|
||||
{
|
||||
return m_state;
|
||||
}
|
||||
|
||||
public DateTime getNextStateChangeTime()
|
||||
{
|
||||
return m_next_state_change_time;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public interface IGameModeState
|
||||
{
|
||||
public void enter();
|
||||
public void exit();
|
||||
|
||||
|
||||
public void update();
|
||||
public GameModeState checkState();
|
||||
public GameModeState getStateType();
|
||||
}
|
||||
Reference in New Issue
Block a user