Merge pull request #984 from CarbonNeuron/master

Add Entity Action handling
This commit is contained in:
ORelio 2020-05-03 21:01:53 +02:00 committed by GitHub
commit 43c2b4b73b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 168 additions and 10 deletions

View file

@ -156,6 +156,8 @@ namespace MinecraftClient
/// <param name="entity">Entity with updated location</param>
public virtual void OnEntityMove(Mapping.Entity entity) { }
public virtual void OnInternalCommand(string commandName,string commandParams, string Result) { }
/// <summary>
/// Called when an entity spawned nearby
/// </summary>
@ -662,6 +664,32 @@ namespace MinecraftClient
{
return Handler.GetInventoryEnabled();
}
public Dictionary<int, Container> GetInventories()
{
return Handler.GetInventories();
}
/// <summary>
/// start Sneaking
/// </summary>
protected bool Sneak(bool on)
{
return SendEntityAction(on ? Protocol.EntityActionType.StartSneaking : Protocol.EntityActionType.StopSneaking);
}
/// <summary>
/// Send Entity Action
/// </summary>
private bool SendEntityAction(Protocol.EntityActionType entityAction)
{
return Handler.sendEntityAction(entityAction);
}
/// <summary>
/// SetSlot
/// </summary>
protected void SetSlot(int slotNum)
{
Handler.ChangeSlot((short) slotNum);
}
/// <summary>
/// Get the current Minecraft World
@ -862,7 +890,7 @@ namespace MinecraftClient
/// Use item currently in the player's hand (active inventory bar slot)
/// </summary>
/// <returns></returns>
protected bool UseItemOnHand()
protected bool UseItemInHand()
{
return Handler.UseItemOnHand();
}

View file

@ -83,7 +83,7 @@ namespace MinecraftClient.ChatBots
}
}
}
if (found) UseItemOnHand();
if (found) UseItemInHand();
return found;
}
}

View file

@ -95,7 +95,7 @@ namespace MinecraftClient.ChatBots
{
LogToConsole(GetTimestamp() + ": Caught a fish!");
// retract fishing rod
UseItemOnHand();
UseItemInHand();
if (inventoryEnabled)
{
if (!hasFishingRod())
@ -110,7 +110,7 @@ namespace MinecraftClient.ChatBots
// retract fishing rod need some time
Thread.Sleep(800);
// throw again
UseItemOnHand();
UseItemInHand();
});
}

View file

