252 lines
11 KiB
C#
252 lines
11 KiB
C#
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<PlayerAction>();
|
|
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<UgcNpcAction>();
|
|
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<UgcNpcAction>();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|