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 f429acaa..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; @@ -6,6 +7,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; @@ -21,21 +24,66 @@ 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 + // 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 = 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 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(); 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); + } + + // 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()) + .Select(GetTypeFromQSBItem) + .Where(x => x != null) + .OrderBy(x => x.FullName); + } } 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/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 2139769b..00000000 --- a/QSB/ItemSync/WorldObjects/Items/QSBScrollItem.cs +++ /dev/null @@ -1,3 +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 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 +}