Pick up thrown items
This commit is contained in:
@@ -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);
|
||||
|
||||
if (insertIntoInventory)
|
||||
Player.Inventory.Remove(itemToReroll);
|
||||
|
||||
InventoryItem rolledItem = null;
|
||||
|
||||
if (itemToReroll is Weapon weapon)
|
||||
@@ -326,6 +329,7 @@ public partial class Game : Node3D, IGame
|
||||
if (itemToReroll is ConsumableItem consumableItem)
|
||||
rolledItem = itemDb.PickItem(consumableItem);
|
||||
|
||||
if (insertIntoInventory)
|
||||
Player.Inventory.TryInsert(rolledItem, currentIndex);
|
||||
|
||||
return rolledItem;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -20,24 +20,40 @@ 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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user