Files
2025-05-01 07:20:41 +09:00

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;
}
}
}
}