mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-10-14 21:22:49 +00:00
Merge pull request #984 from CarbonNeuron/master
Add Entity Action handling
This commit is contained in:
commit
43c2b4b73b
14 changed files with 168 additions and 10 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ namespace MinecraftClient.ChatBots
|
|||
}
|
||||
}
|
||||
}
|
||||
if (found) UseItemOnHand();
|
||||
if (found) UseItemInHand();
|
||||
return found;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
32
MinecraftClient/Commands/Sneak.cs
Normal file
32
MinecraftClient/Commands/Sneak.cs
Normal 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";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
16
MinecraftClient/Protocol/EntityActionType.cs
Normal file
16
MinecraftClient/Protocol/EntityActionType.cs
Normal 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
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -239,6 +239,10 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
}
|
||||
else return "";
|
||||
}
|
||||
public bool SendEntityAction(int PlayerEntityID, int ActionID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
private byte[] readNextByteArray()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue