Files
caliverse_server/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcAction.cs
2025-05-01 07:23:28 +09:00

949 lines
43 KiB
C#

using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameRes.Types;
using static ServerMessage.Types;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
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 UGC_NPC_META_GUID = System.String;
using ITEM_GUID = System.String;
using INSTANCE_GUID = System.String;
namespace GameServer;
public class UgcNpcAction : EntityActionBase
{
private Map? m_map_nullable;
private bool m_is_counting_as_add_connected_user = false;
public UgcNpcAction(UgcNpc owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
return await Task.FromResult(new Result());
}
public override void onClear()
{
}
public async Task<Result> createByUgcNpcDocWithMaster(UgcNpcDoc ugcNpcDoc, Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List<DynamoDbDocBase>() { ugcNpcDoc });
if (result.isFail())
{
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{ugc_npc_attribute.getTypeName()}, from:{ugcNpcDoc.getTypeName()} : {result.toBasicString()} - {owner.toBasicString()}, {master.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = await ensureUgcNpcBasicDocs();
if (result.isFail())
{
err_msg = $"Failed to ensureUgcNpcBasicDoc() !!! : {result.toBasicString()} - {owner.toBasicString()}, {master.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
private async Task<Result> ensureUgcNpcBasicDocs()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var dynamo_db_client = server_logic.getDynamoDbClient();
{
// UgcNpcNicknameRegistryDoc이 등록이 안되어 있는 경우 등록 한다. - kangms
var ugc_npc_nickname_registry_doc = new UgcNpcNicknameRegistryDoc(OwnerEntityType.User, ugc_npc_attribute.OwnerGuid, ugc_npc_attribute.Nickname, ugc_npc_attribute.UgcNpcMetaGuid);
var ugc_npc_nickname_registry_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(ugc_npc_nickname_registry_doc.getPK(), ugc_npc_nickname_registry_doc.getSK());
(var query_result, var ugc_npc_nickname_registry_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcNicknameRegistryDoc>(ugc_npc_nickname_registry_query_config);
if (ugc_npc_nickname_registry_docs.Count == 0)
{
query_result = await ugc_npc_nickname_registry_doc.newDoc4Query();
if(query_result.isFail())
{
err_msg = $"Failed to newDoc4Query() !!!, {ugc_npc_nickname_registry_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
query_result = await dynamo_db_client.simpleUpsertDocumentWithDocType(ugc_npc_nickname_registry_doc);
if (query_result.isFail())
{
err_msg = $"Failed to simpleUpsertDocumentWithDocType() !!!, {ugc_npc_nickname_registry_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
}
}
{
// UgcNpcLikeSelecteeCountDoc 등록이 안되어 있는 경우 등록 한다. - kangms
var selectee_count_doc = new UgcNpcLikeSelecteeCountDoc(OwnerEntityType.UgcNpc, ugc_npc_attribute.UgcNpcMetaGuid);
var selectee_count_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(selectee_count_doc.getPK(), selectee_count_doc.getSK());
(var query_result, var npc_like_selectee_count_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcLikeSelecteeCountDoc>(selectee_count_query_config);
if (npc_like_selectee_count_docs.Count == 0)
{
query_result = await selectee_count_doc.newDoc4Query();
if (query_result.isFail())
{
err_msg = $"Failed to newDoc4Query() !!!, {selectee_count_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
query_result = await dynamo_db_client.simpleUpsertDocumentWithDocType(selectee_count_doc);
if (query_result.isFail())
{
err_msg = $"Failed to simpleUpsertDocumentWithDocType() !!!, {selectee_count_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
}
}
return result;
}
public async Task<Result> createByUgcNpcDoc(UgcNpcDoc ugcNpcDoc)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List<DynamoDbDocBase>() { ugcNpcDoc });
if (result.isFail())
{
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{ugc_npc_attribute.getTypeName()}, from:{ugcNpcDoc.getTypeName()} - {owner.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
public async Task<(Result, ItemDoc?)> createItemDocByTransferOwnerFromUserItem(UserItemAttribute userItemAttribute)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(userItemAttribute, () => $"userItemAttribute is null !!! - {owner.toBasicStringWithMaster()}");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
var item_doc = new ItemDoc(OwnerEntityType.UgcNpc, ugc_npc_attribute.UgcNpcMetaGuid, userItemAttribute.ItemGuid);
result = await ServerBase.DataCopyHelper.copyDocFromEntityAttributes(item_doc, new List<EntityAttributeBase>() { userItemAttribute });
if (result.isFail())
{
err_msg = $"Failed to copyDocFromEntityAttributes() !!!, to:{item_doc.getTypeName()}, from:{userItemAttribute.getTypeName()} - {owner.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityAttributeCopyToDynamoDbDocFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
return (result, item_doc);
}
public async Task<Result> tryTakableItemFromUser( List<ITEM_GUID> materialItemGuids, Dictionary<Int32, BoolType> tattooSlotVisibles
, Dictionary<InvenEquipType, HashSet<Int16>> reservedSlotTypes
, Player master )
{
await Task.CompletedTask;
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(materialItemGuids, () => $"materialItems is null !!! - {master.toBasicString()}");
ArgumentNullReferenceCheckHelper.throwIfNull(tattooSlotVisibles, () => $"tattooSlotVisibles is null !!! - {master.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
var user_inventory_action = master.getEntityAction<UserInventoryAction>();
NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {master.toBasicString()}");
var ugc_npc_inventory_action = ugc_npc.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {master.toBasicString()}");
//=====================================================================================
// 1. 재료 아이템 소유 관계 변경 : User => UgcNpc
//=====================================================================================
foreach (var material_item_guid in materialItemGuids)
{
var found_item = user_inventory_action.tryGetItemByItemGuid(material_item_guid);
NullReferenceCheckHelper.throwIfNull(found_item, () => $"found_item is null !!! - {master.toBasicString()}");
var item_meta = found_item.getItemMeta();
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {master.toBasicString()}");
var backup_item_attribute = found_item.getClonedEntityAttribute<UserItemAttribute>();
NullReferenceCheckHelper.throwIfNull(backup_item_attribute, () => $"backup_item_attribute is null !!! - {master.toBasicString()}");
(result, var deleted_item) = await user_inventory_action.tryDeleteItemByGuid(material_item_guid);
if (result.isFail())
{
return result;
}
(result, ItemDoc? to_create_item_doc_of_ugc_npc) = await backup_item_attribute.changeOwnerAndCreateItemDoc(OwnerEntityType.UgcNpc, ugc_npc.getUgcNpcMetaGuid());
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(to_create_item_doc_of_ugc_npc, () => $"to_create_item_doc_of_ugc_npc is null !!! - {master.toBasicString()}");
(result, var equipable_slot) = ugc_npc_inventory_action.getEquipableSlotOfEquipInven(item_meta, reservedSlotTypes);
if (result.isFail())
{
return result;
}
(result, _) = await ugc_npc_inventory_action.tryTakableToBagWithEquip(to_create_item_doc_of_ugc_npc, equipable_slot);
if (result.isFail())
{
return result;
}
}
//=====================================================================================
// 2. 타투 아이템 보이기/안보이기 설정
//=====================================================================================
var tattoo_inven = ugc_npc_inventory_action.getEquipInvens()[InvenEquipType.Tattoo] as TattooEquipInven;
NullReferenceCheckHelper.throwIfNull(tattoo_inven, () => $"tattoo_inven is null !!! - {master.toBasicString()}");
foreach (var each in tattooSlotVisibles)
{
var slot_index = each.Key;
var slot_visible = each.Value;
if (false == InvenEquipType.Tattoo.isEquipableTattooSlotType((TattooSlotType)slot_index, ugc_npc.getEntityType()))
{
err_msg = $"Not found TattooSlotType !!! : slotType:{slot_index} - {toBasicString()}, {master.toBasicString()}";
result.setFail(ServerErrorCode.TattooEquipRuleTattooSlotTypeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var custom_defined_ui_action = ugc_npc.getEntityAction<CustomDefinedUiAction>();
NullReferenceCheckHelper.throwIfNull(custom_defined_ui_action, () => $"custom_defined_ui_action is null !!! - {toBasicString()}, {master.toBasicString()}");
var tattoo_slot = (TattooSlotType)slot_index;
result = await custom_defined_ui_action.setTattooVisible(tattoo_slot, (slot_visible == BoolType.True ? true : false));
if(result.isFail())
{
return result;
}
}
return result;
}
public async Task<Result> tryRegisterCharacterWithAiChatServer(Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
var ai_chat_action = master.getEntityAction<AIChatAction>();
NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if(true == ugc_npc_attribute.IsRegisteredAiChatServer)
{
err_msg = $"Already registered UgcNpc to AiChatServer !!! : ugcNpcMetaGuid:{ugc_npc_attribute.UgcNpcMetaGuid}, ugcNpcNickname:{ugc_npc_attribute.Nickname}, "
+ $" - {owner?.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
result = await ai_chat_action.registerCharacter(toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.registerCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
ugc_npc_attribute.IsRegisteredAiChatServer = true;
ugc_npc_attribute.modifiedEntityAttribute();
(result, var ugc_npc_doc) = await ugc_npc_attribute.toDocBase();
if (result.isFail() || null == ugc_npc_doc)
{
return result;
}
var dynamo_db_client = server_logic.getDynamoDbClient();
NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - {owner?.toBasicStringWithMaster()}");
result = await dynamo_db_client.simpleUpdateDocumentWithDocType(ugc_npc_doc);
if (result.isFail())
{
err_msg = $"Failed to DynamoDbClient.simpleUpdateDocumentWithDocType() !!! : {result.toBasicString()} - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<Result> tryUpdateCharacterWithAiChatServer(Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
var ugc_npc_action = owner.getEntityAction<UgcNpcAction>();
ArgumentNullException.ThrowIfNull(ugc_npc_action, $"ugc_npc_action is null !!! - {owner.toBasicStringWithMaster()}");
var ai_chat_action = master.getEntityAction<AIChatAction>();
NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if (false == ugc_npc_attribute.IsRegisteredAiChatServer)
{
err_msg = $"Not registered UgcNpc at AiChatServer !!! : ugcNpcMetaGuid:{ugc_npc_attribute.UgcNpcMetaGuid}, ugcNpcNickname:{ugc_npc_attribute.Nickname}, "
+ $" - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
result = await ai_chat_action.registerCharacter(ugc_npc_action.toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.registerCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
}
result = await ai_chat_action.updateCharacter(ugc_npc_action.toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.updateCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
ugc_npc_attribute.IsRegisteredAiChatServer = true;
ugc_npc_attribute.modifiedEntityAttribute();
(result, var ugc_npc_doc) = await ugc_npc_attribute.toDocBase();
if (result.isFail() || null == ugc_npc_doc)
{
return result;
}
var dynamo_db_client = server_logic.getDynamoDbClient();
NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - {owner?.toBasicStringWithMaster()}");
result = await dynamo_db_client.simpleUpdateDocumentWithDocType(ugc_npc_doc);
if (result.isFail())
{
err_msg = $"Failed to DynamoDbClient.simpleUpdateDocumentWithDocType() !!! : {result.toBasicString()} - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<(Result, UgcNpc?)> tryDelete()
{
var owner = getOwner();
var result = new Result();
// UgcNpcDoc 제거 하기
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_attribute.deleteEntityAttribute();
// 보유중인 모든 ItemDoc 제거 하기
var ugc_npc_inventory_action = owner.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {owner.toBasicStringWithMaster()}");
var bag_inven = ugc_npc_inventory_action.getBagInven();
NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {owner.toBasicStringWithMaster()}");
(result, _) = await ugc_npc_inventory_action.tryDeleteItemAll();
if(result.isFail())
{
return (result, null);
}
return (result, owner as UgcNpc);
}
public bool isEqualUgcNpc(string toCheckUgcNpcNickname)
{
var owner = getOwner();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if (ugc_npc_attribute.Nickname == toCheckUgcNpcNickname)
{
return true;
}
return false;
}
public bool isLocatedUgcNpc()
{
var owner = getOwner();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if(EntityStateType.None == ugc_npc_attribute.State)
{
return false;
}
return true;
}
public async Task<Result> tryLocateInGameZone(Map toLocateMap, INSTANCE_GUID instanceGuid = "")
{
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var result = new Result();
var err_msg = string.Empty;
if (true == isLinkedToMap())
{
var curr_map = getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {ugc_npc.toBasicStringWithMaster()}");
err_msg = $"Entity is linked to Map !!! : currMap:{curr_map.toBasicString()} - InstanceGuid:{instanceGuid}, {ugc_npc.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityLinkedToMap, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var linked_map = setLinkToMap(toLocateMap);
result = await linked_map.tryLocateUgcNpc(ugc_npc);
if(result.isFail())
{
return result;
}
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {ugc_npc.toBasicStringWithMaster()}");
ugc_npc_attribute.LocatedInstanceGuid = instanceGuid;
ugc_npc_attribute.LocatedInstanceMetaId = (UInt32)linked_map.MapMId;
return result;
}
public async Task<Result> tryRemoveInGameZone()
{
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var result = new Result();
var err_msg = string.Empty;
if (false == isLinkedToMap())
{
err_msg = $"Enity not linked to Map !!! - {ugc_npc.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityNotLinkedToMap, err_msg);
return result;
}
var linked_to_map = getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(linked_to_map, () => $"linked_to_map is null !!! - {ugc_npc.toBasicStringWithMaster()}");
result = await linked_to_map.tryRemoveUgcNpc(ugc_npc);
if(result.isFail())
{
return result;
}
unlinkToMap();
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {ugc_npc.toBasicStringWithMaster()}");
ugc_npc_attribute.LocatedInstanceGuid = string.Empty;
ugc_npc_attribute.LocatedInstanceMetaId = 0;
return result;
}
public bool isLinkedToMap()
{
if (null != m_map_nullable)
{
return true;
}
return false;
}
private void unlinkToMap()
{
m_map_nullable = null;
}
private Map setLinkToMap(Map toLinkMap)
{
var owner = getOwner();
m_map_nullable = toLinkMap;
return m_map_nullable;
}
public Map? getLinkedToMap()
{
return m_map_nullable;
}
public void modifyStateInfo(EntityStateType entityStateType, EntityPos currPos, string anchorMetaGuid = "", META_ID metaId = 0, bool isApplyDb = true)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.State = entityStateType;
ugc_npc_attribute.AnchorMetaGuid = anchorMetaGuid;
ugc_npc_attribute.MetaIdOfEntityStateType = metaId;
ugc_npc_attribute.setCurrentPos(currPos);
if (true == isApplyDb)
{
ugc_npc_attribute.modifiedEntityAttribute();
}
}
public void resetPos(bool isApplyDb = true)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.State = EntityStateType.None;
ugc_npc_attribute.AnchorMetaGuid = string.Empty;
ugc_npc_attribute.MetaIdOfEntityStateType = 0;
ugc_npc_attribute.setCurrentPos(new EntityPos());
ugc_npc_attribute.LocatedInstanceGuid = string.Empty;
ugc_npc_attribute.LocatedInstanceMetaId = 0;
if (true == isApplyDb)
{
ugc_npc_attribute.modifiedEntityAttribute();
}
}
public void updateUgcNpcCompact(GS2MQS_NTF_BEACON_COMPACT_SYNC ugcNpcCompactSync)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(ugcNpcCompactSync, () => $"ugcNpcCompactSync is null !!! - {owner.toBasicString()}");
var ugc_npc_compact = ugcNpcCompactSync.UgcNpcCompact;
ArgumentNullReferenceCheckHelper.throwIfNull(ugc_npc_compact, () => $"ugc_npc_compact is null !!! - {owner.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
var ugc_npc_attribute_origin = owner.getOriginEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute_origin, () => $"ugc_npc_attribute_origin is null !!! - {owner.toBasicString()}");
var entity_state_info = ugc_npc_compact.EntityStateInfo;
NullReferenceCheckHelper.throwIfNull(entity_state_info, () => $"entity_state_info is null !!! - {owner.toBasicString()}");
var state_type = ugc_npc_compact.EntityStateInfo.StateType;
var anchor_meta_guid = ugc_npc_compact.EntityStateInfo.AnchorMetaGuid;
var meta_id = (UInt32)ugc_npc_compact.EntityStateInfo.MetaIdOfStateType;
var curr_pos = EntityStateType.None == state_type ? new EntityPos() : ugc_npc_attribute.getCurrentPos();
modifyStateInfo(ugc_npc_compact.EntityStateInfo.StateType, curr_pos, anchor_meta_guid, meta_id, false);
var located_instance_context = ugc_npc_compact.LocatedInstanceContext;
NullReferenceCheckHelper.throwIfNull(located_instance_context, () => $"located_instance_context is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.LocatedInstanceGuid = ugcNpcCompactSync.LocatedInstanceGuid;
ugc_npc_attribute.LocatedInstanceMetaId = (UInt32)located_instance_context.LocatedinstanceMetaId;
ugc_npc_attribute_origin.onMerge(ugc_npc_attribute);
}
public EntityPos makeToLocatePosition( System.Numerics.Vector3 basePos, System.Numerics.Vector3 baseRotation
, System.Numerics.Vector3 deltaPos, float deltaAngle )
{
// X축, Y축 Z축에 대한 회전을 순차적으로 적용
var rotated_vector = MapHelper.applyRotation(deltaPos, baseRotation);
var rotated_vector_with_unreal = new System.Numerics.Vector3(rotated_vector.Y, rotated_vector.X, rotated_vector.Z);
// 새로운 위치 계산
var new_position = basePos + rotated_vector_with_unreal;
EntityPos current_pos = new EntityPos();
current_pos.X = new_position.X;
current_pos.Y = new_position.Y;
current_pos.Z = new_position.Z;
current_pos.FacingAngle = baseRotation.Y + deltaAngle;
return current_pos;
}
public EntityPos makeToLocatePosition( System.Numerics.Vector3 basePos, double pitch, double yaw, double roll
, System.Numerics.Vector3 deltaPos, double deltaAngle )
{
// X축, Y축 Z축 <=> Pitch, Yaw, Roll 적용
//var euler_vector = MapHelper.applyRotationFromYawPitchRoll(deltaPos, (float)yaw, (float)pitch, (float)roll);
//var rotated_vector_with_unreal = new System.Numerics.Vector3(euler_vector.Y, euler_vector.X, euler_vector.Z);
var euler_vector = MapHelper.applyRotationFromYawPitchRoll(deltaPos, (float)pitch, (float)roll, (float)yaw);
var rotated_vector_with_unreal = euler_vector;
// 새로운 위치 계산
var new_position = basePos + rotated_vector_with_unreal;
EntityPos current_pos = new EntityPos();
current_pos.X = new_position.X;
current_pos.Y = new_position.Y;
current_pos.Z = new_position.Z;
current_pos.FacingAngle = (float)(yaw + deltaAngle);
return current_pos;
}
public EntityStateType getCurrentEntityStateType()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
return ugc_npc_attribute.State;
}
public AIChatRegisterCharacter toRegisterInfoWithAiChatServer()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
EGenderType gender = EGenderType.MALE;
if (MetaData.Instance._ItemTable.TryGetValue((int)ugc_npc_attribute.BodyItemMetaId, out var item_meta_data) == true)
{
gender = item_meta_data.Gender;
if(gender == EGenderType.ALL)
gender = EGenderType.MALE;
}
var to_register_ai_chat_server = new AIChatRegisterCharacter();
to_register_ai_chat_server.guid = ugc_npc_attribute.UgcNpcMetaGuid;
to_register_ai_chat_server.ownerUserGuid = ugc_npc_attribute.OwnerGuid;
to_register_ai_chat_server.lang = ugc_npc_attribute.LanguageType.ToString().ToLower();
to_register_ai_chat_server.name = ugc_npc_attribute.Nickname;
to_register_ai_chat_server.persona = UgcNpcHelper.toPersonaWithJsonString(ugc_npc_attribute.WorldScenario, ugc_npc_attribute.Description);
to_register_ai_chat_server.firstMes = ugc_npc_attribute.Greeting;
to_register_ai_chat_server.shortDesc = ugc_npc_attribute.Introduction;
to_register_ai_chat_server.tags = ugc_npc_attribute.HashTagMetaIds;
to_register_ai_chat_server.isOfficial = false;
to_register_ai_chat_server.socialActionConfig = UgcNpcHelper.toSocialActionConfigWithAIChatServer( ugc_npc_attribute.DefaultSocialActionMetaId, ugc_npc_attribute.HabitSocialActionMetaIds );
to_register_ai_chat_server.attributes.gender = (int)gender;
return to_register_ai_chat_server;
}
public bool isCountingAsAddConnectedUser() => m_is_counting_as_add_connected_user;
public void setCountingAsConnectedUser(bool isCounting) => m_is_counting_as_add_connected_user = isCounting;
public EntityPos getCurrentPos()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
return ugc_npc_attribute.getCurrentPos();
}
public UgcNpcEntity toUgcNpcEntity()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_entity = new UgcNpcEntity();
ugc_npc_entity.EntityInstantGuid = owner.getUgcNpcMetaGuid();
ugc_npc_entity.CurrentPos = ugc_npc_attribute.getCurrentPos().toPos();
ugc_npc_entity.UgcNpcAppearance = toUgcNpcAppearancec();
return ugc_npc_entity;
}
public UgcNpcSummary toUgcNpcSummary()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_beacon_shop_action = owner.getEntityAction<UgcNpcBeaconShopAction>();
var ugc_summary = new UgcNpcSummary();
ugc_summary.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_summary.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_summary.Title = ugc_npc_attribute.Title;
ugc_summary.Nickname = ugc_npc_attribute.Nickname;
ugc_summary.Greeting = ugc_npc_attribute.Greeting;
ugc_summary.Introduction = ugc_npc_attribute.Introduction;
ugc_summary.Abilities = ability_action.toAbilityInfo();
ugc_summary.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
ugc_summary.HashTagMetaIds.Add(ugc_npc_attribute.HashTagMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
ugc_summary.Description = ugc_npc_attribute.Description;
ugc_summary.WorldScenario = ugc_npc_attribute.WorldScenario;
ugc_summary.DefaultSocialActionId = (Int32)ugc_npc_attribute.DefaultSocialActionMetaId;
ugc_summary.HabitSocialActionIds.AddRange(ugc_npc_attribute.HabitSocialActionMetaIds.ConvertAll<Int32>(Convert.ToInt32));
ugc_summary.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.ConvertAll<Int32>(Convert.ToInt32));
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_summary.EntityStateInfo = entity_state_info;
var located_instance_context = new LocatedInstanceContext();
ugc_summary.LocatedInstanceContext = located_instance_context;
located_instance_context.LocatedinstanceMetaId = (Int32)ugc_npc_attribute.LocatedInstanceMetaId;
var appearance_customize_action = owner.getEntityAction<BeaconAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {owner.toBasicStringWithMaster()}");
ugc_summary.AppearCustomize = appearance_customize_action.toAppearanceCustomization();
var ugc_npc_origin_doc = ugc_npc_attribute.getOriginDocBase<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_origin_doc, () => $"ugc_npc_origin_doc is null !!! - {owner.toBasicStringWithMaster()}");
ugc_summary.CreatedTime = ugc_npc_origin_doc.getCreatedDateTime().ProcessedTime.ToTimestamp();
ugc_summary.HasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem() == true ? BoolType.True : BoolType.False;
ugc_summary.HasReceivePayment = BoolType.False;
var masterEntity = owner.onGetMasterEntity();
if (masterEntity != null)
{
var beacon_shop_action = masterEntity.getEntityAction<BeaconShopAction>();
if (beacon_shop_action != null)
ugc_summary.HasReceivePayment = beacon_shop_action.getBeaconShopNumOfReceiptNotReceived(ugc_summary.UgcNpcMetaGuid) == 0 ? BoolType.False : BoolType.True;
}
return ugc_summary;
}
public UgcNpcInteraction toUgcNpcInteraction(BoolType isCheckLikeFlag)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_interaction = new UgcNpcInteraction();
ugc_npc_interaction.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_interaction.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_interaction.IsCheckLikeFlag = isCheckLikeFlag;
return ugc_npc_interaction;
}
public UgcNpcAppearance toUgcNpcAppearancec()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_beacon_shop_action = owner.getEntityAction<UgcNpcBeaconShopAction>();
var ugc_npc_appearance = new UgcNpcAppearance();
ugc_npc_appearance.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_appearance.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_appearance.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
ugc_npc_appearance.Title = ugc_npc_attribute.Title;
ugc_npc_appearance.Nickname = ugc_npc_attribute.Nickname;
ugc_npc_appearance.Abilities = ability_action.toAbilityInfo();
ugc_npc_appearance.HasItems = toUgcNpcItems();
ugc_npc_appearance.DefaultSocialActionId = (Int32)ugc_npc_attribute.DefaultSocialActionMetaId;
ugc_npc_appearance.HabitSocialActionIds.AddRange(ugc_npc_attribute.HabitSocialActionMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
ugc_npc_appearance.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
var appearance_customize_action = owner.getEntityAction<BeaconAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_appearance.AppearCustomize = appearance_customize_action.toAppearanceCustomization();
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_npc_appearance.EntityStateInfo = entity_state_info;
ugc_npc_appearance.HasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem() == true ? BoolType.True : BoolType.False;
return ugc_npc_appearance;
}
public UgcNpcCompact toUgcNpcCompact()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_compact = new UgcNpcCompact();
ugc_npc_compact.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_compact.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_compact.Title = ugc_npc_attribute.Title;
ugc_npc_compact.Nickname = ugc_npc_attribute.Nickname;
ugc_npc_compact.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_npc_compact.EntityStateInfo = entity_state_info;
var located_instance_context = new LocatedInstanceContext();
ugc_npc_compact.LocatedInstanceContext = located_instance_context;
located_instance_context.LocatedinstanceMetaId = (Int32)ugc_npc_attribute.LocatedInstanceMetaId;
var ugc_npc_origin_doc = ugc_npc_attribute.getOriginDocBase<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_origin_doc, () => $"ugc_npc_origin_doc is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_compact.CreatedTime = ugc_npc_origin_doc.getCreatedDateTime().ProcessedTime.ToTimestamp();
return ugc_npc_compact;
}
public UgcNpcItems toUgcNpcItems()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_inventory_action = owner.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_items = new UgcNpcItems();
ugc_npc_items.HasItems.Add(ugc_npc_inventory_action.toItemAll4Client().toMapField());
ugc_npc_items.HasTattooInfos.Add(ugc_npc_inventory_action.toTattooAll4Client().toMapField());
return ugc_npc_items;
}
}