using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; 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 MASTER_GUID = System.String; using static ClientToGameReq.Types; using Amazon.S3.Model; using System.Collections.Concurrent; namespace GameServer { public class UgcNpc : EntityBase, IMergeWithInventory { public UgcNpc(MASTER_GUID masterGuid) : base(EntityType.UgcNpc, masterGuid) { } public override async Task onInit() { addEntityAttribute(new UgcNpcAttribute(this)); addEntityAttribute(new AppearanceCustomizeAttribute(this)); addEntityAttribute(new BeaconShopProfileAttribute(this)); addEntityAction(new UgcNpcAction(this)); addEntityAction(new UgcNpcEditAction(this)); addEntityAction(new AbilityAction(this)); addEntityAction(new UgcNpcInventoryAction(this)); addEntityAction(new ItemClothAction(this)); addEntityAction(new ItemTattooAction(this)); addEntityAction(new BeaconAppearanceCustomizeAction(this)); addEntityAction(new CustomDefinedUiAction(this)); // 현재 GameZoneAction은 Player를 위한 로직으로 작성되어 있다. // 추후 인던 관련 설계가 리펙토링되면 GameZoneAction 역시 계층화 되어야 한다. - kangms addEntityAction(new GameZoneAction(this)); addEntityAction(new FarmingAction(this)); addEntityAction(new UgcNpcBeaconShopAction(this)); return await base.onInit(); } public async Task onMerge(List reservedSlotOnInvens, TransactionRunner transactionRunner) { var result = new Result(); var ugc_inventory_action = getEntityAction(); NullReferenceCheckHelper.throwIfNull(ugc_inventory_action, () => $"ugc_inventory_action is null !!! - {toBasicStringWithMaster()}"); ArgumentNullReferenceCheckHelper.throwIfNull(transactionRunner, () => $"transactionRunner is null !!! - {toBasicStringWithMaster()}"); result = await ugc_inventory_action.onMergeInventory(reservedSlotOnInvens, transactionRunner); if (result.isFail()) { return result; } return result; } public override EntityBase? onGetMasterEntity() { if(false == hasMasterGuid()) { return null; } var err_msg = string.Empty; var master_guid = getMasterGuid(); var server_logc = GameServerApp.getServerLogic(); var player_manager = server_logc.getPlayerManager(); if(false == player_manager.tryGetUserByPrimaryKey(master_guid, out var found_player)) { return null; } return found_player; } public override TAction getEntityAction() { TAction? to_cast_entity_atcion; if (typeof(TAction) == typeof(InventoryActionBase)) { to_cast_entity_atcion = base.getEntityAction() as TAction; NullReferenceCheckHelper.throwIfNull(to_cast_entity_atcion, () => $"to_cast_action is null !!!"); return to_cast_entity_atcion; } to_cast_entity_atcion = base.getEntityAction(); NullReferenceCheckHelper.throwIfNull(to_cast_entity_atcion, () => $"to_cast_entity_atcion is null !!!"); return to_cast_entity_atcion; } public override Type onGetAvailableItemAttributeType() { return typeof(UgcNpcItemAttribute); } public override OWNER_GUID onGetGuidOfOwnerEntityType() { return getMasterGuid(); } public override OwnerEntityType onGetOwnerEntityType() { return OwnerEntityType.User; } public override string onGetDbGuid() { return getUgcNpcMetaGuid(); } public UGC_NPC_META_GUID getUgcNpcMetaGuid() { return getEntityAttributeWithReadOnly()?.UgcNpcMetaGuid ?? string.Empty; } public override string toStateString() { return $"beaconState:{getEntityAttributeWithReadOnly()?.State}" + $", metaIdOfEntityStateType:{getOriginEntityAttribute()?.MetaIdOfEntityStateType}" + $", locatedInstanceGuid:{getOriginEntityAttribute()?.LocatedInstanceGuid}" + $", LocatedInstanceMetaId:{getOriginEntityAttribute()?.LocatedInstanceMetaId}"; } public override string toSummaryString() { return $"beaconState:{getOriginEntityAttribute()?.State}" + $", anchorMetaGuid:{getOriginEntityAttribute()?.AnchorMetaGuid}" + $", metaIdOfEntityStateType:{getOriginEntityAttribute()?.MetaIdOfEntityStateType}" + $", locatedInstanceGuid:{getOriginEntityAttribute()?.LocatedInstanceGuid}" + $", LocatedInstanceMetaId:{getOriginEntityAttribute()?.LocatedInstanceMetaId}" + $", MasterGuid:{getMasterGuid()}, SummonedCount:{getSummenedEntityGuids().Count}"; } public override string toBasicString() { return $"beaconNickname:{getOriginEntityAttribute()?.Nickname}" + $", ugcNpcMetaGuid:{getOriginEntityAttribute()?.UgcNpcMetaGuid}" + $", ownerGuid:{getOriginEntityAttribute()?.OwnerGuid}" + $", ownerEntityType:{getOriginEntityAttribute()?.OwnerEntityType}" + $", {base.toBasicString()}"; } } }