//
// 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);
}
}
}