From 4e8f9be510b1d28592165ddeb8db16bd11cd84ba Mon Sep 17 00:00:00 2001 From: xen-42 Date: Sat, 1 Mar 2025 14:45:45 -0500 Subject: [PATCH 1/7] Add QSBItem support for OWItems that lack dedicated derived classes --- QSB/ItemSync/ItemManager.cs | 40 +++++++++++++++++-- .../WorldObjects/Items/QSBScrollItem.cs | 4 +- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index f429acaa..fa642d49 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -6,6 +6,8 @@ using QSB.ItemSync.WorldObjects.Sockets; using QSB.Utility; using QSB.Utility.Deterministic; using QSB.WorldSync; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using UnityEngine; @@ -22,15 +24,24 @@ public class ItemManager : WorldObjectManager // Items QSBWorldSync.Init(); - QSBWorldSync.Init(); + // QSBWorldSync.Init(); QSBWorldSync.Init(); QSBWorldSync.Init(); QSBWorldSync.Init(); QSBWorldSync.Init(); - // dream lantern and vision torch are set up in their own managers + // dream lantern and vision torch are set up in their own managers - // Sockets - QSBWorldSync.Init(); + // Use the basic QSBItem class for any items that do not require custom code through a derived class (mod compatibility) + // QSB addons can still define their own QSBItem derived classes and they will just get skipped here + var handledItemTypes = GetHandledItemTypes(); + DebugLog.DebugWrite($"Handled OWItem types (the rest will get generic QSBItem support) are: {string.Join(", ", handledItemTypes)}"); + var otherItemlistToInitFrom = QSBWorldSync.GetUnityObjects() + .Where(x => !handledItemTypes.Contains(x.GetType())) + .SortDeterministic(); + QSBWorldSync.Init, OWItem>(otherItemlistToInitFrom); + + // Sockets + QSBWorldSync.Init(); // other drop targets that don't already have world objects var listToInitFrom = QSBWorldSync.GetUnityObjects() @@ -38,4 +49,25 @@ public class ItemManager : WorldObjectManager .SortDeterministic(); QSBWorldSync.Init(listToInitFrom); } + + /// + /// Gets all types that extend QSBItem and returns the list of OWItem types that are already handled by dedicated classes + /// + /// + private static IEnumerable GetHandledItemTypes() + { + var assemblies = QSBCore.Addons.Values + .Select(x => x.GetType().Assembly) + .Append(typeof(QSBCore).Assembly); + + if (QSBCore.QSBNHAssembly != null) + { + assemblies = assemblies.Append(QSBCore.QSBNHAssembly); + } + + return assemblies.SelectMany(x => x.GetTypes()) + .Where(x => !x.IsInterface && !x.IsAbstract && x.BaseType != null && x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(QSBItem<>)) + .Select(x => x.BaseType.GetGenericArguments()[0]) + .OrderBy(x => x.FullName); + } } diff --git a/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs index 2139769b..fa75aed8 100644 --- a/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs +++ b/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs @@ -1,3 +1,5 @@ namespace QSB.ItemSync.WorldObjects.Items; -public class QSBScrollItem : QSBItem { } \ No newline at end of file +/* +public class QSBScrollItem : QSBItem { } +*/ \ No newline at end of file From accd958dc1ff9c7c81967b2ab35ac3a785a3d721 Mon Sep 17 00:00:00 2001 From: xen-42 Date: Sat, 1 Mar 2025 14:53:39 -0500 Subject: [PATCH 2/7] Fix spacing --- .editorconfig | 2 ++ QSB/ItemSync/ItemManager.cs | 58 ++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..0a56872a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +indent_style = tab diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index fa642d49..f75cc23b 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -29,19 +29,19 @@ public class ItemManager : WorldObjectManager QSBWorldSync.Init(); QSBWorldSync.Init(); QSBWorldSync.Init(); - // dream lantern and vision torch are set up in their own managers + // dream lantern and vision torch are set up in their own managers - // Use the basic QSBItem class for any items that do not require custom code through a derived class (mod compatibility) - // QSB addons can still define their own QSBItem derived classes and they will just get skipped here - var handledItemTypes = GetHandledItemTypes(); - DebugLog.DebugWrite($"Handled OWItem types (the rest will get generic QSBItem support) are: {string.Join(", ", handledItemTypes)}"); - var otherItemlistToInitFrom = QSBWorldSync.GetUnityObjects() - .Where(x => !handledItemTypes.Contains(x.GetType())) - .SortDeterministic(); - QSBWorldSync.Init, OWItem>(otherItemlistToInitFrom); + // Use the basic QSBItem class for any items that do not require custom code through a derived class (mod compatibility) + // QSB addons can still define their own QSBItem derived classes and they will just get skipped here + var handledItemTypes = GetHandledItemTypes(); + DebugLog.DebugWrite($"Handled OWItem types (the rest will get generic QSBItem support) are: {string.Join(", ", handledItemTypes)}"); + var otherItemlistToInitFrom = QSBWorldSync.GetUnityObjects() + .Where(x => !handledItemTypes.Contains(x.GetType())) + .SortDeterministic(); + QSBWorldSync.Init, OWItem>(otherItemlistToInitFrom); - // Sockets - QSBWorldSync.Init(); + // Sockets + QSBWorldSync.Init(); // other drop targets that don't already have world objects var listToInitFrom = QSBWorldSync.GetUnityObjects() @@ -50,24 +50,24 @@ public class ItemManager : WorldObjectManager QSBWorldSync.Init(listToInitFrom); } - /// - /// Gets all types that extend QSBItem and returns the list of OWItem types that are already handled by dedicated classes - /// - /// - private static IEnumerable GetHandledItemTypes() - { - var assemblies = QSBCore.Addons.Values - .Select(x => x.GetType().Assembly) - .Append(typeof(QSBCore).Assembly); + /// + /// Gets all types that extend QSBItem and returns the list of OWItem types that are already handled by dedicated classes + /// + /// + private static IEnumerable GetHandledItemTypes() + { + var assemblies = QSBCore.Addons.Values + .Select(x => x.GetType().Assembly) + .Append(typeof(QSBCore).Assembly); - if (QSBCore.QSBNHAssembly != null) - { - assemblies = assemblies.Append(QSBCore.QSBNHAssembly); - } + if (QSBCore.QSBNHAssembly != null) + { + assemblies = assemblies.Append(QSBCore.QSBNHAssembly); + } - return assemblies.SelectMany(x => x.GetTypes()) - .Where(x => !x.IsInterface && !x.IsAbstract && x.BaseType != null && x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(QSBItem<>)) - .Select(x => x.BaseType.GetGenericArguments()[0]) - .OrderBy(x => x.FullName); - } + return assemblies.SelectMany(x => x.GetTypes()) + .Where(x => !x.IsInterface && !x.IsAbstract && x.BaseType != null && x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(QSBItem<>)) + .Select(x => x.BaseType.GetGenericArguments()[0]) + .OrderBy(x => x.FullName); + } } From bece595564ae1c73b3090f514bcdbad9da943a8a Mon Sep 17 00:00:00 2001 From: _nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 1 Mar 2025 22:00:26 +0000 Subject: [PATCH 3/7] remove classes that we don't need anymore --- QSB/ItemSync/ItemManager.cs | 4 ---- QSB/ItemSync/WorldObjects/Items/QSBNomaiConversationStone.cs | 3 --- QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs | 5 ----- QSB/ItemSync/WorldObjects/Items/QSBSharedStone.cs | 3 --- QSB/ItemSync/WorldObjects/Items/QSBSimpleLanternItem.cs | 3 --- 5 files changed, 18 deletions(-) delete mode 100644 QSB/ItemSync/WorldObjects/Items/QSBNomaiConversationStone.cs delete mode 100644 QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs delete mode 100644 QSB/ItemSync/WorldObjects/Items/QSBSharedStone.cs delete mode 100644 QSB/ItemSync/WorldObjects/Items/QSBSimpleLanternItem.cs diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index f75cc23b..b76b506c 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -23,10 +23,6 @@ public class ItemManager : WorldObjectManager DebugLog.DebugWrite("Building OWItems...", MessageType.Info); // Items - QSBWorldSync.Init(); - // QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); QSBWorldSync.Init(); QSBWorldSync.Init(); // dream lantern and vision torch are set up in their own managers diff --git a/QSB/ItemSync/WorldObjects/Items/QSBNomaiConversationStone.cs b/QSB/ItemSync/WorldObjects/Items/QSBNomaiConversationStone.cs deleted file mode 100644 index 4430d505..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBNomaiConversationStone.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace QSB.ItemSync.WorldObjects.Items; - -public class QSBNomaiConversationStone : QSBItem { } \ No newline at end of file diff --git a/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs deleted file mode 100644 index fa75aed8..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace QSB.ItemSync.WorldObjects.Items; - -/* -public class QSBScrollItem : QSBItem { } -*/ \ No newline at end of file diff --git a/QSB/ItemSync/WorldObjects/Items/QSBSharedStone.cs b/QSB/ItemSync/WorldObjects/Items/QSBSharedStone.cs deleted file mode 100644 index 9efcd97b..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBSharedStone.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace QSB.ItemSync.WorldObjects.Items; - -public class QSBSharedStone : QSBItem { } \ No newline at end of file diff --git a/QSB/ItemSync/WorldObjects/Items/QSBSimpleLanternItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBSimpleLanternItem.cs deleted file mode 100644 index d8c883d5..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBSimpleLanternItem.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace QSB.ItemSync.WorldObjects.Items; - -public class QSBSimpleLanternItem : QSBItem { } \ No newline at end of file From 0461aab31c49885163eb916342250ba8700de941 Mon Sep 17 00:00:00 2001 From: xen-42 Date: Sat, 1 Mar 2025 18:29:32 -0500 Subject: [PATCH 4/7] Account for classes that are subclasses of subclasses of QSBItem --- QSB/ItemSync/ItemManager.cs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index f75cc23b..fbe3b3be 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -65,9 +65,26 @@ public class ItemManager : WorldObjectManager assemblies = assemblies.Append(QSBCore.QSBNHAssembly); } + // If the class inherits from QSBItem, this will return what T is else null + static Type GetTypeFromQSBItem(Type type) + { + if (type.IsInterface || type.IsAbstract || type.BaseType == null) + { + return null; + } + if (type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(QSBItem<>)) + { + return type.BaseType.GetGenericArguments()[0]; + } + else + { + return GetTypeFromQSBItem(type.BaseType); + } + } + return assemblies.SelectMany(x => x.GetTypes()) - .Where(x => !x.IsInterface && !x.IsAbstract && x.BaseType != null && x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(QSBItem<>)) - .Select(x => x.BaseType.GetGenericArguments()[0]) + .Select(GetTypeFromQSBItem) + .Where(x => x != null) .OrderBy(x => x.FullName); } } From e2c8fa53cae17a4de073a00ba7aa0078921a5eaf Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Mar 2025 15:26:39 -0800 Subject: [PATCH 5/7] comment --- QSB/ItemSync/ItemManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index cd658363..b329b557 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -40,6 +40,7 @@ public class ItemManager : WorldObjectManager QSBWorldSync.Init(); // other drop targets that don't already have world objects + // breaks if mod adds custom subclass of IItemDropTarget and then makes WorldObject of that but can just fix that when that happens var listToInitFrom = QSBWorldSync.GetUnityObjects() .Where(x => x is IItemDropTarget and not (RaftDock or RaftController or PrisonCellElevator)) .SortDeterministic(); From 18d57b989216541f89ce97fc87ba6b4ea0e72b6c Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Mar 2025 15:45:58 -0800 Subject: [PATCH 6/7] lots of doc --- QSB/ItemSync/ItemManager.cs | 8 +++++--- QSB/ItemSync/WorldObjects/Items/QSBItem.cs | 2 ++ QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs | 3 +++ QSB/ItemSync/WorldObjects/Items/QSBWarpCoreItem.cs | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index b329b557..a6dd2133 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -1,4 +1,5 @@ using Cysharp.Threading.Tasks; +using HarmonyLib; using OWML.Common; using QSB.ItemSync.WorldObjects; using QSB.ItemSync.WorldObjects.Items; @@ -26,14 +27,16 @@ public class ItemManager : WorldObjectManager QSBWorldSync.Init(); QSBWorldSync.Init(); // dream lantern and vision torch are set up in their own managers + // the rest can just use the generic thing below because they dont have special things using them // Use the basic QSBItem class for any items that do not require custom code through a derived class (mod compatibility) // QSB addons can still define their own QSBItem derived classes and they will just get skipped here - var handledItemTypes = GetHandledItemTypes(); - DebugLog.DebugWrite($"Handled OWItem types (the rest will get generic QSBItem support) are: {string.Join(", ", handledItemTypes)}"); + var handledItemTypes = new HashSet(GetHandledItemTypes()); // set cuz we do Contains below + DebugLog.DebugWrite($"Handled OWItem types (the rest will get generic QSBItem support) are: {handledItemTypes.Join()}"); var otherItemlistToInitFrom = QSBWorldSync.GetUnityObjects() .Where(x => !handledItemTypes.Contains(x.GetType())) .SortDeterministic(); + // could make a subclass for this but i dont care, and would have to filter out from reflection thing below QSBWorldSync.Init, OWItem>(otherItemlistToInitFrom); // Sockets @@ -50,7 +53,6 @@ public class ItemManager : WorldObjectManager /// /// Gets all types that extend QSBItem and returns the list of OWItem types that are already handled by dedicated classes /// - /// private static IEnumerable GetHandledItemTypes() { var assemblies = QSBCore.Addons.Values diff --git a/QSB/ItemSync/WorldObjects/Items/QSBItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBItem.cs index c1417b32..b76cf7b7 100644 --- a/QSB/ItemSync/WorldObjects/Items/QSBItem.cs +++ b/QSB/ItemSync/WorldObjects/Items/QSBItem.cs @@ -12,6 +12,8 @@ using UnityEngine; namespace QSB.ItemSync.WorldObjects.Items; +// not abstract so modded items can use this QSBItem +// could use QSBOtherItem subclass but i dont feel like it public class QSBItem : WorldObject, IQSBItem where T : OWItem { diff --git a/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs new file mode 100644 index 00000000..c0206376 --- /dev/null +++ b/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs @@ -0,0 +1,3 @@ +namespace QSB.ItemSync.WorldObjects.Items; + +public class QSBOtherItem : QSBItem { } diff --git a/QSB/ItemSync/WorldObjects/Items/QSBWarpCoreItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBWarpCoreItem.cs index 476df5a7..18f5625e 100644 --- a/QSB/ItemSync/WorldObjects/Items/QSBWarpCoreItem.cs +++ b/QSB/ItemSync/WorldObjects/Items/QSBWarpCoreItem.cs @@ -3,4 +3,4 @@ public class QSBWarpCoreItem : QSBItem { public bool IsVesselCoreType() => AttachedObject.IsVesselCoreType(); -} \ No newline at end of file +} From b0a60fd45846d94a5f7305930cd5b756c54ee390 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Mar 2025 15:48:13 -0800 Subject: [PATCH 7/7] go aweay --- QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs diff --git a/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs deleted file mode 100644 index c0206376..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBOtherItem.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace QSB.ItemSync.WorldObjects.Items; - -public class QSBOtherItem : QSBItem { }