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,8 @@
namespace GameServer.Contents.GameMode.Helper;
public class GameModeConstants
{
public static readonly int GAME_MODE_DEFAULT_INTERVAL_MSECS = 200;
public static readonly int GAME_MODE_RUN_RACE_CHECK_INTERVAL_MSECS = 200;
public static readonly int GAME_MODE_TPS_FFA_CHECK_INTERVAL_MSECS = 200;
}

View File

@@ -1,4 +1,11 @@
using Google.Protobuf;
using GameServer.Contents.GameMode.Manage;
using GameServer.Contents.GameMode.Manage.LeaveManage;
using GameServer.Contents.GameMode.Manage.PlayManage;
using GameServer.Contents.GameMode.Mode_Battle.Manage;
using GameServer.Contents.GameMode.Mode_Battle.ModeFreeForAll.Manage;
using GameServer.Contents.GameMode.Mode_Running.Manage;
using GameServer.Contents.GameMode.Mode_Running.ModeRace.Manage;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
@@ -15,57 +22,243 @@ namespace GameServer;
public class GameModeHelper
{
public static (Result, IGameModeJoinHandler) getGameModeJoinHandler(InstanceRoom instanceRoom, EPlaceType placeType)
public static (Result, IGameModeJoinHandler) getGameModeJoinHandler(InstanceRoom instanceRoom, int gameModeId, string roomId)
{
(var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId);
var result = new Result();
switch (placeType)
switch (mode_type)
{
case EPlaceType.BattleRoom:
return (result, new BattleInstanceJoinHandler(instanceRoom));
case EPlaceType.ArcadeRunning:
return (result, new ArcadeRunningInstanceJoinHandler(instanceRoom));
case EPlaceType.GameRoom:
return (result, new GameRoomJoinHandler(instanceRoom));
case GameModeType.TPS_FFA:
return (result, new TPSFreeForAllJoinHandler(instanceRoom));
case GameModeType.TPS_TDM:
return (result, new TPSTeamDeathMatchJoinHandler(instanceRoom));
case GameModeType.RUN_ADV:
return (result, new RunAdventureJoinHandler(instanceRoom));
case GameModeType.RUN_RACE:
return (result, new RunRaceJoinHandler(instanceRoom));
//case GameModeType.DANCE_:
// return (result, new (instanceRoom));
default:
var err_msg = $"invalid placeType in this mode!!!! placeType : {placeType}";
var err_msg = $"invalid gameMode !!! gameModeId : {gameModeId}";
result.setFail(ServerErrorCode.GameModeJoinHandlerNotExist, err_msg);
return (result, new BattleInstanceJoinHandler(instanceRoom));
return (result, new TPSFreeForAllJoinHandler(instanceRoom));
}
}
public static (Result, IGameModeInitHandler) getGameModeInitHandler(InstanceRoom instanceRoom, EPlaceType placeType)
public static (Result, IGameModeInitHandler) getGameModeInitHandler(InstanceRoom instanceRoom, int gameModeId, string roomId)
{
(var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId);
var result = new Result();
switch (placeType)
switch (mode_type)
{
case EPlaceType.BattleRoom:
return (result, new BattleInstanceInitHandler(instanceRoom));
case EPlaceType.ArcadeRunning:
return (result, new ArcadeRunningInstanceInitHandler(instanceRoom));
case EPlaceType.GameRoom:
return (result, new GameRoomInitHandler(instanceRoom));
case GameModeType.TPS_FFA:
return (result, new TPSFreeForAllInitHandler(instanceRoom));
case GameModeType.TPS_TDM:
return (result, new TPSTeamDeathMatchInitHandler(instanceRoom));
case GameModeType.RUN_ADV:
return (result, new RunAdventureInitHandler(instanceRoom));
case GameModeType.RUN_RACE:
return (result, new RunRaceInitHandler(instanceRoom));
default:
var err_msg = $"getGameModeInitHandler not!!!! placeType : {placeType}";
var err_msg = $"getGameModeInitHandler not exist!!!! mode_type : {mode_type}";
result.setFail(ServerErrorCode.GameModeInitHandlerNotExist, err_msg);
return (result, new BattleInstanceInitHandler(instanceRoom));
return (result, new TPSFreeForAllInitHandler(instanceRoom));
}
}
public static (Result, IGameModeJoinSuccessHandler?) getGameModeJoinSuccessHandler(Player player, InstanceRoom instanceRoom, EPlaceType placeType)
public static (Result, IGameModeJoinSuccessHandler?) getGameModeJoinSuccessHandler(Player player, InstanceRoom instanceRoom, int gameModeId, string roomId)
{
var result = new Result();
switch (placeType)
(var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId);
switch (mode_type)
{
case EPlaceType.BattleRoom:
return (result, new BattleInstanceJoinSuccessHandler(player, instanceRoom));
case EPlaceType.ArcadeRunning:
return (result, new ArcadeRunningInstanceJoinSuccessHandler(player, instanceRoom));
case EPlaceType.GameRoom:
return (result, new GameRoomJoinSuccessHandler(player, instanceRoom));
case GameModeType.TPS_FFA:
return (result, new TPSFreeForAllJoinSuccessHandler(player, instanceRoom));
case GameModeType.TPS_TDM:
return (result, new TPSTeamDeathMatchJoinSuccessHandler(player, instanceRoom));
case GameModeType.RUN_ADV:
return (result, new RunAdventureJoinSuccessHandler(player, instanceRoom));
case GameModeType.RUN_RACE:
return (result, new RunRaceJoinSuccessHandler(player, instanceRoom));
default:
var err_msg = $"getGameModeInitHandler not!!!! placeType : {placeType}";
var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}";
result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg);
return (result, null);
}
}
public static (Result, IGameMode?) createGameMode(InstanceRoom instanceRoom, GameModeType modeType)
{
var result = new Result();
switch (modeType)
{
case GameModeType.TPS_FFA:
return (result, new GameModeTPSFreeForAll<GameModeTPSFreeForAllData>(new GameModeTPSFreeForAllData(), instanceRoom));
case GameModeType.TPS_TDM:
return (result, new GameModeTPSTeamDeathMatch<GameModeTPSTeamDeathMatchData>(new GameModeTPSTeamDeathMatchData(), instanceRoom));
case GameModeType.RUN_ADV:
return (result, new GameModeRunAdventure<GameModeRunAdventureData>(new GameModeRunAdventureData(), instanceRoom));
case GameModeType.RUN_RACE:
return (result, new GameModeRunRace<GameModeRunRaceData>(new GameModeRunRaceData(), instanceRoom));
default:
var err_msg = $"createGameMode not exist !!!! mode_type : {modeType}";
result.setFail(ServerErrorCode.GameModeCreateFail, err_msg);
return (result, null);
}
}
public static (Result, IGameModeLeaveHandler?) getGameModeLeaveHandler(Player player, string roomId)
{
var result = new Result();
(var genre_type, var mode_type) = getGameModeMeta(1, roomId);
switch (mode_type)
{
case GameModeType.TPS_FFA:
return (result, new TPSFreeForAllLeaveHandler(player, roomId));
case GameModeType.TPS_TDM:
return (result, new TPSTeamDeathMatchLeaveHandler(player, roomId));
case GameModeType.RUN_ADV:
return (result, new RunAdventureLeaveHandler(player, roomId));
case GameModeType.RUN_RACE:
return (result, new RunRaceLeaveHandler(player, roomId));
default:
var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}";
result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg);
return (result, null);
}
}
public static (Result, IGameModeDestroyHandler?) getGameModeDestroyHandler(string roomId)
{
var result = new Result();
(var genre_type, var mode_type) = getGameModeMeta(1, roomId);
switch (mode_type)
{
case GameModeType.TPS_FFA:
return (result, new TPSFreeForAllDestroyHandler(roomId));
case GameModeType.TPS_TDM:
return (result, new TPSTeamDeathMatchDestroyHandler(roomId));
case GameModeType.RUN_ADV:
return (result, new RunAdventureDestroyHandler(roomId));
case GameModeType.RUN_RACE:
return (result, new RunRaceDestroyHandler(roomId));
default:
var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}";
result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg);
return (result, null);
}
}
public static IHostMigrator createHostMigrator(int gameModeId)
{
var result = new Result();
(var genre_type, var mode_type) = getGameModeMeta(gameModeId, "battle"); //kihoon 임시 마이그레이터 나중에 수정 필요
switch (mode_type)
{
case GameModeType.TPS_FFA:
//return HostMigrationFactory.createCommonHostMigrator((int) BattlePlayMode.PodCombat, GameServerApp.getServerLogic());
return new BattleFFAModeHostMigrator();
default:
Log.getLogger().error($"createHostMigrator Not implements mode : {mode_type}");
return new BattleFFAModeHostMigrator();
}
}
public static (GameGenreType genreType, GameModeType modeType) getGameModeMeta(int gameModeId, string roomid)
{
// kihoon todo : Meta에서 데이터 가져와야 한다.
// kihoon todo : Meta가 없을경우의 result 처리 필요
//kihoon todo : roomid 는 임시 나중에 mode id로 넣어서 처리 해줘야 된다.
if (roomid.Contains("battle"))
{
return (GameGenreType.TPS, GameModeType.TPS_FFA);
}
else if (roomid.Contains("1017101"))
{
return (GameGenreType.Running, GameModeType.RUN_RACE);
}
return (GameGenreType.TPS, GameModeType.TPS_FFA);
}
public static GameModeBase toGameModeBase(IGameMode gameMode)
{
var game_mode_base = gameMode as GameModeBase;
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!");
return game_mode_base;
}
public static async Task<Result> leaveGameInstanceRoom(string userGuid, string roomId)
{
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, roomId);
var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(roomId);
await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, roomId);
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;
}
public static IGameObject? getObjectInteractAction(GameModeBase gameModeBase, Anchor anchor)
{
var entity_type = gameModeBase.getEntityType();
switch (entity_type)
{
case EntityType.GameModeTpsfreeForAll:
//kihoon todo : table id 넘겨서 pickup, combat, weapon, buff, 인지 전달 받아야 된다.
return getTpsFreeForAllInteractAction(gameModeBase, anchor);
case EntityType.GameModeTpsteamDeathMatch:
return getTpsTeamDeathMatchInteractAction(gameModeBase, anchor);
case EntityType.GameModeRunAdventure:
return getRunAcventureInteractAction(gameModeBase, anchor);
case EntityType.GameModeRunRace:
return getRunRaceInteractAction(gameModeBase, anchor);
default:
return null;
}
}
public static IGameObject? getRunRaceInteractAction(GameModeBase gameModeBase, Anchor anchor)
{
//kihoon todo :현재 savePoint 밖에 없어서 그거 넘긴다.
return gameModeBase.getEntityAction<RaceGameObjectSavePointInteractAction>();
}
public static IGameObject? getTpsFreeForAllInteractAction(GameModeBase gameModeBase, Anchor anchor)
{
return null;
}
public static IGameObject? getTpsTeamDeathMatchInteractAction(GameModeBase gameModeBase, Anchor anchor)
{
return null;
}
public static IGameObject? getRunAcventureInteractAction(GameModeBase gameModeBase, Anchor anchor)
{
return null;
}
}

