MC 1.14 Terrain support (#703)

Minecraft 1.14 is now fully supported.

- Implement NBT parsing to skip NBT field in chunk data
- Update lighting data format in Chunk Data parsing
- Move Chunk Data parsing into Protocol18Terrain.cs
- Improve PaletteGenerator to greatly reduce palette files sizes
- Re-Generate Palette113.cs to reduce its size (378 Kib -> 50 Kib)
- Generate Palette114.cs (57 Kib instead of 516 Kib with prev format)
- Update Material.cs and MaterialExtensions.cs for new block types
This commit is contained in:
ORelio 2019-05-01 15:23:30 +02:00
parent d2cbc9f1c3
commit 0d58fb9063
11 changed files with 2703 additions and 8900 deletions

View file

@ -76,12 +76,12 @@ namespace MinecraftClient.Mapping.BlockPalettes
{ 60, Material.Farmland }, // Soil
{ 61, Material.Furnace }, // Furnace
{ 62, Material.Furnace }, // BurningFurnace
{ 63, Material.WallSign }, // SignPost
{ 63, Material.OakWallSign }, // SignPost
{ 64, Material.OakDoor }, // WoodenDoor:0
{ 65, Material.Ladder },
{ 66, Material.Rail }, // Rails
{ 67, Material.CobblestoneStairs },
{ 68, Material.WallSign },
{ 68, Material.OakWallSign }, // WallSign
{ 69, Material.Lever },
{ 70, Material.StonePressurePlate }, // StonePlate
{ 71, Material.IronDoor }, // IronDoorBlock

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -20,16 +20,32 @@ namespace MinecraftClient.Mapping.BlockPalettes
/// <returns>state => block name mappings</returns>
public static void JsonToClass(string blocksJsonFile, string outputClass, string outputEnum = null)
{
Dictionary<int, string> blocks = new Dictionary<int, string>();
HashSet<int> knownStates = new HashSet<int>();
Dictionary<string, HashSet<int>> blocks = new Dictionary<string, HashSet<int>>();
Json.JSONData palette = Json.ParseJson(File.ReadAllText(blocksJsonFile));
foreach (KeyValuePair<string, Json.JSONData> item in palette.Properties)
{
string blockType = item.Key;
//minecraft:item_name => ItemName
string blockType = String.Concat(
item.Key.Replace("minecraft:", "")
.Split('_')
.Select(word => char.ToUpper(word[0]) + word.Substring(1))
);
if (blocks.ContainsKey(blockType))
throw new InvalidDataException("Duplicate block type " + blockType + "!?");
blocks[blockType] = new HashSet<int>();
foreach (Json.JSONData state in item.Value.Properties["states"].DataArray)
{
int id = int.Parse(state.Properties["id"].StringValue);
blocks[id] = blockType;
if (knownStates.Contains(id))
throw new InvalidDataException("Duplicate state id " + id + "!?");
knownStates.Add(id);
blocks[blockType].Add(id);
}
}
@ -43,24 +59,46 @@ namespace MinecraftClient.Mapping.BlockPalettes
"{",
" public class PaletteXXX : PaletteMapping",
" {",
" private static Dictionary<int, Material> materials = new Dictionary<int, Material>()",
" private static Dictionary<int, Material> materials = new Dictionary<int, Material>();",
"",
" static PaletteXXX()",
" {",
});
foreach (KeyValuePair<int, string> item in blocks)
foreach (KeyValuePair<string, HashSet<int>> blockType in blocks)
{
//minecraft:item_name => ItemName
string name = String.Concat(
item.Value.Replace("minecraft:", "")
.Split('_')
.Select(word => char.ToUpper(word[0]) + word.Substring(1))
);
outFile.Add(" { " + item.Key + ", Material." + name + " },");
materials.Add(name);
if (blockType.Value.Count > 0)
{
List<int> idList = blockType.Value.ToList();
string materialName = blockType.Key;
materials.Add(materialName);
if (idList.Count > 1)
{
idList.Sort();
Queue<int> idQueue = new Queue<int>(idList);
while (idQueue.Count > 0)
{
int startValue = idQueue.Dequeue();
int endValue = startValue;
while (idQueue.Count > 0 && idQueue.Peek() == endValue + 1)
endValue = idQueue.Dequeue();
if (endValue > startValue)
{
outFile.Add(" for (int i = " + startValue + "; i <= " + endValue + "; i++)");
outFile.Add(" materials[i] = Material." + materialName + ";");
}
else outFile.Add(" materials[" + startValue + "] = Material." + materialName + ";");
}
}
else outFile.Add(" materials[" + idList[0] + "] = Material." + materialName + ";");
}
else throw new InvalidDataException("No state id for block type " + blockType.Key + "!?");
}
outFile.AddRange(new[] {
" };",
" }",
"",
" protected override Dictionary<int, Material> GetDict()",
" {",
@ -75,11 +113,18 @@ namespace MinecraftClient.Mapping.BlockPalettes
if (outputEnum != null)
{
outFile = new List<string>();
outFile.Add(" public enum Material");
outFile.Add(" {");
outFile.AddRange(new[] {
"namespace MinecraftClient.Mapping",
"{",
" public enum Material",
" {"
});
foreach (string material in materials)
outFile.Add(" " + material + ",");
outFile.Add(" }");
outFile.AddRange(new[] {
" }",
"}"
});
File.WriteAllLines(outputEnum, outFile);
}
}

View file

@ -142,6 +142,9 @@
WhiteTulip,
PinkTulip,
OxeyeDaisy,
Cornflower,
WitherRose,
LilyOfTheValley,
BrownMushroom,
RedMushroom,
GoldBlock,
@ -164,12 +167,22 @@
Wheat,
Farmland,
Furnace,
Sign,
OakSign,
SpruceSign,
BirchSign,
AcaciaSign,
JungleSign,
DarkOakSign,
OakDoor,
Ladder,
Rail,
CobblestoneStairs,
WallSign,
OakWallSign,
SpruceWallSign,
BirchWallSign,
AcaciaWallSign,
JungleWallSign,
DarkOakWallSign,
Lever,
StonePressurePlate,
IronDoor,
@ -222,16 +235,16 @@
JungleTrapdoor,
AcaciaTrapdoor,
DarkOakTrapdoor,
StoneBricks,
MossyStoneBricks,
CrackedStoneBricks,
ChiseledStoneBricks,
InfestedStone,
InfestedCobblestone,
InfestedStoneBricks,
InfestedMossyStoneBricks,
InfestedCrackedStoneBricks,
InfestedChiseledStoneBricks,
StoneBricks,
MossyStoneBricks,
CrackedStoneBricks,
ChiseledStoneBricks,
BrownMushroomBlock,
RedMushroomBlock,
MushroomStem,
@ -292,6 +305,9 @@
PottedWhiteTulip,
PottedPinkTulip,
PottedOxeyeDaisy,
PottedCornflower,
PottedLilyOfTheValley,
PottedWitherRose,
PottedRedMushroom,
PottedBrownMushroom,
PottedDeadBush,
@ -304,18 +320,18 @@
JungleButton,
AcaciaButton,
DarkOakButton,
SkeletonWallSkull,
SkeletonSkull,
WitherSkeletonWallSkull,
SkeletonWallSkull,
WitherSkeletonSkull,
ZombieWallHead,
WitherSkeletonWallSkull,
ZombieHead,
PlayerWallHead,
ZombieWallHead,
PlayerHead,
CreeperWallHead,
PlayerWallHead,
CreeperHead,
DragonWallHead,
CreeperWallHead,
DragonHead,
DragonWallHead,
Anvil,
ChippedAnvil,
DamagedAnvil,
@ -449,7 +465,9 @@
AcaciaSlab,
DarkOakSlab,
StoneSlab,
SmoothStoneSlab,
SandstoneSlab,
CutSandstoneSlab,
PetrifiedOakSlab,
CobblestoneSlab,
BrickSlab,
@ -457,6 +475,7 @@
NetherBrickSlab,
QuartzSlab,
RedSandstoneSlab,
CutRedSandstoneSlab,
PurpurSlab,
SmoothStone,
SmoothSandstone,
@ -585,16 +604,6 @@
BubbleCoral,
FireCoral,
HornCoral,
DeadTubeCoralWallFan,
DeadBrainCoralWallFan,
DeadBubbleCoralWallFan,
DeadFireCoralWallFan,
DeadHornCoralWallFan,
TubeCoralWallFan,
BrainCoralWallFan,
BubbleCoralWallFan,
FireCoralWallFan,
HornCoralWallFan,
DeadTubeCoralFan,
DeadBrainCoralFan,
DeadBubbleCoralFan,
@ -605,12 +614,81 @@
BubbleCoralFan,
FireCoralFan,
HornCoralFan,
DeadTubeCoralWallFan,
DeadBrainCoralWallFan,
DeadBubbleCoralWallFan,
DeadFireCoralWallFan,
DeadHornCoralWallFan,
TubeCoralWallFan,
BrainCoralWallFan,
BubbleCoralWallFan,
FireCoralWallFan,
HornCoralWallFan,
SeaPickle,
BlueIce,
Conduit,
BambooSapling,
Bamboo,
PottedBamboo,
VoidAir,
CaveAir,
BubbleColumn,
PolishedGraniteStairs,
SmoothRedSandstoneStairs,
MossyStoneBrickStairs,
PolishedDioriteStairs,
MossyCobblestoneStairs,
EndStoneBrickStairs,
StoneStairs,
SmoothSandstoneStairs,
SmoothQuartzStairs,
GraniteStairs,
AndesiteStairs,
RedNetherBrickStairs,
PolishedAndesiteStairs,
DioriteStairs,
PolishedGraniteSlab,
SmoothRedSandstoneSlab,
MossyStoneBrickSlab,
PolishedDioriteSlab,
MossyCobblestoneSlab,
EndStoneBrickSlab,
SmoothSandstoneSlab,
SmoothQuartzSlab,
GraniteSlab,
AndesiteSlab,
RedNetherBrickSlab,
PolishedAndesiteSlab,
DioriteSlab,
BrickWall,
PrismarineWall,
RedSandstoneWall,
MossyStoneBrickWall,
GraniteWall,
StoneBrickWall,
NetherBrickWall,
AndesiteWall,
RedNetherBrickWall,
SandstoneWall,
EndStoneBrickWall,
DioriteWall,
Scaffolding,
Loom,
Barrel,
Smoker,
BlastFurnace,
CartographyTable,
FletchingTable,
Grindstone,
Lectern,
SmithingTable,
Stonecutter,
Bell,
Lantern,
Campfire,
SweetBerryBush,
StructureBlock,
Jigsaw,
Composter,
}
}

