Files
caliverse_server/ServerCommon/Entity/Attribute/UgcNpcAttribute.cs
2025-05-01 07:20:41 +09:00

423 lines
17 KiB
C#

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<META_ID> HabitSocialActionMetaIds { get; set; } = new List<META_ID>();
[JsonProperty]
public List<META_ID> DialogueSocialActionMetaIds { get; set; } = new List<META_ID>() { 110054 };
[JsonProperty]
public META_ID BodyItemMetaId { get; set; } = 0;
[JsonProperty]
public List<META_ID> 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<UgcNpcAttribute>();
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<UgcNpcAttrib>();
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<UgcNpcAttribute>(try_pending_doc);
}
var origin_doc_base = getOriginDocBase<UgcNpcAttribute>();
if (null == origin_doc_base)
{
// DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!!
return result;
}
var ugc_npc_attrib = origin_doc_base.getAttrib<UgcNpcAttrib>();
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<UgcNpcAttribute>(ugc_npc_doc);
var doc_ugc_npc_attrib = ugc_npc_doc.getAttrib<UgcNpcAttrib>();
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<UgcNpcAttribute>
{
public UgcNpcAttributeTransactor(EntityBase owner)
: base(owner)
{
}
}
}