From 2be01a1282fe6402b0600d6f40de38e4dac3fa6e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 19 Dec 2020 15:31:06 +0100 Subject: [PATCH] blockId: Map all available block states to it --- .../de/bixilon/minosoft/data/Mappings.java | 2 +- .../minosoft/data/mappings/BlockId.java | 21 ++++ .../minosoft/data/mappings/ModIdentifier.java | 5 + .../minosoft/data/mappings/blocks/Blocks.java | 96 ------------------- .../mappings/versions/VersionMapping.java | 84 ++++++++++++++-- 5 files changed, 105 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java diff --git a/src/main/java/de/bixilon/minosoft/data/Mappings.java b/src/main/java/de/bixilon/minosoft/data/Mappings.java index 8eba9d9b6..5ba3b6f81 100644 --- a/src/main/java/de/bixilon/minosoft/data/Mappings.java +++ b/src/main/java/de/bixilon/minosoft/data/Mappings.java @@ -14,8 +14,8 @@ package de.bixilon.minosoft.data; public enum Mappings { - BLOCKS, REGISTRIES, + BLOCKS, ENTITIES; public String getFilename() { diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/BlockId.java b/src/main/java/de/bixilon/minosoft/data/mappings/BlockId.java index 1c6de83b3..7885ad25b 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/BlockId.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/BlockId.java @@ -13,13 +13,34 @@ package de.bixilon.minosoft.data.mappings; +import de.bixilon.minosoft.data.mappings.blocks.Block; + +import java.util.HashSet; + public class BlockId extends ModIdentifier { + private final HashSet blocks; + + public BlockId(String mod, String identifier, HashSet blocks) { + super(mod, identifier); + this.blocks = blocks; + } public BlockId(String mod, String identifier) { super(mod, identifier); + this.blocks = new HashSet<>(); } public BlockId(String fullIdentifier) { super(fullIdentifier); + this.blocks = new HashSet<>(); + } + + public BlockId(ModIdentifier identifier) { + super(identifier); + this.blocks = new HashSet<>(); + } + + public HashSet getBlocks() { + return this.blocks; } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/ModIdentifier.java b/src/main/java/de/bixilon/minosoft/data/mappings/ModIdentifier.java index 7764b7d46..b51632453 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/ModIdentifier.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/ModIdentifier.java @@ -37,6 +37,11 @@ public class ModIdentifier { this.identifier = split[1]; } + public ModIdentifier(ModIdentifier identifier) { + this.mod = identifier.getMod(); + this.identifier = identifier.getIdentifier(); + } + public String getMod() { return this.mod; } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java deleted file mode 100644 index a1940d9d9..000000000 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.data.mappings.blocks; - -import com.google.common.collect.HashBiMap; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import de.bixilon.minosoft.config.StaticConfiguration; - -import java.util.HashSet; - -public class Blocks { - - public static HashBiMap load(String mod, JsonObject json, boolean metaData) { - HashBiMap versionMapping = HashBiMap.create(json.size() * 10); - for (String identifierName : json.keySet()) { - JsonObject identifierJSON = json.getAsJsonObject(identifierName); - JsonArray statesArray = identifierJSON.getAsJsonArray("states"); - for (int i = 0; i < statesArray.size(); i++) { - JsonObject statesJSON = statesArray.get(i).getAsJsonObject(); - Block block; - if (statesJSON.has("properties")) { - // properties are optional - JsonObject propertiesJSON = statesJSON.getAsJsonObject("properties"); - BlockRotations rotation = BlockRotations.NONE; - if (propertiesJSON.has("facing")) { - rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("facing").getAsString()); - propertiesJSON.remove("facing"); - } else if (propertiesJSON.has("rotation")) { - rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("rotation").getAsString()); - propertiesJSON.remove("rotation"); - } else if (propertiesJSON.has("orientation")) { - rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("orientation").getAsString()); - propertiesJSON.remove("orientation"); - } else if (propertiesJSON.has("axis")) { - rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("axis").getAsString()); - propertiesJSON.remove("axis"); - } - - HashSet properties = new HashSet<>(); - for (String propertyName : propertiesJSON.keySet()) { - if (StaticConfiguration.DEBUG_MODE) { - if (BlockProperties.PROPERTIES_MAPPING.get(propertyName) == null) { - throw new RuntimeException(String.format("Unknown block property: %s (identifier=%s)", propertyName, identifierName)); - } - if (BlockProperties.PROPERTIES_MAPPING.get(propertyName).get(propertiesJSON.get(propertyName).getAsString()) == null) { - throw new RuntimeException(String.format("Unknown block property: %s -> %s (identifier=%s)", propertyName, propertiesJSON.get(propertyName).getAsString(), identifierName)); - } - } - properties.add(BlockProperties.PROPERTIES_MAPPING.get(propertyName).get(propertiesJSON.get(propertyName).getAsString())); - } - - block = new Block(mod, identifierName, properties, rotation); - } else { - // no properties, directly add block - block = new Block(mod, identifierName); - } - int blockId = getBlockId(statesJSON, metaData); - if (StaticConfiguration.DEBUG_MODE) { - checkAndCrashIfBlockIsIn(blockId, identifierName, versionMapping); - } - versionMapping.put(blockId, block); - } - } - return versionMapping; - } - - private static int getBlockId(JsonObject json, boolean metaData) { - int blockId = json.get("id").getAsInt(); - if (metaData) { - blockId <<= 4; - if (json.has("meta")) { - // old format (with metadata) - blockId |= json.get("meta").getAsByte(); - } - } - return blockId; - } - - private static void checkAndCrashIfBlockIsIn(int blockId, String identifierName, HashBiMap versionMapping) { - if (versionMapping.containsKey(blockId)) { - throw new RuntimeException(String.format("Block Id %s is already present for %s! (identifier=%s)", blockId, versionMapping.get(blockId), identifierName)); - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java index 951667fb8..e045252f2 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java @@ -17,6 +17,7 @@ import com.google.common.collect.HashBiMap; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import de.bixilon.minosoft.config.StaticConfiguration; import de.bixilon.minosoft.data.EntityClassMappings; import de.bixilon.minosoft.data.Mappings; import de.bixilon.minosoft.data.entities.EntityInformation; @@ -24,7 +25,8 @@ import de.bixilon.minosoft.data.entities.EntityMetaDataFields; import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.*; import de.bixilon.minosoft.data.mappings.blocks.Block; -import de.bixilon.minosoft.data.mappings.blocks.Blocks; +import de.bixilon.minosoft.data.mappings.blocks.BlockProperties; +import de.bixilon.minosoft.data.mappings.blocks.BlockRotations; import de.bixilon.minosoft.data.mappings.particle.Particle; import de.bixilon.minosoft.data.mappings.statistics.Statistic; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; @@ -66,6 +68,24 @@ public class VersionMapping { this.parentMapping = parentMapping; } + private static int getBlockId(JsonObject json, boolean metaData) { + int blockId = json.get("id").getAsInt(); + if (metaData) { + blockId <<= 4; + if (json.has("meta")) { + // old format (with metadata) + blockId |= json.get("meta").getAsByte(); + } + } + return blockId; + } + + private static void checkAndCrashIfBlockIsIn(int blockId, String identifierName, HashBiMap versionMapping) { + if (versionMapping.containsKey(blockId)) { + throw new RuntimeException(String.format("Block Id %s is already present for %s! (identifier=%s)", blockId, versionMapping.get(blockId), identifierName)); + } + } + public Motive getMotiveByIdentifier(String identifier) { if (this.parentMapping != null) { Motive motive = this.parentMapping.getMotiveByIdentifier(identifier); @@ -373,7 +393,59 @@ public class VersionMapping { if (data == null) { break; } - this.blockMap = Blocks.load(mod, data, !version.isFlattened()); + + for (String identifierName : data.keySet()) { + JsonObject identifierJSON = data.getAsJsonObject(identifierName); + JsonArray statesArray = identifierJSON.getAsJsonArray("states"); + for (int i = 0; i < statesArray.size(); i++) { + JsonObject statesJSON = statesArray.get(i).getAsJsonObject(); + Block block; + if (statesJSON.has("properties")) { + // properties are optional + JsonObject propertiesJSON = statesJSON.getAsJsonObject("properties"); + BlockRotations rotation = BlockRotations.NONE; + if (propertiesJSON.has("facing")) { + rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("facing").getAsString()); + propertiesJSON.remove("facing"); + } else if (propertiesJSON.has("rotation")) { + rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("rotation").getAsString()); + propertiesJSON.remove("rotation"); + } else if (propertiesJSON.has("orientation")) { + rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("orientation").getAsString()); + propertiesJSON.remove("orientation"); + } else if (propertiesJSON.has("axis")) { + rotation = BlockRotations.ROTATION_MAPPING.get(propertiesJSON.get("axis").getAsString()); + propertiesJSON.remove("axis"); + } + + HashSet properties = new HashSet<>(); + for (String propertyName : propertiesJSON.keySet()) { + if (StaticConfiguration.DEBUG_MODE) { + if (BlockProperties.PROPERTIES_MAPPING.get(propertyName) == null) { + throw new RuntimeException(String.format("Unknown block property: %s (identifier=%s)", propertyName, identifierName)); + } + if (BlockProperties.PROPERTIES_MAPPING.get(propertyName).get(propertiesJSON.get(propertyName).getAsString()) == null) { + throw new RuntimeException(String.format("Unknown block property: %s -> %s (identifier=%s)", propertyName, propertiesJSON.get(propertyName).getAsString(), identifierName)); + } + } + properties.add(BlockProperties.PROPERTIES_MAPPING.get(propertyName).get(propertiesJSON.get(propertyName).getAsString())); + } + + block = new Block(mod, identifierName, properties, rotation); + + // map block id + this.blockIdMap.get(this.blockIdMap.inverse().get(new BlockId(block))).getBlocks().add(block); + } else { + // no properties, directly add block + block = new Block(mod, identifierName); + } + int blockId = getBlockId(statesJSON, !version.isFlattened()); + if (StaticConfiguration.DEBUG_MODE) { + checkAndCrashIfBlockIsIn(blockId, identifierName, this.blockMap); + } + this.blockMap.put(blockId, block); + } + } } case ENTITIES -> { if (data == null) { @@ -492,7 +564,7 @@ public class VersionMapping { return true; } } - return this.itemMap.containsValue(new Item(identifier.getFullIdentifier())); + return this.itemMap.containsValue(identifier); } public boolean doesBlockExist(ModIdentifier identifier) { @@ -501,7 +573,7 @@ public class VersionMapping { return true; } } - return this.blockIdMap.containsValue(new BlockId(identifier.getFullIdentifier())); + return this.blockIdMap.containsValue(identifier); } public boolean doesEnchantmentExist(ModIdentifier identifier) { @@ -510,7 +582,7 @@ public class VersionMapping { return true; } } - return this.enchantmentMap.containsValue(new Enchantment(identifier.getFullIdentifier())); + return this.enchantmentMap.containsValue(identifier); } public boolean doesMobEffectExist(ModIdentifier identifier) { @@ -519,6 +591,6 @@ public class VersionMapping { return true; } } - return this.mobEffectMap.containsValue(new MobEffect(identifier.getFullIdentifier())); + return this.mobEffectMap.containsValue(identifier); } }