using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MinecraftClient.Crypto;
using MinecraftClient.Mapping;
using MinecraftClient.Inventory;
namespace MinecraftClient.Protocol
{
///
/// 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.
///
public interface IMinecraftCom : IDisposable, IAutoComplete
{
///
/// Start the login procedure once connected to the server
///
/// True if login was successful
bool Login();
///
/// Disconnect from the server
///
void Disconnect();
///
/// Get max length for chat messages
///
/// Max length, in characters
int GetMaxChatMessageLength();
///
/// Send a chat message or command to the server
///
/// Text to send
/// True if successfully sent
bool SendChatMessage(string message);
///
/// Allow to respawn after death
///
/// True if packet successfully sent
bool SendRespawnPacket();
///
/// Inform the server of the client being used to connect
///
/// Client string describing the client
/// True if brand info was successfully sent
bool SendBrandInfo(string brandInfo);
///
/// Inform the server of the client's Minecraft settings
///
/// Client language eg en_US
/// View distance, in chunks
/// Game difficulty (client-side...)
/// Chat mode (allows muting yourself)
/// Show chat colors
/// Show skin layers
/// 1.9+ main hand
/// True if client settings were successfully sent
bool SendClientSettings(string language, byte viewDistance, byte difficulty, byte chatMode, bool chatColors, byte skinParts, byte mainHand);
///
/// Send a location update telling that we moved to that location
///
/// The new location
/// True if the player is on the ground
/// The new yaw (optional)
/// The new pitch (optional)
/// True if packet was successfully sent
bool SendLocationUpdate(Location location, bool onGround, float? yaw, float? pitch);
///
/// Send a plugin channel packet to the server.
///
///
/// Channel to send packet on
/// packet Data
/// True if message was successfully sent
bool SendPluginChannelPacket(string channel, byte[] data);
///
/// Send a held item change packet to the server.
///
/// New active slot in the inventory hotbar
/// True if packet was successfully sent
bool SendHeldItemChange(short slot);
///
/// Send an entity interaction packet to the server.
///
/// Entity ID to interact with
/// Type of interaction (0: interact, 1: attack, 2: interact at)
/// True if packet was successfully sent
bool SendInteractEntity(int EntityID, int type);
///
/// Send an entity interaction packet to the server.
///
/// Entity ID to interact with
/// Type of interaction (0: interact, 1: attack, 2: interact at)
/// X coordinate for "interact at"
/// Y coordinate for "interact at"
/// Z coordinate for "interact at"
/// Player hand (0: main hand, 1: off hand)
/// True if packet was successfully sent
bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z, int hand);
///
/// Send an entity interaction packet to the server.
///
/// Entity ID to interact with
/// Type of interaction (0: interact, 1: attack, 2: interact at)
/// X coordinate for "interact at"
/// Y coordinate for "interact at"
/// Z coordinate for "interact at"
/// True if packet was successfully sent
bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z);
///
/// Send a use item packet to the server
///
/// 0: main hand, 1: off hand
/// True if packet was successfully sent
bool SendUseItem(int hand);
///
/// Send a click window slot packet to the server
///
/// Id of the window being clicked
/// Id of the clicked slot
/// Item in the clicked slot
/// True if packet was successfully sent
bool SendClickWindow(int windowId, int slotId, Item item);
///
/// Send a close window packet to the server
///
/// Id of the window being closed
bool SendCloseWindow(int windowId);
///
/// Send player block placement packet to the server
///
/// 0: main hand, 1: off hand
/// Location to place block at
/// Block face
/// Cursor X
/// Cursor Y
/// Cursor Z
/// TRUE if inside block
/// True if packet was successfully sent
bool SendPlayerBlockPlacement(int hand, Location location, int face, float CursorX, float CursorY, float CursorZ, bool insideBlock);
}
}