Pick up thrown items
This commit is contained in:
@@ -305,12 +305,15 @@ public partial class Game : Node3D, IGame
|
|||||||
DropRestorative(defeatedLocation);
|
DropRestorative(defeatedLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryItem RerollItem(InventoryItem itemToReroll)
|
public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true)
|
||||||
{
|
{
|
||||||
var itemDb = new ItemDatabase();
|
var itemDb = new ItemDatabase();
|
||||||
|
|
||||||
var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll);
|
var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll);
|
||||||
Player.Inventory.Remove(itemToReroll);
|
|
||||||
|
if (insertIntoInventory)
|
||||||
|
Player.Inventory.Remove(itemToReroll);
|
||||||
|
|
||||||
InventoryItem rolledItem = null;
|
InventoryItem rolledItem = null;
|
||||||
|
|
||||||
if (itemToReroll is Weapon weapon)
|
if (itemToReroll is Weapon weapon)
|
||||||
@@ -326,7 +329,8 @@ public partial class Game : Node3D, IGame
|
|||||||
if (itemToReroll is ConsumableItem consumableItem)
|
if (itemToReroll is ConsumableItem consumableItem)
|
||||||
rolledItem = itemDb.PickItem(consumableItem);
|
rolledItem = itemDb.PickItem(consumableItem);
|
||||||
|
|
||||||
Player.Inventory.TryInsert(rolledItem, currentIndex);
|
if (insertIntoInventory)
|
||||||
|
Player.Inventory.TryInsert(rolledItem, currentIndex);
|
||||||
|
|
||||||
return rolledItem;
|
return rolledItem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvid
|
|||||||
|
|
||||||
public void TogglePause();
|
public void TogglePause();
|
||||||
|
|
||||||
public InventoryItem RerollItem(InventoryItem itemToReroll);
|
public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,23 +20,39 @@ public partial class ThrownItem : RigidBody3D
|
|||||||
|
|
||||||
[Node] public Sprite2D Sprite { get; set; } = default!;
|
[Node] public Sprite2D Sprite { get; set; } = default!;
|
||||||
|
|
||||||
|
[Node] public Area3D Collision { get; set; } = default!;
|
||||||
|
|
||||||
public void OnResolved()
|
public void OnResolved()
|
||||||
{
|
{
|
||||||
BodyEntered += ThrownItem_BodyEntered;
|
BodyEntered += ThrownItem_BodyEntered;
|
||||||
|
Collision.AreaEntered += Collision_AreaEntered;
|
||||||
GlobalPosition = Player.CurrentPosition;
|
GlobalPosition = Player.CurrentPosition;
|
||||||
Sprite.Texture = ItemThatIsThrown.GetTexture();
|
Sprite.Texture = ItemThatIsThrown.GetTexture();
|
||||||
AddCollisionExceptionWith((Node)Player);
|
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);
|
CalculateEffect(enemy);
|
||||||
QueueFree();
|
QueueFree();
|
||||||
}
|
}
|
||||||
else if (ItemThatIsThrown is ThrowableItem)
|
}
|
||||||
|
|
||||||
|
private void ThrownItem_BodyEntered(Node body)
|
||||||
|
{
|
||||||
|
if (ItemThatIsThrown is ThrowableItem)
|
||||||
|
{
|
||||||
QueueFree();
|
QueueFree();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RemoveCollisionExceptionWith((Node)Player);
|
||||||
|
Collision.SetCollisionLayerValue(3, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Throw(EffectService effectService)
|
public void Throw(EffectService effectService)
|
||||||
@@ -84,6 +100,9 @@ public partial class ThrownItem : RigidBody3D
|
|||||||
|
|
||||||
private void CalculateEffect(IEnemy enemy)
|
private void CalculateEffect(IEnemy enemy)
|
||||||
{
|
{
|
||||||
|
if (ItemThatIsThrown.ItemTag == ItemTag.MysteryItem)
|
||||||
|
ItemThatIsThrown = Game.RerollItem(ItemThatIsThrown, false);
|
||||||
|
|
||||||
if (ItemThatIsThrown is ThrowableItem throwableItem)
|
if (ItemThatIsThrown is ThrowableItem throwableItem)
|
||||||
{
|
{
|
||||||
switch (throwableItem.ThrowableItemTag)
|
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="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"]
|
[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"]
|
[sub_resource type="ViewportTexture" id="ViewportTexture_qjpqg"]
|
||||||
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
|
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
|
||||||
|
|
||||||
|
[sub_resource type="SphereShape3D" id="SphereShape3D_xxdqr"]
|
||||||
|
radius = 0.306203
|
||||||
|
|
||||||
[node name="Hitbox" type="RigidBody3D"]
|
[node name="Hitbox" type="RigidBody3D"]
|
||||||
collision_layer = 3072
|
collision_layer = 3072
|
||||||
collision_mask = 2049
|
collision_mask = 2049
|
||||||
@@ -55,3 +58,11 @@ unique_name_in_owner = true
|
|||||||
material = ExtResource("2_qjpqg")
|
material = ExtResource("2_qjpqg")
|
||||||
scale = Vector2(0.1, 0.1)
|
scale = Vector2(0.1, 0.1)
|
||||||
centered = false
|
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
|
else
|
||||||
_gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}.");
|
_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)
|
if (area.GetParent() is Restorative restorative)
|
||||||
{
|
{
|
||||||
_gameRepo.OnRestorativePickedUp(restorative);
|
_gameRepo.OnRestorativePickedUp(restorative);
|
||||||
|
|||||||
Reference in New Issue
Block a user