diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index 0419ee42..0ecc2f91 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -35,6 +35,7 @@ TextTranslated, EnterLeave, PlayerEntangle, - DropItem + DropItem, + SocketItem } } \ No newline at end of file diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index fccfc942..e425cc04 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -58,6 +58,7 @@ namespace QSB.Events new EnterLeaveEvent(), new QuantumAuthorityEvent(), new DropItemEvent(), + new SocketItemEvent(), // Conversation/dialogue/exploration new ConversationEvent(), new ConversationStartEndEvent(), diff --git a/QSB/ItemSync/Events/SocketItemEvent.cs b/QSB/ItemSync/Events/SocketItemEvent.cs index d0768ba3..e9cdaefb 100644 --- a/QSB/ItemSync/Events/SocketItemEvent.cs +++ b/QSB/ItemSync/Events/SocketItemEvent.cs @@ -1,6 +1,37 @@ -namespace QSB.ItemSync.Events +using QSB.Events; +using QSB.ItemSync.WorldObjects; +using QSB.Player; +using QSB.Utility; +using QSB.WorldSync; + +namespace QSB.ItemSync.Events { - internal class SocketItemEvent + internal class SocketItemEvent : QSBEvent { + public override QSB.Events.EventType Type => QSB.Events.EventType.SocketItem; + + public override void SetupListener() + => GlobalMessenger.AddListener(EventNames.QSBDropItem, Handler); + + public override void CloseListener() + => GlobalMessenger.RemoveListener(EventNames.QSBDropItem, Handler); + + private void Handler(int socketId, int itemId, bool inserting) + => SendEvent(CreateMessage(socketId, itemId, inserting)); + + private SocketItemMessage CreateMessage(int socketId, int itemId, bool inserting) => new SocketItemMessage + { + AboutId = QSBPlayerManager.LocalPlayerId, + SocketId = socketId, + ItemId = itemId, + Inserting = inserting + }; + + public override void OnReceiveRemote(bool server, SocketItemMessage message) + { + var socketWorldObject = QSBWorldSync.GetWorldFromId(message.SocketId); + var itemWorldObject = QSBWorldSync.GetWorldFromId(message.ItemId); + socketWorldObject.PlaceIntoSocket(itemWorldObject); + } } } diff --git a/QSB/ItemSync/Events/SocketItemMessage.cs b/QSB/ItemSync/Events/SocketItemMessage.cs new file mode 100644 index 00000000..014bc741 --- /dev/null +++ b/QSB/ItemSync/Events/SocketItemMessage.cs @@ -0,0 +1,31 @@ +using QSB.Messaging; +using QSB.SectorSync.WorldObjects; +using QSB.WorldSync; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.ItemSync.Events +{ + public class SocketItemMessage : PlayerMessage + { + public int SocketId { get; set; } + public int ItemId { get; set; } + public bool Inserting { get; set; } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + SocketId = reader.ReadInt32(); + ItemId = reader.ReadInt32(); + Inserting = reader.ReadBoolean(); + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(SocketId); + writer.Write(ItemId); + writer.Write(Inserting); + } + } +} diff --git a/QSB/ItemSync/Patches/ItemPatches.cs b/QSB/ItemSync/Patches/ItemPatches.cs index c2ddde46..15466a32 100644 --- a/QSB/ItemSync/Patches/ItemPatches.cs +++ b/QSB/ItemSync/Patches/ItemPatches.cs @@ -25,7 +25,6 @@ namespace QSB.ItemSync.Patches public static bool ItemTool_SocketItem(OWItem ____heldItem, OWItemSocket socket) { - DebugLog.DebugWrite($"Socket item {____heldItem.name} into socket {socket.name}."); var objectId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(socket)); return true; } @@ -34,7 +33,6 @@ namespace QSB.ItemSync.Patches { var owitem = socket.RemoveFromSocket(); ____heldItem = owitem; - DebugLog.DebugWrite($"Start unsocket item {____heldItem.name} from socket {socket.name}."); if (____heldItem.IsAnimationPlaying()) { ____waitForUnsocketAnimation = true; @@ -76,6 +74,7 @@ namespace QSB.ItemSync.Patches QSBEventManager.FireEvent(EventNames.QSBDropItem, objectId, localPos, hit.normal, parentSector); return false; } + DebugLog.ToConsole($"Warning - no sector found for rigidbody {targetRigidbody.name}.", OWML.Common.MessageType.Warning); var localPosition = sector.transform.InverseTransformPoint(hit.point); QSBEventManager.FireEvent(EventNames.QSBDropItem, objectId, localPosition, hit.normal, sector); return false; diff --git a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs index 2981b268..a73a0c58 100644 --- a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs @@ -6,9 +6,10 @@ namespace QSB.ItemSync.WorldObjects public interface IQSBOWItem : IWorldObjectTypeSubset { void DropItem(Vector3 position, Vector3 normal, Sector sector); - ItemType GetItemType(); void SocketItem(Transform socketTransform, Sector sector); + void SetColliderActivation(bool active); void PlaySocketAnimation(); + void PlayUnsocketAnimation(); } } diff --git a/QSB/ItemSync/WorldObjects/IQSBOWItemSocket.cs b/QSB/ItemSync/WorldObjects/IQSBOWItemSocket.cs index d3aaf2df..f935e396 100644 --- a/QSB/ItemSync/WorldObjects/IQSBOWItemSocket.cs +++ b/QSB/ItemSync/WorldObjects/IQSBOWItemSocket.cs @@ -2,5 +2,10 @@ namespace QSB.ItemSync.WorldObjects { - public interface IQSBOWItemSocket : IWorldObjectTypeSubset { } + public interface IQSBOWItemSocket : IWorldObjectTypeSubset + { + bool AcceptsItem(IQSBOWItem item); + bool PlaceIntoSocket(IQSBOWItem item); + IQSBOWItem RemoveFromSocket(); + } } diff --git a/QSB/ItemSync/WorldObjects/QSBOWItem.cs b/QSB/ItemSync/WorldObjects/QSBOWItem.cs index 9f3542bb..7eb3793f 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItem.cs @@ -7,16 +7,13 @@ namespace QSB.ItemSync.WorldObjects internal class QSBOWItem : WorldObject, IQSBOWItem where T : OWItem { - private ItemType _type - { - get => AttachedObject.GetValue("_type"); - set => AttachedObject.SetValue("_type", value); - } - public override void Init(T attachedObject, int id) { } public ItemType GetItemType() - => _type; + => AttachedObject.GetItemType(); + + public void SetColliderActivation(bool active) + => AttachedObject.SetColliderActivation(active); public virtual void DropItem(Vector3 position, Vector3 normal, Sector sector) { @@ -35,5 +32,6 @@ namespace QSB.ItemSync.WorldObjects => AttachedObject.SocketItem(socketTransform, sector); public virtual void PlaySocketAnimation() { } + public virtual void PlayUnsocketAnimation() { } } } diff --git a/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs b/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs index 3d270457..1dc2dee4 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs @@ -7,10 +7,16 @@ namespace QSB.ItemSync.WorldObjects internal class QSBOWItemSocket : WorldObject, IQSBOWItemSocket where T : MonoBehaviour { - private IQSBOWItem _socketedItem + protected IQSBOWItem _socketedItem { get => ItemManager.GetObject(AttachedObject.GetValue("_socketedItem")); - set => AttachedObject.SetValue("_socketedItem", (value as IWorldObject).ReturnObject()); + set => AttachedObject.SetValue("_socketedItem", (value as IWorldObject)?.ReturnObject()); + } + + private IQSBOWItem _removedItem + { + get => ItemManager.GetObject(AttachedObject.GetValue("_removedItem")); + set => AttachedObject.SetValue("_removedItem", (value as IWorldObject).ReturnObject()); } private Transform _socketTransform @@ -46,5 +52,15 @@ namespace QSB.ItemSync.WorldObjects AttachedObject.enabled = true; return true; } + + public virtual IQSBOWItem RemoveFromSocket() + { + _removedItem = _socketedItem; + _socketedItem = null; + _removedItem.PlayUnsocketAnimation(); + _removedItem.SetColliderActivation(true); + AttachedObject.enabled = true; + return _removedItem; + } } } diff --git a/QSB/ItemSync/WorldObjects/QSBScrollItem.cs b/QSB/ItemSync/WorldObjects/QSBScrollItem.cs index 55d77743..2dbfea85 100644 --- a/QSB/ItemSync/WorldObjects/QSBScrollItem.cs +++ b/QSB/ItemSync/WorldObjects/QSBScrollItem.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using OWML.Utils; +using UnityEngine; namespace QSB.ItemSync.WorldObjects { @@ -10,5 +11,17 @@ namespace QSB.ItemSync.WorldObjects AttachedObject = attachedObject; base.Init(attachedObject, id); } + + public override void PlaySocketAnimation() + => AttachedObject.PlaySocketAnimation(); + + public override void PlayUnsocketAnimation() + => AttachedObject.PlayUnsocketAnimation(); + + public void HideNomaiText() + => AttachedObject.HideNomaiText(); + + public void ShowNomaiText() + => AttachedObject.ShowNomaiText(); } } diff --git a/QSB/ItemSync/WorldObjects/QSBScrollSocket.cs b/QSB/ItemSync/WorldObjects/QSBScrollSocket.cs index bdf15f89..b8c48b9e 100644 --- a/QSB/ItemSync/WorldObjects/QSBScrollSocket.cs +++ b/QSB/ItemSync/WorldObjects/QSBScrollSocket.cs @@ -8,5 +8,12 @@ AttachedObject = attachedObject; base.Init(attachedObject, id); } + + public override IQSBOWItem RemoveFromSocket() + { + var scrollItem = (QSBScrollItem)_socketedItem; + scrollItem.HideNomaiText(); + return RemoveFromSocket(); + } } } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 76ef6e7f..e1a10fd6 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -135,6 +135,7 @@ +