From 2378030a0ffb80d57476fba29a53229d969b4bdb Mon Sep 17 00:00:00 2001 From: Zenny Date: Thu, 27 Mar 2025 00:37:16 -0700 Subject: [PATCH] Pick up thrown items --- Zennysoft.Game.Ma/src/game/Game.cs | 10 +++++--- Zennysoft.Game.Ma/src/game/IGame.cs | 2 +- .../src/items/thrown/ThrownItem.cs | 25 ++++++++++++++++--- .../src/items/thrown/ThrownItem.tscn | 13 +++++++++- Zennysoft.Game.Ma/src/player/Player.cs | 11 ++++++++ 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/Zennysoft.Game.Ma/src/game/Game.cs b/Zennysoft.Game.Ma/src/game/Game.cs index f2c8bf4a..9f1fb529 100644 --- a/Zennysoft.Game.Ma/src/game/Game.cs +++ b/Zennysoft.Game.Ma/src/game/Game.cs @@ -305,12 +305,15 @@ public partial class Game : Node3D, IGame DropRestorative(defeatedLocation); } - public InventoryItem RerollItem(InventoryItem itemToReroll) + public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true) { var itemDb = new ItemDatabase(); var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll); - Player.Inventory.Remove(itemToReroll); + + if (insertIntoInventory) + Player.Inventory.Remove(itemToReroll); + InventoryItem rolledItem = null; if (itemToReroll is Weapon weapon) @@ -326,7 +329,8 @@ public partial class Game : Node3D, IGame if (itemToReroll is ConsumableItem consumableItem) rolledItem = itemDb.PickItem(consumableItem); - Player.Inventory.TryInsert(rolledItem, currentIndex); + if (insertIntoInventory) + Player.Inventory.TryInsert(rolledItem, currentIndex); return rolledItem; } diff --git a/Zennysoft.Game.Ma/src/game/IGame.cs b/Zennysoft.Game.Ma/src/game/IGame.cs index b0e8f773..596c0fc8 100644 --- a/Zennysoft.Game.Ma/src/game/IGame.cs +++ b/Zennysoft.Game.Ma/src/game/IGame.cs @@ -32,5 +32,5 @@ public interface IGame : IProvide, IProvide, IProvid public void TogglePause(); - public InventoryItem RerollItem(InventoryItem itemToReroll); + public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true); } diff --git a/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.cs b/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.cs index e25cba03..f6a48368 100644 --- a/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.cs +++ b/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.cs @@ -20,23 +20,39 @@ public partial class ThrownItem : RigidBody3D [Node] public Sprite2D Sprite { get; set; } = default!; + [Node] public Area3D Collision { get; set; } = default!; + public void OnResolved() { BodyEntered += ThrownItem_BodyEntered; + Collision.AreaEntered += Collision_AreaEntered; GlobalPosition = Player.CurrentPosition; Sprite.Texture = ItemThatIsThrown.GetTexture(); AddCollisionExceptionWith((Node)Player); + Collision.SetCollisionLayerValue(3, false); + } - private void ThrownItem_BodyEntered(Node body) + private void Collision_AreaEntered(Area3D area) { - if (body is IEnemy enemy) + if (area.GetOwner() is IEnemy enemy) { CalculateEffect(enemy); QueueFree(); } - else if (ItemThatIsThrown is ThrowableItem) + } + + private void ThrownItem_BodyEntered(Node body) + { + if (ItemThatIsThrown is ThrowableItem) + { QueueFree(); + } + else + { + RemoveCollisionExceptionWith((Node)Player); + Collision.SetCollisionLayerValue(3, true); + } } public void Throw(EffectService effectService) @@ -84,6 +100,9 @@ public partial class ThrownItem : RigidBody3D private void CalculateEffect(IEnemy enemy) { + if (ItemThatIsThrown.ItemTag == ItemTag.MysteryItem) + ItemThatIsThrown = Game.RerollItem(ItemThatIsThrown, false); + if (ItemThatIsThrown is ThrowableItem throwableItem) { switch (throwableItem.ThrowableItemTag) diff --git a/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.tscn b/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.tscn index bf6fef77..8259c60c 100644 --- a/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.tscn +++ b/Zennysoft.Game.Ma/src/items/thrown/ThrownItem.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://b1twcuneob5kt"] +[gd_scene load_steps=6 format=3 uid="uid://b1twcuneob5kt"] [ext_resource type="Script" uid="uid://bx1k4yff3m82m" path="res://src/items/thrown/ThrownItem.cs" id="1_wlplc"] [ext_resource type="Material" uid="uid://x2bv1q51mcjq" path="res://src/enemy/PixelMelt.tres" id="2_qjpqg"] @@ -9,6 +9,9 @@ size = Vector3(0.46632, 0.507293, 0.586082) [sub_resource type="ViewportTexture" id="ViewportTexture_qjpqg"] viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport") +[sub_resource type="SphereShape3D" id="SphereShape3D_xxdqr"] +radius = 0.306203 + [node name="Hitbox" type="RigidBody3D"] collision_layer = 3072 collision_mask = 2049 @@ -55,3 +58,11 @@ unique_name_in_owner = true material = ExtResource("2_qjpqg") scale = Vector2(0.1, 0.1) centered = false + +[node name="Collision" type="Area3D" parent="."] +unique_name_in_owner = true +collision_layer = 4 +collision_mask = 2048 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"] +shape = SubResource("SphereShape3D_xxdqr") diff --git a/Zennysoft.Game.Ma/src/player/Player.cs b/Zennysoft.Game.Ma/src/player/Player.cs index b34dd275..46101d72 100644 --- a/Zennysoft.Game.Ma/src/player/Player.cs +++ b/Zennysoft.Game.Ma/src/player/Player.cs @@ -596,6 +596,17 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide