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

@@ -1,37 +0,0 @@
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;
}
}

View File

@@ -1,47 +0,0 @@

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

View File

@@ -1,104 +0,0 @@

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

View File

@@ -1,18 +1,18 @@
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
using GameServer.Contents.Battle.Tickers;
using GameServer.Contents.GameMode.Mode_Battle.Manage;
using Google.Protobuf.WellKnownTypes;
using NeoSmart.AsyncLock;
using Newtonsoft.Json;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using Constant = System.Reflection.Metadata.Constant;
namespace GameServer;
@@ -20,191 +20,19 @@ 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<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>();
@@ -214,87 +42,74 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
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))
if (false == GameModeManager.It.tryGetGameMode(instanceRoomId, out var gameMode))
{
removeBattlePlayer(player.getUserGuid());
return;
}
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}");
await ffa.removePodCombat(player);
await battleInstanceRoom.removePodCombat(player);
var host_user_guid = battleInstanceRoom.m_host_migrator.getHostUserGuid();
var host_user_guid = ffa.m_host_migrator.getHostUserGuid();
if (player.getUserGuid().Equals(host_user_guid))
{
using (var releaser = await battleInstanceRoom.getAsyncLock())
using (var releaser = await ffa.getAsyncLock())
{
battleInstanceRoom.m_host_migrator.removeHost();
ffa.m_host_migrator.removeHost();
}
}
//여기서 instanceroom 이 is Destroy 면 DestroyBattleRoom 호출 해줄것
if (battleInstanceRoom.m_instance_room.isDestroy)
if (ffa.getInstanceRoom().isDestroy)
{
m_battle_instances.TryRemove(instanceRoomId, out var _);
await battleInstanceRoom.destroyBattleRoom();
//kihoon todo : 이부분 수정 필요
//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 _);
}
}
// public async Task tryDestroyBattleRoom(string instanceRoomId)
// {
// await Task.CompletedTask;
// 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);
(var result, var leeave_handler) = GameModeHelper.getGameModeLeaveHandler(player, instanceRoomId);
if (result.isFail() || leeave_handler is null) return false;
// if (battleRoom.m_instance_room.isDestroy)
// {
// InstanceRoomManager.Instance.DestroyRoom(instanceRoomId);
// }
await leeave_handler.gameModeLeave();
Log.getLogger().debug($"leave battle room player : {player.toBasicString()}, instanceRoomId : {instanceRoomId}");
return true;
}
public async Task<Result> sendNtfAboutBattleInstance(BattleInstanceRoom battieInstanceRoom, Player player)
public async Task<Result> sendNtfAboutBattleInstance(GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battieInstanceRoom, Player player)
{
var result = new Result();
@@ -313,7 +128,7 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
}
private void sendNtfBattleObjectsState(BattleInstanceRoom battleInstanceRoom, Player player)
private void sendNtfBattleObjectsState(GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battleInstanceRoom, Player player)
{
List<BattleObjectInfo> infos = new();
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
@@ -496,6 +311,55 @@ public class BattleInstanceManager : Singleton<BattleInstanceManager>
return true;
}
private async Task<Result> createBattleEventCheckerTask()
{
var result = new Result();
public BattleInstanceManager Self => this;
var battle_entity_ticker_initializers = new Initializers();
//채널 인던 다 필요한가?
//이벤트 인스턴스 관련 생성 삭제에 대한 관리 Ticker
//battle_entity_ticker_initializers.appendInitializer(new BattleEventCheckTicker(1000, null));
//battle_entity_ticker_initializers.appendInitializer(new BattleEventNotifyTicker(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;
}
}

View File

@@ -17,13 +17,13 @@ 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;
}
// var result = await BattleInstanceManager.It.battleInstanceInit(this, _roomId);
// if (result.isFail())
// {
// Log.getLogger().error(result.toBasicString());
// return false;
// }
await Task.CompletedTask;
return true;
}
@@ -60,47 +60,5 @@ public partial class InstanceRoom
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()}");
}
}

View File

@@ -373,33 +373,7 @@ public class BattleInstanceRoomHandler
}
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;
}
}

View File

@@ -0,0 +1,27 @@
using GameServer.Contents.GameMode.Manage.PlayManage;
namespace GameServer.Contents.GameMode.Mode_Battle.Manage;
public class GameModeTPS: GameModeBase, IGameModeGenre
{
public GameModeTPS(EntityType type, InstanceRoom instanceRoom) : base(type, instanceRoom)
{
}
public override Task taskUpdate()
{
return Task.CompletedTask;
}
public override string toBasicString()
{
var basic_string = base.toBasicString() + $"GameModeTPS....";
return basic_string;
}
public override Task initAfterTimerCreate()
{
return Task.CompletedTask;
}
}

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Mode_Battle.Manage;
public interface IBattleMode
{
public Task<Result> init();
}

View File

@@ -0,0 +1,6 @@
namespace GameServer.Contents.GameMode.Mode_Battle.Manage;
public interface ITPSMode
{
Task<Result> initTPSMode();
}