Fixed an issue where AI could not pick up weapons.

修复AI不能捡起武器的问题。
This commit is contained in:
Cold-Mint 2024-10-05 20:56:50 +08:00
parent 4e83bca579
commit 4a4d4a0c37
Signed by: Cold-Mint
GPG Key ID: C5A9BF8A98E0CE99
8 changed files with 24 additions and 14 deletions

View File

@ -15,7 +15,6 @@ _maxDamage = 10
_minDamage = 1
_damageType = 2
Speed = 500.0
_enableTracking = true
_targetDiesDestroyProjectile = true
_repelStrength = 2.5

View File

@ -180,6 +180,7 @@ public sealed partial class AiCharacter : CharacterTemplate
//You must create an item container for the character before you can pick up the item.
//必须为角色创建物品容器后才能拾起物品。
var universalItemContainer = new UniversalItemContainer(1);
universalItemContainer.AllowAddingItemByType(Config.ItemType.ProjectileWeapon);
ProtectedItemContainer = universalItemContainer;
//Add initial weapon
//添加初始武器

View File

@ -481,10 +481,10 @@ public partial class CharacterTemplate : CharacterBody2D
if (_currentItem is IItem item)
{
item.Use(this, position);
return item.Use(this, position);
}
return true;
return false;
}
public override void _Process(double delta)

View File

@ -126,7 +126,11 @@ public interface IItem
/// </summary>
/// <param name="owner">Owner of current item, if any</param>
/// <param name="targetGlobalPosition">Target position, such as the position of the cursor when used by the player</param>
void Use(Node2D? owner, Vector2 targetGlobalPosition);
/// <returns>
///<para>Whether it was successfully executed</para>
///<para>是否成功被执行了</para>
/// </returns>
bool Use(Node2D? owner, Vector2 targetGlobalPosition);
/// <summary>
/// <para>When the item is thrown</para>

View File

@ -18,9 +18,13 @@ public partial class Packsack : PickAbleTemplate
get => Config.ItemType.Packsack;
}
[Export] public int NumberSlots { get; set; }
public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
public override bool Use(Node2D? owner, Vector2 targetGlobalPosition)
{
GameSceneDepend.DynamicUiGroup?.ShowControl(Path, control =>
if (GameSceneDepend.DynamicUiGroup == null)
{
return false;
}
return GameSceneDepend.DynamicUiGroup.ShowControl(Path, control =>
{
if (control is PacksackUi packsackUi)
{

View File

@ -50,8 +50,9 @@ public class PlaceholderItem : IItem
return null;
}
public void Use(Node2D? owner, Vector2 targetGlobalPosition)
public bool Use(Node2D? owner, Vector2 targetGlobalPosition)
{
return false;
}
public void OnThrow(Vector2 velocity)

View File

@ -182,8 +182,9 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
return Math.Min(freeQuantity, unallocatedQuantity);
}
public virtual void Use(Node2D? owner, Vector2 targetGlobalPosition)
public virtual bool Use(Node2D? owner, Vector2 targetGlobalPosition)
{
return false;
}
public virtual void OnThrow(Vector2 velocity)

View File

@ -25,9 +25,9 @@ public abstract partial class WeaponTemplate : PickAbleTemplate
_audioStreamPlayer2D = GetNodeOrNull<AudioStreamPlayer2D>("Marker2D/AudioStreamPlayer2D");
}
public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
public override bool Use(Node2D? owner, Vector2 targetGlobalPosition)
{
Fire(owner, targetGlobalPosition);
return Fire(owner, targetGlobalPosition);
}
@ -77,15 +77,16 @@ public abstract partial class WeaponTemplate : PickAbleTemplate
///<para>敌人所在位置</para>
/// </param>
/// </remarks>
public void Fire(Node2D? owner, Vector2 enemyGlobalPosition)
public bool Fire(Node2D? owner, Vector2 enemyGlobalPosition)
{
var nowTime = DateTime.Now;
//If the present time minus the time of the last fire is less than the interval between fires, it means that the fire cannot be fired yet.
//如果现在时间减去上次开火时间小于开火间隔,说明还不能开火。
if (_lastFiringTime != null && nowTime - _lastFiringTime < _firingInterval)
{
return;
return false;
}
_lastFiringTime = nowTime;
var result = DoFire(owner, enemyGlobalPosition);
if (result)
{
@ -96,10 +97,9 @@ public abstract partial class WeaponTemplate : PickAbleTemplate
characterTemplate.AddForce(enemyGlobalPosition.DirectionTo(characterTemplate.GlobalPosition) * _recoilStrength * Config.CellSize);
}
}
_audioStreamPlayer2D?.Play();
}
_lastFiringTime = nowTime;
return result;
}
/// <summary>