Traveller/scripts/stateMachine/StateProcessor/LookForWeaponProcessor.cs
Cold-Mint 7812d9c570
Remove useless dependencies and add logic for AI to find weapons.
移除无用依赖,加入AI查找武器的逻辑。
2024-07-17 22:54:42 +08:00

86 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using ColdMint.scripts.character;
using ColdMint.scripts.debug;
using ColdMint.scripts.utils;
using ColdMint.scripts.weapon;
using Godot;
namespace ColdMint.scripts.stateMachine.StateProcessor;
/// <summary>
/// <para>Weapon seeking condition</para>
/// <para>寻找武器状态</para>
/// </summary>
public class LookForWeaponProcessor : StateProcessorTemplate
{
protected WeaponTemplate? TargetWeapon;
protected override void OnExecute(StateContext context, Node owner)
{
if (owner is not AiCharacter aiCharacter)
{
LogCat.LogError("owner_is_not_AiCharacter", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
if (TargetWeapon != null)
{
//If the nearest weapon is found, move the character to the weapon.
//如果有最近的武器被找到了,那么将角色移动到武器旁边。
aiCharacter.SetTargetPosition(TargetWeapon.GlobalPosition);
return;
}
if (aiCharacter.ScoutWeaponDetected())
{
//Weapons were found in the character's recon area.
//在角色的侦察范围内发现了武器。
//We search for the nearest weapon.
//我们搜索最近的武器。
LogCat.Log("weapon_detected", LogCat.LogLabel.LookForWeaponProcessor);
var weaponTemplates = aiCharacter.GetWeaponInScoutArea();
if (weaponTemplates == null || weaponTemplates.Length == 0)
{
//The weapon may have been lost or taken by someone else.
//武器可能已丢失,或被他人占用。
LogCat.Log("weapon_lost", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
var nodes = new List<Node>();
foreach (var weapon in weaponTemplates)
{
if (weapon is Node newNode)
{
nodes.Add(newNode);
}
}
var node = NodeUtils.GetTheNearestNode(aiCharacter, nodes.ToArray());
if (node == null)
{
//When looking for the nearest node, return null.
//查找最近的节点时返回null。
LogCat.Log("nearest_node_is_null", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
if (node is WeaponTemplate weaponTemplate)
{
TargetWeapon = weaponTemplate;
}
else
{
LogCat.LogError("node_is_not_WeaponTemplate", LogCat.LogLabel.LookForWeaponProcessor);
}
}
else
{
//No weapons detected
//没有检测到武器
LogCat.Log("no_weapon_detected", LogCat.LogLabel.LookForWeaponProcessor);
}
}
public override State State => State.LookForWeapon;
}