// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.GameServer.MessageHandler; using MUnique.OpenMU.GameLogic; using MUnique.OpenMU.GameLogic.NPC; using MUnique.OpenMU.GameLogic.PlayerActions; using MUnique.OpenMU.Network.Packets.ClientToServer; /// /// Handler for talk npc request packets. /// internal abstract class TalkNpcHandlerPlugInBase : IPacketHandlerPlugIn { /// public virtual bool IsEncryptionExpected => false; /// public byte Key => TalkToNpcRequest.Code; /// /// Gets the talk NPC action. /// protected abstract TalkNpcAction TalkNpcAction { get; } /// public async ValueTask HandlePacketAsync(Player player, Memory packet) { TalkToNpcRequest message = packet; // ADAMU-CUSTOM: remote NPC ("NPC list" mobile feature). Object id'leri her zaman <= 0x7FFF // (GameMap IdGenerator), o yüzden yüksek bit serbest marker. Set edilmişse alt 15 bit bir // NPC *definition number*'dır — o NPC'nin penceresini konum/harita bağımsız aç. if ((message.NpcId & 0x8000) != 0) { await this.TalkNpcAction.TalkToNpcByNumberAsync(player, (short)(message.NpcId & 0x7FFF)).ConfigureAwait(false); return; } // ADAMU-CUSTOM end if (player.CurrentMap?.GetObject(message.NpcId) is NonPlayerCharacter npc) { await this.TalkNpcAction.TalkToNpcAsync(player, npc).ConfigureAwait(false); } } }