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; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer; public class GameModeHelper { 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 (mode_type) { 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 gameMode !!! gameModeId : {gameModeId}"; result.setFail(ServerErrorCode.GameModeJoinHandlerNotExist, err_msg); return (result, new TPSFreeForAllJoinHandler(instanceRoom)); } } 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 (mode_type) { 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 exist!!!! mode_type : {mode_type}"; result.setFail(ServerErrorCode.GameModeInitHandlerNotExist, err_msg); return (result, new TPSFreeForAllInitHandler(instanceRoom)); } } public static (Result, IGameModeJoinSuccessHandler?) getGameModeJoinSuccessHandler(Player player, InstanceRoom instanceRoom, int gameModeId, string roomId) { var result = new Result(); (var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId); switch (mode_type) { 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 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(new GameModeTPSFreeForAllData(), instanceRoom)); case GameModeType.TPS_TDM: return (result, new GameModeTPSTeamDeathMatch(new GameModeTPSTeamDeathMatchData(), instanceRoom)); case GameModeType.RUN_ADV: return (result, new GameModeRunAdventure(new GameModeRunAdventureData(), instanceRoom)); case GameModeType.RUN_RACE: return (result, new GameModeRunRace(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 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(); } 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; } }