250501 커밋
This commit is contained in:
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);
|
||||
}
|
||||
Reference in New Issue
Block a user