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 WORLD_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 ITEM_GUID = System.String; using ENTITY_UNIQUE_ID = System.String; using ANCHOR_META_GUID = System.String; using NPC_UNIQUE_ID = System.String; using FARMING_ENTITY_GUID = System.String; using LOCATION_UNIQUE_ID = System.String; namespace ServerCommon { public class FarmingEffectAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { [JsonProperty] public ANCHOR_META_GUID AnchorMetaGuid { get; set; } = string.Empty; [JsonProperty] public LOCATION_UNIQUE_ID LocationUniqueId { get; set; } = string.Empty; [JsonProperty] public META_ID FarmingPropMetaId { get; set; } = 0; // 파밍 효과를 요청한 OwnerEntityType.User [JsonProperty] public OwnerEntityType OwnerEntityType { get; set; } = OwnerEntityType.None; // 파밍 효과를 요청한 OwnerEntityType.User GUID [JsonProperty] public OWNER_GUID OwnerGuid { get; set; } = string.Empty; [JsonProperty] public FarmingSummonedEntityType FarmingSummonedEntityType { get; set; } = FarmingSummonedEntityType.None; // FarmingSummonedEntityType.User: UserGuid, FarmingSummonedEntityType.Beacon: UgcNpcMetaGuid: [JsonProperty] public FARMING_ENTITY_GUID FarmingEntityGuid { get; set; } = string.Empty; [JsonProperty] public FarmingStateType FarmingState { get; set; } = FarmingStateType.None; [JsonProperty] public Int16 FarmingActionReqTryCount { get; set; } = 0; [JsonProperty] public Int16 CompletedRewardCount { get; set; } = 0; public DateTime FarmingLastUpdateTime { get; set; } = DateTimeHelper.MinTime; [JsonProperty] public DateTime FarmingStartTime { get; set; } = DateTimeHelper.MinTime; [JsonProperty] public DateTime FarmingEndTime { get; set; } = DateTimeHelper.MinTime; public DateTime FarmingRespawnTime { get; set; } = DateTimeHelper.MinTime; public FarmingEffectAttribute(EntityBase owner, EntityBase entityOfOwnerEntityType) : base(owner, entityOfOwnerEntityType) { OwnerEntityType = entityOfOwnerEntityType.onGetOwnerEntityType(); OwnerGuid = entityOfOwnerEntityType.onGetGuidOfOwnerEntityType(); FarmingState = FarmingStateType.StandBy; } public async Task<(Result, EntityHelper.MasterProfile?)> getMasterProfile() where TMasterEntity : EntityBase { var owner = getOwner(); var root_parent = owner.getRootParent(); var server_logic = ServerLogicApp.getServerLogicApp(); var server_config = server_logic.getServerConfig(); var dynamo_db_client = server_logic.getDynamoDbClient(); var table_name = ServerBase.DynamoDbDefine.TableNames.Main; var result = new Result(); var err_msg = string.Empty; (result, var master_profile) = EntityHelper.getMasterProfile(root_parent); if (result.isFail()) { err_msg = $"Failed to EntityHelper.getMasterProfile() !!! : {result.toBasicString()} - {owner.toBasicString()}"; Log.getLogger().debug(err_msg); if(OwnerEntityType.User != OwnerEntityType) { err_msg = $"Invalid OwnerEntityType !!! : OwnerEntityType.User == OwnerEntityType - {owner.toBasicString()}"; result.setFail(ServerErrorCode.OwnerEntityTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } if (true == OwnerGuid.isNullOrWhiteSpace()) { err_msg = $"Invalid OwnerGuid !!! : OwnerGuid:{OwnerGuid} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.OwnerGuidInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } (result, var found_nickname_attrib) = await dynamo_db_client.simpleQueryDocTypeToAttrib(table_name, OwnerGuid); if (result.isFail()) { return (result, null); } NullReferenceCheckHelper.throwIfNull(found_nickname_attrib, () => $"found_nickname_attrib in null !!! - {owner.toBasicString()}"); master_profile = new EntityHelper.MasterProfile(); master_profile.MasterGuid = OwnerGuid; master_profile.MasterNickname = found_nickname_attrib.Nickname; } return (result, master_profile); } public override void newEntityAttribute() { base.newEntityAttribute(); } public override void onClear() { AnchorMetaGuid = string.Empty; LocationUniqueId = string.Empty; FarmingPropMetaId = 0; OwnerEntityType = OwnerEntityType.None; OwnerGuid = string.Empty; FarmingSummonedEntityType = FarmingSummonedEntityType.None; FarmingEntityGuid = string.Empty; FarmingState = FarmingStateType.None; FarmingActionReqTryCount = 0; CompletedRewardCount = 0; FarmingLastUpdateTime = DateTimeHelper.MinTime; FarmingStartTime = DateTimeHelper.MinTime; FarmingEndTime = DateTimeHelper.MinTime; FarmingRespawnTime = DateTimeHelper.MinTime; getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var owner = getOwner(); var entity_of_owner_entity_type = getEntityOfOwnerEntityType(); NullReferenceCheckHelper.throwIfNull(entity_of_owner_entity_type, () => $"entity_of_owner_entity_type is null !!! - {owner.toBasicString()}"); var cloned = new FarmingEffectAttribute(getOwner(), entity_of_owner_entity_type); cloned.deepCopyFromBase(this); cloned.AnchorMetaGuid = AnchorMetaGuid; cloned.LocationUniqueId = LocationUniqueId; cloned.FarmingPropMetaId = FarmingPropMetaId; cloned.OwnerEntityType = OwnerEntityType; cloned.OwnerGuid = OwnerGuid; cloned.FarmingSummonedEntityType = FarmingSummonedEntityType; cloned.FarmingEntityGuid = FarmingEntityGuid; cloned.FarmingState = FarmingState; cloned.FarmingActionReqTryCount = FarmingActionReqTryCount; cloned.CompletedRewardCount = CompletedRewardCount; cloned.FarmingLastUpdateTime = FarmingLastUpdateTime; cloned.FarmingStartTime = FarmingStartTime; cloned.FarmingEndTime = FarmingEndTime; cloned.FarmingRespawnTime = FarmingRespawnTime; return cloned; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new FarmingEffectAttributeTransactor(getOwner()); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var owner = getOwner(); //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as FarmingEffectDoc; if (null == try_pending_doc) { var to_copy_doc = new FarmingEffectDoc( AnchorMetaGuid, LocationUniqueId , FarmingPropMetaId , FarmingSummonedEntityType, FarmingEntityGuid , FarmingState , FarmingActionReqTryCount , FarmingStartTime, FarmingEndTime); 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_farming_effect_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(to_copy_doc_farming_effect_attrib, () => $"to_copy_doc_farming_effect_attrib is null !!! - {owner.toBasicString()}"); to_copy_doc_farming_effect_attrib.AnchorMetaGuid = AnchorMetaGuid; to_copy_doc_farming_effect_attrib.LocationUniqueId = LocationUniqueId; to_copy_doc_farming_effect_attrib.FarmingPropMetaId = FarmingPropMetaId; to_copy_doc_farming_effect_attrib.FarmingSummonedEntityType = FarmingSummonedEntityType; to_copy_doc_farming_effect_attrib.FarmingEntityGuid = FarmingEntityGuid; to_copy_doc_farming_effect_attrib.FarmingState = FarmingState; to_copy_doc_farming_effect_attrib.FarmingActionReqTryCount = FarmingActionReqTryCount; to_copy_doc_farming_effect_attrib.CompletedRewardCount = CompletedRewardCount; to_copy_doc_farming_effect_attrib.FarmingLastUpdateTime = FarmingLastUpdateTime; to_copy_doc_farming_effect_attrib.FarmingStartTime = FarmingStartTime; to_copy_doc_farming_effect_attrib.FarmingEndTime = FarmingEndTime; to_copy_doc_farming_effect_attrib.FarmingRespawnTime = FarmingRespawnTime; 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(); 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_farming_effect_attribute = otherEntityAttribute as FarmingEffectAttribute; if (null == other_farming_effect_attribute) { err_msg = $"Failed to cast FarmingEffectAttribute !!!, other_farming_effect_attribute is null - {owner.toBasicString()}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } AnchorMetaGuid = other_farming_effect_attribute.AnchorMetaGuid; LocationUniqueId = other_farming_effect_attribute.LocationUniqueId; FarmingPropMetaId = other_farming_effect_attribute.FarmingPropMetaId; OwnerEntityType = other_farming_effect_attribute.OwnerEntityType; OwnerGuid = other_farming_effect_attribute.OwnerGuid; FarmingSummonedEntityType = other_farming_effect_attribute.FarmingSummonedEntityType; FarmingEntityGuid = other_farming_effect_attribute.FarmingEntityGuid; FarmingState = other_farming_effect_attribute.FarmingState; FarmingActionReqTryCount = other_farming_effect_attribute.FarmingActionReqTryCount; CompletedRewardCount = other_farming_effect_attribute.CompletedRewardCount; FarmingLastUpdateTime = other_farming_effect_attribute.FarmingLastUpdateTime; FarmingStartTime = other_farming_effect_attribute.FarmingStartTime; FarmingEndTime = other_farming_effect_attribute.FarmingEndTime; FarmingRespawnTime = other_farming_effect_attribute.FarmingRespawnTime; //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = other_farming_effect_attribute.getTryPendingDocBase() as FarmingEffectDoc; if (null != try_pending_doc) { other_farming_effect_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var farming_effect_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!! - {owner.toBasicString()}"); farming_effect_attrib.AnchorMetaGuid = AnchorMetaGuid; farming_effect_attrib.LocationUniqueId = LocationUniqueId; farming_effect_attrib.FarmingPropMetaId = FarmingPropMetaId; farming_effect_attrib.FarmingSummonedEntityType = FarmingSummonedEntityType; farming_effect_attrib.FarmingEntityGuid = FarmingEntityGuid; farming_effect_attrib.FarmingState = FarmingState; farming_effect_attrib.FarmingActionReqTryCount = FarmingActionReqTryCount; farming_effect_attrib.CompletedRewardCount = CompletedRewardCount; farming_effect_attrib.FarmingLastUpdateTime = FarmingLastUpdateTime; farming_effect_attrib.FarmingStartTime = FarmingStartTime; farming_effect_attrib.FarmingEndTime = FarmingEndTime; farming_effect_attrib.FarmingRespawnTime = FarmingRespawnTime; return result; } public bool copyEntityAttributeFromDoc(DynamoDbDocBase? docBase) { var err_msg = string.Empty; var owner = getOwner(); var to_cast_string = typeof(FarmingEffectDoc).Name; var farming_effect_doc = docBase as FarmingEffectDoc; if (null == farming_effect_doc) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, farming_effect_doc is null :{to_cast_string} - {owner.toBasicString}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(farming_effect_doc); //===================================================================================== // Doc => Attribute //===================================================================================== var farming_effect_attrib = farming_effect_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!! - {owner.toBasicString()}"); AnchorMetaGuid = farming_effect_attrib.AnchorMetaGuid; LocationUniqueId = farming_effect_attrib.LocationUniqueId; FarmingPropMetaId = farming_effect_attrib.FarmingPropMetaId; FarmingSummonedEntityType = farming_effect_attrib.FarmingSummonedEntityType; FarmingEntityGuid = farming_effect_attrib.FarmingEntityGuid; FarmingState = farming_effect_attrib.FarmingState; FarmingActionReqTryCount = farming_effect_attrib.FarmingActionReqTryCount; CompletedRewardCount = farming_effect_attrib.CompletedRewardCount; FarmingLastUpdateTime = farming_effect_attrib.FarmingLastUpdateTime; FarmingStartTime = farming_effect_attrib.FarmingStartTime; FarmingEndTime = farming_effect_attrib.FarmingEndTime; FarmingRespawnTime = farming_effect_attrib.FarmingRespawnTime; return true; } } public class FarmingEffectAttributeTransactor : EntityAttributeTransactorBase { public FarmingEffectAttributeTransactor(EntityBase owner) : base(owner) { } } }