using System; using System.Collections.Generic; using MinecraftClient.Inventory; using MinecraftClient.Logger; using MinecraftClient.Mapping; using MinecraftClient.Protocol.Message; using MinecraftClient.Protocol.ProfileKey; using MinecraftClient.Scripting; namespace MinecraftClient.Protocol { /// /// Interface for the MinecraftCom Handler. /// It defines some callbacks that the MinecraftCom handler must have. /// It allows the protocol handler to abstract from the other parts of the program. /// public interface IMinecraftComHandler { /* The MinecraftCom Handler must * provide these getters */ int GetServerPort(); string GetServerHost(); string GetUsername(); Guid GetUserUuid(); string GetUserUuidStr(); string GetSessionID(); string[] GetOnlinePlayers(); Dictionary GetOnlinePlayersWithUUID(); PlayerInfo? GetPlayerInfo(Guid uuid); PlayerKeyPair? GetPlayerKeyPair(); Location GetCurrentLocation(); World GetWorld(); bool GetIsSupportPreviewsChat(); bool GetTerrainEnabled(); bool SetTerrainEnabled(bool enabled); bool GetInventoryEnabled(); bool SetInventoryEnabled(bool enabled); bool GetEntityHandlingEnabled(); bool SetEntityHandlingEnabled(bool enabled); bool GetNetworkPacketCaptureEnabled(); void SetNetworkPacketCaptureEnabled(bool enabled); int GetProtocolVersion(); Container? GetInventory(int inventoryID); ILogger GetLogger(); /// /// Invoke a task on the main thread, wait for completion and retrieve return value. /// /// Task to run with any type or return value /// Any result returned from task, result type is inferred from the task /// bool result = InvokeOnMainThread(methodThatReturnsAbool); /// bool result = InvokeOnMainThread(() => methodThatReturnsAbool(argument)); /// int result = InvokeOnMainThread(() => { yourCode(); return 42; }); /// Type of the return value T InvokeOnMainThread(Func task); /// /// Invoke a task on the main thread and wait for completion /// /// Task to run without return value /// InvokeOnMainThread(methodThatReturnsNothing); /// InvokeOnMainThread(() => methodThatReturnsNothing(argument)); /// InvokeOnMainThread(() => { yourCode(); }); void InvokeOnMainThread(Action task); /// /// Called when a network packet received or sent /// /// /// Only called if is set to True /// /// Packet ID /// A copy of Packet Data /// The packet is login phase or playing phase /// The packet is received from server or sent by client void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound); /// /// Called when a server was successfully joined /// void OnGameJoined(bool isOnlineMode); /// /// Received chat/system message from the server /// /// Message received public void OnTextReceived(ChatMessage message); /// /// Will be called every animations of the hit and place block /// /// Player ID /// 0 = LMB, 1 = RMB (RMB Corrent not work) void OnEntityAnimation(int entityID, byte animation); /// /// Will be called when a Synchronization sequence is recevied, this sequence need to be sent when breaking or placing blocks /// /// Sequence ID void OnBlockChangeAck(int sequenceId); /// /// Will be called every player break block in gamemode 0 /// /// Player ID /// Block location /// Destroy stage, maximum 255 void OnBlockBreakAnimation(int entityID, Location location, byte stage); /// /// This method is called when the protocol handler receives a title /// void OnTitle(int action, string titletext, string subtitletext, string actionbartext, int fadein, int stay, int fadeout, string json); /// /// Called when receiving a connection keep-alive from the server /// void OnServerKeepAlive(); /// /// This method is called when the protocol handler receives server data /// /// Indicates if the server has a motd message /// Server MOTD message /// Indicates if the server has a an icon /// Server icon in Base 64 format /// Indicates if the server previews chat void OnServerDataRecived(bool hasMotd, string motd, bool hasIcon, string iconBase64, bool previewsChat); /// /// This method is called when the protocol handler receives "Set Display Chat Preview" packet /// /// Indicates if the server previews chat public void OnChatPreviewSettingUpdate(bool previewsChat); /// /// Called when an inventory is opened /// void OnInventoryOpen(int inventoryID, Container inventory); /// /// Called when an inventory is closed /// void OnInventoryClose(int inventoryID); /// /// Called when the player respawns, which happens on login, respawn and world change. /// void OnRespawn(); /// /// Triggered when a new player joins the game /// /// player info public void OnPlayerJoin(PlayerInfo player); /// /// This method is called when a player has left the game /// /// UUID of the player void OnPlayerLeave(Guid uuid); /// /// This method is called when a player has been killed by another entity /// /// Killer's entity if /// message sent in chat when player is killed void OnPlayerKilled(int killerEntityId, string chatMessage); /// /// Called when the server sets the new location for the player /// /// New location of the player /// New yaw /// New pitch void UpdateLocation(Location location, float yaw, float pitch); /// /// This method is called when the connection has been lost /// void OnConnectionLost(ChatBot.DisconnectReason reason, string message); /// /// Called ~10 times per second (10 ticks per second) /// Useful for updating bots in other parts of the program /// void OnUpdate(); /// /// Registers the given plugin channel for the given bot. /// /// The channel to register. /// The bot to register the channel for. void RegisterPluginChannel(string channel, ChatBot bot); /// /// Unregisters the given plugin channel for the given bot. /// /// The channel to unregister. /// The bot to unregister the channel for. void UnregisterPluginChannel(string channel, ChatBot bot); /// /// Sends a plugin channel packet to the server. /// See http://wiki.vg/Plugin_channel for more information about plugin channels. /// /// The channel to send the packet on. /// The payload for the packet. /// Whether the packet should be sent even if the server or the client hasn't registered it yet. /// Whether the packet was sent: true if it was sent, false if there was a connection error or it wasn't registered. bool SendPluginChannelMessage(string channel, byte[] data, bool sendEvenIfNotRegistered = false); /// /// Called when a plugin channel message was sent from the server. /// /// The channel the message was sent on /// The data from the channel void OnPluginChannelMessage(string channel, byte[] data); /// /// Called when an entity has spawned /// /// Spawned entity void OnSpawnEntity(Entity entity); /// /// Called when an entity has spawned /// /// Entity id /// Equipment slot. 0: main hand, 1: off hand, 2–5: armor slot (2: boots, 3: leggings, 4: chestplate, 5: helmet)/param> /// Item/param> void OnEntityEquipment(int entityid, int slot, Item? item); /// /// Called when a player spawns or enters the client's render distance /// /// Entity ID /// Entity UUID /// Entity location /// Player head yaw /// Player head pitch void OnSpawnPlayer(int entityID, Guid uuid, Location location, byte yaw, byte pitch); /// /// Called when entities have despawned /// /// List of Entity ID that have despawned void OnDestroyEntities(int[] EntityID); /// /// Called when an entity moved by coordinate offset /// /// Entity ID /// X offset /// Y offset /// Z offset /// TRUE if on ground void OnEntityPosition(int entityID, Double dx, Double dy, Double dz, bool onGround); /// /// Called when an entity moved to fixed coordinates /// /// Entity ID /// X /// Y /// Z /// TRUE if on ground void OnEntityTeleport(int entityID, Double x, Double y, Double z, bool onGround); /// /// Called when additional properties have been received for an entity /// /// Entity ID /// Dictionary of properties void OnEntityProperties(int entityID, Dictionary prop); /// /// Called when the status of an entity have been changed /// /// Entity ID /// Status ID void OnEntityStatus(int entityID, byte status); /// /// Called when the world age has been updated /// /// World age /// Time of Day void OnTimeUpdate(long worldAge, long timeOfDay); /// /// When received window properties from server. /// /// /// Inventory ID /// Property ID /// Property Value public void OnWindowProperties(byte inventoryID, short propertyId, short propertyValue); /// /// Called when inventory items have been received /// /// Inventory ID /// Item list /// State ID void OnWindowItems(byte inventoryID, Dictionary itemList, int stateId); /// /// Called when a single slot has been updated inside an inventory /// /// Window ID /// Slot ID /// Item (may be null for empty slot) /// State ID void OnSetSlot(byte inventoryID, short slotID, Item? item, int stateId); /// /// Called when player health or hunger changed. /// /// /// void OnUpdateHealth(float health, int food); /// /// Called when the health of an entity changed /// /// Entity ID /// The health of the entity void OnEntityHealth(int entityID, float health); /// /// Called when entity metadata or metadata changed. /// /// Entity ID /// Entity metadata void OnEntityMetadata(int EntityID, Dictionary metadata); /// /// Called when and explosion occurs on the server /// /// Explosion location /// Explosion strength /// Amount of affected blocks void OnExplosion(Location location, float strength, int affectedBlocks); /// /// Called when a player's game mode has changed /// /// Affected player's UUID /// New game mode void OnGamemodeUpdate(Guid uuid, int gamemode); /// /// Called when a player's latency has changed /// /// Affected player's UUID /// latency void OnLatencyUpdate(Guid uuid, int latency); /// /// Called when Experience bar is updated /// /// Experience bar level /// Player Level /// Total experience void OnSetExperience(float Experiencebar, int Level, int TotalExperience); /// /// Called when client need to change slot. /// /// Used for setting player slot after joining game /// void OnHeldItemChange(byte slot); /// /// Called when an update of the map is sent by the server, take a look at https://wiki.vg/Protocol#Map_Data for more info on the fields /// Map format and colors: https://minecraft.fandom.com/wiki/Map_item_format /// /// Map ID of the map being modified /// A scale of the Map, from 0 for a fully zoomed-in map (1 block per pixel) to 4 for a fully zoomed-out map (16 blocks per pixel) /// Specifies whether player and item frame icons are shown /// True if the map has been locked in a cartography table /// A list of MapIcon objects of map icons, send only if trackingPosition is true /// Numbs of columns that were updated (map width) (NOTE: If it is 0, the next fields are not used/are set to default values of 0 and null respectively) /// Map height /// x offset of the westernmost column /// z offset of the northernmost row /// a byte array of colors on the map void OnMapData(int mapid, byte scale, bool trackingPosition, bool locked, List icons, byte columnsUpdated, byte rowsUpdated, byte mapCoulmnX, byte mapRowZ, byte[]? colors); /// /// Called when the Player entity ID has been received from the server /// /// Player entity ID void OnReceivePlayerEntityID(int EntityID); /// /// Called when the Entity use effects /// /// entity ID /// effect id /// effect amplifier /// effect duration /// effect flags /// has factor data /// factorCodec void OnEntityEffect(int entityid, Effects effect, int amplifier, int duration, byte flags, bool hasFactorData, Dictionary? factorCodec); /// /// Called when coreboardObjective /// /// objective name /// 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text. /// Only if mode is 0 or 2. The text to be displayed for the score /// Only if mode is 0 or 2. 0 = "integer", 1 = "hearts". void OnScoreboardObjective(string objectivename, byte mode, string objectivevalue, int type); /// /// Called when DisplayScoreboard /// /// The entity whose score this is. For players, this is their username; for other entities, it is their UUID. /// 0 to create/update an item. 1 to remove an item. /// The name of the objective the score belongs to /// he score to be displayed next to the entry. Only sent when Action does not equal 1. void OnUpdateScore(string entityname, int action, string objectivename, int value); /// /// Called when tradeList is received from server /// /// Window ID /// List of trades. /// The level the villager is. /// The amount of experience the villager has. /// True if regular villagers and false if the wandering trader. /// If the villager can restock his trades at a workstation, True for regular villagers and false for the wandering trader. void OnTradeList(int windowID, List trades, VillagerInfo villagerInfo); /// /// This method is called when the protocol handler receives "Login Success" packet /// /// The player's UUID received from the server /// The player's username received from the server /// Tuple public void OnLoginSuccess(Guid uuid, string userName, Tuple[]? playerProperty); /// /// Used for a wide variety of game events, from weather to bed use to gamemode to demo messages. /// /// Event type /// Depends on Reason public void OnGameEvent(byte reason, float value); /// /// Called when a block is changed. /// /// The location of the block. /// The block public void OnBlockChange(Location location, Block block); /// /// Called when "AutoComplete" completes. /// /// The number of this result. /// All commands. public void OnAutoCompleteDone(int transactionId, string[] result); public void SetCanSendMessage(bool canSendMessage); /// /// Send a click container button packet to the server. /// Used for Enchanting table, Lectern, stone cutter and loom /// /// Id of the window being clicked /// Id of the clicked button /// True if packet was successfully sent bool ClickContainerButton(int windowId, int buttonId); /// /// Send a rename item packet when the anvil inventory is open and there is an item in the first slot /// /// New name (max 50 characters) /// True if packet was successfully sent bool SendRenameItem(string itemName); } }