From 0b0e3c334efcca5646c6ad5b961d6662bd25d053 Mon Sep 17 00:00:00 2001 From: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com> Date: Sat, 21 Mar 2020 18:41:48 +0800 Subject: [PATCH] auto attack --- .gitattributes | 2 + MinecraftClient/ChatBots/kill.cs | 15 + MinecraftClient/McTcpClient.cs | 172 ++ MinecraftClient/MinecraftClient.csproj | 1 + .../Protocol/Handlers/DataTypes.cs | 17 +- .../Protocol/Handlers/PacketIncomingType.cs | 11 +- .../Protocol/Handlers/PacketOutgoingType.cs | 5 +- .../Protocol/Handlers/Protocol16.cs | 14 + .../Protocol/Handlers/Protocol18.cs | 125 +- .../Handlers/Protocol18PacketTypes.cs | 11 + MinecraftClient/Protocol/IMinecraftCom.cs | 5 + .../Protocol/IMinecraftComHandler.cs | 14 + entityID list.txt | 1688 +++++++++++++++++ 13 files changed, 2065 insertions(+), 15 deletions(-) create mode 100644 .gitattributes create mode 100644 MinecraftClient/ChatBots/kill.cs create mode 100644 entityID list.txt diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/MinecraftClient/ChatBots/kill.cs b/MinecraftClient/ChatBots/kill.cs new file mode 100644 index 00000000..ece0fefe --- /dev/null +++ b/MinecraftClient/ChatBots/kill.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MinecraftClient.ChatBots +{ + class kill : ChatBot + { + public override void Update() + { + + } + } +} diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs index 4dc2e8eb..f4db9da2 100644 --- a/MinecraftClient/McTcpClient.cs +++ b/MinecraftClient/McTcpClient.cs @@ -135,6 +135,7 @@ namespace MinecraftClient if (Settings.AutoRespond_Enabled) { BotLoad(new ChatBots.AutoRespond(Settings.AutoRespond_Matches)); } //Add your ChatBot here by uncommenting and adapting //BotLoad(new ChatBots.YourBot()); + //BotLoad(new ChatBots.kill()); } } @@ -816,6 +817,25 @@ namespace MinecraftClient pitch = null; } } + + // auto attack entity within range + // by reinforce + if (attackCooldown == 0) + { + attackCooldown = 6; + if (entitiesToAttack.Count > 0) + { + foreach(KeyValuePair a in entitiesToAttack) + { + handler.SendInteractEntityPacket(a.Key, 1); + ConsoleIO.WriteLine("Attacked Entity with ID " + a.Key); + } + } + } + else + { + attackCooldown--; + } } /// @@ -1018,5 +1038,157 @@ namespace MinecraftClient } } } + + // by reinforce + //public List entitiesToAttack = new List(); + //public List entitiesInAttackList = new List(); + public Dictionary entitiesToAttack = new Dictionary(); + public Dictionary entitiesToTrack = new Dictionary(); + public int attackCooldown = 6; + public Double attackSpeed; + public Double attackCooldownSecond; + public void OnSpawnLivingEntity(int EntityID, int EntityType, Guid UUID, Location location) + { + string msg; + + string name = getEntityName(EntityType); + if (name == "") + { + //msg = "Spawn Entity with typeID " + EntityType.ToString(); + //msg = ""; + } + else + { + msg = "Spawn Entity " + getEntityName(EntityType); + + //handler.SendInteractEntityPacket(EntityID, 1); + //ConsoleIO.WriteLine("Attacked Entity with ID " + EntityID.ToString()); + + if (calculateDistance(location, GetCurrentLocation()) < 5) + { + entitiesToAttack.Add(EntityID, location); + ConsoleIO.WriteLine("Added Entity with ID " + EntityID.ToString()+" to Attack list"); + } + + entitiesToTrack.Add(EntityID, location); + //ConsoleIO.WriteLine("Added Entity with ID " + EntityID.ToString() + " to Track list"); + //ConsoleIO.WriteLine(msg); + + } + } + + public void OnDestroyEntities(int[] Entities) + { + foreach(int a in Entities) + { + if (entitiesToTrack.ContainsKey(a)) + { + if(entitiesToAttack.ContainsKey(a)) ConsoleIO.WriteLine("Removed Entity with ID " + a.ToString()); + entitiesToAttack.Remove(a); + entitiesToTrack.Remove(a); + } + } + } + + public void OnSetCooldown(int itemID, int tick) + { + ConsoleIO.WriteLine("Set Cooldown on item " + itemID + " by " + tick + " ticks"); + } + + public void OnEntityPosition(int EntityID, Double Dx, Double Dy, Double Dz,bool onGround) + { + if (entitiesToTrack.ContainsKey(EntityID)) + { + + Location L = entitiesToTrack[EntityID]; + L.X += Dx; + L.Y += Dy; + L.Z += Dz; + entitiesToTrack[EntityID] = L; + entitiesToAttack[EntityID] = L; + Double distance = calculateDistance(L, GetCurrentLocation()); + + if (distance < 5) + { + ConsoleIO.WriteLine("Entity Pos changed, ID " + EntityID + ", Distance: " + distance); + if (!entitiesToAttack.ContainsKey(EntityID)) + { + entitiesToAttack.Add(EntityID, L); + ConsoleIO.WriteLine("Added Entity with ID " + EntityID.ToString()+" to Attack list"); + } + } + else + { + entitiesToAttack.Remove(EntityID); + } + } + } + + public void OnEntityProperties(int EntityID, Dictionary prop) + { + if(EntityID == playerEntityID) + { + //ConsoleIO.WriteLine("Prop On Player reviced"); + if (prop.ContainsKey("generic.attackSpeed")) + { + if (attackSpeed != prop["generic.attackSpeed"]) + { + ConsoleIO.WriteLine("generic.attackSpeed: " + prop["generic.attackSpeed"].ToString()); + attackSpeed = prop["generic.attackSpeed"]; + attackCooldownSecond = 1 / attackSpeed * (serverTPS / 20.0); + attackCooldown = Convert.ToInt16(Math.Truncate(attackCooldownSecond / 0.1) + 1); + ConsoleIO.WriteLine("attack cooldown: " + attackCooldown); + } + } + } + } + + long lastAge = 0; + DateTime lastTime; + Double serverTPS = 0; + public void OnTimeUpdate(long WorldAge, long TimeOfDay) + { + //ConsoleIO.WriteLine("Time update: World age: " + WorldAge.ToString()); + //ConsoleIO.WriteLine("Time update: Time of day: " + TimeOfDay.ToString()); + if (lastAge != 0) + { + DateTime currentTime = DateTime.Now; + Double tps = (WorldAge - lastAge) / (currentTime - lastTime).TotalSeconds; + lastAge = WorldAge; + lastTime = currentTime; + ConsoleIO.WriteLine("TPS: " + tps.ToString()); + if (tps <= 20 || tps >= 0) + { + serverTPS = tps; + } + } + else + { + lastAge = WorldAge; + lastTime = DateTime.Now; + } + + } + + public double calculateDistance(Location l1,Location l2) + { + return Math.Sqrt(Math.Pow(l2.X - l1.X, 2) + Math.Pow(l2.Y - l1.Y, 2) + Math.Pow(l2.Z - l1.Z, 2)); + } + public string getEntityName(int EntityType) + { + switch (EntityType) + { + case 31: return "Guardian"; + case 95: return "zombie"; + default: return ""; + } + } + public int playerEntityID; + public void SetPlayerEntityID(int EntityID) + { + playerEntityID = EntityID; + } + + } } diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index ac4a1258..82f2fd5d 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -79,6 +79,7 @@ + diff --git a/MinecraftClient/Protocol/Handlers/DataTypes.cs b/MinecraftClient/Protocol/Handlers/DataTypes.cs index 3b8c36fa..9912d308 100644 --- a/MinecraftClient/Protocol/Handlers/DataTypes.cs +++ b/MinecraftClient/Protocol/Handlers/DataTypes.cs @@ -324,18 +324,16 @@ namespace MinecraftClient.Protocol.Handlers /// private Dictionary ReadNextNbt(List cache, bool root) { - Dictionary NbtData = new Dictionary(); - if (root) { - if (cache[0] == 0) // TAG_End - return NbtData; if (cache[0] != 10) // TAG_Compound throw new System.IO.InvalidDataException("Failed to decode NBT: Does not start with TAG_Compound"); ReadNextByte(cache); // Tag type (TAG_Compound) ReadData(ReadNextUShort(cache), cache); // NBT root name } + Dictionary NbtData = new Dictionary(); + while (true) { int fieldType = ReadNextByte(cache); @@ -447,7 +445,7 @@ namespace MinecraftClient.Protocol.Handlers if (protocolversion < Protocol18Handler.MC18Version) { byte[] length = BitConverter.GetBytes((short)array.Length); - Array.Reverse(length); //Endianness + Array.Reverse(length); return ConcatBytes(length, array); } else return ConcatBytes(GetVarInt(array.Length), array); @@ -466,7 +464,7 @@ namespace MinecraftClient.Protocol.Handlers } /// - /// Get a byte array representing the given location encoded as an unsigned long + /// Get a byte array representing the given location encoded as an unsigned short /// /// /// A modulo will be applied if the location is outside the following ranges: @@ -477,14 +475,11 @@ namespace MinecraftClient.Protocol.Handlers /// Location representation as ulong public byte[] GetLocation(Location location) { - byte[] locationBytes; if (protocolversion >= Protocol18Handler.MC114Version) { - locationBytes = BitConverter.GetBytes(((((ulong)location.X) & 0x3FFFFFF) << 38) | ((((ulong)location.Z) & 0x3FFFFFF) << 12) | (((ulong)location.Y) & 0xFFF)); + return BitConverter.GetBytes(((((ulong)location.X) & 0x3FFFFFF) << 38) | ((((ulong)location.Z) & 0x3FFFFFF) << 12) | (((ulong)location.Y) & 0xFFF)); } - else locationBytes = BitConverter.GetBytes(((((ulong)location.X) & 0x3FFFFFF) << 38) | ((((ulong)location.Y) & 0xFFF) << 26) | (((ulong)location.Z) & 0x3FFFFFF)); - Array.Reverse(locationBytes); //Endianness - return locationBytes; + else return BitConverter.GetBytes(((((ulong)location.X) & 0x3FFFFFF) << 38) | ((((ulong)location.Y) & 0xFFF) << 26) | (((ulong)location.Z) & 0x3FFFFFF)); } /// diff --git a/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs b/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs index 5cbfd3ac..fc2419d9 100644 --- a/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs +++ b/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs @@ -10,6 +10,9 @@ namespace MinecraftClient.Protocol.Handlers /// enum PacketIncomingType { + // modified by reinforce + SpawnEntity, + SpawnLivingEntity, KeepAlive, JoinGame, ChatMessage, @@ -30,6 +33,12 @@ namespace MinecraftClient.Protocol.Handlers OpenWindow, WindowItems, SetSlot, - UnknownPacket + UnknownPacket, + DestroyEntities, + SetCooldown, + EntityPosition, + EntityPositionAndRotation, + EntityProperties, + TimeUpdate } } diff --git a/MinecraftClient/Protocol/Handlers/PacketOutgoingType.cs b/MinecraftClient/Protocol/Handlers/PacketOutgoingType.cs index be863d5b..de1f8a92 100644 --- a/MinecraftClient/Protocol/Handlers/PacketOutgoingType.cs +++ b/MinecraftClient/Protocol/Handlers/PacketOutgoingType.cs @@ -19,6 +19,9 @@ namespace MinecraftClient.Protocol.Handlers TabComplete, PlayerPosition, PlayerPositionAndLook, - TeleportConfirm + TeleportConfirm, + //modified by reinforce + HeldItemChange, + InteractEntity } } diff --git a/MinecraftClient/Protocol/Handlers/Protocol16.cs b/MinecraftClient/Protocol/Handlers/Protocol16.cs index c8516766..458d50a0 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol16.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol16.cs @@ -733,5 +733,19 @@ namespace MinecraftClient.Protocol.Handlers } catch { return false; } } + + // reinforce + public bool SendInteractEntityPacket(int EntityID, int type) + { + return true; + } + public bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z, int hand) + { + return true; + } + public bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z) + { + return true; + } } } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 68f5a34d..e5006beb 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -191,7 +191,10 @@ namespace MinecraftClient.Protocol.Handlers break; case PacketIncomingType.JoinGame: handler.OnGameJoined(); - dataTypes.ReadNextInt(packetData); + // by reinforce + // get client player EntityID + int playerEntityID = dataTypes.ReadNextInt(packetData); + handler.SetPlayerEntityID(playerEntityID); dataTypes.ReadNextByte(packetData); if (protocolversion >= MC191Version) this.currentDimension = dataTypes.ReadNextInt(packetData); @@ -242,7 +245,9 @@ namespace MinecraftClient.Protocol.Handlers float pitch = dataTypes.ReadNextFloat(packetData); byte locMask = dataTypes.ReadNextByte(packetData); - if (handler.GetTerrainEnabled()) + // player pos is needed for calculate entity distance + // modified by reinforce + if (handler.GetTerrainEnabled() || true) { if (protocolversion >= MC18Version) { @@ -535,6 +540,98 @@ namespace MinecraftClient.Protocol.Handlers SendPacket(PacketOutgoingType.ResourcePackStatus, dataTypes.ConcatBytes(responseHeader, dataTypes.GetVarInt(3))); //Accepted pack SendPacket(PacketOutgoingType.ResourcePackStatus, dataTypes.ConcatBytes(responseHeader, dataTypes.GetVarInt(0))); //Successfully loaded break; + // modified by reinforce + case PacketIncomingType.SpawnLivingEntity: + if (login_phase) break; + int EntityID = dataTypes.ReadNextVarInt(packetData); + Guid EntityUUID = dataTypes.ReadNextUUID(packetData); + int EntityType = dataTypes.ReadNextVarInt(packetData); + Double X = dataTypes.ReadNextDouble(packetData); + Double Y = dataTypes.ReadNextDouble(packetData); + Double Z = dataTypes.ReadNextDouble(packetData); + byte EntityYaw = dataTypes.ReadNextByte(packetData); + byte EntityPitch = dataTypes.ReadNextByte(packetData); + byte EntityHeadPitch = dataTypes.ReadNextByte(packetData); + short VelocityX = dataTypes.ReadNextShort(packetData); + short VelocityY = dataTypes.ReadNextShort(packetData); + short VelocityZ = dataTypes.ReadNextShort(packetData); + + Location EntityLocation = new Location(X, Y, Z); + + + handler.OnSpawnLivingEntity(EntityID,EntityType,EntityUUID,EntityLocation); + break; + case PacketIncomingType.DestroyEntities: + int EntityCount = dataTypes.ReadNextVarInt(packetData); + int[] EntitiesList = new int[EntityCount]; + for(int i = 0; i < EntityCount; i++) + { + EntitiesList[i] = dataTypes.ReadNextVarInt(packetData); + } + handler.OnDestroyEntities(EntitiesList); + break; + case PacketIncomingType.SetCooldown: + int _itemID = dataTypes.ReadNextVarInt(packetData); + int tick = dataTypes.ReadNextVarInt(packetData); + handler.OnSetCooldown(_itemID, tick); + break; + case PacketIncomingType.EntityPosition: + EntityID = dataTypes.ReadNextVarInt(packetData); + Double DeltaX = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + Double DeltaY = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + Double DeltaZ = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + bool OnGround = dataTypes.ReadNextBool(packetData); + DeltaX = DeltaX / (128 * 32); + DeltaY = DeltaY / (128 * 32); + DeltaZ = DeltaZ / (128 * 32); + handler.OnEntityPosition(EntityID, DeltaX, DeltaY, DeltaZ,OnGround); + break; + case PacketIncomingType.EntityPositionAndRotation: + EntityID = dataTypes.ReadNextVarInt(packetData); + DeltaX = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + DeltaY = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + DeltaZ = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); + yaw = dataTypes.ReadNextByte(packetData); + pitch = dataTypes.ReadNextByte(packetData); + OnGround = dataTypes.ReadNextBool(packetData); + DeltaX = DeltaX / (128 * 32); + DeltaY = DeltaY / (128 * 32); + DeltaZ = DeltaZ / (128 * 32); + handler.OnEntityPosition(EntityID, DeltaX, DeltaY, DeltaZ, OnGround); + break; + case PacketIncomingType.EntityProperties: + EntityID = dataTypes.ReadNextVarInt(packetData); + int NumberOfProperties = dataTypes.ReadNextInt(packetData); + Dictionary keys = new Dictionary(); + for(int i = 0; i < NumberOfProperties; i++) + { + string _key = dataTypes.ReadNextString(packetData); + Double _value = dataTypes.ReadNextDouble(packetData); + + + int NumberOfModifiers = dataTypes.ReadNextVarInt(packetData); + //if (NumberOfModifiers == 0) continue; + for(int j = 0; j < NumberOfModifiers; j++) + { + dataTypes.ReadNextUUID(packetData); + Double amount = dataTypes.ReadNextDouble(packetData); + byte operation = dataTypes.ReadNextByte(packetData); + switch (operation) + { + case 0: _value += amount; break; + case 1: _value += (amount / 100); break; + case 2: _value *= amount; break; + } + } + keys.Add(_key, _value); + } + handler.OnEntityProperties(EntityID, keys); + break; + case PacketIncomingType.TimeUpdate: + long WorldAge = dataTypes.ReadNextLong(packetData); + long TimeOfday = dataTypes.ReadNextLong(packetData); + handler.OnTimeUpdate(WorldAge, TimeOfday); + break; default: return false; //Ignored packet } @@ -1023,5 +1120,29 @@ namespace MinecraftClient.Protocol.Handlers } return false; } + + // reinforce + public bool SendInteractEntityPacket(int EntityID, int type) + { + try + { + List fields = new List(); + fields.AddRange(dataTypes.GetVarInt(EntityID)); + fields.AddRange(dataTypes.GetVarInt(type)); + SendPacket(PacketOutgoingType.InteractEntity, fields); + return true; + } + catch (SocketException) { return false; } + catch (System.IO.IOException) { return false; } + catch (ObjectDisposedException) { return false; } + } + public bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z, int hand) + { + return true; + } + public bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z) + { + return true; + } } } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs index ca31e19c..b122ef90 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs @@ -176,6 +176,9 @@ namespace MinecraftClient.Protocol.Handlers { switch (packetID) { + // modified by reinforce + case 0x00: return PacketIncomingType.SpawnEntity; + case 0x03: return PacketIncomingType.SpawnLivingEntity; case 0x21: return PacketIncomingType.KeepAlive; case 0x26: return PacketIncomingType.JoinGame; case 0x0F: return PacketIncomingType.ChatMessage; @@ -194,6 +197,12 @@ namespace MinecraftClient.Protocol.Handlers case 0x14: return PacketIncomingType.CloseWindow; case 0x15: return PacketIncomingType.WindowItems; case 0x17: return PacketIncomingType.SetSlot; + case 0x38: return PacketIncomingType.DestroyEntities; + case 0x18: return PacketIncomingType.SetCooldown; + case 0x29: return PacketIncomingType.EntityPosition; + case 0x2A: return PacketIncomingType.EntityPositionAndRotation; + case 0x59: return PacketIncomingType.EntityProperties; + case 0x4F: return PacketIncomingType.TimeUpdate; default: return PacketIncomingType.UnknownPacket; } } @@ -301,6 +310,8 @@ namespace MinecraftClient.Protocol.Handlers case PacketOutgoingType.PlayerPosition: return 0x11; case PacketOutgoingType.PlayerPositionAndLook: return 0x12; case PacketOutgoingType.TeleportConfirm: return 0x00; + case PacketOutgoingType.HeldItemChange: return 0x23; + case PacketOutgoingType.InteractEntity: return 0x0E; } } diff --git a/MinecraftClient/Protocol/IMinecraftCom.cs b/MinecraftClient/Protocol/IMinecraftCom.cs index 0e5d55e8..83cec5ca 100644 --- a/MinecraftClient/Protocol/IMinecraftCom.cs +++ b/MinecraftClient/Protocol/IMinecraftCom.cs @@ -84,5 +84,10 @@ namespace MinecraftClient.Protocol /// packet Data /// True if message was successfully sent bool SendPluginChannelPacket(string channel, byte[] data); + + // by reinforce + bool SendInteractEntityPacket(int EntityID, int type); + bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z, int hand); + bool SendInteractEntityPacket(int EntityID, int type, float X, float Y, float Z); } } diff --git a/MinecraftClient/Protocol/IMinecraftComHandler.cs b/MinecraftClient/Protocol/IMinecraftComHandler.cs index 0bcc0bcf..1521c5f1 100644 --- a/MinecraftClient/Protocol/IMinecraftComHandler.cs +++ b/MinecraftClient/Protocol/IMinecraftComHandler.cs @@ -125,5 +125,19 @@ namespace MinecraftClient.Protocol /// The channel the message was sent on /// The data from the channel void OnPluginChannelMessage(string channel, byte[] data); + + void OnSpawnLivingEntity(int EntityID, int EntityType, Guid UUID, Location location); + + void OnDestroyEntities(int[] EntityID); + + void OnSetCooldown(int itemID, int tick); + + void OnEntityPosition(int EntityID, Double Dx, Double Dy, Double Dz,bool onGround); + + void OnEntityProperties(int EntityID, Dictionary prop); + + void OnTimeUpdate(long WorldAge, long TimeOfDay); + + void SetPlayerEntityID(int EntityID); } } diff --git a/entityID list.txt b/entityID list.txt new file mode 100644 index 00000000..8c521c6c --- /dev/null +++ b/entityID list.txt @@ -0,0 +1,1688 @@ +Entities +area_effect_cloud +ID +0 +Name +area_effect_cloud +Display name +Area Effect Cloud +Height +0.5 +Width +6.0 +Metadata +Inherits from ~abstract_entity +Own metadata: +Float: 0.5 +VarInt: 0 +Boolean: False +Particle: Unknown +armor_stand +ID +1 +Name +armor_stand +Display name +Armor Stand +Height +1.975 +Width +0.5 +Metadata +Inherits from ~abstract_living +Own metadata: +Byte: 0 +Rotations: Unknown +Rotations: Unknown +Rotations: Unknown +Rotations: Unknown +Rotations: Unknown +Rotations: Unknown +arrow +ID +2 +Name +arrow +Display name +Arrow +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Byte: 0 +OptUUID: Empty +Byte: 0 +Own metadata: +VarInt: -1 +bat +ID +3 +Name +bat +Display name +Bat +Height +0.9 +Width +0.5 +Metadata +Inherits from ~abstract_insentient +Own metadata: +Byte: 0 +bee +ID +4 +Name +bee +Display name +Bee +Height +0.6 +Width +0.7 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Byte: 0 +VarInt: 0 +blaze +ID +5 +Name +blaze +Display name +Blaze +Height +1.8 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Own metadata: +Byte: 0 +boat +ID +6 +Name +boat +Display name +Boat +Height +0.5625 +Width +1.375 +Metadata +Inherits from ~abstract_entity +Own metadata: +VarInt: 0 +VarInt: 1 +Float: 0.0 +VarInt: Unknown +Boolean: False +Boolean: False +VarInt: 0 +cat +ID +7 +Name +cat +Display name +Cat +Height +0.7 +Width +0.6 +Metadata +Inherits from ~abstract_tameable +Own metadata: +VarInt: 1 +Boolean: False +Boolean: False +VarInt: Unknown +cave_spider +ID +8 +Name +cave_spider +Display name +Cave Spider +Height +0.5 +Width +0.7 +Metadata +Inherits from spider +chest_minecart +ID +43 +Name +chest_minecart +Display name +Minecart with Chest +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +chicken +ID +9 +Name +chicken +Display name +Chicken +Height +0.7 +Width +0.4 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +cod +ID +10 +Name +cod +Display name +Cod +Height +0.3 +Width +0.5 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +command_block_minecart +ID +44 +Name +command_block_minecart +Display name +Minecart with Command Block +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +Own metadata: +String: "" +Chat: {'text': ''} +cow +ID +11 +Name +cow +Display name +Cow +Height +1.4 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +creeper +ID +12 +Name +creeper +Display name +Creeper +Height +1.7 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Own metadata: +VarInt: -1 +Boolean: False +Boolean: False +dolphin +ID +14 +Name +dolphin +Display name +Dolphin +Height +0.6 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Own metadata: +BlockPos: (0, 0, 0) +Boolean: False +VarInt: 2400 +donkey +ID +13 +Name +donkey +Display name +Donkey +Height +1.5 +Width +1.39648 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +Abstract parent: +Boolean: False +dragon_fireball +ID +15 +Name +dragon_fireball +Display name +Dragon Fireball +Height +1.0 +Width +1.0 +Metadata +Inherits from ~abstract_entity +drowned +ID +16 +Name +drowned +Display name +Drowned +Height +1.95 +Width +0.6 +Metadata +Inherits from zombie +egg +ID +79 +Name +egg +Display name +Thrown Egg +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +elder_guardian +ID +17 +Name +elder_guardian +Display name +Elder Guardian +Height +1.9975 +Width +1.9975 +Metadata +Inherits from guardian +end_crystal +ID +18 +Name +end_crystal +Display name +End Crystal +Height +2.0 +Width +2.0 +Metadata +Inherits from ~abstract_entity +Own metadata: +OptBlockPos: Empty +Boolean: True +ender_dragon +ID +19 +Name +ender_dragon +Display name +Ender Dragon +Height +8.0 +Width +16.0 +Metadata +Inherits from ~abstract_insentient +Own metadata: +VarInt: Unknown +ender_pearl +ID +80 +Name +ender_pearl +Display name +Thrown Ender Pearl +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +enderman +ID +20 +Name +enderman +Display name +Enderman +Height +2.9 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Own metadata: +OptBlockState: Empty +Boolean: False +Boolean: False +endermite +ID +21 +Name +endermite +Display name +Endermite +Height +0.3 +Width +0.4 +Metadata +Inherits from ~abstract_monster +evoker +ID +23 +Name +evoker +Display name +Evoker +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +evoker_fangs +ID +22 +Name +evoker_fangs +Display name +Evoker Fangs +Height +0.8 +Width +0.5 +Metadata +Inherits from ~abstract_entity +experience_bottle +ID +81 +Name +experience_bottle +Display name +Thrown Bottle o' Enchanting +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +experience_orb +ID +24 +Name +experience_orb +Display name +Experience Orb +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +eye_of_ender +ID +25 +Name +eye_of_ender +Display name +Eye of Ender +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Own metadata: +Slot: Empty +falling_block +ID +26 +Name +falling_block +Display name +Falling Block +Height +0.98 +Width +0.98 +Metadata +Inherits from ~abstract_entity +Own metadata: +BlockPos: (0, 0, 0) +fireball +ID +37 +Name +fireball +Display name +Fireball +Height +1.0 +Width +1.0 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +firework_rocket +ID +27 +Name +firework_rocket +Display name +Firework Rocket +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Own metadata: +Slot: Empty +OptVarInt: Empty +Boolean: False +fishing_bobber +ID +102 +Name +fishing_bobber +Display name +Fishing Bobber +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Own metadata: +VarInt: 0 +fox +ID +28 +Name +fox +Display name +Fox +Height +0.7 +Width +0.6 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +Byte: 0 +OptUUID: Empty +OptUUID: Empty +furnace_minecart +ID +45 +Name +furnace_minecart +Display name +Minecart with Furnace +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +Own metadata: +Boolean: False +ghast +ID +29 +Name +ghast +Display name +Ghast +Height +4.0 +Width +4.0 +Metadata +Inherits from ~abstract_insentient +Own metadata: +Boolean: False +giant +ID +30 +Name +giant +Display name +Giant +Height +12.0 +Width +3.6 +Metadata +Inherits from ~abstract_monster +guardian +ID +31 +Name +guardian +Display name +Guardian +Height +0.85 +Width +0.85 +Metadata +Inherits from ~abstract_monster +Own metadata: +Boolean: False +VarInt: 0 +hopper_minecart +ID +46 +Name +hopper_minecart +Display name +Minecart with Hopper +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +horse +ID +32 +Name +horse +Display name +Horse +Height +1.6 +Width +1.39648 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +Own metadata: +VarInt: 0 +husk +ID +33 +Name +husk +Display name +Husk +Height +1.95 +Width +0.6 +Metadata +Inherits from zombie +illusioner +ID +34 +Name +illusioner +Display name +Illusioner +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +iron_golem +ID +86 +Name +iron_golem +Display name +Iron Golem +Height +2.7 +Width +1.4 +Metadata +Inherits from ~abstract_insentient +Own metadata: +Byte: 0 +item +ID +35 +Name +item +Display name +Item +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Own metadata: +Slot: Empty +item_frame +ID +36 +Name +item_frame +Display name +Item Frame +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +Own metadata: +Slot: Empty +VarInt: 0 +leash_knot +ID +38 +Name +leash_knot +Display name +Leash Knot +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +lightning_bolt +ID +100 +Name +lightning_bolt +Display name +Lightning Bolt +Height +0.0 +Width +0.0 +Metadata +Inherits from ~abstract_entity +llama +ID +39 +Name +llama +Display name +Llama +Height +1.87 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +VarInt: -1 +VarInt: 0 +llama_spit +ID +40 +Name +llama_spit +Display name +Llama Spit +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +magma_cube +ID +41 +Name +magma_cube +Display name +Magma Cube +Height +2.04 +Width +2.04 +Metadata +Inherits from slime +minecart +ID +42 +Name +minecart +Display name +Minecart +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +mooshroom +ID +50 +Name +mooshroom +Display name +Mooshroom +Height +1.4 +Width +0.9 +Metadata +Inherits from cow +Own metadata: +String: Unknown +mule +ID +49 +Name +mule +Display name +Mule +Height +1.6 +Width +1.39648 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +Abstract parent: +Boolean: False +ocelot +ID +51 +Name +ocelot +Display name +Ocelot +Height +0.7 +Width +0.6 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Boolean: False +painting +ID +52 +Name +painting +Display name +Painting +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +panda +ID +53 +Name +panda +Display name +Panda +Height +1.25 +Width +1.3 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +VarInt: 0 +VarInt: 0 +Byte: 0 +Byte: 0 +Byte: 0 +parrot +ID +54 +Name +parrot +Display name +Parrot +Height +0.9 +Width +0.5 +Metadata +Inherits from ~abstract_tameable +Own metadata: +VarInt: 0 +phantom +ID +98 +Name +phantom +Display name +Phantom +Height +0.5 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Own metadata: +VarInt: 0 +pig +ID +55 +Name +pig +Display name +Pig +Height +0.9 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Boolean: False +VarInt: 0 +pillager +ID +88 +Name +pillager +Display name +Pillager +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +Own metadata: +Boolean: False +player +ID +101 +Name +player +Display name +Player +Height +1.8 +Width +0.6 +Metadata +Inherits from ~abstract_living +Own metadata: +Float: 0.0 +VarInt: 0 +Byte: 0 +Byte: 1 +NBT: Empty +NBT: Empty +polar_bear +ID +58 +Name +polar_bear +Display name +Polar Bear +Height +1.4 +Width +1.4 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Boolean: False +potion +ID +82 +Name +potion +Display name +Potion +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Own metadata: +Slot: Empty +pufferfish +ID +56 +Name +pufferfish +Display name +Pufferfish +Height +0.7 +Width +0.7 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +rabbit +ID +60 +Name +rabbit +Display name +Rabbit +Height +0.5 +Width +0.4 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +ravager +ID +99 +Name +ravager +Display name +Ravager +Height +2.2 +Width +1.95 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +salmon +ID +61 +Name +salmon +Display name +Salmon +Height +0.4 +Width +0.7 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +sheep +ID +62 +Name +sheep +Display name +Sheep +Height +1.3 +Width +0.9 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Byte: 0 +shulker +ID +63 +Name +shulker +Display name +Shulker +Height +1.0 +Width +1.0 +Metadata +Inherits from ~abstract_insentient +Own metadata: +Facing: Unknown +OptBlockPos: Empty +Byte: 0 +Byte: 16 +shulker_bullet +ID +64 +Name +shulker_bullet +Display name +Shulker Bullet +Height +0.3125 +Width +0.3125 +Metadata +Inherits from ~abstract_entity +silverfish +ID +65 +Name +silverfish +Display name +Silverfish +Height +0.3 +Width +0.4 +Metadata +Inherits from ~abstract_monster +skeleton +ID +66 +Name +skeleton +Display name +Skeleton +Height +1.99 +Width +0.6 +Metadata +Inherits from ~abstract_monster +skeleton_horse +ID +67 +Name +skeleton_horse +Display name +Skeleton Horse +Height +1.6 +Width +1.39648 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +slime +ID +68 +Name +slime +Display name +Slime +Height +2.04 +Width +2.04 +Metadata +Inherits from ~abstract_insentient +Own metadata: +VarInt: 1 +small_fireball +ID +69 +Name +small_fireball +Display name +Small Fireball +Height +0.3125 +Width +0.3125 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +snow_golem +ID +70 +Name +snow_golem +Display name +Snow Golem +Height +1.9 +Width +0.7 +Metadata +Inherits from ~abstract_insentient +Own metadata: +Byte: 16 +snowball +ID +71 +Name +snowball +Display name +Snowball +Height +0.25 +Width +0.25 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Slot: Empty +spawner_minecart +ID +47 +Name +spawner_minecart +Display name +Minecart with Spawner +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +spectral_arrow +ID +72 +Name +spectral_arrow +Display name +Spectral Arrow +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Byte: 0 +OptUUID: Empty +Byte: 0 +spider +ID +73 +Name +spider +Display name +Spider +Height +0.9 +Width +1.4 +Metadata +Inherits from ~abstract_monster +Own metadata: +Byte: 0 +squid +ID +74 +Name +squid +Display name +Squid +Height +0.8 +Width +0.8 +Metadata +Inherits from ~abstract_insentient +stray +ID +75 +Name +stray +Display name +Stray +Height +1.99 +Width +0.6 +Metadata +Inherits from ~abstract_monster +tnt +ID +59 +Name +tnt +Display name +Primed TNT +Height +0.98 +Width +0.98 +Metadata +Inherits from ~abstract_entity +Own metadata: +VarInt: 80 +tnt_minecart +ID +48 +Name +tnt_minecart +Display name +Minecart with TNT +Height +0.7 +Width +0.98 +Metadata +Inherits from ~abstract_minecart +trader_llama +ID +76 +Name +trader_llama +Display name +Trader Llama +Height +1.87 +Width +0.9 +Metadata +Inherits from llama +trident +ID +83 +Name +trident +Display name +Trident +Height +0.5 +Width +0.5 +Metadata +Inherits from ~abstract_entity +Abstract parent: +Byte: 0 +OptUUID: Empty +Byte: 0 +Own metadata: +Byte: 0 +Boolean: False +tropical_fish +ID +77 +Name +tropical_fish +Display name +Tropical Fish +Height +0.4 +Width +0.5 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +VarInt: 0 +turtle +ID +78 +Name +turtle +Display name +Turtle +Height +0.4 +Width +1.2 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +BlockPos: (0, 0, 0) +Boolean: False +Boolean: False +BlockPos: (0, 0, 0) +Boolean: False +Boolean: False +vex +ID +84 +Name +vex +Display name +Vex +Height +0.8 +Width +0.4 +Metadata +Inherits from ~abstract_monster +Own metadata: +Byte: 0 +villager +ID +85 +Name +villager +Display name +Villager +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +VarInt: 0 +Own metadata: +16: Unknown +vindicator +ID +87 +Name +vindicator +Display name +Vindicator +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +wandering_trader +ID +89 +Name +wandering_trader +Display name +Wandering Trader +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +VarInt: 0 +witch +ID +90 +Name +witch +Display name +Witch +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Abstract parent: +Boolean: False +Own metadata: +Boolean: False +wither +ID +91 +Name +wither +Display name +Wither +Height +3.5 +Width +0.9 +Metadata +Inherits from ~abstract_monster +Own metadata: +VarInt: 0 +VarInt: 0 +VarInt: 0 +VarInt: 0 +wither_skeleton +ID +92 +Name +wither_skeleton +Display name +Wither Skeleton +Height +2.4 +Width +0.7 +Metadata +Inherits from ~abstract_monster +wither_skull +ID +93 +Name +wither_skull +Display name +Wither Skull +Height +0.3125 +Width +0.3125 +Metadata +Inherits from ~abstract_entity +Own metadata: +Boolean: False +wolf +ID +94 +Name +wolf +Display name +Wolf +Height +0.85 +Width +0.6 +Metadata +Inherits from ~abstract_tameable +Own metadata: +Boolean: False +VarInt: Unknown +zombie +ID +95 +Name +zombie +Display name +Zombie +Height +1.95 +Width +0.6 +Metadata +Inherits from ~abstract_monster +Own metadata: +Boolean: False +VarInt: 0 +Boolean: False +zombie_horse +ID +96 +Name +zombie_horse +Display name +Zombie Horse +Height +1.6 +Width +1.39648 +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Abstract parent: +Byte: 0 +OptUUID: Empty +zombie_pigman +ID +57 +Name +zombie_pigman +Display name +Zombie Pigman +Height +1.95 +Width +0.6 +Metadata +Inherits from zombie +zombie_villager +ID +97 +Name +zombie_villager +Display name +Zombie Villager +Height +1.95 +Width +0.6 +Metadata +Inherits from zombie +Own metadata: +Boolean: False +16: Unknown +~abstract_entity +Name +~abstract_entity +Metadata +Own metadata: +Byte: 0 +VarInt: Unknown +OptChat: Empty +Boolean: False +Boolean: False +Boolean: False +18: Unknown +~abstract_insentient +Name +~abstract_insentient +Metadata +Inherits from ~abstract_living +Own metadata: +Byte: 0 +~abstract_living +Name +~abstract_living +Metadata +Inherits from ~abstract_entity +Own metadata: +Byte: 0 +Float: 1.0 +VarInt: 0 +Boolean: False +VarInt: 0 +VarInt: 0 +OptBlockPos: Empty +~abstract_minecart +Name +~abstract_minecart +Metadata +Inherits from ~abstract_entity +Own metadata: +VarInt: 0 +VarInt: 1 +Float: 0.0 +VarInt: Unknown +VarInt: 6 +Boolean: False +~abstract_monster +Name +~abstract_monster +Metadata +Inherits from ~abstract_insentient +~abstract_tameable +Name +~abstract_tameable +Metadata +Inherits from ~abstract_insentient +Abstract parent: +Boolean: False +Own metadata: +Byte: 0 +OptUUID: Empty \ No newline at end of file