Compare commits
2 Commits
develop
...
develop-te
Author | SHA1 | Date | |
---|---|---|---|
2d4f820f04 | |||
ab97315910 |
1
.idea/modules.xml
generated
1
.idea/modules.xml
generated
@ -3,6 +3,7 @@
|
|||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<modules>
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/PixelPic.main.iml" filepath="$PROJECT_DIR$/.idea/modules/PixelPic.main.iml" />
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/PixelPic.main.iml" filepath="$PROJECT_DIR$/.idea/modules/PixelPic.main.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/PixelPics.PixelPic.main.iml" filepath="$PROJECT_DIR$/.idea/modules/PixelPics.PixelPic.main.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/eu.mhsl.minecraft.pixelpic.PixelPic.main.iml" filepath="$PROJECT_DIR$/.idea/modules/eu.mhsl.minecraft.pixelpic.PixelPic.main.iml" />
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/eu.mhsl.minecraft.pixelpic.PixelPic.main.iml" filepath="$PROJECT_DIR$/.idea/modules/eu.mhsl.minecraft.pixelpic.PixelPic.main.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
|
@ -3,9 +3,20 @@ package eu.mhsl.minecraft.pixelpic;
|
|||||||
import eu.mhsl.minecraft.pixelpic.commands.PixelPicCommand;
|
import eu.mhsl.minecraft.pixelpic.commands.PixelPicCommand;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.render.DefaultScreenRenderer;
|
import eu.mhsl.minecraft.pixelpic.render.render.DefaultScreenRenderer;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.render.Renderer;
|
import eu.mhsl.minecraft.pixelpic.render.render.Renderer;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.jar.JarEntry;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
public final class Main extends JavaPlugin {
|
public final class Main extends JavaPlugin {
|
||||||
private static Main instance;
|
private static Main instance;
|
||||||
private Renderer screenRenderer;
|
private Renderer screenRenderer;
|
||||||
@ -13,68 +24,78 @@ public final class Main extends JavaPlugin {
|
|||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
instance = this;
|
instance = this;
|
||||||
|
extractJsonResources();
|
||||||
|
|
||||||
Bukkit.getPluginCommand("pixelPic").setExecutor(new PixelPicCommand());
|
Bukkit.getPluginCommand("pixelPic").setExecutor(new PixelPicCommand());
|
||||||
//
|
|
||||||
// Bukkit.getPluginCommand("test2").setExecutor((sender, command, label, args) -> {
|
Bukkit.getPluginCommand("test").setExecutor((sender, command, label, args) -> {
|
||||||
// if(!(sender instanceof Player player)) return false;
|
Material.getMaterial("acacia_button");
|
||||||
// Bukkit.broadcast(Component.text("HI"));
|
Bukkit.broadcast(Component.text(Material.STONE.getBlockTranslationKey().replace("block.minecraft.", "")));
|
||||||
//
|
|
||||||
// Resolution.Pixels pixels = Resolution.Pixels._256P;
|
if(!(sender instanceof Player player))
|
||||||
// Resolution.AspectRatio aspectRatio = Resolution.AspectRatio._1_1;
|
throw new IllegalStateException("Dieser Command kann nur von einem Spieler ausgeführt werden!");
|
||||||
// Resolution resolution = new Resolution(pixels, aspectRatio);
|
|
||||||
// BufferedImage image = screenRenderer.render((Player) sender, resolution);
|
File blockDir = new File(getDataFolder(), "models/block");
|
||||||
// Bukkit.broadcast(Component.text(image.toString()));
|
for (File file : blockDir.listFiles()) {
|
||||||
//
|
String blockName = file.getName().substring(0, file.getName().lastIndexOf('.'));
|
||||||
// File file = new File(getDataFolder(), "Bild" + ".png");
|
Material material = Material.getMaterial(blockName.toUpperCase());
|
||||||
// try {
|
System.out.println(material);
|
||||||
// getDataFolder().mkdir();
|
if(material == null) {
|
||||||
// ImageIO.write(image, "png", file);
|
System.out.println(blockName);
|
||||||
// } catch (Exception e) {
|
}
|
||||||
// return true;
|
}
|
||||||
// }
|
|
||||||
//
|
return true;
|
||||||
// ItemStack map = new ItemStack(Material.FILLED_MAP, 1);
|
});
|
||||||
// MapMeta meta = (MapMeta) map.getItemMeta();
|
|
||||||
// MapView mapView = Bukkit.createMap(Bukkit.getWorlds().getFirst());
|
|
||||||
// mapView.addRenderer(new ImageMapRenderer(image, 0, 0));
|
|
||||||
// meta.setMapView(mapView);
|
|
||||||
// map.setItemMeta(meta);
|
|
||||||
// player.getInventory().addItem(map);
|
|
||||||
//
|
|
||||||
// ItemStack map2 = new ItemStack(Material.FILLED_MAP, 1);
|
|
||||||
// MapMeta meta1 = (MapMeta) map2.getItemMeta();
|
|
||||||
// MapView mapView4 = Bukkit.createMap(Bukkit.getWorlds().getFirst());
|
|
||||||
// mapView4.addRenderer(new ImageMapRenderer(image, 1, 0));
|
|
||||||
// meta1.setMapView(mapView4);
|
|
||||||
// map2.setItemMeta(meta1);
|
|
||||||
// player.getInventory().addItem(map2);
|
|
||||||
//
|
|
||||||
// ItemStack map3 = new ItemStack(Material.FILLED_MAP, 1);
|
|
||||||
// MapMeta meta2 = (MapMeta) map3.getItemMeta();
|
|
||||||
// MapView mapView3 = Bukkit.createMap(Bukkit.getWorlds().getFirst());
|
|
||||||
// mapView3.addRenderer(new ImageMapRenderer(image, 0, 1));
|
|
||||||
// meta2.setMapView(mapView3);
|
|
||||||
// map3.setItemMeta(meta2);
|
|
||||||
// player.getInventory().addItem(map3);
|
|
||||||
//
|
|
||||||
// ItemStack map4 = new ItemStack(Material.FILLED_MAP, 1);
|
|
||||||
// MapMeta meta3 = (MapMeta) map4.getItemMeta();
|
|
||||||
// MapView mapView2 = Bukkit.createMap(Bukkit.getWorlds().getFirst());
|
|
||||||
// mapView2.addRenderer(new ImageMapRenderer(image, 1, 1));
|
|
||||||
// meta3.setMapView(mapView2);
|
|
||||||
// map4.setItemMeta(meta3);
|
|
||||||
// player.getInventory().addItem(map4);
|
|
||||||
//
|
|
||||||
// player.updateInventory();
|
|
||||||
//
|
|
||||||
// return true;
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void extractJsonResources() {
|
||||||
|
String resourcePath = "models/block/"; // Pfad im JAR
|
||||||
|
File outputDir = new File(getDataFolder(), resourcePath);
|
||||||
|
if (outputDir.exists()) return;
|
||||||
|
outputDir.mkdirs();
|
||||||
|
|
||||||
|
try {
|
||||||
|
URL jarUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
|
||||||
|
File jarFile = new File(jarUrl.toURI());
|
||||||
|
|
||||||
|
try (JarFile jar = new JarFile(jarFile)) {
|
||||||
|
Enumeration<JarEntry> entries = jar.entries();
|
||||||
|
|
||||||
|
while (entries.hasMoreElements()) {
|
||||||
|
JarEntry entry = entries.nextElement();
|
||||||
|
String entryName = entry.getName();
|
||||||
|
|
||||||
|
// Nur JSON-Dateien im gewünschten Ordner
|
||||||
|
if (entryName.startsWith(resourcePath) && entryName.endsWith(".json")) {
|
||||||
|
InputStream in = getResource(entryName);
|
||||||
|
if (in == null) continue;
|
||||||
|
|
||||||
|
File outFile = new File(getDataFolder(), entryName);
|
||||||
|
outFile.getParentFile().mkdirs(); // Ordnerstruktur sicherstellen
|
||||||
|
|
||||||
|
try (OutputStream out = new FileOutputStream(outFile)) {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int len;
|
||||||
|
while ((len = in.read(buffer)) != -1) {
|
||||||
|
out.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
System.out.println("Extrahiert: " + entryName);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | URISyntaxException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Renderer getScreenRenderer() {
|
public Renderer getScreenRenderer() {
|
||||||
if(this.screenRenderer == null) this.screenRenderer = new DefaultScreenRenderer();
|
if(this.screenRenderer == null) this.screenRenderer = new DefaultScreenRenderer();
|
||||||
return this.screenRenderer;
|
return this.screenRenderer;
|
||||||
|
@ -0,0 +1,151 @@
|
|||||||
|
package eu.mhsl.minecraft.pixelpic.render.raytrace;
|
||||||
|
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.model.Model;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.registry.AdvancedModelRegistry;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.registry.ModelRegistry;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.util.BlockRaytracer;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.util.Intersection;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.util.MathUtil;
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class AdvancedRaytracer implements Raytracer {
|
||||||
|
private final int maxDistance;
|
||||||
|
private final int reflectionDepth;
|
||||||
|
|
||||||
|
private final AdvancedModelRegistry textureRegistry;
|
||||||
|
private Block reflectedBlock;
|
||||||
|
|
||||||
|
public AdvancedRaytracer() {
|
||||||
|
this(300, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdvancedRaytracer(int maxDistance, int reflectionDepth) {
|
||||||
|
this.maxDistance = maxDistance;
|
||||||
|
this.reflectionDepth = reflectionDepth;
|
||||||
|
|
||||||
|
this.textureRegistry = new AdvancedModelRegistry();
|
||||||
|
this.textureRegistry.initialize();
|
||||||
|
|
||||||
|
this.reflectedBlock = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int trace(World world, Vector point, Vector direction) {
|
||||||
|
return trace(world, point, direction, reflectionDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int trace(World world, Vector point, Vector direction, int reflectionDepth) {
|
||||||
|
Location loc = point.toLocation(world);
|
||||||
|
loc.setDirection(direction);
|
||||||
|
BlockRaytracer iterator = new BlockRaytracer(loc);
|
||||||
|
int baseColor = Color.fromRGB(65, 89, 252).asRGB();
|
||||||
|
Vector finalIntersection = null;
|
||||||
|
|
||||||
|
int reflectionColor = 0;
|
||||||
|
double reflectionFactor = 0;
|
||||||
|
boolean reflected = false;
|
||||||
|
|
||||||
|
Vector transparencyStart = null;
|
||||||
|
int transparencyColor = 0;
|
||||||
|
double transparencyFactor = 0;
|
||||||
|
|
||||||
|
Material occlusionMaterial = null;
|
||||||
|
BlockData occlusionData = null;
|
||||||
|
|
||||||
|
for (int i = 0; i < maxDistance; i++) {
|
||||||
|
if (!iterator.hasNext()) break;
|
||||||
|
Block block = iterator.next();
|
||||||
|
if (reflectedBlock != null && reflectedBlock.equals(block)) continue;
|
||||||
|
reflectedBlock = null;
|
||||||
|
|
||||||
|
Material material = block.getType();
|
||||||
|
if (material == Material.AIR) {
|
||||||
|
occlusionMaterial = null;
|
||||||
|
occlusionData = null;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model textureModel = textureRegistry.getModel(block.getType(), block.getBlockData(), block.getTemperature(), block.getHumidity());
|
||||||
|
Intersection currentIntersection = Intersection.of(
|
||||||
|
MathUtil.toVector(iterator.getIntersectionFace()),
|
||||||
|
i == 0 ? point : iterator.getIntersectionPoint(),
|
||||||
|
direction
|
||||||
|
);
|
||||||
|
Intersection newIntersection = textureModel.intersect(block, currentIntersection);
|
||||||
|
|
||||||
|
if (newIntersection == null) continue;
|
||||||
|
|
||||||
|
int color = newIntersection.getColor();
|
||||||
|
|
||||||
|
if (!reflected && textureModel.getReflectionFactor() > 0 && reflectionDepth > 0 && (color >> 24) != 0) {
|
||||||
|
reflectedBlock = block;
|
||||||
|
reflectionColor = trace(
|
||||||
|
world,
|
||||||
|
newIntersection.getPoint(),
|
||||||
|
MathUtil.reflectVector(
|
||||||
|
point,
|
||||||
|
direction,
|
||||||
|
newIntersection.getPoint(),
|
||||||
|
newIntersection.getNormal()
|
||||||
|
),
|
||||||
|
reflectionDepth - 1
|
||||||
|
);
|
||||||
|
reflectionFactor = textureModel.getReflectionFactor();
|
||||||
|
reflected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transparencyStart == null && textureModel.getTransparencyFactor() > 0) {
|
||||||
|
transparencyStart = newIntersection.getPoint();
|
||||||
|
transparencyColor = newIntersection.getColor();
|
||||||
|
transparencyFactor = textureModel.getTransparencyFactor();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textureModel.isOccluding()) {
|
||||||
|
BlockData data = block.getBlockData();
|
||||||
|
|
||||||
|
if (material == occlusionMaterial && data.equals(occlusionData)) continue;
|
||||||
|
|
||||||
|
occlusionMaterial = material;
|
||||||
|
occlusionData = data;
|
||||||
|
} else {
|
||||||
|
occlusionMaterial = null;
|
||||||
|
occlusionData = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transparencyStart != null && textureModel.getTransparencyFactor() > 0) continue;
|
||||||
|
if ((color >> 24) == 0) continue;
|
||||||
|
|
||||||
|
baseColor = color;
|
||||||
|
finalIntersection = newIntersection.getPoint();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transparencyStart != null) {
|
||||||
|
baseColor = MathUtil.weightedColorSum(
|
||||||
|
baseColor,
|
||||||
|
transparencyColor,
|
||||||
|
transparencyFactor,
|
||||||
|
(1
|
||||||
|
- transparencyFactor)
|
||||||
|
* (1 + transparencyStart.distance(finalIntersection == null ? transparencyStart : finalIntersection)
|
||||||
|
/ 5.0));
|
||||||
|
}
|
||||||
|
if (reflected) {
|
||||||
|
baseColor = MathUtil.weightedColorSum(
|
||||||
|
baseColor,
|
||||||
|
reflectionColor,
|
||||||
|
1 - reflectionFactor,
|
||||||
|
reflectionFactor
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseColor & 0xFFFFFF;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package eu.mhsl.minecraft.pixelpic.render.raytrace;
|
package eu.mhsl.minecraft.pixelpic.render.raytrace;
|
||||||
|
|
||||||
import eu.mhsl.minecraft.pixelpic.render.model.Model;
|
import eu.mhsl.minecraft.pixelpic.render.model.Model;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.registry.DefaultModelRegistry;
|
import eu.mhsl.minecraft.pixelpic.render.registry.AdvancedModelRegistry;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.registry.ModelRegistry;
|
import eu.mhsl.minecraft.pixelpic.render.registry.ModelRegistry;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.util.BlockRaytracer;
|
import eu.mhsl.minecraft.pixelpic.render.util.BlockRaytracer;
|
||||||
import eu.mhsl.minecraft.pixelpic.render.util.Intersection;
|
import eu.mhsl.minecraft.pixelpic.render.util.Intersection;
|
||||||
@ -10,6 +10,7 @@ import org.bukkit.Color;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
@ -29,7 +30,7 @@ public class DefaultRaytracer implements Raytracer {
|
|||||||
this.maxDistance = maxDistance;
|
this.maxDistance = maxDistance;
|
||||||
this.reflectionDepth = reflectionDepth;
|
this.reflectionDepth = reflectionDepth;
|
||||||
|
|
||||||
this.textureRegistry = new DefaultModelRegistry();
|
this.textureRegistry = new AdvancedModelRegistry();
|
||||||
this.textureRegistry.initialize();
|
this.textureRegistry.initialize();
|
||||||
|
|
||||||
this.reflectedBlock = null;
|
this.reflectedBlock = null;
|
||||||
@ -71,6 +72,7 @@ public class DefaultRaytracer implements Raytracer {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Biome biome = block.getBiome();
|
||||||
Model textureModel = textureRegistry.getModel(block);
|
Model textureModel = textureRegistry.getModel(block);
|
||||||
Intersection currentIntersection = Intersection.of(
|
Intersection currentIntersection = Intersection.of(
|
||||||
MathUtil.toVector(iterator.getIntersectionFace()),
|
MathUtil.toVector(iterator.getIntersectionFace()),
|
||||||
|
@ -0,0 +1,157 @@
|
|||||||
|
package eu.mhsl.minecraft.pixelpic.render.registry;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.Main;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.model.AbstractModel;
|
||||||
|
import eu.mhsl.minecraft.pixelpic.render.model.Model;
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static eu.mhsl.minecraft.pixelpic.render.registry.DefaultModelRegistry.TEXTURE_SIZE;
|
||||||
|
|
||||||
|
public class AdvancedModelRegistry implements ModelRegistry {
|
||||||
|
private final Gson gson = new Gson();
|
||||||
|
|
||||||
|
private final Map<Material, Map<BlockData, Model>> modelMap = new HashMap<>();
|
||||||
|
private final Set<String> tintedBlocks = Set.of("grass", "grass_block", "leaves", "oak_leaves", "water", "vine", "sugar_cane");
|
||||||
|
|
||||||
|
public record BlockInfo(String parent, BlockTextures textures){}
|
||||||
|
public record BlockTextures(
|
||||||
|
String texture,
|
||||||
|
String bottom,
|
||||||
|
String top,
|
||||||
|
String all,
|
||||||
|
String particle,
|
||||||
|
String end,
|
||||||
|
String side,
|
||||||
|
String cross,
|
||||||
|
String rail,
|
||||||
|
String overlay
|
||||||
|
){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
System.out.println(modelMap);
|
||||||
|
|
||||||
|
File blockDir = new File(Main.getInstance().getDataFolder(), "models/block");
|
||||||
|
for (File file : Objects.requireNonNull(blockDir.listFiles())) {
|
||||||
|
addModelFromFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
registerModel(Material.LAVA, AbstractModel.Builder.createSimple(getTextureArray("lava_still"))
|
||||||
|
.transparency(0.15).reflection(0.05).occlusion().build());
|
||||||
|
registerModel(Material.WATER, AbstractModel.Builder.createSimple(getTextureArray("water_still"))
|
||||||
|
.transparency(0.60).reflection(0.1).occlusion().build());
|
||||||
|
} catch (Exception ignored) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Model getModel(Block block) {
|
||||||
|
return ModelRegistry.super.getModel(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Model getModel(Material material, BlockData blockData) {
|
||||||
|
return getModel(material, blockData, 0.8, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Model getModel(Material material, BlockData blockData, double temperature, double humidity) {
|
||||||
|
return modelMap.computeIfAbsent(material, key -> new HashMap<>()).getOrDefault(blockData,
|
||||||
|
blockData == null ? getDefaultModel()
|
||||||
|
: modelMap.get(material).getOrDefault(null, getDefaultModel()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Model getDefaultModel() {
|
||||||
|
return AbstractModel.Builder.createStatic(Color.PURPLE.asRGB()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerModel(Material material, Model blockModel) {
|
||||||
|
modelMap.computeIfAbsent(material, key -> new HashMap<>())
|
||||||
|
.put(null, blockModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addModelFromFile(File file) {
|
||||||
|
String blockName = file.getName().substring(0, file.getName().lastIndexOf('.'));
|
||||||
|
Material material = Material.getMaterial(blockName.toUpperCase());
|
||||||
|
if(material == null) return;
|
||||||
|
|
||||||
|
Model model = getModelFromFile(file);
|
||||||
|
if(model == null) return;
|
||||||
|
|
||||||
|
registerModel(material, model);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Model getModelFromFile(File file) {
|
||||||
|
try (Reader reader = new FileReader(file)) {
|
||||||
|
BlockInfo blockInfo = gson.fromJson(reader, BlockInfo.class);
|
||||||
|
|
||||||
|
if(blockInfo.textures.all != null) {
|
||||||
|
return AbstractModel.Builder.createSimple(
|
||||||
|
getTextureArray(blockInfo.textures.all.substring(blockInfo.textures.all.lastIndexOf('/') + 1))
|
||||||
|
).build();
|
||||||
|
}
|
||||||
|
if(blockInfo.textures.cross != null) {
|
||||||
|
return AbstractModel.Builder.createCross(
|
||||||
|
getTextureArray(blockInfo.textures.cross.substring(blockInfo.textures.cross.lastIndexOf('/') + 1))
|
||||||
|
).build();
|
||||||
|
}
|
||||||
|
if(blockInfo.textures.side != null && blockInfo.textures.bottom != null && blockInfo.textures.top != null) {
|
||||||
|
return AbstractModel.Builder.createMulti(
|
||||||
|
getTextureArray(blockInfo.textures.top.substring(blockInfo.textures.top.lastIndexOf('/') + 1)),
|
||||||
|
getTextureArray(blockInfo.textures.side.substring(blockInfo.textures.side.lastIndexOf('/') + 1)),
|
||||||
|
getTextureArray(blockInfo.textures.bottom.substring(blockInfo.textures.bottom.lastIndexOf('/') + 1))
|
||||||
|
).build();
|
||||||
|
}
|
||||||
|
if(blockInfo.textures.side != null && blockInfo.textures.end != null) {
|
||||||
|
return AbstractModel.Builder.createMulti(
|
||||||
|
getTextureArray(blockInfo.textures.end.substring(blockInfo.textures.end.lastIndexOf('/') + 1)),
|
||||||
|
getTextureArray(blockInfo.textures.side.substring(blockInfo.textures.side.lastIndexOf('/') + 1)),
|
||||||
|
getTextureArray(blockInfo.textures.end.substring(blockInfo.textures.end.lastIndexOf('/') + 1))
|
||||||
|
).build();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[][] getTextureArray(String textureName) {
|
||||||
|
int[][] texture = new int[TEXTURE_SIZE][TEXTURE_SIZE];
|
||||||
|
BufferedImage img;
|
||||||
|
URL url = this.getClass().getClassLoader().getResource(String.format("textures/block/%s.png", textureName));
|
||||||
|
if (url == null) {
|
||||||
|
throw new RuntimeException("Block Texture Resource not found.");
|
||||||
|
}
|
||||||
|
try (InputStream input = url.openConnection().getInputStream()) {
|
||||||
|
img = ImageIO.read(input);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int pixelY = 0; pixelY < TEXTURE_SIZE; pixelY++) {
|
||||||
|
for (int pixelX = 0; pixelX < TEXTURE_SIZE; pixelX++) {
|
||||||
|
texture[TEXTURE_SIZE - 1 - pixelY][TEXTURE_SIZE - 1 - pixelX] = img.getRGB(pixelX, pixelY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int tintPixel(int baseColor, int tintColor) {
|
||||||
|
int a = (baseColor >> 24) & 0xFF;
|
||||||
|
int r = ((baseColor >> 16) & 0xFF) * ((tintColor >> 16) & 0xFF) / 255;
|
||||||
|
int g = ((baseColor >> 8) & 0xFF) * ((tintColor >> 8) & 0xFF) / 255;
|
||||||
|
int b = (baseColor & 0xFF) * (tintColor & 0xFF) / 255;
|
||||||
|
return (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
}
|
BIN
src/main/resources/colormap/foliage.png
Normal file
BIN
src/main/resources/colormap/foliage.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
src/main/resources/colormap/grass.png
Normal file
BIN
src/main/resources/colormap/grass.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
6
src/main/resources/models/block/acacia_button.json
Normal file
6
src/main/resources/models/block/acacia_button.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button_inventory",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button_pressed",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_left",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_left_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_right",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_right_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_left",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_left_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_right",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_right_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_door_bottom",
|
||||||
|
"top": "minecraft:block/acacia_door_top"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_fence_gate.json
Normal file
6
src/main/resources/models/block/acacia_fence_gate.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_fence_gate",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_fence_gate_open",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_fence_gate_wall",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_fence_gate_wall_open",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/fence_inventory",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_fence_post.json
Normal file
6
src/main/resources/models/block/acacia_fence_post.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/fence_post",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_fence_side.json
Normal file
6
src/main/resources/models/block/acacia_fence_side.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/fence_side",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
5
src/main/resources/models/block/acacia_hanging_sign.json
Normal file
5
src/main/resources/models/block/acacia_hanging_sign.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/stripped_acacia_log"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_leaves.json
Normal file
6
src/main/resources/models/block/acacia_leaves.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/leaves",
|
||||||
|
"textures": {
|
||||||
|
"all": "minecraft:block/acacia_leaves"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/acacia_log.json
Normal file
7
src/main/resources/models/block/acacia_log.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/acacia_log_top",
|
||||||
|
"side": "minecraft:block/acacia_log"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column_horizontal",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/acacia_log_top",
|
||||||
|
"side": "minecraft:block/acacia_log"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_planks.json
Normal file
6
src/main/resources/models/block/acacia_planks.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/pressure_plate_up",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/pressure_plate_down",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_sapling.json
Normal file
6
src/main/resources/models/block/acacia_sapling.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {
|
||||||
|
"cross": "minecraft:block/acacia_sapling"
|
||||||
|
}
|
||||||
|
}
|
5
src/main/resources/models/block/acacia_sign.json
Normal file
5
src/main/resources/models/block/acacia_sign.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/acacia_slab.json
Normal file
8
src/main/resources/models/block/acacia_slab.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/slab",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_planks",
|
||||||
|
"side": "minecraft:block/acacia_planks",
|
||||||
|
"top": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/acacia_slab_top.json
Normal file
8
src/main/resources/models/block/acacia_slab_top.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/slab_top",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_planks",
|
||||||
|
"side": "minecraft:block/acacia_planks",
|
||||||
|
"top": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/acacia_stairs.json
Normal file
8
src/main/resources/models/block/acacia_stairs.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_planks",
|
||||||
|
"side": "minecraft:block/acacia_planks",
|
||||||
|
"top": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/acacia_stairs_inner.json
Normal file
8
src/main/resources/models/block/acacia_stairs_inner.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/inner_stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_planks",
|
||||||
|
"side": "minecraft:block/acacia_planks",
|
||||||
|
"top": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/acacia_stairs_outer.json
Normal file
8
src/main/resources/models/block/acacia_stairs_outer.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/outer_stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/acacia_planks",
|
||||||
|
"side": "minecraft:block/acacia_planks",
|
||||||
|
"top": "minecraft:block/acacia_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_orientable_trapdoor_bottom",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_trapdoor"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_orientable_trapdoor_open",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_trapdoor"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/acacia_trapdoor_top.json
Normal file
6
src/main/resources/models/block/acacia_trapdoor_top.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_orientable_trapdoor_top",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/acacia_trapdoor"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/acacia_wood.json
Normal file
7
src/main/resources/models/block/acacia_wood.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/acacia_log",
|
||||||
|
"side": "minecraft:block/acacia_log"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/activator_rail.json
Normal file
6
src/main/resources/models/block/activator_rail.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/rail_flat",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/activator_rail_on.json
Normal file
6
src/main/resources/models/block/activator_rail_on.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/rail_flat",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail_on"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_rail_raised_ne",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail_on"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_rail_raised_sw",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail_on"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_rail_raised_ne",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_rail_raised_sw",
|
||||||
|
"textures": {
|
||||||
|
"rail": "minecraft:block/activator_rail"
|
||||||
|
}
|
||||||
|
}
|
5
src/main/resources/models/block/air.json
Normal file
5
src/main/resources/models/block/air.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:missingno"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/allium.json
Normal file
6
src/main/resources/models/block/allium.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {
|
||||||
|
"cross": "minecraft:block/allium"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/amethyst_block.json
Normal file
6
src/main/resources/models/block/amethyst_block.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "minecraft:block/amethyst_block"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/amethyst_cluster.json
Normal file
6
src/main/resources/models/block/amethyst_cluster.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {
|
||||||
|
"cross": "minecraft:block/amethyst_cluster"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/ancient_debris.json
Normal file
7
src/main/resources/models/block/ancient_debris.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/ancient_debris_top",
|
||||||
|
"side": "minecraft:block/ancient_debris_side"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/andesite.json
Normal file
6
src/main/resources/models/block/andesite.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/andesite_slab.json
Normal file
8
src/main/resources/models/block/andesite_slab.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/slab",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/andesite",
|
||||||
|
"side": "minecraft:block/andesite",
|
||||||
|
"top": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/andesite_slab_top.json
Normal file
8
src/main/resources/models/block/andesite_slab_top.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/slab_top",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/andesite",
|
||||||
|
"side": "minecraft:block/andesite",
|
||||||
|
"top": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/models/block/andesite_stairs.json
Normal file
8
src/main/resources/models/block/andesite_stairs.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/andesite",
|
||||||
|
"side": "minecraft:block/andesite",
|
||||||
|
"top": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/inner_stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/andesite",
|
||||||
|
"side": "minecraft:block/andesite",
|
||||||
|
"top": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/outer_stairs",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/andesite",
|
||||||
|
"side": "minecraft:block/andesite",
|
||||||
|
"top": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/wall_inventory",
|
||||||
|
"textures": {
|
||||||
|
"wall": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/andesite_wall_post.json
Normal file
6
src/main/resources/models/block/andesite_wall_post.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_wall_post",
|
||||||
|
"textures": {
|
||||||
|
"wall": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/andesite_wall_side.json
Normal file
6
src/main/resources/models/block/andesite_wall_side.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_wall_side",
|
||||||
|
"textures": {
|
||||||
|
"wall": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_wall_side_tall",
|
||||||
|
"textures": {
|
||||||
|
"wall": "minecraft:block/andesite"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/anvil.json
Normal file
6
src/main/resources/models/block/anvil.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_anvil",
|
||||||
|
"textures": {
|
||||||
|
"top": "minecraft:block/anvil_top"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/attached_melon_stem.json
Normal file
7
src/main/resources/models/block/attached_melon_stem.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/stem_fruit",
|
||||||
|
"textures": {
|
||||||
|
"stem": "minecraft:block/melon_stem",
|
||||||
|
"upperstem": "minecraft:block/attached_melon_stem"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/stem_fruit",
|
||||||
|
"textures": {
|
||||||
|
"stem": "minecraft:block/pumpkin_stem",
|
||||||
|
"upperstem": "minecraft:block/attached_pumpkin_stem"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/azalea.json
Normal file
7
src/main/resources/models/block/azalea.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_azalea",
|
||||||
|
"textures": {
|
||||||
|
"side": "minecraft:block/azalea_side",
|
||||||
|
"top": "minecraft:block/azalea_top"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/azalea_leaves.json
Normal file
6
src/main/resources/models/block/azalea_leaves.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "minecraft:block/azalea_leaves"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/azure_bluet.json
Normal file
6
src/main/resources/models/block/azure_bluet.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {
|
||||||
|
"cross": "minecraft:block/azure_bluet"
|
||||||
|
}
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo1_age0.json
Normal file
19
src/main/resources/models/block/bamboo1_age0.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 7, 0, 7 ],
|
||||||
|
"to": [ 9, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 15, 6 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 15, 2], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 0, 0, 2, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 0, 0, 2, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo1_age1.json
Normal file
19
src/main/resources/models/block/bamboo1_age1.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 6.5, 0, 6.5 ],
|
||||||
|
"to": [ 9.5, 16, 9.5 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 16, 7 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 16, 3 ], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 0, 0, 3, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 0, 0, 3, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 0, 0, 3, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 0, 0, 3, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo2_age0.json
Normal file
19
src/main/resources/models/block/bamboo2_age0.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 7, 0, 7 ],
|
||||||
|
"to": [ 9, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 15, 6 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 15, 2], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 3, 0, 5, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 3, 0, 5, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 3, 0, 5, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 3, 0, 5, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo2_age1.json
Normal file
19
src/main/resources/models/block/bamboo2_age1.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 6.5, 0, 6.5 ],
|
||||||
|
"to": [ 9.5, 16, 9.5 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 16, 7 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 16, 3 ], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 3, 0, 6, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 3, 0, 6, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 3, 0, 6, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 3, 0, 6, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo3_age0.json
Normal file
19
src/main/resources/models/block/bamboo3_age0.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 7, 0, 7 ],
|
||||||
|
"to": [ 9, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 15, 6 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 15, 2], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 6, 0, 8, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 6, 0, 8, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 6, 0, 8, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 6, 0, 8, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo3_age1.json
Normal file
19
src/main/resources/models/block/bamboo3_age1.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 6.5, 0, 6.5 ],
|
||||||
|
"to": [ 9.5, 16, 9.5 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 16, 7 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 16, 3 ], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 6, 0, 9, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 6, 0, 9, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 6, 0, 9, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 6, 0, 9, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo4_age0.json
Normal file
19
src/main/resources/models/block/bamboo4_age0.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 7, 0, 7 ],
|
||||||
|
"to": [ 9, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 15, 6 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 15, 2], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 9, 0, 11, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 9, 0, 11, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 9, 0, 11, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 9, 0, 11, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
src/main/resources/models/block/bamboo4_age1.json
Normal file
19
src/main/resources/models/block/bamboo4_age1.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"all": "block/bamboo_stalk",
|
||||||
|
"particle": "block/bamboo_stalk"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "from": [ 6.5, 0, 6.5 ],
|
||||||
|
"to": [ 9.5, 16, 9.5 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 13, 4, 16, 7 ], "texture": "#all", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 13, 0, 16, 3 ], "texture": "#all", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 9, 0, 12, 16 ], "texture": "#all" },
|
||||||
|
"south": { "uv": [ 9, 0, 12, 16 ], "texture": "#all" },
|
||||||
|
"west": { "uv": [ 9, 0, 12, 16 ], "texture": "#all" },
|
||||||
|
"east": { "uv": [ 9, 0, 12, 16 ], "texture": "#all" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_block.json
Normal file
7
src/main/resources/models/block/bamboo_block.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/bamboo_block_top",
|
||||||
|
"side": "minecraft:block/bamboo_block"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_block_x.json
Normal file
7
src/main/resources/models/block/bamboo_block_x.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column_uv_locked_x",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/bamboo_block_top",
|
||||||
|
"side": "minecraft:block/bamboo_block"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_block_y.json
Normal file
7
src/main/resources/models/block/bamboo_block_y.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column_uv_locked_y",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/bamboo_block_top",
|
||||||
|
"side": "minecraft:block/bamboo_block"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_block_z.json
Normal file
7
src/main/resources/models/block/bamboo_block_z.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_column_uv_locked_z",
|
||||||
|
"textures": {
|
||||||
|
"end": "minecraft:block/bamboo_block_top",
|
||||||
|
"side": "minecraft:block/bamboo_block"
|
||||||
|
}
|
||||||
|
}
|
6
src/main/resources/models/block/bamboo_button.json
Normal file
6
src/main/resources/models/block/bamboo_button.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/bamboo_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button_inventory",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/bamboo_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/button_pressed",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/bamboo_planks"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_left",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_left_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_right",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_bottom_right_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_left",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_left_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_right",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/door_top_right_open",
|
||||||
|
"textures": {
|
||||||
|
"bottom": "minecraft:block/bamboo_door_bottom",
|
||||||
|
"top": "minecraft:block/bamboo_door_top"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_fence_gate.json
Normal file
7
src/main/resources/models/block/bamboo_fence_gate.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_custom_fence_gate",
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/bamboo_fence_gate_particle",
|
||||||
|
"texture": "minecraft:block/bamboo_fence_gate"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_custom_fence_gate_open",
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/bamboo_fence_gate_particle",
|
||||||
|
"texture": "minecraft:block/bamboo_fence_gate"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_custom_fence_gate_wall",
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/bamboo_fence_gate_particle",
|
||||||
|
"texture": "minecraft:block/bamboo_fence_gate"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/template_custom_fence_gate_wall_open",
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/bamboo_fence_gate_particle",
|
||||||
|
"texture": "minecraft:block/bamboo_fence_gate"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/custom_fence_inventory",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/bamboo_fence"
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/models/block/bamboo_fence_post.json
Normal file
7
src/main/resources/models/block/bamboo_fence_post.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/custom_fence_post",
|
||||||
|
"textures": {
|
||||||
|
"particle": "minecraft:block/bamboo_fence_particle",
|
||||||
|
"texture": "minecraft:block/bamboo_fence"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/custom_fence_side_east",
|
||||||
|
"textures": {
|
||||||
|
"texture": "minecraft:block/bamboo_fence"
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user