@ -12,11 +12,12 @@ namespace MinecraftClient.ChatBots
public class ChatLog : ChatBot
{
public enum MessageFilter { AllText, AllMessages, OnlyChat, OnlyWhispers };
public enum MessageFilter { AllText, AllMessages, OnlyChat, OnlyWhispers, OnlyInternalCommands };
private bool dateandtime;
private bool saveOther = true;
private bool saveChat = true;
private bool savePrivate = true;
private bool saveInternal = true;
private string logfile;
/// <summary>
@ -52,6 +53,12 @@ namespace MinecraftClient.ChatBots
savePrivate = true;
saveChat = false;
break;
case MessageFilter.OnlyInternalCommands:
saveOther = false;
savePrivate = false;
saveChat = false;
saveInternal = true;
break;
}
if (String.IsNullOrEmpty(file) || file.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
{
@ -68,6 +75,7 @@ namespace MinecraftClient.ChatBots
case "messages": return MessageFilter.AllMessages;
case "chat": return MessageFilter.OnlyChat;
case "private": return MessageFilter.OnlyWhispers;
case "internal": return MessageFilter.OnlyInternalCommands;
default: return MessageFilter.AllText;
}
}
@ -92,6 +100,14 @@ namespace MinecraftClient.ChatBots
}
}
public override void OnInternalCommand(string commandName,string commandParams, string result)
{
if (saveInternal)
{
save(string.Format("Internal {0}({1}): {2}", commandName, commandParams, result));
}
}
private void save(string tosave)
{
if (dateandtime)

View file

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MinecraftClient.Commands
{
public class Sneak : Command
{
private bool sneaking = false;
public override string CMDName { get { return "Sneak"; } }
public override string CMDDesc { get { return "Sneak: Toggles sneaking"; } }
public override string Run(McTcpClient handler, string command, Dictionary<string, object> localVars)
{
Console.WriteLine(command);
if (sneaking)
{
var result = handler.sendEntityAction(Protocol.EntityActionType.StopSneaking);
sneaking = false;
return result ? "Success" : "Fail";
}
else
{
var result = handler.sendEntityAction(Protocol.EntityActionType.StartSneaking);
sneaking = true;
return result ? "Success" : "Fail";
}
}
}
}

View file

@ -6,6 +6,7 @@ using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net;
using MinecraftClient.ChatBots;
using MinecraftClient.Protocol;
using MinecraftClient.Proxy;
using MinecraftClient.Protocol.Handlers.Forge;
@ -170,6 +171,7 @@ namespace MinecraftClient
if (Settings.AutoAttack_Enabled) { BotLoad(new ChatBots.AutoAttack()); }
if (Settings.AutoFishing_Enabled) { BotLoad(new ChatBots.AutoFishing()); }
if (Settings.AutoEat_Enabled) { BotLoad(new ChatBots.AutoEat(Settings.AutoEat_hungerThreshold)); }
//Add your ChatBot here by uncommenting and adapting
//BotLoad(new ChatBots.YourBot());
}
@ -324,6 +326,7 @@ namespace MinecraftClient
}
while (true);
}
/// <summary>
/// Perform an internal MCC command (not a server command, use SendText() instead for that!)
@ -334,6 +337,7 @@ namespace MinecraftClient
/// <returns>TRUE if the command was indeed an internal MCC command</returns>
public bool PerformInternalCommand(string command, ref string response_msg, Dictionary<string, object> localVars = null)
{
/* Load commands from the 'Commands' namespace */
if (cmds.Count == 0)
@ -382,12 +386,28 @@ namespace MinecraftClient
else if (cmds.ContainsKey(command_name))
{
response_msg = cmds[command_name].Run(this, command, localVars);
foreach (ChatBot bot in bots.ToArray())
{
try
{
bot.OnInternalCommand(command_name, string.Join(" ",Command.getArgs(command)),response_msg);
}
catch (Exception e)
{
if (!(e is ThreadAbortException))
{
ConsoleIO.WriteLogLine("OnInternalCommand: Got error from " + bot.ToString() + ": " + e.ToString());
}
else throw; //ThreadAbortException should not be caught
}
}
}
else
{
response_msg = "Unknown command '" + command_name + "'. Use '" + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + "help' for help.";
return false;
}
return true;
}
@ -1356,6 +1376,7 @@ namespace MinecraftClient
}
}
/// <summary>
/// Called when an entity moved over 8 block.
/// </summary>
@ -1469,6 +1490,14 @@ namespace MinecraftClient
playerEntityID = EntityID;
}
/// <summary>
/// Send the Entity Action packet with the Specified ID
/// </summary>
/// <returns>TRUE if the item was successfully used</returns>
public bool sendEntityAction(EntityActionType entityAction)
{
return handler.SendEntityAction(playerEntityID, (int) entityAction);
}
/// <summary>
/// Use the item currently in the player's hand
/// </summary>

View file

@ -103,6 +103,7 @@
<Compile Include="Commands\Send.cs" />
<Compile Include="Commands\Set.cs" />
<Compile Include="Commands\Health.cs" />
<Compile Include="Commands\Sneak.cs" />
<Compile Include="Commands\UseItem.cs" />
<Compile Include="Inventory\Container.cs" />
<Compile Include="Inventory\ContainerType.cs" />
@ -119,6 +120,7 @@
<Compile Include="Mapping\Entity.cs" />
<Compile Include="Mapping\EntityType.cs" />
<Compile Include="Mapping\MaterialExtensions.cs" />
<Compile Include="Protocol\EntityActionType.cs" />
<Compile Include="Protocol\Handlers\DataTypes.cs" />
<Compile Include="Protocol\Handlers\PacketIncomingType.cs" />
<Compile Include="Protocol\Handlers\PacketOutgoingType.cs" />

View file

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MinecraftClient.Protocol
{
public enum EntityActionType
{
StartSneaking,
StopSneaking,
LeaveBed,
StartSprinting,
StopSprinting
}
}

View file

@ -17,6 +17,7 @@ namespace MinecraftClient.Protocol.Handlers
ClientSettings,
PluginMessage,
TabComplete,
EntityAction,
PlayerPosition,
PlayerPositionAndLook,
TeleportConfirm,
@ -27,4 +28,4 @@ namespace MinecraftClient.Protocol.Handlers
CloseWindow,
PlayerBlockPlacement
}
}
}

View file

