Pick up thrown items

This commit is contained in:
2025-03-27 00:37:16 -07:00
parent 096786f97e
commit 2378030a0f
5 changed files with 53 additions and 8 deletions

View File

@@ -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;
}

View File

@@ -32,5 +32,5 @@ public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvid
public void TogglePause();
public InventoryItem RerollItem(InventoryItem itemToReroll);
public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true);
}

View File

@@ -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)

View File

@@ -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")

View File

@@ -596,6 +596,17 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<ISaveChunk<Play
else
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}.");
}
if (area.GetParent() is ThrownItem thrownItem)
{
var isAdded = Inventory.TryAdd(thrownItem.ItemThatIsThrown);
if (isAdded)
{
_gameRepo.AnnounceMessageOnMainScreen($"{thrownItem.ItemThatIsThrown.ItemName} picked up.");
thrownItem.QueueFree();
}
else
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {thrownItem.ItemThatIsThrown.ItemName}.");
}
if (area.GetParent() is Restorative restorative)
{
_gameRepo.OnRestorativePickedUp(restorative);