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 onInit() { return await Task.FromResult(new Result()); } public override void onClear() { } public async Task 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List() { 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 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(); 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(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(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 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List() { 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(); 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() { 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 tryTakableItemFromUser( List materialItemGuids, Dictionary tattooSlotVisibles , Dictionary> 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(); NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {master.toBasicString()}"); var ugc_npc_inventory_action = ugc_npc.getEntityAction(); 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(); 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(); 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 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(); NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}"); var ugc_npc_attribute = owner.getEntityAttribute(); 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 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(); ArgumentNullException.ThrowIfNull(ugc_npc_action, $"ugc_npc_action is null !!! - {owner.toBasicStringWithMaster()}"); var ai_chat_action = master.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}"); var ugc_npc_attribute = owner.getEntityAttribute(); 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); ugc_npc_attribute.deleteEntityAttribute(); // 보유중인 모든 ItemDoc 제거 하기 var ugc_npc_inventory_action = owner.getEntityAction(); 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(); 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(); 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 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(); 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 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(); 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(); 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(); 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}"); var ugc_npc_attribute_origin = owner.getOriginEntityAttribute(); 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(); 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(); 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(); 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(); 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); var ability_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}"); var ugc_npc_beacon_shop_action = owner.getEntityAction(); 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(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(Convert.ToInt32)); ugc_summary.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.ConvertAll(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(); 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(); 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(); 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(); 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); var ability_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}"); var ugc_npc_beacon_shop_action = owner.getEntityAction(); 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(x => (Int32)x).ToList()); ugc_npc_appearance.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.Select(x => (Int32)x).ToList()); var appearance_customize_action = owner.getEntityAction(); 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(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}"); var ability_action = owner.getEntityAction(); 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(); 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(); 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; } }