Files
caliverse_server/GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs
2025-05-01 07:23:28 +09:00

135 lines
4.1 KiB
C#

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;
}
}