using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; using SESSION_ID = System.Int32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using NPC_UNIQUE_ID = System.String; using UGC_NPC_META_GUID = System.String; using ITEM_GUID = System.String; using ENTITY_INSTANCE_GUID = System.String; namespace GameServer { public static class NpcHelper { public static async Task<(Result, EntityBase?, EntityBase?)> findNpc(EntityType targetNpcType, NPC_UNIQUE_ID npcUniqueId, USER_GUID ownerGuid) { var result = new Result(); var err_msg = string.Empty; switch(targetNpcType) { case EntityType.UgcNpc: case EntityType.Beacon: (result, var found_ugc_npc, var found_master) = await findUgcNpc(npcUniqueId, ownerGuid); if(result.isSuccess()) { return (result, found_ugc_npc, found_master); } break; default: err_msg = $"Invalid EntityType of Npc !!! : targetNpcType:{targetNpcType}, npcUniqueId:{npcUniqueId}, ownerGuid:{ownerGuid}"; result.setFail(ServerErrorCode.EntityTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); break; } return (result, null, null); } public static async Task<(Result, UgcNpc?, Player?)> findUgcNpc(NPC_UNIQUE_ID npcUniqueId, USER_GUID ownerGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! : npcUniqueId:{npcUniqueId}, ownerGuid:{ownerGuid}"); var player_manager = server_logic.getPlayerManager(); NullReferenceCheckHelper.throwIfNull(player_manager, () => $"player_manager is null !!! : npcUniqueId:{npcUniqueId}, ownerGuid:{ownerGuid}"); UgcNpc? found_ugc_npc = null; // 플레이어가 접속 상태인지 조회 한다. !!! if(true == player_manager.tryGetUserByPrimaryKey(ownerGuid, out var found_player)) { var player_action = found_player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! : npcUniqueId:{npcUniqueId}, ownerGuid:{ownerGuid}"); found_ugc_npc = player_action.findUgcNpc(npcUniqueId); return (result, found_ugc_npc, found_player); } if(null == found_ugc_npc) { // 채널 및 던전에 있는지 조회 한다. !!! found_ugc_npc = server_logic.findUgcNpcInGameZone(npcUniqueId); if(null != found_ugc_npc) { return (result, found_ugc_npc, found_player); } } err_msg = $"Not found UgcNpc !!! : npcUniqueId:{npcUniqueId}, ownerGuid:{ownerGuid}"; result.setFail(ServerErrorCode.UgcNpcNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return await Task.FromResult<(Result, UgcNpc?, Player?)>((result, null, null)); } public static UgcNpc? findUgcNpcInGameZone(this GameServerLogic gameServerLogic, UGC_NPC_META_GUID ugcNpcMetaGuid) { if(gameServerLogic.getServerType().toServerType() == ServerType.Channel) { return gameServerLogic.getMap().findUgcNpc(ugcNpcMetaGuid); } else { foreach(var each in InstanceRoomManager.Instance.getInstanceRooms()) { var room_key = each.Key; var instance_room = each.Value; var found_ugc_npc = instance_room.getMap().findUgcNpc(ugcNpcMetaGuid); if(null != found_ugc_npc) { return found_ugc_npc; } } } return null; } public static async Task<(Result, EntityBase?)> findInstanceNpc(EntityType targetNpcType, ENTITY_INSTANCE_GUID entityInstanceGuid) { var result = new Result(); var err_msg = string.Empty; switch (targetNpcType) { case EntityType.UgcNpc: case EntityType.Beacon: (result, var found_ugc_npc) = await findInstanceUgcNpc(entityInstanceGuid); if (result.isSuccess()) { return (result, found_ugc_npc); } break; default: err_msg = $"Invalid EntityType of Npc !!! : targetNpcType:{targetNpcType}, entityInstanceGuid:{entityInstanceGuid}"; result.setFail(ServerErrorCode.EntityTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); break; } return (result, null); } public static async Task<(Result, UgcNpc?)> findInstanceUgcNpc(ENTITY_INSTANCE_GUID entityInstanceGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! : entityInstanceGuid:{entityInstanceGuid}"); var player_manager = server_logic.getPlayerManager(); NullReferenceCheckHelper.throwIfNull(player_manager, () => $"player_manager is null !!! : entityInstanceGuid:{entityInstanceGuid}"); UgcNpc? found_ugc_npc = null; // 채널 및 던전에 있는지 조회 한다. !!! found_ugc_npc = server_logic.findUgcNpcInGameZone(entityInstanceGuid); if (null != found_ugc_npc) { return (result, found_ugc_npc); } err_msg = $"Not found UgcNpc !!! : entityInstanceGuid:{entityInstanceGuid}"; result.setFail(ServerErrorCode.UgcNpcNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return await Task.FromResult<(Result, UgcNpc?)>((result, null)); } public static async Task notifyNpcInfo(Player player, EntityType targetNpcType, EntityBase entityNpc) { ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! : targetNpcType:{targetNpcType}"); ArgumentNullReferenceCheckHelper.throwIfNull(entityNpc, () => $"entityNpc is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; switch (targetNpcType) { case EntityType.UgcNpc: case EntityType.Beacon: var ugc_npc = entityNpc as UgcNpc; ArgumentNullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); var ugc_npc_meta_guid = ugc_npc.getUgcNpcMetaGuid(); (result, var like_count) = await UgcNpcHelper.getLikeCountOfUgcNpc(ugc_npc_meta_guid, player); if(result.isFail()) { err_msg = $"Failed to UgcNpcHelper.getLikeCountOfUgcNpc() !!! : {result.toBasicString()}, targetNpcType:{targetNpcType}, ugcNpc:{ugc_npc.toBasicString()}"; Log.getLogger().error(err_msg); } (result, var dialog_count) = await UgcNpcHelper.getDialogCountOfUgcNpc(ugc_npc_meta_guid, player); if (result.isFail()) { err_msg = $"Failed to UgcNpcHelper.getDialogCountOfUgcNpc() !!! : {result.toBasicString()}, targetNpcType:{targetNpcType}, ugcNpc:{ugc_npc.toBasicString()}"; Log.getLogger().error(err_msg); } var ugc_npc_action = ugc_npc.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); UgcNpcNotifyHelper.send_GS2C_NTF_BEACON_DETAIL_INFO(player, ugc_npc_action.toUgcNpcSummary(), like_count, dialog_count); break; default: err_msg = $"Invalid EntityType of Npc !!! : targetNpcType:{targetNpcType}, entityNpc:{entityNpc.toBasicString()}"; result.setFail(ServerErrorCode.EntityTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); break; } } public static async Task notifyNpcInteractionInfo(Player player, EntityType targetNpcType, EntityBase entityNpc) { ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! : targetNpcType:{targetNpcType}"); ArgumentNullReferenceCheckHelper.throwIfNull(entityNpc, () => $"entityNpc is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; switch (targetNpcType) { case EntityType.UgcNpc: case EntityType.Beacon: var ugc_npc = entityNpc as UgcNpc; ArgumentNullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); var ugc_npc_meta_guid = ugc_npc.getUgcNpcMetaGuid(); (result, var is_check_like) = await UgcNpcHelper.getLikeCheckFlagOfUgcNpc(ugc_npc_meta_guid, player); if (result.isFail()) { err_msg = $"Failed to UgcNpcHelper.getLikeCheckFlagOfUgcNpc() !!! : {result.toBasicString()}, targetNpcType:{targetNpcType}, ugcNpc:{ugc_npc.toBasicString()}"; Log.getLogger().error(err_msg); } var ugc_npc_action = ugc_npc.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! : targetNpcType:{targetNpcType} - {player.toBasicString()}"); UgcNpcNotifyHelper.send_GS2C_NTF_BEACON_INTERACTION_INFO(player, ugc_npc, ugc_npc_action.toUgcNpcInteraction(is_check_like)); break; default: err_msg = $"Invalid EntityType of Npc !!! : targetNpcType:{targetNpcType}, entityNpc:{entityNpc.toBasicString()}"; result.setFail(ServerErrorCode.EntityTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); break; } } } }