using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.Concurrent; using System.Numerics; using Newtonsoft.Json; using Nettention.Proud; using StackExchange.Redis; using Pipelines.Sockets.Unofficial.Buffers; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; 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 ITEM_GUID = System.String; namespace GameServer; public partial class Player : UserBase, IEntityWithSession, IMergeWithInventory, IInitNotifyPacket { private readonly CancellationTokenSource m_cts = new(); private readonly List<(ClientToGame packet, bool isNotifyBroadcast)> notifyPackets = new(); public Player(NetClientInfo netClient) : base(EntityType.Player, netClient) { } public override async Task onInit() { //===================================================================================== // User Domain Attribute //===================================================================================== addEntityAttribute(new UserAttribute(this)); addEntityAttribute(new NicknameAttribute(this)); addEntityAttribute(new LevelAttribute(this)); addEntityAttribute(new MoneyAttribute(this)); addEntityAttribute(new LocationAttribute(this)); addEntityAttribute(new BuffAttribute(this)); addEntityAttribute(new GameOptionAttribute(this)); addEntityAttribute(new CharacterProfileAttribute(this)); addEntityAttribute(new MailProfileAttribute(this)); addEntityAttribute(new CraftHelpAttribute(this)); addEntityAttribute(new PartyInvitePartyRecvsAttribute(this)); addEntityAttribute(new FriendFolderAttribute(this)); addEntityAttribute(new RepeatQuestAttribute(this)); addEntityAttribute(new EscapePositionAttribute(this)); addEntityAttribute(new SeasonPassAttribute(this)); addEntityAttribute(new UserContentsSettingAttribute(this)); addEntityAttribute(new PackageLastOrderRecodeAttribute(this)); addEntityAttribute(new AiChatAttribute(this)); addEntityAttribute(new UgqDailyRewardCountAttribute(this)); addEntityAttribute(new RentalInstanceVisitAttribute(this)); addEntityAttribute(new DailyQuestCheckAttribute(this));//legacy addEntityAttribute(new SwitchingPropAttribute(this)); addEntityAttribute(new QuestPeriodRepeatCheckAttribute(this)); //===================================================================================== // Game Domain Attribute //===================================================================================== addEntityAttribute(new CaliumAttribute(this)); //===================================================================================== // User Domain Action //===================================================================================== addEntityAction(new PlayerAction(this)); addEntityAction(new AbilityAction(this)); addEntityAction(new NicknameAction(this)); addEntityAction(new LocationAction(this)); addEntityAction(new MoneyAction(this)); addEntityAction(new UserContentsSettingAction(this)); //===================================================================================== // Inventory 관련 Action //===================================================================================== addEntityAction(new UserInventoryAction(this)); //===================================================================================== // Item 관리적인 Action //===================================================================================== addEntityAction(new ItemBuyAction(this)); addEntityAction(new ItemClothAction(this)); addEntityAction(new ItemToolAction(this)); addEntityAction(new ItemTattooAction(this)); addEntityAction(new RandomBoxItemUseAction(this)); //===================================================================================== // GameZone Domain Action //===================================================================================== addEntityAction(new GameZoneAction(this)); addEntityAction(new GameZoneMoveAction(this)); // room 관련 action addEntityAction(new RoomAction(this)); // shop 관련 action addEntityAction(new ShopAction(this)); // Party 관련 action addEntityAction(new PersonalPartyAction(this)); addEntityAction(new PartyInvitePartyRecvAction(this)); addEntityAction(new FriendAgentAction(this)); addEntityAction(new FriendFolderAction(this)); addEntityAction(new SendFriendRequestAction(this)); addEntityAction(new FriendInviteMyhomeAction(this)); addEntityAction(new FriendReplyInviteMyhomeAction(this)); addEntityAction(new ReplyReceivedFriendRequestAction(this)); addEntityAction(new KickFriendsFromMyHomeAction(this)); addEntityAction(new BlockUserAgentAction(this)); addEntityAction(new QuestAction(this)); addEntityAction(new QuestCheatAction(this)); addEntityAction(new RepeatQuestAction(this)); addEntityAction(new EndQuestAction(this)); addEntityAction(new QuestAcceptAction(this)); addEntityAction(new QuestMailAction(this)); addEntityAction(new QuestRefuseAction(this)); addEntityAction(new QuestAbandonAction(this)); addEntityAction(new QuestTaskUpdateAction(this)); addEntityAction(new QuestRewardAction(this)); addEntityAction(new QuestNPCDialogueAction(this)); addEntityAction(new ClaimAction(this)); addEntityAction(new ClaimRewardAction(this)); addEntityAction(new UgqInfoAction(this)); addEntityAction(new UgqAssignAction(this)); addEntityAction(new UgqTestAction(this)); addEntityAction(new UgqAbortAction(this)); addEntityAction(new UgqRewardAction(this)); addEntityAction(new SwitchingPropAction(this)); addEntityAction(new OwnedBuildingAgentAction(this)); addEntityAction(new OwnedLandAgentAction(this)); addEntityAction(new MyhomeAgentAction(this)); addEntityAction(new RentalAgentAction(this)); addEntityAction(new UserSocialActionExecutorAction(this)); addEntityAction(new MinimapMarkerAgentAction(this)); addEntityAction(new ItemFirstPurchaseHistoryAgentAction(this)); addEntityAction(new SearchNicknameAction(this)); addEntityAction(new ChatAction(this)); addEntityAction(new CharacterProfileAction(this)); addEntityAction(new ChannelAction(this)); addEntityAction(new CartAction(this)); addEntityAction(new BuffAction(this)); addEntityAction(new GameOptionAction(this)); addEntityAction(new LanguageAction(this)); addEntityAction(new MailAction(this)); addEntityAction(new StateAction(this)); addEntityAction(new UserReportAction(this)); addEntityAction(new EscapeAction(this)); addEntityAction(new PackageAction(this)); addEntityAction(new CraftAction(this)); addEntityAction(new CraftHelpAction(this)); addEntityAction(new CraftRecipeAction(this)); addEntityAction(new SeasonPassAction(this)); addEntityAction(new RentalVisitAction(this)); addEntityAction(new P2PDataAction(this)); addEntityAction(new BeaconShopAction(this)); //===================================================================================== // AI Chat 관련 Action //===================================================================================== addEntityAction(new AIChatAction(this)); //===================================================================================== // Task Reservation 관련 Action //===================================================================================== addEntityAction(new TaskReservationAction(this)); //===================================================================================== // Npc 상호작용 Action //===================================================================================== addEntityAction(new NpcInteractionAction(this)); //===================================================================================== // Ugc Npc 관련 Action //===================================================================================== addEntityAction(new UgcNpcCreationOrLoadAction(this)); //===================================================================================== // Farming 관련 Action //===================================================================================== addEntityAction(new FarmingAction(this)); //===================================================================================== // Game LogInOut 관련 Action //===================================================================================== addEntityAction(new GameLoginAction(this)); addEntityAction(new GameLogoutAction(this)); //===================================================================================== // User Create or Load 관련 Action //===================================================================================== addEntityAction(new UserCreateOrLoadAction(this)); //===================================================================================== // Custom Ui or Data 관련 Action //===================================================================================== addEntityAction(new CustomDefinedUiAction(this)); //===================================================================================== // Calium 관련 Action //===================================================================================== addEntityAction(new CaliumConverterAction(this)); addEntityAction(new CaliumExchangerAction(this)); //===================================================================================== // AI Chat 관련 Action //===================================================================================== //===================================================================================== // 랜드 경매 관련 Action //===================================================================================== addEntityAction(new UserLandAuctionAction(this)); return await base.onInit(); } public async Task onResetUser() { foreach(var each in getEntityAttributes()) { var to_clear_attribute = each.Value; var account_attribute = to_clear_attribute as AccountAttribute; if (null != account_attribute) { continue; } var user_attribute = to_clear_attribute as UserAttribute; if (null != user_attribute) { continue; } to_clear_attribute.onClear(); } foreach (var each in getEntityActions()) { var to_clear_action = each.Value; to_clear_action.onClear(); } await Task.CompletedTask; } // override IMergeWithInventory public async Task onMerge(List reservedSlotOnInvens, TransactionRunner transactionRunner) { ArgumentNullReferenceCheckHelper.throwIfNull(reservedSlotOnInvens, () => $"reservedSlotOnInvens is null !!! - {toBasicString()}"); ArgumentNullReferenceCheckHelper.throwIfNull(transactionRunner, () => $"transactionRunner is null !!! - {toBasicString()}"); var result = new Result(); var inventory_action = getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {toBasicString()}"); result = await inventory_action.onMergeInventory(reservedSlotOnInvens, transactionRunner); if(result.isFail()) { return result; } return result; } public void addNotifyMessage(ClientToGame message, bool isNotifyBroadcast) { notifyPackets.Add((message, isNotifyBroadcast)); } public void InitNotifyMessage() { notifyPackets.Clear(); } public void sendNotifyMessage() { foreach ((ClientToGame packet, bool isNotifyBroadcast) notifyInfo in notifyPackets) { if (notifyInfo.isNotifyBroadcast == true) { var game_zone_action = this.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {toBasicString()}"); game_zone_action.broadcast(this, notifyInfo.packet); } else { if (false == GameServerApp.getServerLogic().onSendPacket(this, notifyInfo.packet)) { continue; } } } } public override TAction getEntityAction() { if (typeof(TAction) == typeof(InventoryActionBase)) { var inventory_action = base.getEntityAction() as TAction; NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!!"); return inventory_action; } else if (typeof(TAction) == typeof(SocialActionLoadAction)) { var social_action = base.getEntityAction() as TAction; NullReferenceCheckHelper.throwIfNull(social_action, () => $"social_action is null !!!"); return social_action; } var action = base.getEntityAction(); NullReferenceCheckHelper.throwIfNull(action, () => $"action is null !!!"); return action; } public override Type onGetAvailableItemAttributeType() { return typeof(UserItemAttribute); } public override OWNER_GUID onGetGuidOfOwnerEntityType() { var user_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {toBasicString()}"); return user_attribute.UserGuid; } public bool sendPacket(ClientToGame msg) { return GameServerApp.getServerLogic().onSendPacket(this, msg); } public bool hasOtpForServerConnect() { var account_attribute = getEntityAttribute(); if (null == account_attribute) { return false; } if (0 >= account_attribute.OtpForServerConnect.Length) { return false; } return true; } public CancellationTokenSource getCancelToken() => m_cts; public override string onGetDbGuid() { return getUserGuid(); } public CommonResult? getCommonResult() { var err_msg = string.Empty; var found_transaction_runner = findTransactionRunner(TransactionIdType.PrivateContents); if (null == found_transaction_runner) { err_msg = $"Not found TransactionRunner !!! : {toBasicString()}"; Log.getLogger().error(err_msg); return null; } return found_transaction_runner.getCommonResult(); } public override ILogActor toLogActor() { var user_actor_log = base.toLogActor() as UserActorLog; ArgumentNullReferenceCheckHelper.throwIfNull(user_actor_log, () => $"user_actor_log is null !!!"); var nickname_attribute = getEntityAttribute(); if(null != nickname_attribute) { user_actor_log.UserNickname = nickname_attribute.Nickname; } return user_actor_log; } public override string toSummaryString() { var server_logic = GameServerApp.getServerLogic(); var public_ip = server_logic.getProudNetListener().getNetServer().getNetClientPublicIp(this.getHostId()); var account_attribute = getOriginEntityAttribute(); return toBasicString() + $"accountCreationType:{account_attribute?.AccountCreationType}, authAdminLevelType:{account_attribute?.AuthAdminLevelType}, publicIp:{public_ip}, {base.toSummaryString()}"; } }