초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,333 @@
using System.Collections.Concurrent;
using RabbitMQ.Client;
using MongoDB.Bson.IO;
using ServerCore; using ServerBase;
using ServerCommon;
using MetaAssets;
using UGQDatabase.Models;
namespace GameServer;
public static class UgqMetaHelper
{
public static UgqNpcInfo copyToUgcNpc(UgcNpcAttrib npcAttrib)
{
var ugq_npc = new UgqNpcInfo();
ugq_npc.NpcMetaGuid = npcAttrib.UgcNpcMetaGuid;
ugq_npc.OwnerGuid = npcAttrib.OwnerGuid;
ugq_npc.OwnerEntityType = (int)npcAttrib.OwnerEntityType;
ugq_npc.Nickname = npcAttrib.Nickname;
ugq_npc.Title = npcAttrib.Title;
ugq_npc.Greeting = npcAttrib.Greeting;
ugq_npc.Introduction = npcAttrib.Introduction;
ugq_npc.Description = npcAttrib.Description;
ugq_npc.WorldScenario = npcAttrib.WorldScenario;
ugq_npc.DefaultSocialActionMetaId = npcAttrib.DefaultSocialActionMetaId;
ugq_npc.HabitSocialActionMetaIds.AddRange(npcAttrib.HabitSocialActionMetaIds);
ugq_npc.DialogueSocialActionMetaIds.AddRange(npcAttrib.DialogueSocialActionMetaIds);
ugq_npc.BodyItemMetaId = npcAttrib.BodyItemMetaId;
ugq_npc.HashTagMetaIds.AddRange(npcAttrib.HashTagMetaIds);
ugq_npc.State = npcAttrib.State;
ugq_npc.IsRegisteredAiChatServer = npcAttrib.IsRegisteredAiChatServer == true ? BoolType.True : BoolType.False;
return ugq_npc;
}
public static UGQAbortReason convertUGQAbortReason(this UgqStateType ugqStateType)
{
switch (ugqStateType)
{
case UgqStateType.Shutdown:
return UGQAbortReason.Shutdown;
case UgqStateType.RevisionChanged:
return UGQAbortReason.RevisionUpdated;
case UgqStateType.None:
default:
return UGQAbortReason.None;
}
}
public static (Result, QuestBaseInfo?) generateUgqQuestBaseInfo(GameQuestDataEntity gameQuestData)
{
var quest_base_info = new QuestBaseInfo();
SortedSet<int> setTaskNum = new();
SortedSet<int> setTaskIdx = new();
UgqGradeType grade_type = gameQuestData.GradeType;
int beacon_id = gameQuestData.BeaconId;
var result = new Result();
if (gameQuestData.QuestScriptMetas.Count == 0)
{
var err_msg = $"gameQuestData QuestsScript Metas count zero QuestId : {gameQuestData.QuestId}, revision : {gameQuestData.Revision}";
result.setFail(ServerErrorCode.UgqQuestMetaNotExist, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
var quest_script_metas = convertQuestMeta2ScrioptMeta(gameQuestData.QuestScriptMetas);
var ugq_quest_type = QuestHelper.convertQuestContentStateToUgqStateType(gameQuestData.State);
MetaData.Instance.makeQuestBaseInfo(quest_script_metas, ref quest_base_info, ref setTaskIdx,
(UInt32)gameQuestData.QuestId,
EQuestType.UGQ.ToString(),
true,
EAssignType.NONE.ToString(),
ERequirementQuestType.None.ToString(),
0,
OncePeriodRangeType.Nolimit,
false,
true,
getUgqRewardGroupIdByGrade(grade_type, beacon_id),
string.Empty,
string.Empty,
ugq_quest_type,
(UInt32)gameQuestData.Revision
);
//Log.getLogger().info($"base_info : {JsonConvert.SerializeObject(quest_base_info)}");
return (new(), quest_base_info);
}
private static bool isWorldBeacon(int beaconId)
{
if (beaconId > 0)
{
return true;
}
else return false;
}
/*
* ugq api 서버 테스트 및 디버깅이 어려워 우선 meta 정보 받아오고 나서 groupId셋팅 처리
* 추후 다시 리팩토링 필요
*/
private static int getUgqRewardGroupIdByGrade(UgqGradeType gradeType, int beaconId)
{
bool is_world_beacon = isWorldBeacon(beaconId);
if (is_world_beacon)
{
switch (gradeType)
{
case UgqGradeType.Amature:
return MetaHelper.GameConfigMeta.WorldBeaconAmateurUGQReward;
case UgqGradeType.RisingStar:
return MetaHelper.GameConfigMeta.WorldBeaconRisingstarUGQReward;
case UgqGradeType.Master1:
return MetaHelper.GameConfigMeta.WorldBeaconMasterOneUGQReward;
case UgqGradeType.Master2:
return MetaHelper.GameConfigMeta.WorldBeaconMasterTwoUGQReward;
case UgqGradeType.Master3:
return MetaHelper.GameConfigMeta.WorldBeaconMasterThreeUGQReward;
default:
Log.getLogger().error($"{gradeType} type not exist in getUgqRewardGroupIdByGrade");
return 0;
}
}
else
{
switch (gradeType)
{
case UgqGradeType.Amature:
return MetaHelper.GameConfigMeta.NormalBeaconAmateurUGQReward;
case UgqGradeType.RisingStar:
return MetaHelper.GameConfigMeta.NormalBeaconRisingstarUGQReward;
case UgqGradeType.Master1:
return MetaHelper.GameConfigMeta.NormalBeaconMasterOneUGQReward;
case UgqGradeType.Master2:
return MetaHelper.GameConfigMeta.NormalBeaconMasterTwoUGQReward;
case UgqGradeType.Master3:
return MetaHelper.GameConfigMeta.NormalBeaconMasterThreeUGQReward;
default:
Log.getLogger().error($"{gradeType} type not exist in getUgqRewardGroupIdByGrade");
return 0;
}
}
}
public static List<QuestScriptMetaData> convertQuestMeta2ScrioptMeta(List<QuestMetaInfo> questMetaInfos)
{
List<QuestScriptMetaData> metas = new();
(var quest_id, var quest_revision) = QuestHelper.convertUgqQuestIdToQuestIdAndRevision(questMetaInfos[0].ComposedQuestId);
foreach (var quest_meta in questMetaInfos)
{
QuestScriptMetaDataMutable script_mutable = new();
script_mutable.QuestId = quest_id;
script_mutable.Index = quest_meta.Index;
script_mutable.EventTarget = quest_meta.EventTarget;
script_mutable.Event = quest_meta.EventName;
script_mutable.EventCondition1 = quest_meta.EventCondition1;
script_mutable.EventCondition2 = quest_meta.EventCondition2;
script_mutable.EventCondition3 = quest_meta.EventCondition3;
script_mutable.FunctionTarget = quest_meta.FunctionTarget;
script_mutable.Function = quest_meta.FunctionName;
script_mutable.FunctionCondition1 = quest_meta.FunctionCondition1;
script_mutable.FunctionCondition2 = quest_meta.FunctionCondition2;
script_mutable.FunctionCondition3 = quest_meta.FunctionCondition3;
QuestScriptMetaData script_meta = new(script_mutable);
metas.Add(script_meta);
}
return metas;
}
public static async Task<(Result, GameQuestDataEntity?)> loadLiveGameQuestGameDataEntity(Player player, UInt32 questId, UInt32 questRevision)
{
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
NullReferenceCheckHelper.throwIfNull(ugq_api_manager, () => $"ugq_api_manager is null - {player.toBasicString()}");
var lang_type = player.getLanguageType();
var func = new Func<string, UInt32, UInt32, LanguageType, Task<(Result, GameQuestDataEntity?)>>(ugq_api_manager.getUgqQuestData);
return await loadGameQuestDataEntity(player, questId, questRevision, func);
}
public static async Task<(Result, GameQuestDataEntity?)> loadTestGameQuestGameDataEntity(Player player, UInt32 questId, UInt32 questRevision)
{
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
NullReferenceCheckHelper.throwIfNull(ugq_api_manager, () => $"ugq_api_manager is null - {player.toBasicString()}");
var lang_type = player.getLanguageType();
var func = new Func<string, UInt32, UInt32, LanguageType, Task<(Result, GameQuestDataEntity?)>>(ugq_api_manager.getUgqTestQuestData);
return await loadGameQuestDataEntity(player, questId, questRevision, func);
}
public static async Task<(Result, GameQuestDataEntity?)> loadGameQuestDataEntity(Player player, UInt32 questId, UInt32 questRevision, Func<string, UInt32, UInt32, LanguageType, Task<(Result, GameQuestDataEntity?)>> func)
{
// 1. ugq api 서버에서 데이터 호출
(var result, var game_quest_data) = await func(player.getUserGuid(), questId, questRevision, player.getLanguageType());
if (result.isFail())
{
return (result, null);
}
if (game_quest_data == null || game_quest_data.QuestScriptMetas.Count == 0 || game_quest_data.UgqGameQuestDataForClientString == string.Empty)
{
var err_msg = $"GameQuestDataEntity NotExist questId : {questId} - questRevision L {questRevision}";
result.setFail(ServerErrorCode.UgqQuestMetaNotExist, err_msg);
Log.getLogger().error(err_msg);
return (result, null);
}
// 2. string -> UgqGameQuestDataForClient 로 전환및 gradeType, stateType 적용
var ugq_game_quest_data_for_client = Newtonsoft.Json.JsonConvert.DeserializeObject<UgqGameQuestDataForClient>(game_quest_data.UgqGameQuestDataForClientString);
if (ugq_game_quest_data_for_client is null)
{
var err_msg = $"GameQuestDataEntity NotExist questId : {questId} - questRevision L {questRevision}";
result.setFail(ServerErrorCode.UgqQuestMetaNotExist, err_msg);
Log.getLogger().error(err_msg);
return (result, null);
}
game_quest_data.UgqGameQuestDataForClient = ugq_game_quest_data_for_client;
game_quest_data.UgqGameQuestDataForClient.UgqGradeType = game_quest_data.GradeType;
game_quest_data.UgqGameQuestDataForClient.UgqStateType = QuestHelper.convertQuestContentStateToUgqStateType(game_quest_data.State);
// 3. IsShowNpcLocation 값 신규 추가 됐으나, 추가되기전 데이터에는 반영이 안되어 있어서 임시로 반영 처리
if (false == game_quest_data.UgqGameQuestDataForClientString.Contains("IsShowNpcLocation"))
{
foreach (var task in game_quest_data.UgqGameQuestDataForClient.Task)
{
task.IsShowNpcLocation = BoolType.True;
}
}
// 4. shutdown 체크
if (game_quest_data.Shutdown == true) game_quest_data.UgqGameQuestDataForClient.UgqStateType = UgqStateType.Shutdown;
game_quest_data.UgqGameQuestDataForClientString = string.Empty;
return (result, game_quest_data);
}
public static (Int32, Int32) getUgqDailyRewardMaxCountByGrade(UgqGradeType grade)
{
switch (grade)
{
case UgqGradeType.Amature:
return (MetaHelper.GameConfigMeta.UgqAmateurBonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldAmateur);
case UgqGradeType.RisingStar:
return (MetaHelper.GameConfigMeta.UgqRisingStarBonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldRisingStar);
case UgqGradeType.Master1:
return (MetaHelper.GameConfigMeta.UgqMaster1BonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldMaster1);
case UgqGradeType.Master2:
return (MetaHelper.GameConfigMeta.UgqMaster2BonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldMaster2);
case UgqGradeType.Master3:
return (MetaHelper.GameConfigMeta.UgqMaster3BonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldMaster3);
default:
return (MetaHelper.GameConfigMeta.UgqAmateurBonusCount, MetaHelper.GameConfigMeta.UgqBonusGoldAmateur);
}
}
public static CurrencyType getUgqUsageFeeType(UgqGradeType grade)
{
switch (grade)
{
case UgqGradeType.Amature:
return EnumHelper.convertEnumValueStringToEnum<CurrencyType>(MetaHelper.GameConfigMeta.UgqUsageFeeTypeAmateur, CurrencyType.Sapphire);
case UgqGradeType.RisingStar:
return EnumHelper.convertEnumValueStringToEnum<CurrencyType>(MetaHelper.GameConfigMeta.UgqUsageFeeTypeRisingStar, CurrencyType.Ruby);
case UgqGradeType.Master1:
return EnumHelper.convertEnumValueStringToEnum<CurrencyType>(MetaHelper.GameConfigMeta.UgqUsageFeeTypeMaster1, CurrencyType.Sapphire);
case UgqGradeType.Master2:
return EnumHelper.convertEnumValueStringToEnum<CurrencyType>(MetaHelper.GameConfigMeta.UgqUsageFeeTypeMaster2, CurrencyType.Sapphire);
case UgqGradeType.Master3:
return EnumHelper.convertEnumValueStringToEnum<CurrencyType>(MetaHelper.GameConfigMeta.UgqUsageFeeTypeMaster3, CurrencyType.Sapphire);
default:
return CurrencyType.Sapphire;
}
}
public static int getUgqCost(UgqGradeType gradeType)
{
switch (gradeType)
{
case UgqGradeType.Amature:
return MetaHelper.GameConfigMeta.UgqUsageFeeAmateur;
case UgqGradeType.RisingStar:
return MetaHelper.GameConfigMeta.UgqUsageFeeRisingStar;
case UgqGradeType.Master1:
return MetaHelper.GameConfigMeta.UgqUsageFeeMaster1;
case UgqGradeType.Master2:
return MetaHelper.GameConfigMeta.UgqUsageFeeMaster2;
case UgqGradeType.Master3:
return MetaHelper.GameConfigMeta.UgqUsageFeeMaster3;
default:
return 0;
}
}
}