/* * @Author: 白哉 * @Description: * @Date: 2025年06月06日 星期五 19:06:16 * @Modify: */ using System; using System.Collections.Generic; using Logic.AI; using NodeCanvas.Framework; using ParadoxNotion.Design; using RuntimeData; namespace NodeCanvas.Tasks.Actions { [Name("判断我的危险值")] [Category("AI节点")] [Serializable] public class AIParamSelfDanger : BaseActionTask { public bool MoreThan; public float Value; public int Offset; protected override string desc { get { if (MoreThan) return string.Format($"周围{Offset}格 危险值大于等于 {Value}"); return string.Format($"周围{Offset}格 危险值小于等于 {Value}"); } } protected override void OnExecute() { base.OnExecute(); // 直接从Blackboard获取AICalculatorData var data = blackboard.GetVariable("Data"); if (data?.value?.TargetParam.UnitData == null) { EndAction(false); return; } var map = data.value.TargetParam.MapData; var unit = data.value.TargetParam.UnitData; if (!unit.Player(map, out var player)) return; var grid = unit.Grid(map); if (grid == null) { EndAction(false); return; } var dangerValue = 0f; var arounds = map.GridMap.GetAroundGridData(Offset, Offset, grid); foreach (var around in arounds) { if (around == grid) continue; if(!around.VisibleUnit(map,player,out var attacker)) continue; if (data.value.TargetParam.MapData.IsLeagueUnitByUnit(unit.Id, attacker.Id)) continue; var dis = map.GridMap.CalcDistance(around, grid); if (dis > attacker.GetAttackRange(map)) continue; dangerValue += Table.Instance.CalcDamage(map, attacker, unit); } if (MoreThan) EndAction(dangerValue >= Value); else EndAction(dangerValue <= Value); } } }