Enhanced loot drops system

This commit is contained in:
MaddoScientisto 2026-03-01 19:14:34 +01:00
commit acc61f9a0e
12 changed files with 661 additions and 443 deletions

View file

@ -2,74 +2,58 @@
using Cirno.Scripts.Components.FSM.Enemy._3D;
using Cirno.Scripts.Enums;
using Cirno.Scripts.Resources;
using Cirno.Scripts.Resources.Loot;
using Godot;
namespace Cirno.Scripts.Components.Actors._3D;
public partial class EnemyDropModule3D : ModuleBase<EnemyState, CharacterBody3D>
{
[Export] public EnemyStorage3D StorageModule { get; private set; }
/// <summary>Radius of the circle in which dropped items are scattered uniformly.</summary>
[Export] public float LootScatterRadius { get; set; } = 1.0f;
/// <summary>Initial upward speed applied to each dropped item so it pops up before falling.</summary>
[Export] public float LootLaunchUpSpeed { get; set; } = 3.0f;
private bool _initialized = false;
private bool _enabled = false;
private RandomNumberGenerator _rng = new ();
private RandomNumberGenerator _rng = new();
public override void EnterState(EnemyState state)
{
_enabled = true;
foreach (var loot in StorageModule.EnemyData.LootDrops)
{
if (loot is not { Item: not null }) continue;
var roll = _rng.RandfRange(0f, 100f); // Generate a number between 0 and 100
if (roll <= loot.Chance) // Compare with drop chance
{
DropItem(loot.Item);
}
}
LootDropHelper.SpawnDrops(
StorageModule.LootDrops,
_machine.MainObject,
_machine.MainObject.GlobalPosition,
LootScatterRadius,
LootLaunchUpSpeed,
_rng);
}
private void DropItem(LootItem item)
{
if (!string.IsNullOrWhiteSpace(item.DropScenePath3D))
{
item.Spawn3D(_machine.MainObject);
GD.Print($"Dropped item: {item.ItemName}");
//var scene = GD.Load<PackedScene>(item.DropScenePath3D);
//_actor.CreateSibling<Node3D>(scene);
}
else
{
GD.Print($"Skipping Item with missing path: {item.ItemName}");
}
}
public override void ExitState(EnemyState state)
{
_enabled = false;
}
private IStateMachine<EnemyState, CharacterBody3D> _machine;
public override void Init(IStateMachine<EnemyState, CharacterBody3D> machine)
{
if (_initialized) return;
_machine = machine;
}
public override void Process(double delta)
{
}
public override void PhysicsProcess(double delta)
{
}
}
}