@ -239,6 +239,10 @@ namespace MinecraftClient.Protocol.Handlers
}
else return "";
}
public bool SendEntityAction(int PlayerEntityID, int ActionID)
{
return false;
}
private byte[] readNextByteArray()
{

View file

@ -965,6 +965,22 @@ namespace MinecraftClient.Protocol.Handlers
catch (System.IO.IOException) { return false; }
catch (ObjectDisposedException) { return false; }
}
public bool SendEntityAction(int PlayerEntityID, int ActionID)
{
try
{
List<byte> fields = new List<byte>();
fields.AddRange(dataTypes.GetVarInt(PlayerEntityID));
fields.AddRange(dataTypes.GetVarInt(ActionID));
fields.AddRange(dataTypes.GetVarInt(0));
SendPacket(PacketOutgoingType.EntityAction, fields);
return true;
}
catch (SocketException) { return false; }
catch (System.IO.IOException) { return false; }
catch (ObjectDisposedException) { return false; }
}
/// <summary>
/// Send a respawn packet to the server

View file

@ -310,6 +310,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.TeleportConfirm: throw new InvalidOperationException("Teleport confirm is not supported in protocol " + protocol);
case PacketOutgoingType.ClickWindow: return 0x0E;
case PacketOutgoingType.CloseWindow: return 0x0D;
case PacketOutgoingType.EntityAction: return 0x0B;
}
}
else if (protocol <= Protocol18Handler.MC1112Version) // MC 1.9, 1,10 and 1.11
@ -330,6 +331,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.InteractEntity: return 0x0A;
case PacketOutgoingType.ClickWindow: return 0x07;
case PacketOutgoingType.CloseWindow: return 0x08;
case PacketOutgoingType.EntityAction: return 0x0B;
}
}
else if (protocol <= Protocol18Handler.MC112Version) // MC 1.12
@ -350,6 +352,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.InteractEntity: return 0x0B;
case PacketOutgoingType.ClickWindow: return 0x07;
case PacketOutgoingType.CloseWindow: return 0x08;
case PacketOutgoingType.EntityAction: return 0x0B;
}
}
else if (protocol <= Protocol18Handler.MC1122Version) // 1.12.2
@ -370,6 +373,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.InteractEntity: return 0x0A;
case PacketOutgoingType.ClickWindow: return 0x07;
case PacketOutgoingType.CloseWindow: return 0x08;
case PacketOutgoingType.EntityAction: return 0x0B;
}
}
else if (protocol < Protocol18Handler.MC114Version) // MC 1.13 to 1.13.2
@ -390,6 +394,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.InteractEntity: return 0x0D;
case PacketOutgoingType.ClickWindow: return 0x08;
case PacketOutgoingType.CloseWindow: return 0x09;
case PacketOutgoingType.EntityAction: return 0x19;
}
}
else // MC 1.14 to 1.15
@ -412,6 +417,7 @@ namespace MinecraftClient.Protocol.Handlers
case PacketOutgoingType.PlayerBlockPlacement: return 0x2C;
case PacketOutgoingType.ClickWindow: return 0x09;
case PacketOutgoingType.CloseWindow: return 0x0A;
case PacketOutgoingType.EntityAction: return 0x19;
}
}

View file

@ -85,7 +85,15 @@ namespace MinecraftClient.Protocol
/// <param name="data">packet Data</param>
/// <returns>True if message was successfully sent</returns>
bool SendPluginChannelPacket(string channel, byte[] data);
/// <summary>
/// Send Entity Action packet to the server.
/// </summary>
/// <param name="entityID">PlayerID</param>
/// <param name="type">Type of packet to send</param>
/// <returns>True if packet was successfully sent</returns>
bool SendEntityAction(int EntityID, int type);
/// <summary>
/// Send a held item change packet to the server.
/// </summary>

View file

@ -466,7 +466,6 @@ namespace MinecraftClient
case "matchesfile": AutoRespond_Matches = argValue; break;
}
break;
case ParseMode.AutoAttack:
switch (argName.ToLower())
{
@ -689,12 +688,13 @@ namespace MinecraftClient
+ "\r\n"
+ "[AutoFishing]\r\n"
+ "# Entity Handling NEED to be enabled first\r\n"
+ "enabled=false"
+ "enabled=false\r\n"
+ "\r\n"
+ "[AutoEat]\r\n"
+ "# Inventory Handling NEED to be enabled first\r\n"
+ "enabled=false\r\n"
+ "threshold=6", Encoding.UTF8);
+ "threshold=6\r\n"
+ "\r\n", Encoding.UTF8);
}
/// <summary>