fix: Uses client bug to make addon containers work (#776)
* Fixes tooltip for container furniture so it works. This doesn't work on ClassicUO. * Fixes double click opening container furniture by double clicking the addon component. * Fixes the context menu not showing up sometimes on the addon piece. Note: You cannot drop anything into the addon component since it might be far away and it is not a real container. There is no easy fix for this without building an entire custom container class for addons or changing how items drag/drop entirely. Requires closing/opening container gumps as it switches from one component to another that shares the same content. Also requires sharing tooltips, invalidated properties, process delta changes, etc. Not worth the effort. <img width="444" alt="Screen_Shot_2021-09-12_at_4 27 28_PM" src="https://user-images.githubusercontent.com/3953314/133011752-c5b54cf2-2c7b-45c0-882d-0365ef62e686.png">
This commit is contained in:
parent
52dacec68f
commit
c5e35c9b69
8 changed files with 104 additions and 86 deletions
|
|
@ -1,5 +1,8 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.Collections.Generic;
|
||||
using Server.ContextMenus;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
|
|
@ -19,11 +22,11 @@ namespace Server.Items
|
|||
|
||||
[SerializableField(0)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
public BaseAddonContainer _addon;
|
||||
private BaseAddonContainer _addon;
|
||||
|
||||
[SerializableField(1)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
public Point3D _offset;
|
||||
private Point3D _offset;
|
||||
|
||||
[Hue]
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
|
|
@ -65,9 +68,6 @@ namespace Server.Items
|
|||
}
|
||||
}
|
||||
|
||||
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list) =>
|
||||
_addon?.GetContextMenuEntries(from, list);
|
||||
|
||||
public override void OnMapChange()
|
||||
{
|
||||
if (_addon != null)
|
||||
|
|
@ -76,6 +76,11 @@ namespace Server.Items
|
|||
}
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list) => _addon?.GetProperties(list);
|
||||
|
||||
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list) =>
|
||||
_addon?.GetContextMenuEntries(from, list);
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
base.OnAfterDelete();
|
||||
|
|
@ -83,6 +88,17 @@ namespace Server.Items
|
|||
_addon?.Delete();
|
||||
}
|
||||
|
||||
public override void SendWorldPacketTo(NetState ns, ReadOnlySpan<byte> world = default)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength].InitializePacket();
|
||||
var length = OutgoingItemPackets.CreateWorldItem(buffer, this);
|
||||
// Use an itemid of a real container
|
||||
BinaryPrimitives.WriteUInt16BigEndian(buffer[7..9], (ushort)(_addon?.ItemID ?? 0x9AB));
|
||||
ns.Send(buffer[..length]);
|
||||
|
||||
base.SendWorldPacketTo(ns, world);
|
||||
}
|
||||
|
||||
[AfterDeserialization]
|
||||
private void AfterDeserialization()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue