cirnogodot/Scripts/Components/Actors/PlayerWeaponProvider.cs

115 lines
2.7 KiB
C#
Raw Normal View History

using System;
using System.Linq;
2025-02-28 18:50:42 +01:00
using Cirno.Scripts.Resources;
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Components.Actors;
public partial class PlayerWeaponProvider : Node2D
{
2025-02-28 18:50:42 +01:00
[Export] public PackedScene WeaponTemplate { get; private set; }
public Array<Weapon> EquippedWeapons { get; set; } = new Array<Weapon>();
public int CurrentWeaponIndex { get; set; } = 0;
private InventoryManager _inventoryManager;
public Weapon EquippedWeapon { get; set; }
//private PlayerMovement _parent;
//public Vector2 FacingDirection
public override void _Ready()
{
_inventoryManager = this.GetInventoryManager();
2025-02-28 18:50:42 +01:00
_inventoryManager.WeaponEquip += this.EquipWeapon;
_inventoryManager.ItemAdded += (LootItem item, int amount) =>
{
if (item.Item == ItemTypes.Weapon)
{
SpawnPlayerWeapon(item);
}
};
}
public void Init(PlayerMovement parent)
{
//_parent = parent;
}
public void AddWeapon(Weapon weapon)
{
EquippedWeapons.Add(weapon);
}
public void EquipWeapon(string itemKey)
{
if (string.IsNullOrWhiteSpace(itemKey)) return;
var weapon = EquippedWeapons.FirstOrDefault(x => x.WeaponData.ItemKey == itemKey);
if (weapon is null) return;
EquipWeapon(weapon);
}
// Triggered by event in inventorymanager
public void EquipWeapon(Weapon weapon)
{
EquippedWeapon = weapon;
CurrentWeaponIndex = EquippedWeapons.IndexOf(weapon);
}
public void NextWeapon()
{
CurrentWeaponIndex += 1;
if (CurrentWeaponIndex > EquippedWeapons.Count - 1)
{
CurrentWeaponIndex = EquippedWeapons.Count - 1;
}
EquipWeapon(EquippedWeapons[CurrentWeaponIndex]);
}
public void PreviousWeapon()
{
CurrentWeaponIndex -= 1;
if (CurrentWeaponIndex < 0)
{
CurrentWeaponIndex = 0;
}
EquipWeapon(EquippedWeapons[CurrentWeaponIndex]);
}
public void Shoot(Vector2 direction)
{
if (EquippedWeapon == null) return;
EquippedWeapon.ShootDirection = direction;
EquippedWeapon.Shoot();
}
2025-02-28 18:50:42 +01:00
private void SpawnPlayerWeapon(LootItem startingItem)
{
if (WeaponTemplate == null)
{
GD.Print("Could not spawn weapon because template is null");
return;
}
var weapon = this.CreateSibling<Weapon>(WeaponTemplate);
weapon.WeaponData = startingItem.WeaponData;
this.AddWeapon(weapon);
if (this.EquippedWeapon == null)
{
this.EquipWeapon(weapon);
}
}
}