mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-10-14 21:22:49 +00:00
Add support for 1.17 (#1630)
* fix caps * implement 1.17 without terrain * properly switch order of Tracking Position and Locked for 1.17 * Update MinecraftClient/Protocol/Handlers/PacketTypesIn.cs Co-authored-by: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com> Co-authored-by: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com>
This commit is contained in:
parent
83e61f04b7
commit
8bd221c248
8 changed files with 229 additions and 12 deletions
|
|
@ -207,6 +207,7 @@
|
|||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPalette115.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPalette116.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPalette1162.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPalette117.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPalette17.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketPalettes\PacketPaletteHelper.cs" />
|
||||
<Compile Include="Protocol\Handlers\PacketType18Handler.cs" />
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace MinecraftClient
|
|||
|
||||
public const string Version = MCHighestVersion;
|
||||
public const string MCLowestVersion = "1.4.6";
|
||||
public const string MCHighestVersion = "1.16.5";
|
||||
public const string MCHighestVersion = "1.17";
|
||||
public static readonly string BuildInfo = null;
|
||||
|
||||
private static Thread offlinePrompt = null;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,176 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace MinecraftClient.Protocol.Handlers.PacketPalettes
|
||||
{
|
||||
public class PacketPalette117 : PacketTypePalette
|
||||
{
|
||||
private Dictionary<int, PacketTypesIn> typeIn = new Dictionary<int, PacketTypesIn>()
|
||||
{
|
||||
{ 0x00, PacketTypesIn.SpawnEntity },
|
||||
{ 0x01, PacketTypesIn.SpawnExperienceOrb },
|
||||
{ 0x02, PacketTypesIn.SpawnLivingEntity },
|
||||
{ 0x03, PacketTypesIn.SpawnPainting },
|
||||
{ 0x04, PacketTypesIn.SpawnPlayer },
|
||||
{ 0x05, PacketTypesIn.SkulkVibrationSignal },
|
||||
{ 0x06, PacketTypesIn.EntityAnimation },
|
||||
{ 0x07, PacketTypesIn.Statistics },
|
||||
{ 0x08, PacketTypesIn.AcknowledgePlayerDigging },
|
||||
{ 0x09, PacketTypesIn.BlockBreakAnimation },
|
||||
{ 0x0A, PacketTypesIn.BlockEntityData },
|
||||
{ 0x0B, PacketTypesIn.BlockAction },
|
||||
{ 0x0C, PacketTypesIn.BlockChange },
|
||||
{ 0x0D, PacketTypesIn.BossBar },
|
||||
{ 0x0E, PacketTypesIn.ServerDifficulty },
|
||||
{ 0x0F, PacketTypesIn.ChatMessage },
|
||||
{ 0x10, PacketTypesIn.ClearTiles },
|
||||
{ 0x11, PacketTypesIn.TabComplete },
|
||||
{ 0x12, PacketTypesIn.DeclareCommands },
|
||||
{ 0x13, PacketTypesIn.CloseWindow },
|
||||
{ 0x14, PacketTypesIn.WindowItems },
|
||||
{ 0x15, PacketTypesIn.WindowProperty },
|
||||
{ 0x16, PacketTypesIn.SetSlot },
|
||||
{ 0x17, PacketTypesIn.SetCooldown },
|
||||
{ 0x18, PacketTypesIn.PluginMessage },
|
||||
{ 0x19, PacketTypesIn.NamedSoundEffect },
|
||||
{ 0x1A, PacketTypesIn.Disconnect },
|
||||
{ 0x1B, PacketTypesIn.EntityStatus },
|
||||
{ 0x1C, PacketTypesIn.Explosion },
|
||||
{ 0x1D, PacketTypesIn.UnloadChunk },
|
||||
{ 0x1E, PacketTypesIn.ChangeGameState },
|
||||
{ 0x1F, PacketTypesIn.OpenHorseWindow },
|
||||
{ 0x20, PacketTypesIn.InitializeWorldBorder },
|
||||
{ 0x21, PacketTypesIn.KeepAlive },
|
||||
{ 0x22, PacketTypesIn.ChunkData },
|
||||
{ 0x23, PacketTypesIn.Effect },
|
||||
{ 0x24, PacketTypesIn.Particle },
|
||||
{ 0x25, PacketTypesIn.UpdateLight },
|
||||
{ 0x26, PacketTypesIn.JoinGame },
|
||||
{ 0x27, PacketTypesIn.MapData },
|
||||
{ 0x28, PacketTypesIn.TradeList },
|
||||
{ 0x29, PacketTypesIn.EntityPosition },
|
||||
{ 0x2A, PacketTypesIn.EntityPositionAndRotation },
|
||||
{ 0x2B, PacketTypesIn.EntityRotation },
|
||||
{ 0x2C, PacketTypesIn.VehicleMove },
|
||||
{ 0x2D, PacketTypesIn.OpenBook },
|
||||
{ 0x2E, PacketTypesIn.OpenWindow },
|
||||
{ 0x2F, PacketTypesIn.OpenSignEditor },
|
||||
{ 0x30, PacketTypesIn.Ping },
|
||||
{ 0x31, PacketTypesIn.CraftRecipeResponse },
|
||||
{ 0x32, PacketTypesIn.PlayerAbilities },
|
||||
{ 0x33, PacketTypesIn.EndCombatEvent },
|
||||
{ 0x34, PacketTypesIn.EnterCombatEvent },
|
||||
{ 0x35, PacketTypesIn.DeathCombatEvent },
|
||||
{ 0x36, PacketTypesIn.PlayerInfo },
|
||||
{ 0x37, PacketTypesIn.FacePlayer },
|
||||
{ 0x38, PacketTypesIn.PlayerPositionAndLook },
|
||||
{ 0x39, PacketTypesIn.UnlockRecipes },
|
||||
{ 0x3A, PacketTypesIn.DestroyEntity },
|
||||
{ 0x3B, PacketTypesIn.RemoveEntityEffect },
|
||||
{ 0x3C, PacketTypesIn.ResourcePackSend },
|
||||
{ 0x3D, PacketTypesIn.Respawn },
|
||||
{ 0x3E, PacketTypesIn.EntityHeadLook },
|
||||
{ 0x3F, PacketTypesIn.MultiBlockChange },
|
||||
{ 0x40, PacketTypesIn.SelectAdvancementTab },
|
||||
{ 0x41, PacketTypesIn.ActionBar },
|
||||
{ 0x42, PacketTypesIn.WorldBorderCenter },
|
||||
{ 0x43, PacketTypesIn.WorldBorderLerpSize },
|
||||
{ 0x44, PacketTypesIn.WorldBorderSize },
|
||||
{ 0x45, PacketTypesIn.WorldBorderWarningDelay },
|
||||
{ 0x46, PacketTypesIn.WorldBorderWarningReach },
|
||||
{ 0x47, PacketTypesIn.Camera },
|
||||
{ 0x48, PacketTypesIn.HeldItemChange },
|
||||
{ 0x49, PacketTypesIn.UpdateViewPosition },
|
||||
{ 0x4A, PacketTypesIn.UpdateViewDistance },
|
||||
{ 0x4B, PacketTypesIn.SpawnPosition },
|
||||
{ 0x4C, PacketTypesIn.DisplayScoreboard },
|
||||
{ 0x4D, PacketTypesIn.EntityMetadata },
|
||||
{ 0x4E, PacketTypesIn.AttachEntity },
|
||||
{ 0x4F, PacketTypesIn.EntityVelocity },
|
||||
{ 0x50, PacketTypesIn.EntityEquipment },
|
||||
{ 0x51, PacketTypesIn.SetExperience },
|
||||
{ 0x52, PacketTypesIn.UpdateHealth },
|
||||
{ 0x53, PacketTypesIn.ScoreboardObjective },
|
||||
{ 0x54, PacketTypesIn.SetPassengers },
|
||||
{ 0x55, PacketTypesIn.Teams },
|
||||
{ 0x56, PacketTypesIn.UpdateScore },
|
||||
{ 0x57, PacketTypesIn.SetTitleSubTitle },
|
||||
{ 0x58, PacketTypesIn.TimeUpdate },
|
||||
{ 0x59, PacketTypesIn.SetTitleText },
|
||||
{ 0x5A, PacketTypesIn.SetTitleTime },
|
||||
{ 0x5B, PacketTypesIn.EntitySoundEffect },
|
||||
{ 0x5C, PacketTypesIn.SoundEffect },
|
||||
{ 0x5D, PacketTypesIn.StopSound },
|
||||
{ 0x5E, PacketTypesIn.PlayerListHeaderAndFooter },
|
||||
{ 0x5F, PacketTypesIn.NBTQueryResponse },
|
||||
{ 0x60, PacketTypesIn.CollectItem },
|
||||
{ 0x61, PacketTypesIn.EntityTeleport },
|
||||
{ 0x62, PacketTypesIn.Advancements },
|
||||
{ 0x63, PacketTypesIn.EntityProperties },
|
||||
{ 0x64, PacketTypesIn.EntityEffect },
|
||||
{ 0x65, PacketTypesIn.DeclareRecipes },
|
||||
{ 0x66, PacketTypesIn.Tags },
|
||||
};
|
||||
|
||||
private Dictionary<int, PacketTypesOut> typeOut = new Dictionary<int, PacketTypesOut>()
|
||||
{
|
||||
{ 0x00, PacketTypesOut.TeleportConfirm },
|
||||
{ 0x01, PacketTypesOut.QueryBlockNBT },
|
||||
{ 0x02, PacketTypesOut.SetDifficulty },
|
||||
{ 0x03, PacketTypesOut.ChatMessage },
|
||||
{ 0x04, PacketTypesOut.ClientStatus },
|
||||
{ 0x05, PacketTypesOut.ClientSettings },
|
||||
{ 0x06, PacketTypesOut.TabComplete },
|
||||
{ 0x07, PacketTypesOut.ClickWindowButton },
|
||||
{ 0x08, PacketTypesOut.ClickWindow },
|
||||
{ 0x09, PacketTypesOut.CloseWindow },
|
||||
{ 0x0A, PacketTypesOut.PluginMessage },
|
||||
{ 0x0B, PacketTypesOut.EditBook },
|
||||
{ 0x0C, PacketTypesOut.EntityNBTRequest },
|
||||
{ 0x0D, PacketTypesOut.InteractEntity },
|
||||
{ 0x0E, PacketTypesOut.GenerateStructure },
|
||||
{ 0x0F, PacketTypesOut.KeepAlive },
|
||||
{ 0x10, PacketTypesOut.LockDifficulty },
|
||||
{ 0x11, PacketTypesOut.PlayerPosition },
|
||||
{ 0x12, PacketTypesOut.PlayerPositionAndRotation },
|
||||
{ 0x13, PacketTypesOut.PlayerRotation },
|
||||
{ 0x14, PacketTypesOut.PlayerMovement },
|
||||
{ 0x15, PacketTypesOut.VehicleMove },
|
||||
{ 0x16, PacketTypesOut.SteerBoat },
|
||||
{ 0x17, PacketTypesOut.PickItem },
|
||||
{ 0x18, PacketTypesOut.CraftRecipeRequest },
|
||||
{ 0x19, PacketTypesOut.PlayerAbilities },
|
||||
{ 0x1A, PacketTypesOut.PlayerDigging },
|
||||
{ 0x1B, PacketTypesOut.EntityAction },
|
||||
{ 0x1C, PacketTypesOut.SteerVehicle },
|
||||
{ 0x1D, PacketTypesOut.Pong },
|
||||
{ 0x1E, PacketTypesOut.SetDisplayedRecipe },
|
||||
{ 0x1F, PacketTypesOut.SetRecipeBookState },
|
||||
{ 0x20, PacketTypesOut.NameItem },
|
||||
{ 0x21, PacketTypesOut.ResourcePackStatus },
|
||||
{ 0x22, PacketTypesOut.AdvancementTab },
|
||||
{ 0x23, PacketTypesOut.SelectTrade },
|
||||
{ 0x24, PacketTypesOut.SetBeaconEffect },
|
||||
{ 0x25, PacketTypesOut.HeldItemChange },
|
||||
{ 0x26, PacketTypesOut.UpdateCommandBlock },
|
||||
{ 0x27, PacketTypesOut.UpdateCommandBlockMinecart },
|
||||
{ 0x28, PacketTypesOut.CreativeInventoryAction },
|
||||
{ 0x29, PacketTypesOut.UpdateJigsawBlock },
|
||||
{ 0x2A, PacketTypesOut.UpdateStructureBlock },
|
||||
{ 0x2B, PacketTypesOut.UpdateSign },
|
||||
{ 0x2C, PacketTypesOut.Animation },
|
||||
{ 0x2D, PacketTypesOut.Spectate },
|
||||
{ 0x2E, PacketTypesOut.PlayerBlockPlacement },
|
||||
{ 0x2F, PacketTypesOut.UseItem },
|
||||
};
|
||||
|
||||
protected override Dictionary<int, PacketTypesIn> GetListIn()
|
||||
{
|
||||
return typeIn;
|
||||
}
|
||||
|
||||
protected override Dictionary<int, PacketTypesOut> GetListOut()
|
||||
{
|
||||
return typeOut;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -51,7 +51,7 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
public PacketTypePalette GetTypeHandler(int protocol)
|
||||
{
|
||||
PacketTypePalette p;
|
||||
if (protocol > Protocol18Handler.MC1165Version)
|
||||
if (protocol > Protocol18Handler.MC117Version)
|
||||
throw new NotImplementedException(Translations.Get("exception.palette.packet"));
|
||||
if (protocol <= Protocol18Handler.MC18Version)
|
||||
p = new PacketPalette17();
|
||||
|
|
@ -69,7 +69,10 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
p = new PacketPalette115();
|
||||
else if (protocol <= Protocol18Handler.MC1161Version)
|
||||
p = new PacketPalette116();
|
||||
else p = new PacketPalette1162();
|
||||
else if (protocol <= Protocol18Handler.MC1165Version)
|
||||
p = new PacketPalette1162();
|
||||
else
|
||||
p = new PacketPalette117();
|
||||
|
||||
p.SetForgeEnabled(this.forgeEnabled);
|
||||
return p;
|
||||
|
|
|
|||
|
|
@ -102,7 +102,24 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
EntityProperties,
|
||||
EntityEffect,
|
||||
DeclareRecipes,
|
||||
SetTitleTime,
|
||||
SetTitleText,
|
||||
SetTitleSubTitle,
|
||||
WorldBorderWarningReach,
|
||||
WorldBorderWarningDelay,
|
||||
WorldBorderSize,
|
||||
WorldBorderLerpSize,
|
||||
WorldBorderCenter,
|
||||
ActionBar,
|
||||
Tags,
|
||||
DestroyEntity, // For 1.17+
|
||||
DeathCombatEvent,
|
||||
EnterCombatEvent,
|
||||
EndCombatEvent,
|
||||
Ping,
|
||||
InitializeWorldBorder,
|
||||
SkulkVibrationSignal,
|
||||
ClearTiles,
|
||||
UseBed, // For 1.13.2 or below
|
||||
MapChunkBulk, // For 1.8 or below
|
||||
SetCompression, // For 1.8 or below
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
Spectate,
|
||||
PlayerBlockPlacement,
|
||||
UseItem,
|
||||
Pong,
|
||||
PrepareCraftingGrid, // For 1.12 - 1.12.1 only
|
||||
EnchantItem, // For 1.13.2 or below
|
||||
GenerateStructure, // Added in 1.16
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
internal const int MC1162Version = 751;
|
||||
internal const int MC1163Version = 753;
|
||||
internal const int MC1165Version = 754;
|
||||
internal const int MC117Version = 755;
|
||||
|
||||
private int compression_treshold = 0;
|
||||
private bool autocomplete_received = false;
|
||||
|
|
@ -299,6 +300,7 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
else
|
||||
dataTypes.ReadNextString(packetData);
|
||||
// TODO handle dimensions for 1.16+, needed for terrain handling
|
||||
// TODO this data give min and max y which will be needed for chunk collumn handling
|
||||
this.currentDimension = 0;
|
||||
}
|
||||
else if (protocolversion >= MC191Version)
|
||||
|
|
@ -405,8 +407,10 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
// Teleport confirm packet
|
||||
SendPacket(PacketTypesOut.TeleportConfirm, dataTypes.GetVarInt(teleportID));
|
||||
}
|
||||
|
||||
if (protocolversion >= MC117Version) dataTypes.ReadNextBool(packetData);
|
||||
break;
|
||||
case PacketTypesIn.ChunkData:
|
||||
case PacketTypesIn.ChunkData: //TODO implement for 1.17, bit mask is not limited to 0-15 anymore
|
||||
if (handler.GetTerrainEnabled())
|
||||
{
|
||||
int chunkX = dataTypes.ReadNextInt(packetData);
|
||||
|
|
@ -458,12 +462,16 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
case PacketTypesIn.MapData:
|
||||
int mapid = dataTypes.ReadNextVarInt(packetData);
|
||||
byte scale = dataTypes.ReadNextByte(packetData);
|
||||
bool trackingposition = dataTypes.ReadNextBool(packetData);
|
||||
bool trackingposition = protocolversion >= MC117Version ? false : dataTypes.ReadNextBool(packetData);
|
||||
bool locked = false;
|
||||
if (protocolversion >= MC114Version)
|
||||
{
|
||||
locked = dataTypes.ReadNextBool(packetData);
|
||||
}
|
||||
if (protocolversion >= MC117Version)
|
||||
{
|
||||
trackingposition = dataTypes.ReadNextBool(packetData);
|
||||
}
|
||||
int iconcount = dataTypes.ReadNextVarInt(packetData);
|
||||
handler.OnMapData(mapid, scale, trackingposition, locked, iconcount);
|
||||
break;
|
||||
|
|
@ -841,6 +849,8 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
case PacketTypesIn.ResourcePackSend:
|
||||
string url = dataTypes.ReadNextString(packetData);
|
||||
string hash = dataTypes.ReadNextString(packetData);
|
||||
bool forced = dataTypes.ReadNextBool(packetData);
|
||||
String forcedMessage = ChatParser.ParseText(dataTypes.ReadNextString(packetData));
|
||||
// Some server plugins may send invalid resource packs to probe the client and we need to ignore them (issue #1056)
|
||||
if (hash.Length != 40)
|
||||
break;
|
||||
|
|
@ -935,6 +945,12 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
handler.OnDestroyEntities(EntitiesList);
|
||||
}
|
||||
break;
|
||||
case PacketTypesIn.DestroyEntity:
|
||||
if (handler.GetEntityHandlingEnabled())
|
||||
{
|
||||
handler.OnDestroyEntities(new [] { dataTypes.ReadNextVarInt(packetData) });
|
||||
}
|
||||
break;
|
||||
case PacketTypesIn.EntityPosition:
|
||||
if (handler.GetEntityHandlingEnabled())
|
||||
{
|
||||
|
|
@ -969,7 +985,7 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
if (handler.GetEntityHandlingEnabled())
|
||||
{
|
||||
int EntityID = dataTypes.ReadNextVarInt(packetData);
|
||||
int NumberOfProperties = dataTypes.ReadNextInt(packetData);
|
||||
int NumberOfProperties = protocolversion >= MC117Version ? dataTypes.ReadNextVarInt(packetData) : dataTypes.ReadNextInt(packetData);
|
||||
Dictionary<string, Double> keys = new Dictionary<string, Double>();
|
||||
for (int i = 0; i < NumberOfProperties; i++)
|
||||
{
|
||||
|
|
@ -1056,7 +1072,9 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
case PacketTypesIn.Explosion:
|
||||
Location explosionLocation = new Location(dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData));
|
||||
float explosionStrength = dataTypes.ReadNextFloat(packetData);
|
||||
int explosionBlockCount = dataTypes.ReadNextInt(packetData);
|
||||
int explosionBlockCount = protocolversion >= MC117Version
|
||||
? dataTypes.ReadNextVarInt(packetData)
|
||||
: dataTypes.ReadNextInt(packetData);
|
||||
// Ignoring additional fields (records, pushback)
|
||||
handler.OnExplosion(explosionLocation, explosionStrength, explosionBlockCount);
|
||||
break;
|
||||
|
|
@ -1565,6 +1583,8 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
else fields.Add(skinParts);
|
||||
if (protocolversion >= MC19Version)
|
||||
fields.AddRange(dataTypes.GetVarInt(mainHand));
|
||||
if (protocolversion >= MC117Version)
|
||||
fields.Add(1);
|
||||
SendPacket(PacketTypesOut.ClientSettings, fields);
|
||||
}
|
||||
catch (SocketException) { }
|
||||
|
|
@ -1850,14 +1870,11 @@ namespace MinecraftClient.Protocol.Handlers
|
|||
packet.Add((byte)windowId);
|
||||
packet.AddRange(dataTypes.GetShort((short)slotId));
|
||||
packet.Add(button);
|
||||
packet.AddRange(dataTypes.GetShort(actionNumber));
|
||||
|
||||
if (protocolversion < MC117Version) packet.AddRange(dataTypes.GetShort(actionNumber));
|
||||
if (protocolversion >= MC19Version)
|
||||
packet.AddRange(dataTypes.GetVarInt(mode));
|
||||
else packet.Add(mode);
|
||||
|
||||
packet.AddRange(dataTypes.GetItemSlot(item, itemPalette));
|
||||
|
||||
SendPacket(PacketTypesOut.ClickWindow, packet);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ namespace MinecraftClient.Protocol
|
|||
int[] supportedVersions_Protocol16 = { 51, 60, 61, 72, 73, 74, 78 };
|
||||
if (Array.IndexOf(supportedVersions_Protocol16, ProtocolVersion) > -1)
|
||||
return new Protocol16Handler(Client, ProtocolVersion, Handler);
|
||||
int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751, 753, 754 };
|
||||
int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751, 753, 754, 755 };
|
||||
if (Array.IndexOf(supportedVersions_Protocol18, ProtocolVersion) > -1)
|
||||
return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo);
|
||||
throw new NotSupportedException(Translations.Get("exception.version_unsupport", ProtocolVersion));
|
||||
|
|
@ -245,6 +245,8 @@ namespace MinecraftClient.Protocol
|
|||
case "1.16.4":
|
||||
case "1.16.5":
|
||||
return 754;
|
||||
case "1.17":
|
||||
return 755;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue