using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using Newtonsoft.Json; using ServerCore; using ServerBase; using SESSION_ID = System.Int32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using UGC_NPC_META_GUID = System.String; using ITEM_GUID = System.String; using ANCHOR_META_GUID = System.String; namespace ServerCommon { public class UgcNpcAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { [JsonProperty] public UGC_NPC_META_GUID UgcNpcMetaGuid { get; set; } = string.Empty; [JsonProperty] public string Nickname { get; set; } = string.Empty; [JsonProperty] public string Title { get; set; } = string.Empty; [JsonProperty] public string Greeting { get; set; } = string.Empty; [JsonProperty] public string Introduction { get; set; } = string.Empty; [JsonProperty] public string Description { get; set; } = string.Empty; [JsonProperty] public string WorldScenario { get; set; } = string.Empty; [JsonProperty] public META_ID DefaultSocialActionMetaId { get; set; } = 0; [JsonProperty] public List HabitSocialActionMetaIds { get; set; } = new List(); [JsonProperty] public List DialogueSocialActionMetaIds { get; set; } = new List() { 110054 }; [JsonProperty] public META_ID BodyItemMetaId { get; set; } = 0; [JsonProperty] public List HashTagMetaIds { get; set; } = new(); [JsonProperty] public OwnerEntityType OwnerEntityType { get; set; } = OwnerEntityType.None; [JsonProperty] public OWNER_GUID OwnerGuid { get; set; } = string.Empty; [JsonProperty] public LanguageType LanguageType { get; set; } = LanguageType.None; [JsonProperty] public EntityStateType State { get; set; } = EntityStateType.None; [JsonProperty] public ANCHOR_META_GUID AnchorMetaGuid { get; set; } = string.Empty; [JsonProperty] public META_ID MetaIdOfEntityStateType { get; set; } = 0; [JsonProperty] public string LocatedInstanceGuid { get; set; } = string.Empty; [JsonProperty] public META_ID LocatedInstanceMetaId { get; set; } = 0; [JsonProperty] public bool IsRegisteredAiChatServer { get; set; } = false; private EntityPos m_current_pos = new(); public UgcNpcAttribute(EntityBase owner) : base(owner) { } public override void newEntityAttribute() { UgcNpcMetaGuid = System.Guid.NewGuid().ToString("N"); base.newEntityAttribute(); } public override void onClear() { UgcNpcMetaGuid = string.Empty; Nickname = string.Empty; Title = string.Empty; Greeting = string.Empty; Introduction = string.Empty; Description = string.Empty; WorldScenario = string.Empty; DefaultSocialActionMetaId = 0; HabitSocialActionMetaIds.Clear(); DialogueSocialActionMetaIds.Clear(); BodyItemMetaId = 0; HashTagMetaIds.Clear(); OwnerEntityType = OwnerEntityType.None; OwnerGuid = string.Empty; LanguageType = LanguageType.None; AnchorMetaGuid = string.Empty; State = EntityStateType.None; LocatedInstanceGuid = string.Empty; LocatedInstanceMetaId = 0; IsRegisteredAiChatServer = false; m_current_pos = new(); getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var cloned = new UgcNpcAttribute(owner); cloned.deepCopyFromBase(this); cloned.UgcNpcMetaGuid = UgcNpcMetaGuid; cloned.Nickname = Nickname; cloned.Title = Title; cloned.Greeting = Greeting; cloned.Introduction = Introduction; cloned.Description = Description; cloned.WorldScenario = WorldScenario; cloned.DefaultSocialActionMetaId = DefaultSocialActionMetaId; cloned.HabitSocialActionMetaIds = HabitSocialActionMetaIds.Select(x => x).ToList(); cloned.DialogueSocialActionMetaIds = DialogueSocialActionMetaIds.Select(x => x).ToList(); cloned.BodyItemMetaId = BodyItemMetaId; cloned.HashTagMetaIds = HashTagMetaIds.Select(x => x).ToList(); cloned.OwnerEntityType = OwnerEntityType; cloned.OwnerGuid = OwnerGuid; cloned.LanguageType = LanguageType; cloned.State = State; cloned.AnchorMetaGuid = AnchorMetaGuid; cloned.MetaIdOfEntityStateType = MetaIdOfEntityStateType; cloned.LocatedInstanceGuid = LocatedInstanceGuid; cloned.LocatedInstanceMetaId = LocatedInstanceMetaId; cloned.IsRegisteredAiChatServer = IsRegisteredAiChatServer; cloned.m_current_pos = m_current_pos.clone(); return cloned; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new UgcNpcAttributeTransactor(getOwner()); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as UgcNpcDoc; if (null == try_pending_doc) { var to_copy_doc = new UgcNpcDoc(OwnerEntityType, OwnerGuid, UgcNpcMetaGuid); var origin_doc = getOriginDocBase(); if (null != origin_doc) { to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc); } try_pending_doc = to_copy_doc; setTryPendingDocBase(try_pending_doc); } var to_copy_doc_ugc_npc_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(to_copy_doc_ugc_npc_attrib, () => $"to_copy_doc_ugc_npc_attrib is null !!! - {owner.toBasicStringWithMaster()}"); to_copy_doc_ugc_npc_attrib.Nickname = Nickname; to_copy_doc_ugc_npc_attrib.Title = Title; to_copy_doc_ugc_npc_attrib.Greeting = Greeting; to_copy_doc_ugc_npc_attrib.Introduction = Introduction; to_copy_doc_ugc_npc_attrib.Description = Description; to_copy_doc_ugc_npc_attrib.WorldScenario = WorldScenario; to_copy_doc_ugc_npc_attrib.DefaultSocialActionMetaId = DefaultSocialActionMetaId; to_copy_doc_ugc_npc_attrib.HabitSocialActionMetaIds = HabitSocialActionMetaIds.Select(x => x).ToList(); to_copy_doc_ugc_npc_attrib.DialogueSocialActionMetaIds = DialogueSocialActionMetaIds.Select(x => x).ToList(); to_copy_doc_ugc_npc_attrib.BodyItemMetaId = BodyItemMetaId; to_copy_doc_ugc_npc_attrib.HashTagMetaIds = HashTagMetaIds.Select(x => x).ToList(); to_copy_doc_ugc_npc_attrib.OwnerEntityType = OwnerEntityType; to_copy_doc_ugc_npc_attrib.OwnerGuid = OwnerGuid; to_copy_doc_ugc_npc_attrib.LanguageType = LanguageType; to_copy_doc_ugc_npc_attrib.AnchorMetaGuid = AnchorMetaGuid; to_copy_doc_ugc_npc_attrib.MetaIdOfEntityStateType = MetaIdOfEntityStateType; to_copy_doc_ugc_npc_attrib.State = State; to_copy_doc_ugc_npc_attrib.LocatedInstanceGuid = LocatedInstanceGuid; to_copy_doc_ugc_npc_attrib.LocatedInstanceMetaId = LocatedInstanceMetaId; to_copy_doc_ugc_npc_attrib.IsRegisteredAiChatServer = IsRegisteredAiChatServer; if (false == isForQuery) { return (result, try_pending_doc); } //===================================================================================== // Doc QueryType 반영 //===================================================================================== (result, var to_query_doc) = await applyDoc4Query(try_pending_doc); if (result.isFail()) { return (result, null); } return (result, to_query_doc); } public Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); var err_msg = string.Empty; if (null == otherEntityAttribute) { err_msg = $"Invalid Param !!!, otherEntityAttribute is null"; result.setFail(ServerErrorCode.FunctionParamNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } //===================================================================================== // OtherAttribute => Origin Attribute //===================================================================================== var other_ugc_npc_attribute = otherEntityAttribute as UgcNpcAttribute; if (null == other_ugc_npc_attribute) { err_msg = $"Failed to cast ItemAttribute !!!, other_item_attribute is null - {owner.toBasicStringWithMaster()}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } UgcNpcMetaGuid = other_ugc_npc_attribute.UgcNpcMetaGuid; Nickname = other_ugc_npc_attribute.Nickname; Title = other_ugc_npc_attribute.Title; Greeting = other_ugc_npc_attribute.Greeting; Introduction = other_ugc_npc_attribute.Introduction; Description = other_ugc_npc_attribute.Description; WorldScenario = other_ugc_npc_attribute.WorldScenario; DefaultSocialActionMetaId = other_ugc_npc_attribute.DefaultSocialActionMetaId; HabitSocialActionMetaIds = other_ugc_npc_attribute.HabitSocialActionMetaIds.Select(x => x).ToList(); DialogueSocialActionMetaIds = other_ugc_npc_attribute.DialogueSocialActionMetaIds.Select(x => x).ToList(); BodyItemMetaId = other_ugc_npc_attribute.BodyItemMetaId; HashTagMetaIds = other_ugc_npc_attribute.HashTagMetaIds.Select(x => x).ToList(); OwnerEntityType = other_ugc_npc_attribute.OwnerEntityType; OwnerGuid = other_ugc_npc_attribute.OwnerGuid; LanguageType = other_ugc_npc_attribute.LanguageType; State = other_ugc_npc_attribute.State; AnchorMetaGuid = other_ugc_npc_attribute.AnchorMetaGuid; MetaIdOfEntityStateType = other_ugc_npc_attribute.MetaIdOfEntityStateType; LocatedInstanceGuid = other_ugc_npc_attribute.LocatedInstanceGuid; LocatedInstanceMetaId = other_ugc_npc_attribute.LocatedInstanceMetaId; IsRegisteredAiChatServer = other_ugc_npc_attribute.IsRegisteredAiChatServer; m_current_pos = other_ugc_npc_attribute.m_current_pos.clone(); //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = other_ugc_npc_attribute.getTryPendingDocBase() as UgcNpcDoc; if (null != try_pending_doc) { other_ugc_npc_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var ugc_npc_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(ugc_npc_attrib, () => $"ugc_npc_attrib is null !!! - {owner.toBasicString()}"); ugc_npc_attrib.UgcNpcMetaGuid = UgcNpcMetaGuid; ugc_npc_attrib.Nickname = Nickname; ugc_npc_attrib.Title = Title; ugc_npc_attrib.Greeting = Greeting; ugc_npc_attrib.Introduction = Introduction; ugc_npc_attrib.Description = Description; ugc_npc_attrib.WorldScenario = WorldScenario; ugc_npc_attrib.DefaultSocialActionMetaId = DefaultSocialActionMetaId; ugc_npc_attrib.HabitSocialActionMetaIds = HabitSocialActionMetaIds.Select(x => x).ToList(); ugc_npc_attrib.DialogueSocialActionMetaIds = DialogueSocialActionMetaIds.Select(x => x).ToList(); ugc_npc_attrib.BodyItemMetaId = BodyItemMetaId; ugc_npc_attrib.HashTagMetaIds = HashTagMetaIds.Select(x => x).ToList(); ugc_npc_attrib.OwnerEntityType = OwnerEntityType; ugc_npc_attrib.OwnerGuid = OwnerGuid; ugc_npc_attrib.LanguageType = LanguageType; ugc_npc_attrib.State = State; ugc_npc_attrib.AnchorMetaGuid = AnchorMetaGuid; ugc_npc_attrib.MetaIdOfEntityStateType = MetaIdOfEntityStateType; ugc_npc_attrib.LocatedInstanceGuid = LocatedInstanceGuid; ugc_npc_attrib.LocatedInstanceMetaId = LocatedInstanceMetaId; ugc_npc_attrib.IsRegisteredAiChatServer = IsRegisteredAiChatServer; return result; } public bool copyEntityAttributeFromDoc(DynamoDbDocBase? docBase) { var err_msg = string.Empty; var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var to_cast_string = typeof(UgcNpcDoc).Name; var ugc_npc_doc = docBase as UgcNpcDoc; if (null == ugc_npc_doc) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, ugc_npc_doc is null :{to_cast_string} - {owner.toBasicStringWithMaster()}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(ugc_npc_doc); var doc_ugc_npc_attrib = ugc_npc_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(doc_ugc_npc_attrib, () => $"doc_ugc_npc_attrib is null !!! - {owner.toBasicStringWithMaster()}"); UgcNpcMetaGuid = doc_ugc_npc_attrib.UgcNpcMetaGuid; Nickname = doc_ugc_npc_attrib.Nickname; Title = doc_ugc_npc_attrib.Title; Greeting = doc_ugc_npc_attrib.Greeting; Introduction = doc_ugc_npc_attrib.Introduction; Description = doc_ugc_npc_attrib.Description; WorldScenario = doc_ugc_npc_attrib.WorldScenario; DefaultSocialActionMetaId = doc_ugc_npc_attrib.DefaultSocialActionMetaId; HabitSocialActionMetaIds = doc_ugc_npc_attrib.HabitSocialActionMetaIds.Select(x => x).ToList(); DialogueSocialActionMetaIds = doc_ugc_npc_attrib.DialogueSocialActionMetaIds.Select(x => x).ToList(); BodyItemMetaId = doc_ugc_npc_attrib.BodyItemMetaId; HashTagMetaIds = doc_ugc_npc_attrib.HashTagMetaIds.Select(x => x).ToList(); OwnerEntityType = doc_ugc_npc_attrib.OwnerEntityType; OwnerGuid = doc_ugc_npc_attrib.OwnerGuid; LanguageType = doc_ugc_npc_attrib.LanguageType; State = doc_ugc_npc_attrib.State; AnchorMetaGuid = doc_ugc_npc_attrib.AnchorMetaGuid; MetaIdOfEntityStateType = doc_ugc_npc_attrib.MetaIdOfEntityStateType; LocatedInstanceGuid = doc_ugc_npc_attrib.LocatedInstanceGuid; LocatedInstanceMetaId = doc_ugc_npc_attrib.LocatedInstanceMetaId; IsRegisteredAiChatServer = doc_ugc_npc_attrib.IsRegisteredAiChatServer; return true; } public void setCurrentPos(EntityPos pos) => m_current_pos = pos; public EntityPos getCurrentPos() => m_current_pos; public override string toBasicString() { return $"UgcNpcNickname:{Nickname}, UgcNpcMetaGuid:{UgcNpcMetaGuid}"; } } public class UgcNpcAttributeTransactor : EntityAttributeTransactorBase { public UgcNpcAttributeTransactor(EntityBase owner) : base(owner) { } } }