Fix AutoAttack stop working with AutoEat enabled and no food on hotbar

#934
This commit is contained in:
ReinforceZwei 2020-04-11 14:33:22 +08:00 committed by ORelio
parent 8e32c3747c
commit 3e76baeeb1
2 changed files with 21 additions and 10 deletions

View file

@ -868,5 +868,10 @@ namespace MinecraftClient
{ {
return Handler.ChangeSlot(slot); return Handler.ChangeSlot(slot);
} }
protected byte GetCurrentSlot()
{
return Handler.GetCurrentSlot();
}
} }
} }

View file

@ -3,13 +3,14 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MinecraftClient.ChatBots namespace MinecraftClient.ChatBots
{ {
class AutoEat : ChatBot class AutoEat : ChatBot
{ {
byte LastSlot = 0; byte LastSlot = 0;
byte CurrentSlot;
public static bool Eating = false; public static bool Eating = false;
private int HungerThreshold = 6; private int HungerThreshold = 6;
@ -20,15 +21,22 @@ namespace MinecraftClient.ChatBots
public override void OnHealthUpdate(float health, int food) public override void OnHealthUpdate(float health, int food)
{ {
if (food <= HungerThreshold || (food < 20 && health < 20)) if (((food <= HungerThreshold) || (food < 20 && health < 20)) && !Eating)
{ {
Eating = true; Eating = FindFoodAndEat();
FindFoodAndEat(); if (!Eating)
ChangeSlot(LastSlot);
} }
// keep eating until full // keep eating until full
if (food < 20 && Eating) if (food < 20 && Eating)
{ {
FindFoodAndEat(); Task.Factory.StartNew(delegate
{
Thread.Sleep(200);
Eating = FindFoodAndEat();
if (!Eating)
ChangeSlot(LastSlot);
});
} }
if (food >= 20 && Eating) if (food >= 20 && Eating)
{ {
@ -37,10 +45,6 @@ namespace MinecraftClient.ChatBots
} }
} }
public override void OnHeldItemChange(byte slot)
{
CurrentSlot = slot;
}
/// <summary> /// <summary>
/// Try to find food in the hotbar and eat it /// Try to find food in the hotbar and eat it
/// </summary> /// </summary>
@ -49,6 +53,8 @@ namespace MinecraftClient.ChatBots
{ {
Container inventory = GetPlayerInventory(); Container inventory = GetPlayerInventory();
bool found = false; bool found = false;
byte CurrentSlot = GetCurrentSlot();
if (!Eating)
LastSlot = CurrentSlot; LastSlot = CurrentSlot;
if (inventory.Items.ContainsKey(CurrentSlot + 36) && inventory.Items[CurrentSlot + 36].Type.IsFood()) if (inventory.Items.ContainsKey(CurrentSlot + 36) && inventory.Items[CurrentSlot + 36].Type.IsFood())
{ {