From 506f040b97d9e54c65867eff32b6d885710e2ab8 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Thu, 25 Feb 2021 14:53:34 +0000 Subject: [PATCH] add socket stuff --- QSB/ItemSync/WorldObjects/IQSBOWItem.cs | 4 ++ QSB/ItemSync/WorldObjects/QSBOWItem.cs | 14 +++++++ QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs | 41 +++++++++++++++++++- QSB/WorldSync/IWorldObject.cs | 1 + QSB/WorldSync/QSBWorldSync.cs | 1 + QSB/WorldSync/WorldObject.cs | 1 + 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs index a85d02a2..2981b268 100644 --- a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs @@ -6,5 +6,9 @@ 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 PlaySocketAnimation(); } } diff --git a/QSB/ItemSync/WorldObjects/QSBOWItem.cs b/QSB/ItemSync/WorldObjects/QSBOWItem.cs index 8483b666..9f3542bb 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItem.cs @@ -7,8 +7,17 @@ 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; + public virtual void DropItem(Vector3 position, Vector3 normal, Sector sector) { AttachedObject.transform.SetParent(sector.transform); @@ -21,5 +30,10 @@ namespace QSB.ItemSync.WorldObjects AttachedObject.SetSector(sector); AttachedObject.SetColliderActivation(true); } + + public virtual void SocketItem(Transform socketTransform, Sector sector) + => AttachedObject.SocketItem(socketTransform, sector); + + public virtual void PlaySocketAnimation() { } } } diff --git a/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs b/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs index 1c95833c..3d270457 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItemSocket.cs @@ -1,4 +1,5 @@ -using QSB.WorldSync; +using OWML.Utils; +using QSB.WorldSync; using UnityEngine; namespace QSB.ItemSync.WorldObjects @@ -6,6 +7,44 @@ namespace QSB.ItemSync.WorldObjects internal class QSBOWItemSocket : WorldObject, IQSBOWItemSocket where T : MonoBehaviour { + private IQSBOWItem _socketedItem + { + get => ItemManager.GetObject(AttachedObject.GetValue("_socketedItem")); + set => AttachedObject.SetValue("_socketedItem", (value as IWorldObject).ReturnObject()); + } + + private Transform _socketTransform + { + get => AttachedObject.GetValue("_socketedTransform"); + set => AttachedObject.SetValue("_socketedTransform", value); + } + + private Sector _sector + { + get => AttachedObject.GetValue("_sector"); + set => AttachedObject.SetValue("_sector", value); + } + public override void Init(T attachedObject, int id) { } + + public virtual bool AcceptsItem(IQSBOWItem item) + { + var itemType = item.GetItemType(); + var acceptableType = AttachedObject.GetValue("_acceptableType"); + return (itemType & acceptableType) == itemType; + } + + public virtual bool PlaceIntoSocket(IQSBOWItem item) + { + if (!AcceptsItem(item) || _socketedItem != null) + { + return false; + } + _socketedItem = item; + _socketedItem.SocketItem(_socketTransform, _sector); + _socketedItem.PlaySocketAnimation(); + AttachedObject.enabled = true; + return true; + } } } diff --git a/QSB/WorldSync/IWorldObject.cs b/QSB/WorldSync/IWorldObject.cs index 94dd53d8..4974215f 100644 --- a/QSB/WorldSync/IWorldObject.cs +++ b/QSB/WorldSync/IWorldObject.cs @@ -6,5 +6,6 @@ string Name { get; } void OnRemoval(); + object ReturnObject(); } } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index c5e24bd0..fffd76bf 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using QSB.ItemSync.WorldObjects; using QSB.OrbSync.WorldObjects; using QSB.TransformSync; using QSB.Utility; diff --git a/QSB/WorldSync/WorldObject.cs b/QSB/WorldSync/WorldObject.cs index 53c42643..f96b20f3 100644 --- a/QSB/WorldSync/WorldObject.cs +++ b/QSB/WorldSync/WorldObject.cs @@ -11,5 +11,6 @@ namespace QSB.WorldSync public abstract void Init(T attachedObject, int id); public virtual void OnRemoval() { } + public object ReturnObject() => AttachedObject; } } \ No newline at end of file