diff --git a/pom.xml b/pom.xml index b5e28d0cb..904569781 100644 --- a/pom.xml +++ b/pom.xml @@ -26,8 +26,8 @@ org.apache.maven.plugins maven-compiler-plugin - 11 - 11 + 14 + 14 diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java index 06e7ff006..efda7a179 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java @@ -13,6 +13,8 @@ package de.bixilon.minosoft.render.blockModels; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import de.bixilon.minosoft.Config; @@ -32,6 +34,13 @@ import java.util.Map; import static de.bixilon.minosoft.util.Util.readJsonFromFile; public class BlockModel { + public static final HashBiMap rotationAdjust = HashBiMap.create(Map.of( + BlockRotation.EAST, BlockRotation.SOUTH, + BlockRotation.SOUTH, BlockRotation.WEST, + BlockRotation.WEST, BlockRotation.NORTH, + BlockRotation.NORTH, BlockRotation.EAST + )); + HashMap> blockConfigurationStates; boolean isFull; diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModelLoader.java b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModelLoader.java index c6a22c6b3..903b688f5 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModelLoader.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModelLoader.java @@ -21,10 +21,7 @@ import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.Blocks; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.render.blockModels.Face.Face; import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation; -import de.bixilon.minosoft.render.blockModels.specialModels.CropModel; -import de.bixilon.minosoft.render.blockModels.specialModels.FireModel; -import de.bixilon.minosoft.render.blockModels.specialModels.WireModel; -import de.bixilon.minosoft.render.blockModels.specialModels.StairsModel; +import de.bixilon.minosoft.render.blockModels.specialModels.*; import de.bixilon.minosoft.render.texture.TextureLoader; import org.apache.commons.collections.primitives.ArrayFloatList; @@ -102,27 +99,19 @@ public class BlockModelLoader { private HashSet loadModel(String mod, String identifier, JsonObject block) { HashSet result = new HashSet<>(); try { - BlockModel model = null; + String type = ""; + if (block.has("type")) { - String type = block.get("type").getAsString(); - switch (type) { - case "fire": - model = new FireModel(block, mod); - break; - case "stairs": - model = new StairsModel(block, mod); - break; - case "wire": - model = new WireModel(block, mod); - break; - case "crop": - model = new CropModel(block, mod); - break; - } - } - if (model == null) { - model = new BlockModel(block, mod); + type = block.get("type").getAsString(); } + BlockModel model = switch (type) { + case "fire" -> new FireModel(block, mod); + case "stairs" -> new StairsModel(block, mod); + case "wire" -> new WireModel(block, mod); + case "crop" -> new CropModel(block, mod); + case "door" -> new DoorModel(block, mod); + default -> new BlockModel(block, mod); + }; result.addAll(model.getAllTextures()); HashMap modMap = blockDescriptionMap.get(mod); modMap.put(identifier, model); diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java index 5e80127e0..e73b64438 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java @@ -16,6 +16,7 @@ package de.bixilon.minosoft.render.blockModels.specialModels; import com.google.gson.JsonObject; import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.Block; import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.BlockProperties; +import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.render.blockModels.BlockModel; import de.bixilon.minosoft.render.blockModels.Face.Face; import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation; @@ -44,6 +45,7 @@ public class CropModel extends BlockModel { return prepareBlockState(modelMap.get(property.name()), adjacentBlocks, block); } } + Log.warn("failed to prepare block: " + block.toString()); return new HashSet<>(); } diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/DoorModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/DoorModel.java new file mode 100644 index 000000000..3fd9feeeb --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/DoorModel.java @@ -0,0 +1,100 @@ +/* + * Codename Minosoft + * Copyright (C) 2020 Lukas Eisenhauer + * + * 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.render.blockModels.specialModels; + +import com.google.gson.JsonObject; +import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.Block; +import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.BlockProperties; +import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.BlockRotation; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.render.blockModels.BlockModel; +import de.bixilon.minosoft.render.blockModels.Face.Face; +import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation; +import de.bixilon.minosoft.render.blockModels.subBlocks.SubBlock; +import de.bixilon.minosoft.render.texture.TextureLoader; + +import java.util.HashMap; +import java.util.HashSet; + +public class DoorModel extends BlockModel { + HashSet bottom; + HashSet bottom_hinge; + + HashSet top; + HashSet top_hinge; + + public DoorModel(JsonObject block, String mod) { + bottom = super.load(mod, block.get("bottom").getAsString()); + bottom_hinge = super.load(mod, block.get("bottom_hinge").getAsString()); + + top = super.load(mod, block.get("top").getAsString()); + top_hinge = super.load(mod, block.get("top_hinge").getAsString()); + } + + @Override + public HashSet prepare(Block block, HashMap adjacentBlocks) { + if (block.getProperties().contains(BlockProperties.HINGE_LEFT)) { + return prepareHinge(bottom, top, block, adjacentBlocks); + } + return prepareHinge(bottom_hinge, top_hinge, block, adjacentBlocks); + } + + private static HashSet prepareHinge(HashSet bottom, HashSet top, Block block, + HashMap adjacentBlocks) { + if (block.getProperties().contains(BlockProperties.OPEN)) { + return prepareHalf(bottom, top, block, adjacentBlocks, + rotationAdjust.inverse().get(block.getRotation())); + } else { + return prepareHalf(bottom,top, block, adjacentBlocks, block.getRotation()); + } + } + + private static HashSet prepareHalf(HashSet bottom, HashSet top, + Block block, HashMap adjacentBlocks, + BlockRotation rotation) { + if (block.getProperties().contains(BlockProperties.HALF_LOWER)) { + return prepareBlockState(bottom, adjacentBlocks, new Block("", "", + rotation)); + } + else if (block.getProperties().contains(BlockProperties.HALF_UPPER)) { + return prepareBlockState(top, adjacentBlocks, new Block("", "", + rotation)); + } + Log.warn("now"); + return null; + } + + @Override + public boolean isFull() { + return false; + } + + @Override + public HashSet getAllTextures() { + HashSet result = new HashSet<>(); + result.addAll(getTextures(bottom)); + result.addAll(getTextures(bottom_hinge)); + result.addAll(getTextures(top)); + result.addAll(getTextures(top_hinge)); + return result; + } + + @Override + public void applyTextures(String mod, TextureLoader loader) { + applyConfigurationTextures(bottom, mod, loader); + applyConfigurationTextures(bottom_hinge, mod, loader); + applyConfigurationTextures(top, mod, loader); + applyConfigurationTextures(top_hinge, mod, loader); + } +} diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/StairsModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/StairsModel.java index d64ef4e9c..b942b6698 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/StairsModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/StairsModel.java @@ -25,20 +25,12 @@ import de.bixilon.minosoft.render.texture.TextureLoader; import java.util.HashMap; import java.util.HashSet; -import java.util.Map; public class StairsModel extends BlockModel { HashSet straight; HashSet inner; HashSet outer; - public static final Map rotationAdjust = Map.of( - BlockRotation.EAST, BlockRotation.SOUTH, - BlockRotation.SOUTH, BlockRotation.WEST, - BlockRotation.WEST, BlockRotation.NORTH, - BlockRotation.NORTH, BlockRotation.EAST - ); - public StairsModel(JsonObject block, String mod) { straight = super.load(mod, block.get("straight").getAsString()); inner = super.load(mod, block.get("inner").getAsString()); diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlockPosition.java b/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlockPosition.java index 9d6c06e26..4ea929cac 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlockPosition.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlockPosition.java @@ -75,6 +75,9 @@ public class SubBlockPosition { } public SubBlockPosition rotated(Block block) { + if (block.getRotation() == null) { + return this; + } switch (block.getRotation()) { case EAST: return eastRotator.apply(this); diff --git a/src/main/resources/assets/mapping/blockModels/minecraft.json b/src/main/resources/assets/mapping/blockModels/minecraft.json index 5a9c44631..e240712d2 100644 --- a/src/main/resources/assets/mapping/blockModels/minecraft.json +++ b/src/main/resources/assets/mapping/blockModels/minecraft.json @@ -699,7 +699,97 @@ "base_name": "wheat_stage" }, "farmland": { - "blockModel": "farmland" + "states": [ + { + "properties": { + "moisture": "0" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "1" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "2" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "3" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "4" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "5" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "6" + }, + "blockModel": "farmland" + }, + { + "properties": { + "moisture": "7" + }, + "blockModel": "farmland_moist" + } + ] + }, + "furnace": { + "states": [ + { + "properties": { + "lit": "false" + }, + "blockModel": "furnace" + }, + { + "properties": { + "lit": "true" + }, + "blockModel": "furnace_on" + } + ] + }, + "oak_sign": { + "blockModel": "oak_sign" + }, + "spruce_sign": { + "blockModel": "spruce_sign" + }, + "birch_sign": { + "blockModel": "birch_sign" + }, + "acacia_sign": { + "blockModel": "acacia_sign" + }, + "jungle_sign": { + "blockModel": "jungle_sign" + }, + "dark_oak_sign": { + "blockModel": "dark_oak_sign" + }, + "oak_door": { + "type": "door", + "bottom": "oak_door_bottom", + "bottom_hinge": "oak_door_bottom_hinge", + "top": "oak_door_top", + "top_hinge": "oak_door_top_hinge" } }, "tinted_textures": {