View File

@@ -0,0 +1,35 @@
using Google.Protobuf.WellKnownTypes;
using Newtonsoft.Json;
using ServerCore;
namespace GameServer.Contents.GameMode.Helper;
public class GameNotifyHelper
{
public static void broadcast_GS2C_NTF_GAME_STATE_UPDATE(InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime)
{
var ntf = makeNtfGameStateUpdate(instanceRoom, state, nextUpdatableTime);
Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE ntf instanceRoom Id : {instanceRoom.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfGameStateUpdate)}");
instanceRoom.Broadcast(ntf);
}
public static void send_GS2C_NTF_GAME_STATE_UPDATE(Player player, InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime)
{
var ntf = makeNtfGameStateUpdate(instanceRoom, state, nextUpdatableTime);
Log.getLogger().debug($"send_GS2C_NTF_GAME_STATE_UPDATE ntf instanceRoom Id : {instanceRoom.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfGameStateUpdate)}");
GameServerApp.getServerLogic().onSendPacket(player, ntf);
}
public static ClientToGame makeNtfGameStateUpdate(InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime)
{
ClientToGame ntf = new ClientToGame();
ntf.Message = new ClientToGameMessage();
ntf.Message.NtfGameStateUpdate = new ClientToGameMessage.Types.GS2C_NTF_GAME_STATE_UPDATE_NOTI();
ntf.Message.NtfGameStateUpdate.CurrentState = state;
ntf.Message.NtfGameStateUpdate.NextUpdatableTime = Timestamp.FromDateTime(nextUpdatableTime);
return ntf;
}
}