diff --git a/NewHorizons/Builder/Props/ItemBuilder.cs b/NewHorizons/Builder/Props/ItemBuilder.cs index f4992e8a..05620329 100644 --- a/NewHorizons/Builder/Props/ItemBuilder.cs +++ b/NewHorizons/Builder/Props/ItemBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.Components.Props; using NewHorizons.External.Modules.Props.Item; using NewHorizons.Handlers; +using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OWML; using OWML.Common; using OWML.Utils; @@ -27,6 +28,8 @@ namespace NewHorizons.Builder.Props public static NHItem MakeItem(GameObject go, GameObject planetGO, Sector sector, ItemInfo info, IModBehaviour mod) { + go.layer = Layer.Interactible; + var itemName = info.name; if (string.IsNullOrEmpty(itemName)) { @@ -93,10 +96,13 @@ namespace NewHorizons.Builder.Props if (info.colliderRadius > 0f) { - go.AddComponent().radius = info.colliderRadius; + var col = go.AddComponent(); + col.radius = info.colliderRadius; + col.isTrigger = info.colliderIsTrigger; go.GetAddComponent(); } + // Wait until next frame when all objects are built before trying to socket the item if it has an initial socket Delay.FireOnNextUpdate(() => { if (item != null && !string.IsNullOrEmpty(info.pathToInitialSocket)) @@ -133,6 +139,8 @@ namespace NewHorizons.Builder.Props public static NHItemSocket MakeSocket(GameObject go, GameObject planetGO, Sector sector, ItemSocketInfo info) { + go.layer = Layer.Interactible; + var itemType = EnumUtils.TryParse(info.itemType, true, out ItemType result) ? result : ItemType.Invalid; if (itemType == ItemType.Invalid && !string.IsNullOrEmpty(info.itemType)) { @@ -151,15 +159,18 @@ namespace NewHorizons.Builder.Props if (socket._socketTransform == null) { var socketGO = GeneralPropBuilder.MakeNew("Socket", planetGO, sector, info, defaultParent: go.transform); - if (info.colliderRadius > 0f) - { - go.AddComponent().radius = info.colliderRadius; - go.GetAddComponent(); - } socketGO.SetActive(true); socket._socketTransform = socketGO.transform; } + if (info.colliderRadius > 0f) + { + var col = go.AddComponent(); + col.radius = info.colliderRadius; + col.isTrigger = info.colliderIsTrigger; + go.GetAddComponent(); + } + socket.ItemType = itemType; socket.UseGiveTakePrompts = info.useGiveTakePrompts; socket.InsertCondition = info.insertCondition; @@ -169,6 +180,7 @@ namespace NewHorizons.Builder.Props socket.ClearRemovalConditionOnInsert = info.clearRemovalConditionOnInsert; socket.RemovalFact = info.removalFact; + // Wait until initial item socketing is done before considering the socket empty Delay.FireInNUpdates(() => { if (socket != null && !socket._socketedItem) diff --git a/NewHorizons/External/Modules/Props/Item/ItemInfo.cs b/NewHorizons/External/Modules/Props/Item/ItemInfo.cs index f837443a..4d5751ae 100644 --- a/NewHorizons/External/Modules/Props/Item/ItemInfo.cs +++ b/NewHorizons/External/Modules/Props/Item/ItemInfo.cs @@ -32,6 +32,10 @@ namespace NewHorizons.External.Modules.Props.Item /// [DefaultValue(0.5f)] public float colliderRadius = 0.5f; /// + /// Whether the added sphere collider will be a trigger (interactible but does not collide). Defaults to true. + /// + [DefaultValue(true)] public bool colliderIsTrigger = true; + /// /// Whether the item can be dropped. Defaults to true. /// [DefaultValue(true)] public bool droppable = true; diff --git a/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs b/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs index 7294fbb0..d2ff2336 100644 --- a/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs +++ b/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs @@ -19,6 +19,15 @@ namespace NewHorizons.External.Modules.Props.Item /// [DefaultValue(2f)] public float interactRange = 2f; /// + /// Default collider radius when interacting with the socket + /// + [DefaultValue(0f)] + public float colliderRadius = 0f; + /// + /// Whether the added sphere collider will be a trigger (interactible but does not collide). Defaults to true. + /// + [DefaultValue(true)] public bool colliderIsTrigger = true; + /// /// Whether to use "Give Item" / "Take Item" prompts instead of "Insert Item" / "Remove Item". /// public bool useGiveTakePrompts; @@ -46,10 +55,5 @@ namespace NewHorizons.External.Modules.Props.Item /// A ship log fact to reveal when removing an item from this socket, or when the socket is empty. /// public string removalFact; - /// - /// Default collider radius when interacting with the socket - /// - [DefaultValue(0f)] - public float colliderRadius = 0f; } }