using System.Collections.Generic; using ColdMint.scripts.character; using ColdMint.scripts.damage; using ColdMint.scripts.debug; using Godot; namespace ColdMint.scripts.weapon; /// /// MeleeWeapon /// 近战武器 /// public partial class MeleeWeapon : WeaponTemplate { /// /// The damage area of the weapon /// 武器的伤害区域 /// private Area2D? _weaponDamageArea; [Export] private int _maxDamage = 1; [Export] private int _minDamage = 1; private DamageTemplate? _damageTemplate; private readonly List _characterTemplates = [ ]; public override void _Ready() { base._Ready(); LogCat.Log("ready", LogCat.LogLabel.MeleeWeapon); _weaponDamageArea = GetNode("WeaponDamageArea"); _weaponDamageArea.InputPickable = false; _weaponDamageArea.SetCollisionMaskValue(Config.LayerNumber.Player, true); _weaponDamageArea.SetCollisionMaskValue(Config.LayerNumber.Mob, true); _weaponDamageArea.Monitoring = true; _weaponDamageArea.BodyEntered += OnBodyEntered; _weaponDamageArea.BodyExited += OnBodyExited; _weaponDamageArea.AreaEntered += AreaEntered; _weaponDamageArea.AreaExited += AreaExited; _damageTemplate = new Damage(); _damageTemplate.MaxDamage = _maxDamage; _damageTemplate.MinDamage = _minDamage; _damageTemplate.Type = Config.DamageType.Physical; LogCat.Log("success", LogCat.LogLabel.MeleeWeapon); } private void AreaExited(Node2D node2D) { LogCat.Log("AreaExited" + node2D.Name, LogCat.LogLabel.MeleeWeapon); } private void AreaEntered(Node2D node2D) { LogCat.Log("AreaEntered" + node2D.Name, LogCat.LogLabel.MeleeWeapon); } /// /// OnBodyEntered /// 当敌人进入攻击范围 /// private void OnBodyEntered(Node2D node2D) { LogCat.Log("OnBodyEntered" + node2D.Name, LogCat.LogLabel.MeleeWeapon); if (node2D is CharacterTemplate characterTemplate) { _characterTemplates.Add(characterTemplate); } } /// /// When the enemy is out of range /// 当敌人离开攻击范围 /// /// private void OnBodyExited(Node node) { LogCat.Log("OnBodyExited" + node.Name, LogCat.LogLabel.MeleeWeapon); if (node is CharacterTemplate characterTemplate) { _characterTemplates.Remove(characterTemplate); } } protected override bool DoFire(Node2D? owner, Vector2 enemyGlobalPosition) { if (_weaponDamageArea == null) { return false; } if (_damageTemplate == null) { return false; } if (owner == null) { LogCat.LogError("owner_is_null", LogCat.LogLabel.MeleeWeapon); return false; } if (_characterTemplates.Count == 0) { return false; } foreach (var characterTemplate in _characterTemplates) { characterTemplate.Damage(_damageTemplate); } return true; } }