250501 커밋

This commit is contained in:
2025-05-01 07:23:28 +09:00
parent 98bb2e3c5c
commit 23176551b7
353 changed files with 9972 additions and 6652 deletions

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

View File

@@ -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()}";
}
}

View File

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

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Manage.PlayManage;
public interface IDeadHandler
{
}

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Manage.PlayManage;
public interface IGameMode
{
}

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Manage.PlayManage;
public interface IGameModeGenre
{
}

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Manage.PlayManage;
public interface IGameObject
{
Task<Result> interact(string anchorGuid, DateTime interactionTime);
}