949 lines
43 KiB
C#
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.hasBeaconShopSoldRecord(ugc_summary.UgcNpcMetaGuid) == true ? BoolType.True : BoolType.False;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|