View file

@ -135,7 +135,6 @@ namespace MinecraftClient.Mapping
case Material.CraftingTable:
case Material.Farmland:
case Material.Furnace:
case Material.Sign:
case Material.OakDoor:
case Material.Ladder:
case Material.CobblestoneStairs:
@ -176,16 +175,16 @@ namespace MinecraftClient.Mapping
case Material.JungleTrapdoor:
case Material.AcaciaTrapdoor:
case Material.DarkOakTrapdoor:
case Material.StoneBricks:
case Material.MossyStoneBricks:
case Material.CrackedStoneBricks:
case Material.ChiseledStoneBricks:
case Material.InfestedStone:
case Material.InfestedCobblestone:
case Material.InfestedStoneBricks:
case Material.InfestedMossyStoneBricks:
case Material.InfestedCrackedStoneBricks:
case Material.InfestedChiseledStoneBricks:
case Material.StoneBricks:
case Material.MossyStoneBricks:
case Material.CrackedStoneBricks:
case Material.ChiseledStoneBricks:
case Material.BrownMushroomBlock:
case Material.RedMushroomBlock:
case Material.MushroomStem:
@ -236,22 +235,25 @@ namespace MinecraftClient.Mapping
case Material.PottedWhiteTulip:
case Material.PottedPinkTulip:
case Material.PottedOxeyeDaisy:
case Material.PottedCornflower:
case Material.PottedLilyOfTheValley:
case Material.PottedWitherRose:
case Material.PottedRedMushroom:
case Material.PottedBrownMushroom:
case Material.PottedDeadBush:
case Material.PottedCactus:
case Material.SkeletonWallSkull:
case Material.SkeletonSkull:
case Material.WitherSkeletonWallSkull:
case Material.SkeletonWallSkull:
case Material.WitherSkeletonSkull:
case Material.ZombieWallHead:
case Material.WitherSkeletonWallSkull:
case Material.ZombieHead:
case Material.PlayerWallHead:
case Material.ZombieWallHead:
case Material.PlayerHead:
case Material.CreeperWallHead:
case Material.PlayerWallHead:
case Material.CreeperHead:
case Material.DragonWallHead:
case Material.CreeperWallHead:
case Material.DragonHead:
case Material.DragonWallHead:
case Material.Anvil:
case Material.ChippedAnvil:
case Material.DamagedAnvil:
@ -327,7 +329,9 @@ namespace MinecraftClient.Mapping
case Material.AcaciaSlab:
case Material.DarkOakSlab:
case Material.StoneSlab:
case Material.SmoothStoneSlab:
case Material.SandstoneSlab:
case Material.CutSandstoneSlab:
case Material.PetrifiedOakSlab:
case Material.CobblestoneSlab:
case Material.BrickSlab:
@ -335,6 +339,7 @@ namespace MinecraftClient.Mapping
case Material.NetherBrickSlab:
case Material.QuartzSlab:
case Material.RedSandstoneSlab:
case Material.CutRedSandstoneSlab:
case Material.PurpurSlab:
case Material.SmoothStone:
case Material.SmoothSandstone:
@ -451,8 +456,64 @@ namespace MinecraftClient.Mapping
case Material.SeaPickle:
case Material.BlueIce:
case Material.Conduit:
case Material.Bamboo:
case Material.PottedBamboo:
case Material.BubbleColumn:
case Material.PolishedGraniteStairs:
case Material.SmoothRedSandstoneStairs:
case Material.MossyStoneBrickStairs:
case Material.PolishedDioriteStairs:
case Material.MossyCobblestoneStairs:
case Material.EndStoneBrickStairs:
case Material.StoneStairs:
case Material.SmoothSandstoneStairs:
case Material.SmoothQuartzStairs:
case Material.GraniteStairs:
case Material.AndesiteStairs:
case Material.RedNetherBrickStairs:
case Material.PolishedAndesiteStairs:
case Material.DioriteStairs:
case Material.PolishedGraniteSlab:
case Material.SmoothRedSandstoneSlab:
case Material.MossyStoneBrickSlab:
case Material.PolishedDioriteSlab:
case Material.MossyCobblestoneSlab:
case Material.EndStoneBrickSlab:
case Material.SmoothSandstoneSlab:
case Material.SmoothQuartzSlab:
case Material.GraniteSlab:
case Material.AndesiteSlab:
case Material.RedNetherBrickSlab:
case Material.PolishedAndesiteSlab:
case Material.DioriteSlab:
case Material.BrickWall:
case Material.PrismarineWall:
case Material.RedSandstoneWall:
case Material.MossyStoneBrickWall:
case Material.GraniteWall:
case Material.StoneBrickWall:
case Material.NetherBrickWall:
case Material.AndesiteWall:
case Material.RedNetherBrickWall:
case Material.SandstoneWall:
case Material.EndStoneBrickWall:
case Material.DioriteWall:
case Material.Loom:
case Material.Barrel:
case Material.Smoker:
case Material.BlastFurnace:
case Material.CartographyTable:
case Material.FletchingTable:
case Material.Grindstone:
case Material.Lectern:
case Material.SmithingTable:
case Material.Stonecutter:
case Material.Bell:
case Material.Lantern:
case Material.Campfire:
case Material.StructureBlock:
case Material.Jigsaw:
case Material.Composter:
return true;
default:
return false;
@ -472,6 +533,7 @@ namespace MinecraftClient.Mapping
case Material.Cactus:
case Material.Lava:
case Material.MagmaBlock:
case Material.Campfire:
return true;
default:
return false;