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": {