2020-05-26 00:16:53 +05:00
using System ;
2014-05-31 01:59:03 +02:00
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using MinecraftClient.Crypto ;
2015-11-27 17:16:33 +01:00
using MinecraftClient.Mapping ;
2020-03-29 18:41:26 +02:00
using MinecraftClient.Inventory ;
2022-08-15 23:55:44 +08:00
using MinecraftClient.Protocol.Keys ;
2014-05-31 01:59:03 +02:00
namespace MinecraftClient.Protocol
{
/// <summary>
/// Interface for the Minecraft protocol handler.
/// A protocol handler is used to communicate with the Minecraft server.
/// This interface allows to abstract from the underlying minecraft version in other parts of the program.
/// The protocol handler will take care of parsing and building the appropriate network packets.
/// </summary>
2015-06-19 19:40:18 +02:00
public interface IMinecraftCom : IDisposable , IAutoComplete
2014-05-31 01:59:03 +02:00
{
/// <summary>
/// Start the login procedure once connected to the server
/// </summary>
/// <returns>True if login was successful</returns>
2022-08-27 23:01:28 +08:00
bool Login ( PlayerKeyPair ? playerKeyPair , Session . SessionToken session ) ;
2014-05-31 01:59:03 +02:00
/// <summary>
/// Disconnect from the server
/// </summary>
void Disconnect ( ) ;
2016-11-19 16:06:08 +01:00
/// <summary>
/// Get max length for chat messages
/// </summary>
/// <returns>Max length, in characters</returns>
int GetMaxChatMessageLength ( ) ;
2020-09-07 03:51:42 +08:00
/// <summary>
/// Get the current protocol version.
/// </summary>
/// <remarks>
/// Version-specific operations should be handled inside the Protocol handled whenever possible.
/// </remarks>
/// <returns>Minecraft Protocol version number</returns>
int GetProtocolVersion ( ) ;
2014-05-31 01:59:03 +02:00
/// <summary>
/// Send a chat message or command to the server
/// </summary>
/// <param name="message">Text to send</param>
/// <returns>True if successfully sent</returns>
2022-08-15 23:55:44 +08:00
bool SendChatMessage ( string message , PlayerKeyPair ? playerKeyPair = null ) ;
2014-05-31 01:59:03 +02:00
/// <summary>
/// Allow to respawn after death
/// </summary>
/// <returns>True if packet successfully sent</returns>
bool SendRespawnPacket ( ) ;
2015-09-29 14:00:44 +02:00
/// <summary>
2015-11-27 17:16:33 +01:00
/// Inform the server of the client being used to connect
2015-09-29 14:00:44 +02:00
/// </summary>
/// <param name="brandInfo">Client string describing the client</param>
/// <returns>True if brand info was successfully sent</returns>
bool SendBrandInfo ( string brandInfo ) ;
2015-10-24 22:26:45 -07:00
2016-08-26 12:19:25 +02:00
/// <summary>
/// Inform the server of the client's Minecraft settings
/// </summary>
/// <param name="language">Client language eg en_US</param>
/// <param name="viewDistance">View distance, in chunks</param>
/// <param name="difficulty">Game difficulty (client-side...)</param>
/// <param name="chatMode">Chat mode (allows muting yourself)</param>
/// <param name="chatColors">Show chat colors</param>
/// <param name="skinParts">Show skin layers</param>
/// <param name="mainHand">1.9+ main hand</param>
/// <returns>True if client settings were successfully sent</returns>
bool SendClientSettings ( string language , byte viewDistance , byte difficulty , byte chatMode , bool chatColors , byte skinParts , byte mainHand ) ;
2015-11-27 17:16:33 +01:00
/// <summary>
/// Send a location update telling that we moved to that location
/// </summary>
/// <param name="location">The new location</param>
2017-03-10 23:40:02 +01:00
/// <param name="onGround">True if the player is on the ground</param>
2019-04-09 18:01:00 -07:00
/// <param name="yaw">The new yaw (optional)</param>
/// <param name="pitch">The new pitch (optional)</param>
2015-11-27 17:16:33 +01:00
/// <returns>True if packet was successfully sent</returns>
2019-04-09 18:01:00 -07:00
bool SendLocationUpdate ( Location location , bool onGround , float? yaw , float? pitch ) ;
2015-11-27 17:16:33 +01:00
2015-10-24 22:26:45 -07:00
/// <summary>
/// Send a plugin channel packet to the server.
/// </summary>
2015-11-27 17:16:33 +01:00
/// <see href="http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/" />
2015-10-24 22:26:45 -07:00
/// <param name="channel">Channel to send packet on</param>
/// <param name="data">packet Data</param>
/// <returns>True if message was successfully sent</returns>
bool SendPluginChannelPacket ( string channel , byte [ ] data ) ;
2022-07-01 18:59:58 +02:00
2020-05-01 08:28:22 -05:00
/// <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 ) ;
2022-07-01 18:59:58 +02:00
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send a held item change packet to the server.
/// </summary>
/// <param name="slot">New active slot in the inventory hotbar</param>
/// <returns>True if packet was successfully sent</returns>
2020-03-26 15:01:42 +08:00
bool SendHeldItemChange ( short slot ) ;
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send an entity interaction packet to the server.
/// </summary>
/// <param name="EntityID">Entity ID to interact with</param>
/// <param name="type">Type of interaction (0: interact, 1: attack, 2: interact at)</param>
/// <returns>True if packet was successfully sent</returns>
2020-03-29 18:41:26 +02:00
bool SendInteractEntity ( int EntityID , int type ) ;
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send an entity interaction packet to the server.
/// </summary>
/// <param name="EntityID">Entity ID to interact with</param>
/// <param name="type">Type of interaction (0: interact, 1: attack, 2: interact at)</param>
/// <param name="X">X coordinate for "interact at"</param>
/// <param name="Y">Y coordinate for "interact at"</param>
/// <param name="Z">Z coordinate for "interact at"</param>
/// <param name="hand">Player hand (0: main hand, 1: off hand)</param>
/// <returns>True if packet was successfully sent</returns>
2020-03-29 18:41:26 +02:00
bool SendInteractEntity ( int EntityID , int type , float X , float Y , float Z , int hand ) ;
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send an entity interaction packet to the server.
/// </summary>
/// <param name="EntityID">Entity ID to interact with</param>
/// <param name="type">Type of interaction (0: interact, 1: attack, 2: interact at)</param>
/// <param name="X">X coordinate for "interact at"</param>
/// <param name="Y">Y coordinate for "interact at"</param>
/// <param name="Z">Z coordinate for "interact at"</param>
/// <returns>True if packet was successfully sent</returns>
2020-03-29 18:41:26 +02:00
bool SendInteractEntity ( int EntityID , int type , float X , float Y , float Z ) ;
2022-07-01 18:59:58 +02:00
2020-07-04 13:45:51 +05:00
/// <summary>
/// Send an entity interaction packet to the server.
/// </summary>
/// <param name="EntityID">Entity ID to interact with</param>
/// <param name="type">Type of interaction (0: interact, 1: attack, 2: interact at)</param>
/// <param name="hand">Only if Type is interact or interact at; 0: main hand, 1: off hand</param>
/// <returns>True if packet was successfully sent</returns>
bool SendInteractEntity ( int EntityID , int type , int hand ) ;
2020-03-22 20:12:06 +08:00
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send a use item packet to the server
/// </summary>
/// <param name="hand">0: main hand, 1: off hand</param>
2022-08-15 23:55:44 +08:00
/// <param name="sequenceId">Sequence ID used for synchronization</param>
2020-03-28 00:48:41 +01:00
/// <returns>True if packet was successfully sent</returns>
2022-08-15 23:55:44 +08:00
bool SendUseItem ( int hand , int sequenceId ) ;
2020-03-29 18:41:26 +02:00
/// <summary>
/// Send a click window slot packet to the server
/// </summary>
/// <param name="windowId">Id of the window being clicked</param>
/// <param name="slotId">Id of the clicked slot</param>
2022-07-25 01:13:41 +08:00
/// <param name="action">Action to perform</param>
2020-03-29 18:41:26 +02:00
/// <param name="item">Item in the clicked slot</param>
2022-07-25 01:13:41 +08:00
/// <param name="changedSlots">Slots that have been changed in this event: List<SlotID, Changed Items> </param>
/// <param name="stateId">Inventory's stateId</param>
2020-03-29 18:41:26 +02:00
/// <returns>True if packet was successfully sent</returns>
2022-07-25 01:13:41 +08:00
bool SendWindowAction ( int windowId , int slotId , WindowActionType action , Item item , List < Tuple < short , Item > > changedSlots , int stateId ) ;
2020-03-29 18:41:26 +02:00
2020-05-26 00:16:53 +05:00
/// <summary>
2020-05-25 21:39:24 +02:00
/// Request Creative Mode item creation into regular/survival Player Inventory
/// </summary>
/// <remarks>(obviously) requires to be in creative mode</remarks>
/// <param name="slot">Destination inventory slot</param>
/// <param name="itemType">Item type</param>
/// <param name="count">Item count</param>
2020-06-20 21:30:23 +02:00
/// <param name="nbt">Optional item NBT</param>
2020-05-25 21:39:24 +02:00
/// <returns>TRUE if item given successfully</returns>
2022-08-15 23:55:44 +08:00
bool SendCreativeInventoryAction ( int slot , ItemType itemType , int count , Dictionary < string , object > ? nbt ) ;
2020-05-26 00:16:53 +05:00
2020-05-26 14:02:09 +05:00
/// <summary>
/// Plays animation
/// </summary>
2020-05-26 13:01:01 +02:00
/// <param name="animation">0 for left arm, 1 for right arm</param>
/// <param name="playerid">Player Entity ID</param>
2020-05-26 14:02:09 +05:00
/// <returns>TRUE if item given successfully</returns>
2020-05-26 13:01:01 +02:00
bool SendAnimation ( int animation , int playerid ) ;
2020-05-26 14:02:09 +05:00
2020-03-29 18:41:26 +02:00
/// <summary>
/// Send a close window packet to the server
/// </summary>
/// <param name="windowId">Id of the window being closed</param>
bool SendCloseWindow ( int windowId ) ;
2020-03-26 15:01:42 +08:00
2020-03-28 00:48:41 +01:00
/// <summary>
/// Send player block placement packet to the server
/// </summary>
/// <param name="hand">0: main hand, 1: off hand</param>
/// <param name="location">Location to place block at</param>
/// <param name="face">Block face</param>
2022-08-15 23:55:44 +08:00
/// <param name="sequenceId">Sequence ID (use for synchronization)</param>
2020-03-28 00:48:41 +01:00
/// <returns>True if packet was successfully sent</returns>
2022-08-15 23:55:44 +08:00
bool SendPlayerBlockPlacement ( int hand , Location location , Direction face , int sequenceId ) ;
2020-05-29 23:18:34 +05:00
/// <summary>
2020-06-20 21:30:23 +02:00
/// Send player blog digging packet to the server. This packet needs to be called at least twice: Once to begin digging, then a second time to finish digging
2020-05-29 23:18:34 +05:00
/// </summary>
2020-06-20 16:07:54 +02:00
/// <param name="status">0 to start digging, 1 to cancel, 2 to finish ( https://wiki.vg/Protocol#Player_Digging )</param>
2020-05-29 23:18:34 +05:00
/// <param name="location">Location</param>
2020-06-20 16:07:54 +02:00
/// <param name="face">Block face</param>
2022-08-15 23:55:44 +08:00
/// <param name="sequenceId">Sequence ID (use for synchronization)</param>
2020-06-20 16:07:54 +02:00
/// <returns>True if packet was succcessfully sent</returns>
2022-08-15 23:55:44 +08:00
bool SendPlayerDigging ( int status , Location location , Direction face , int sequenceId ) ;
2020-06-20 16:07:54 +02:00
/// <summary>
/// Change text on a sign
/// </summary>
/// <param name="location">Location of Sign block</param>
/// <param name="line1">New line 1</param>
/// <param name="line2">New line 2</param>
/// <param name="line3">New line 3</param>
/// <param name="line4">New line 4</param>
2020-05-29 23:18:34 +05:00
/// <returns>True if packet was succcessfully sent</returns>
2020-06-20 17:57:07 +05:00
bool SendUpdateSign ( Location location , string line1 , string line2 , string line3 , string line4 ) ;
2022-07-01 18:59:58 +02:00
2020-07-04 13:45:51 +05:00
/// <summary>
/// Update command block
/// </summary>
/// <param name="location">command block location</param>
/// <param name="command">command</param>
/// <param name="mode">command block mode</param>
/// <param name="flags">command block flags</param>
bool UpdateCommandBlock ( Location location , string command , CommandBlockMode mode , CommandBlockFlags flags ) ;
2020-11-08 23:39:07 +01:00
/// <summary>
/// Select villager trade
/// </summary>
/// <param name="selectedSlot">The slot of the trade, starts at 0.</param>
bool SelectTrade ( int selectedSlot ) ;
2021-05-12 22:31:06 +08:00
2021-11-17 17:33:52 +01:00
/// <summary>
/// Spectate a player/entity
/// </summary>
/// <param name="uuid">The uuid of the player/entity to spectate/teleport to.</param>
bool SendSpectate ( Guid uuid ) ;
2021-05-12 22:31:06 +08:00
/// <summary>
/// Get net read thread (main thread) ID
/// </summary>
/// <returns>Net read thread ID</returns>
int GetNetReadThreadId ( ) ;
2014-05-31 01:59:03 +02:00
}
}