Fix prevent AntiCheat Block Breaking (In Scripts)

Fix prevent AntiCheat Block Breaking (In Scripts)
This commit is contained in:
Anon 2024-12-25 16:56:07 +01:00 committed by GitHub
commit 2409de2a2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 100 additions and 16 deletions

View file

@ -285,7 +285,7 @@ namespace MinecraftClient.ChatBots
if (Config.Mode == Configs.ModeType.lookat || if (Config.Mode == Configs.ModeType.lookat ||
(Config.Mode == Configs.ModeType.both && Config._Locations.Contains(blockLoc))) (Config.Mode == Configs.ModeType.both && Config._Locations.Contains(blockLoc)))
{ {
if (DigBlock(blockLoc, lookAtBlock: false)) if (DigBlock(blockLoc, Direction.Down, lookAtBlock: false))
{ {
currentDig = blockLoc; currentDig = blockLoc;
if (Config.Log_Block_Dig) if (Config.Log_Block_Dig)
@ -346,7 +346,7 @@ namespace MinecraftClient.ChatBots
if (minDistance <= 6.0) if (minDistance <= 6.0)
{ {
if (DigBlock(target, lookAtBlock: true)) if (DigBlock(target, Direction.Down, lookAtBlock: true))
{ {
currentDig = target; currentDig = target;
if (Config.Log_Block_Dig) if (Config.Log_Block_Dig)
@ -380,7 +380,7 @@ namespace MinecraftClient.ChatBots
((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) ||
(Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type)))) (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type))))
{ {
if (DigBlock(blockLoc, lookAtBlock: true)) if (DigBlock(blockLoc, Direction.Down, lookAtBlock: true))
{ {
currentDig = blockLoc; currentDig = blockLoc;
if (Config.Log_Block_Dig) if (Config.Log_Block_Dig)

View file

@ -831,7 +831,7 @@ namespace MinecraftClient.ChatBots
// Yoinked from Daenges's Sugarcane Farmer // Yoinked from Daenges's Sugarcane Farmer
private bool WaitForDigBlock(Location block, int digTimeout = 1000) private bool WaitForDigBlock(Location block, int digTimeout = 1000)
{ {
if (!DigBlock(block.ToFloor())) return false; if (!DigBlock(block.ToFloor(), Direction.Down)) return false;
short i = 0; // Maximum wait time of 10 sec. short i = 0; // Maximum wait time of 10 sec.
while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout) while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout)
{ {

View file

@ -651,9 +651,10 @@ public class WebSocketBot : ChatBot
var result = cmd.Parameters.Length switch var result = cmd.Parameters.Length switch
{ {
3 => DigBlock(location), // TODO Get blockFace direction from arguments
4 => DigBlock(location, (bool)cmd.Parameters[3]), 3 => DigBlock(location, Direction.Down),
5 => DigBlock(location, (bool)cmd.Parameters[3], (bool)cmd.Parameters[4]), 4 => DigBlock(location, Direction.Down, (bool)cmd.Parameters[3]),
5 => DigBlock(location, Direction.Down, (bool)cmd.Parameters[3], (bool)cmd.Parameters[4]),
_ => false _ => false
}; };

View file

@ -22,6 +22,7 @@ namespace MinecraftClient.Commands
); );
dispatcher.Register(l => l.Literal(CmdName) dispatcher.Register(l => l.Literal(CmdName)
// TODO Get blockFace direction from arguments
.Executes(r => DigLookAt(r.Source)) .Executes(r => DigLookAt(r.Source))
.Then(l => l.Argument("Duration", Arguments.Double()) .Then(l => l.Argument("Duration", Arguments.Double())
.Executes(r => DigLookAt(r.Source, Arguments.GetDouble(r, "Duration")))) .Executes(r => DigLookAt(r.Source, Arguments.GetDouble(r, "Duration"))))
@ -58,7 +59,7 @@ namespace MinecraftClient.Commands
Block block = handler.GetWorld().GetBlock(blockToBreak); Block block = handler.GetWorld().GetBlock(blockToBreak);
if (block.Type == Material.Air) if (block.Type == Material.Air)
return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block);
else if (handler.DigBlock(blockToBreak, duration: duration)) else if (handler.DigBlock(blockToBreak, Direction.Down, duration: duration))
{ {
blockToBreak = blockToBreak.ToCenter(); blockToBreak = blockToBreak.ToCenter();
return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockToBreak.X, blockToBreak.Y, blockToBreak.Z, block.GetTypeString())); return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockToBreak.X, blockToBreak.Y, blockToBreak.Z, block.GetTypeString()));
@ -78,7 +79,7 @@ namespace MinecraftClient.Commands
return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far); return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far);
else if (block.Type == Material.Air) else if (block.Type == Material.Air)
return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block);
else if (handler.DigBlock(blockLoc, lookAtBlock: false, duration: duration)) else if (handler.DigBlock(blockLoc, Direction.Down, lookAtBlock: false, duration: duration))
return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString()));
else else
return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail); return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail);

View file

@ -0,0 +1,63 @@
using System;
namespace MinecraftClient.Mapping
{
public static class DirectionExtensions
{
public static Direction GetOpposite(this Direction direction)
{
switch (direction)
{
case Direction.SouthEast:
return Direction.NorthEast;
case Direction.SouthWest:
return Direction.NorthWest;
case Direction.NorthEast:
return Direction.SouthEast;
case Direction.NorthWest:
return Direction.SouthWest;
case Direction.West:
return Direction.East;
case Direction.East:
return Direction.West;
case Direction.North:
return Direction.South;
case Direction.South:
return Direction.North;
case Direction.Down:
return Direction.Up;
case Direction.Up:
return Direction.Down;
default:
return Direction.Up;
}
}
public static Direction[] HORIZONTAL =
{
Direction.South,
Direction.West,
Direction.North,
Direction.East
};
public static Direction FromRotation(double rotation)
{
double floor = Math.Floor((rotation / 90.0) + 0.5);
int value = (int)floor & 3;
return FromHorizontal(value);
}
public static Direction FromHorizontal(int value)
{
return HORIZONTAL[Math.Abs(value % HORIZONTAL.Length)];
}
}
}

View file

@ -1087,6 +1087,15 @@ namespace MinecraftClient
#region Getters: Retrieve data for use in other methods or ChatBots #region Getters: Retrieve data for use in other methods or ChatBots
/// <summary>
/// Gets the horizontal direction of the takeoff.
/// </summary>
/// <returns>Return direction of view</returns>
public Direction GetHorizontalFacing()
{
return DirectionExtensions.FromRotation(GetYaw());
}
/// <summary> /// <summary>
/// Get max length for chat messages /// Get max length for chat messages
/// </summary> /// </summary>
@ -2311,22 +2320,22 @@ namespace MinecraftClient
return InvokeOnMainThread(() => handler.SendPlayerBlockPlacement((int)hand, location, blockFace, sequenceId++)); return InvokeOnMainThread(() => handler.SendPlayerBlockPlacement((int)hand, location, blockFace, sequenceId++));
} }
/// <summary> /// <summary>
/// Attempt to dig a block at the specified location /// Attempt to dig a block at the specified location
/// </summary> /// </summary>
/// <param name="location">Location of block to dig</param> /// <param name="location">Location of block to dig</param>
/// <param name="swingArms">Also perform the "arm swing" animation</param> /// <param name="swingArms">Also perform the "arm swing" animation</param>
/// <param name="lookAtBlock">Also look at the block before digging</param> /// <param name="lookAtBlock">Also look at the block before digging</param>
public bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true, double duration = 0) public bool DigBlock(Location location, Direction blockFace, bool swingArms = true, bool lookAtBlock = true, double duration = 0)
{ {
// TODO select best face from current player location
if (!GetTerrainEnabled()) if (!GetTerrainEnabled())
return false; return false;
if (InvokeRequired) if (InvokeRequired)
return InvokeOnMainThread(() => DigBlock(location, swingArms, lookAtBlock, duration)); return InvokeOnMainThread(() => DigBlock(location, blockFace, swingArms, lookAtBlock, duration));
// TODO select best face from current player location
Direction blockFace = Direction.Down;
lock (DigLock) lock (DigLock)
{ {

View file

@ -1075,11 +1075,12 @@ namespace MinecraftClient.Scripting
/// Attempt to dig a block at the specified location /// Attempt to dig a block at the specified location
/// </summary> /// </summary>
/// <param name="location">Location of block to dig</param> /// <param name="location">Location of block to dig</param>
/// <param name="direction">Example: if your player is under a block that is being destroyed, use Down</param>
/// <param name="swingArms">Also perform the "arm swing" animation</param> /// <param name="swingArms">Also perform the "arm swing" animation</param>
/// <param name="lookAtBlock">Also look at the block before digging</param> /// <param name="lookAtBlock">Also look at the block before digging</param>
protected bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true) protected bool DigBlock(Location location, Direction direction, bool swingArms = true, bool lookAtBlock = true)
{ {
return Handler.DigBlock(location, swingArms, lookAtBlock); return Handler.DigBlock(location, direction, swingArms, lookAtBlock);
} }
/// <summary> /// <summary>
@ -1633,6 +1634,15 @@ namespace MinecraftClient.Scripting
return Handler.GetProtocolVersion(); return Handler.GetProtocolVersion();
} }
/// <summary>
/// Gets the horizontal direction of the takeoff.
/// </summary>
/// <returns>Return direction of view</returns>
protected Direction GetHorizontalFacing()
{
return Handler.GetHorizontalFacing();
}
/// <summary> /// <summary>
/// Invoke a task on the main thread, wait for completion and retrieve return value. /// Invoke a task on the main thread, wait for completion and retrieve return value.
/// </summary> /// </summary>