From b3169a64422391b4d042415508d753ee4c0808b8 Mon Sep 17 00:00:00 2001 From: Jurgen Date: Sun, 1 May 2022 16:24:34 +0200 Subject: [PATCH 01/11] updated deprecated interfaces where possible, there are still many left, like ForgeRegistry.BIOME, ForgeRegistry.BLOCK_STATE_IDS, and many more I couln't find a fix for. --- .../org/dynmap/hdmap/CustomBlockModel.java | 2 +- .../java/org/dynmap/hdmap/TexturePack.java | 4 +- .../helper/BukkitVersionHelperGeneric.java | 38 +++++++++---------- .../org/dynmap/forge_1_14_4/DynmapPlugin.java | 19 +++------- 4 files changed, 27 insertions(+), 36 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/CustomBlockModel.java b/DynmapCore/src/main/java/org/dynmap/hdmap/CustomBlockModel.java index ec298d08..a89670e8 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/CustomBlockModel.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/CustomBlockModel.java @@ -16,7 +16,7 @@ public class CustomBlockModel extends HDBlockModel { super(bstate, databits, blockset); try { Class cls = Class.forName(classname); /* Get class */ - render = (CustomRenderer) cls.newInstance(); + render = (CustomRenderer) cls.getDeclaredConstructor().newInstance(); if(render.initializeRenderer(HDBlockModels.pdf, bstate.blockName, databits, classparm) == false) { Log.severe("Error loading custom renderer - " + classname); render = null; diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/TexturePack.java b/DynmapCore/src/main/java/org/dynmap/hdmap/TexturePack.java index dc59fa18..c81cc5c8 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/TexturePack.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/TexturePack.java @@ -2097,7 +2097,7 @@ public class TexturePack { else if(av[0].equals("custColorMult")) { try { Class cls = Class.forName(av[1]); - custColorMult = (CustomColorMultiplier)cls.newInstance(); + custColorMult = (CustomColorMultiplier)cls.getDeclaredConstructor().newInstance(); } catch (Exception x) { Log.severe("Error loading custom color multiplier - " + av[1] + ": " + x.getMessage()); } @@ -2263,7 +2263,7 @@ public class TexturePack { else if(av[0].equals("custColorMult")) { try { Class cls = Class.forName(av[1]); - custColorMult = (CustomColorMultiplier)cls.newInstance(); + custColorMult = (CustomColorMultiplier)cls.getDeclaredConstructor().newInstance(); } catch (Exception x) { Log.severe("Error loading custom color multiplier - " + av[1] + ": " + x.getMessage()); } diff --git a/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelperGeneric.java b/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelperGeneric.java index 22eec1cf..edb0faf8 100644 --- a/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelperGeneric.java +++ b/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelperGeneric.java @@ -397,7 +397,7 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { /** * Get inhabited ticks count from chunk */ - private static final Long zero = new Long(0); + private static final Long zero = Long.valueOf(0); public long getInhabitedTicks(Chunk c) { if (nmsc_inhabitedticks == null) { return 0; @@ -557,25 +557,25 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { if (profile != null) { Object propmap = callMethod(profile, cmaprofile_getproperties, nullargs, null); if ((propmap != null) && (propmap instanceof ForwardingMultimap)) { - ForwardingMultimap fmm = (ForwardingMultimap) propmap; - Collection txt = fmm.get("textures"); - Object textureProperty = Iterables.getFirst(fmm.get("textures"), null); - if (textureProperty != null) { - String val = (String) callMethod(textureProperty, cmaproperty_getvalue, nullargs, null); - if (val != null) { - TexturesPayload result = null; - try { + ForwardingMultimap fmm = (ForwardingMultimap) propmap; + Collection txt = fmm.get("textures"); + Object textureProperty = Iterables.getFirst(fmm.get("textures"), null); + if (textureProperty != null) { + String val = (String) callMethod(textureProperty, cmaproperty_getvalue, nullargs, null); + if (val != null) { + TexturesPayload result = null; + try { String json = new String(Base64.getDecoder().decode(val), StandardCharsets.UTF_8); - result = gson.fromJson(json, TexturesPayload.class); - } catch (JsonParseException e) { - } catch (IllegalArgumentException x) { - Log.warning("Malformed response from skin URL check: " + val); - } - if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) { - url = result.textures.get("SKIN").url; - } - } - } + result = gson.fromJson(json, TexturesPayload.class); + } catch (JsonParseException e) { + } catch (IllegalArgumentException x) { + Log.warning("Malformed response from skin URL check: " + val); + } + if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) { + url = result.textures.get("SKIN").url; + } + } + } } } diff --git a/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java b/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java index f6648e4c..b770de74 100644 --- a/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java +++ b/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java @@ -6,20 +6,8 @@ import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Optional; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentLinkedQueue; @@ -253,7 +241,10 @@ public class DynmapPlugin if (statename.length() > 0) { statename += ","; } - statename += p.getName() + "=" + bs.get(p).toString(); + try { + statename += p.getName() + "=" + bs.get(p).toString(); + } catch (IllegalFormatConversionException e){ + } } int lightAtten = bs.isOpaqueCube(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 0 : 1); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten); From 53f048ac86d45a5942b2bfe33b476fc197c448c6 Mon Sep 17 00:00:00 2001 From: PssbleTrngle Date: Tue, 21 Jun 2022 11:44:17 +0200 Subject: [PATCH 02/11] add fabric-permissions & luckperms provider --- fabric-1.19/build.gradle | 8 ++ .../org/dynmap/fabric_1_19/DynmapPlugin.java | 16 ++- .../permissions/FabricPermissions.java | 47 ++++++++ .../permissions/LuckPermissions.java | 102 ++++++++++++++++++ 4 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java create mode 100644 fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java diff --git a/fabric-1.19/build.gradle b/fabric-1.19/build.gradle index 5d6eea4a..0b0194f6 100644 --- a/fabric-1.19/build.gradle +++ b/fabric-1.19/build.gradle @@ -18,6 +18,11 @@ configurations { implementation.extendsFrom(shadow) } +repositories { + mavenCentral() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } +} + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" @@ -27,6 +32,9 @@ dependencies { compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' shadow project(path: ':DynmapCore', configuration: 'shadow') + + modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT" + compileOnly 'net.luckperms:api:5.4' } processResources { diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java index 7c265749..5bb6c754 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java @@ -396,9 +396,19 @@ public class DynmapPlugin { registerPlayerLoginListener(); /* Initialize permissions handler */ - permissions = FilePermissions.create(); - if (permissions == null) { - permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"}); + if (FabricLoader.getInstance().isModLoaded("luckperms")) { + Log.info("Using luckperms for access control"); + permissions = new LuckPermissions(); + } + else if (FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0")) { + Log.info("Using fabric-permissions-api for access control"); + permissions = new FabricPermissions(); + } else { + /* Initialize permissions handler */ + permissions = FilePermissions.create(); + if (permissions == null) { + permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"}); + } } /* Get and initialize data folder */ File dataDirectory = new File("dynmap"); diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java new file mode 100644 index 00000000..c572acc4 --- /dev/null +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java @@ -0,0 +1,47 @@ +package org.dynmap.fabric_1_18_2.permissions; + +import me.lucko.fabric.api.permissions.v0.Permissions; +import net.minecraft.entity.player.PlayerEntity; +import org.dynmap.Log; +import org.dynmap.fabric_1_18_2.DynmapPlugin; +import org.dynmap.json.simple.parser.JSONParser; + +import java.util.Set; +import java.util.stream.Collectors; + +public class FabricPermissions implements PermissionProvider { + + private String permissionKey(String perm) { + return "dynmap." + perm; + } + + @Override + public Set hasOfflinePermissions(String player, Set perms) { + return perms.stream() + .filter(perm -> hasOfflinePermission(player, perm)) + .collect(Collectors.toSet()); + } + + @Override + public boolean hasOfflinePermission(String player, String perm) { + return DynmapPlugin.plugin.isOp(player.toLowerCase()); + } + + @Override + public boolean has(PlayerEntity player, String permission) { + if (player == null) return false; + String name = player.getName().getString().toLowerCase(); + if (DynmapPlugin.plugin.isOp(name)) return true; + return Permissions.check(player, permissionKey(permission)); + } + + @Override + public boolean hasPermissionNode(PlayerEntity player, String permission) { + if (player != null) { + String name = player.getName().getString().toLowerCase(); + return DynmapPlugin.plugin.isOp(name); + } + return false; + } + +} diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java new file mode 100644 index 00000000..829c8a80 --- /dev/null +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java @@ -0,0 +1,102 @@ +package org.dynmap.fabric_1_18_2.permissions; + +import me.lucko.fabric.api.permissions.v0.Permissions; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.model.user.User; +import net.luckperms.api.util.Tristate; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import org.dynmap.Log; +import org.dynmap.fabric_1_18_2.DynmapPlugin; +import org.dynmap.json.simple.JSONArray; +import org.dynmap.json.simple.JSONObject; +import org.dynmap.json.simple.parser.JSONParser; +import org.dynmap.json.simple.parser.ParseException; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class LuckPermissions implements PermissionProvider { + + private final JSONParser parser = new JSONParser(); + private LuckPerms api = null; + + private Optional getApi() { + if (api != null) return Optional.of(api); + try { + api = LuckPermsProvider.get(); + return Optional.of(api); + } catch (Exception ex) { + Log.warning("Trying to access LuckPerms before it has loaded"); + return Optional.empty(); + } + } + + private Optional cachedUUID(String username) { + try { + BufferedReader reader = new BufferedReader(new FileReader(MinecraftServer.USER_CACHE_FILE)); + JSONArray cache = (JSONArray) parser.parse(reader); + for (Object it : cache) { + JSONObject user = (JSONObject) it; + if (user.get("name").toString().equalsIgnoreCase(username)) { + String uuid = user.get("uuid").toString(); + return Optional.of(UUID.fromString(uuid)); + } + } + + reader.close(); + } catch (IOException | ParseException ex) { + Log.warning("Unable to read usercache.json"); + } + + return Optional.empty(); + } + + private String permissionKey(String perm) { + return "dynmap." + perm; + } + + @Override + public Set hasOfflinePermissions(String player, Set perms) { + return perms.stream() + .filter(perm -> hasOfflinePermission(player, perm)) + .collect(Collectors.toSet()); + } + + @Override + public boolean hasOfflinePermission(String player, String perm) { + if (DynmapPlugin.plugin.isOp(player.toLowerCase())) return true; + Optional api = getApi(); + Optional uuid = cachedUUID(player); + if (!uuid.isPresent() || !api.isPresent()) return false; + User user = api.get().getUserManager().loadUser(uuid.get()).join(); + CachedPermissionData permissions = user.getCachedData().getPermissionData(); + Tristate state = permissions.checkPermission(permissionKey(perm)); + return state.asBoolean(); + } + + @Override + public boolean has(PlayerEntity player, String permission) { + if (player == null) return false; + String name = player.getName().getString().toLowerCase(); + if (DynmapPlugin.plugin.isOp(name)) return true; + return Permissions.check(player, permissionKey(permission)); + } + + @Override + public boolean hasPermissionNode(PlayerEntity player, String permission) { + if (player != null) { + String name = player.getName().getString().toLowerCase(); + return DynmapPlugin.plugin.isOp(name); + } + return false; + } + +} From 9f865fa5bd179b685df1537ba1b807b1bd85dc2f Mon Sep 17 00:00:00 2001 From: PssbleTrngle Date: Tue, 21 Jun 2022 11:51:08 +0200 Subject: [PATCH 03/11] fix imports --- .../org/dynmap/fabric_1_19/permissions/FabricPermissions.java | 4 ++-- .../org/dynmap/fabric_1_19/permissions/LuckPermissions.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java index c572acc4..270ff000 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/FabricPermissions.java @@ -1,9 +1,9 @@ -package org.dynmap.fabric_1_18_2.permissions; +package org.dynmap.fabric_1_19.permissions; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.entity.player.PlayerEntity; import org.dynmap.Log; -import org.dynmap.fabric_1_18_2.DynmapPlugin; +import org.dynmap.fabric_1_19.DynmapPlugin; import org.dynmap.json.simple.parser.JSONParser; import java.util.Set; diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java index 829c8a80..737e162b 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java @@ -1,4 +1,4 @@ -package org.dynmap.fabric_1_18_2.permissions; +package org.dynmap.fabric_1_19.permissions; import me.lucko.fabric.api.permissions.v0.Permissions; import net.luckperms.api.LuckPerms; @@ -9,7 +9,7 @@ import net.luckperms.api.util.Tristate; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; import org.dynmap.Log; -import org.dynmap.fabric_1_18_2.DynmapPlugin; +import org.dynmap.fabric_1_19.DynmapPlugin; import org.dynmap.json.simple.JSONArray; import org.dynmap.json.simple.JSONObject; import org.dynmap.json.simple.parser.JSONParser; From c25945ea13107db6a734218abb27dd17604f127d Mon Sep 17 00:00:00 2001 From: PssbleTrngle Date: Tue, 21 Jun 2022 12:06:26 +0200 Subject: [PATCH 04/11] add missing import --- .../main/java/org/dynmap/fabric_1_19/DynmapPlugin.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java index 5bb6c754..f209550b 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java @@ -3,10 +3,10 @@ package org.dynmap.fabric_1_19; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.FluidBlock; @@ -30,9 +30,6 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.ChunkStatus; -import net.minecraft.world.chunk.WorldChunk; - import org.dynmap.*; import org.dynmap.common.BiomeMap; import org.dynmap.common.DynmapCommandSender; @@ -48,9 +45,7 @@ import org.dynmap.fabric_1_19.event.CustomServerChunkEvents; import org.dynmap.fabric_1_19.event.CustomServerLifecycleEvents; import org.dynmap.fabric_1_19.event.PlayerEvents; import org.dynmap.fabric_1_19.mixin.BiomeEffectsAccessor; -import org.dynmap.fabric_1_19.permissions.FilePermissions; -import org.dynmap.fabric_1_19.permissions.OpPermissions; -import org.dynmap.fabric_1_19.permissions.PermissionProvider; +import org.dynmap.fabric_1_19.permissions.*; import org.dynmap.permissions.PermissionsHandler; import org.dynmap.renderer.DynmapBlockState; From 3b1cbdca0915da36608d43a73530ca8017d28925 Mon Sep 17 00:00:00 2001 From: PssbleTrngle Date: Tue, 21 Jun 2022 12:07:48 +0200 Subject: [PATCH 05/11] usercache filename --- .../org/dynmap/fabric_1_19/permissions/LuckPermissions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java index 737e162b..143fa7bf 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/permissions/LuckPermissions.java @@ -41,7 +41,7 @@ public class LuckPermissions implements PermissionProvider { private Optional cachedUUID(String username) { try { - BufferedReader reader = new BufferedReader(new FileReader(MinecraftServer.USER_CACHE_FILE)); + BufferedReader reader = new BufferedReader(new FileReader("usercache.json")); JSONArray cache = (JSONArray) parser.parse(reader); for (Object it : cache) { JSONObject user = (JSONObject) it; From a8af8037cb39517bda6543c9694289ce1288b46a Mon Sep 17 00:00:00 2001 From: Jurgen Date: Tue, 21 Jun 2022 14:25:25 +0200 Subject: [PATCH 06/11] fixed mud_bricks sides so it is no longer transparent. thanks BlargCraft on Reddit. --- DynmapCore/src/main/resources/texture_1.txt | 535 ++++++++++++++++++++ 1 file changed, 535 insertions(+) diff --git a/DynmapCore/src/main/resources/texture_1.txt b/DynmapCore/src/main/resources/texture_1.txt index a437348b..534da2eb 100644 --- a/DynmapCore/src/main/resources/texture_1.txt +++ b/DynmapCore/src/main/resources/texture_1.txt @@ -3201,3 +3201,538 @@ block:id=%attached_melon_stem,patch0=0:melon_stem,patch1=0:attached_melon_stem,b block:id=%pumpkin_stem,patch0=0:pumpkin_stem,blockcolor=foliagebiome,transparency=TRANSPARENT,stdrot=true # Melon stem block:id=%melon_stem,patch0=0:melon_stem,blockcolor=foliagebiome,transparency=TRANSPARENT,stdrot=true +<<<<<<< HEAD +======= + +[1.19-]texture:id=mangrove_planks,filename=assets/minecraft/textures/block/mangrove_planks.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_propagule_hanging,filename=assets/minecraft/textures/block/mangrove_propagule_hanging.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_propagule,filename=assets/minecraft/textures/block/mangrove_propagule.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_log,filename=assets/minecraft/textures/block/mangrove_log.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_log_top,filename=assets/minecraft/textures/block/mangrove_log_top.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_roots_side,filename=assets/minecraft/textures/block/mangrove_roots_side.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_roots_top,filename=assets/minecraft/textures/block/mangrove_roots_top.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_door_top,filename=assets/minecraft/textures/block/mangrove_door_top.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_door_bottom,filename=assets/minecraft/textures/block/mangrove_door_bottom.png,xcount=1,ycount=1 +[1.19-]texture:id=muddy_mangrove_roots_side,filename=assets/minecraft/textures/block/muddy_mangrove_roots_side.png,xcount=1,ycount=1 +[1.19-]texture:id=muddy_mangrove_roots_top,filename=assets/minecraft/textures/block/muddy_mangrove_roots_top.png,xcount=1,ycount=1 +[1.19-]texture:id=stripped_mangrove_log,filename=assets/minecraft/textures/block/stripped_mangrove_log.png,xcount=1,ycount=1 +[1.19-]texture:id=stripped_mangrove_log_top,filename=assets/minecraft/textures/block/stripped_mangrove_log_top.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_leaves,filename=assets/minecraft/textures/block/mangrove_leaves.png,xcount=1,ycount=1 +[1.19-]texture:id=mangrove_trapdoor,filename=assets/minecraft/textures/block/mangrove_trapdoor.png,xcount=1,ycount=1 +[1.19-]texture:id=foliage,filename=assets/minecraft/textures/colormap/foliage.png,xcount=1,ycount=1,format=BIOME +[1.19-]texturefile:id=mangrove_sign,filename=assets/minecraft/textures/entity/signs/mangrove.png,format=SIGN +[1.19-]texture:id=packed_mud,filename=assets/minecraft/textures/block/packed_mud.png,xcount=1,ycount=1 +[1.19-]texture:id=mud_bricks,filename=assets/minecraft/textures/block/mud_bricks.png,xcount=1,ycount=1 +[1.19-]texture:id=mud,filename=assets/minecraft/textures/block/mud.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk,filename=assets/minecraft/textures/block/sculk.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_vein,filename=assets/minecraft/textures/block/sculk_vein.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_catalyst_side_bloom,filename=assets/minecraft/textures/block/sculk_catalyst_side_bloom.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_catalyst_top_bloom,filename=assets/minecraft/textures/block/sculk_catalyst_top_bloom.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_catalyst_bottom,filename=assets/minecraft/textures/block/sculk_catalyst_bottom.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_catalyst_side,filename=assets/minecraft/textures/block/sculk_catalyst_side.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_catalyst_top,filename=assets/minecraft/textures/block/sculk_catalyst_top.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_shrieker_side,filename=assets/minecraft/textures/block/sculk_shrieker_side.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_shrieker_can_summon_inner_top,filename=assets/minecraft/textures/block/sculk_shrieker_can_summon_inner_top.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_shrieker_bottom,filename=assets/minecraft/textures/block/sculk_shrieker_bottom.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_shrieker_top,filename=assets/minecraft/textures/block/sculk_shrieker_top.png,xcount=1,ycount=1 +[1.19-]texture:id=sculk_shrieker_inner_top,filename=assets/minecraft/textures/block/sculk_shrieker_inner_top.png,xcount=1,ycount=1 +[1.19-]texture:id=ochre_froglight_side,filename=assets/minecraft/textures/block/ochre_froglight_side.png,xcount=1,ycount=1 +[1.19-]texture:id=ochre_froglight_top,filename=assets/minecraft/textures/block/ochre_froglight_top.png,xcount=1,ycount=1 +[1.19-]texture:id=verdant_froglight_side,filename=assets/minecraft/textures/block/verdant_froglight_side.png,xcount=1,ycount=1 +[1.19-]texture:id=verdant_froglight_top,filename=assets/minecraft/textures/block/verdant_froglight_top.png,xcount=1,ycount=1 +[1.19-]texture:id=pearlescent_froglight_side,filename=assets/minecraft/textures/block/pearlescent_froglight_side.png,xcount=1,ycount=1 +[1.19-]texture:id=pearlescent_froglight_top,filename=assets/minecraft/textures/block/pearlescent_froglight_top.png,xcount=1,ycount=1 +[1.19-]texture:id=frogspawn,filename=assets/minecraft/textures/block/frogspawn.png,xcount=1,ycount=1 +[1.19-]texture:id=reinforced_deepslate_side,filename=assets/minecraft/textures/block/reinforced_deepslate_side.png,xcount=1,ycount=1 +[1.19-]texture:id=reinforced_deepslate_top,filename=assets/minecraft/textures/block/reinforced_deepslate_top.png,xcount=1,ycount=1 +[1.19-]texture:id=reinforced_deepslate_bottom,filename=assets/minecraft/textures/block/reinforced_deepslate_bottom.png,xcount=1,ycount=1 +[1.19-]texture:id=lightning_rod_on,filename=assets/minecraft/textures/block/lightning_rod_on.png,xcount=1,ycount=1 +[1.19-]texture:id=lightning_rod,filename=assets/minecraft/textures/block/lightning_rod.png,xcount=1,ycount=1 +[1.19-]texture:id=potted_azalea_bush_top,filename=assets/minecraft/textures/block/potted_azalea_bush_top.png,xcount=1,ycount=1 +[1.19-]texture:id=potted_azalea_bush_side,filename=assets/minecraft/textures/block/potted_azalea_bush_side.png,xcount=1,ycount=1 +[1.19-]texture:id=potted_azalea_bush_plant,filename=assets/minecraft/textures/block/potted_azalea_bush_plant.png,xcount=1,ycount=1 +[1.19-]texture:id=potted_flowering_azalea_bush_top,filename=assets/minecraft/textures/block/potted_flowering_azalea_bush_top.png,xcount=1,ycount=1 +[1.19-]texture:id=potted_flowering_azalea_bush_side,filename=assets/minecraft/textures/block/potted_flowering_azalea_bush_side.png,xcount=1,ycount=1 +[1.19-]block:id=%stripped_mangrove_wood,state=axis:x,patch0=0:stripped_mangrove_log,stdrot=true +[1.19-]block:id=%stripped_mangrove_wood,state=axis:y,patch0=0:stripped_mangrove_log,patch1=0:stripped_mangrove_log,patch2=0:stripped_mangrove_log,patch3=0:stripped_mangrove_log,patch4=0:stripped_mangrove_log,patch5=0:stripped_mangrove_log,stdrot=true +[1.19-]block:id=%stripped_mangrove_wood,state=axis:z,patch0=0:stripped_mangrove_log,stdrot=true +[1.19-]block:id=%mangrove_planks,patch0=0:mangrove_planks,patch1=0:mangrove_planks,patch2=0:mangrove_planks,patch3=0:mangrove_planks,patch4=0:mangrove_planks,patch5=0:mangrove_planks,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:true/age:0,patch0=0:mangrove_propagule_hanging,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:false/age:0,patch0=0:mangrove_propagule,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:true/age:1,patch0=0:mangrove_propagule_hanging,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:false/age:1,patch0=0:mangrove_propagule,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:true/age:2,patch0=0:mangrove_propagule_hanging,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:false/age:2,patch0=0:mangrove_propagule,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:true/age:3,patch0=0:mangrove_propagule_hanging,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:false/age:3,patch0=0:mangrove_propagule,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:true/age:4,patch0=0:mangrove_propagule_hanging,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_propagule,state=hanging:false/age:4,patch0=0:mangrove_propagule,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_log,state=axis:x,patch0=0:mangrove_log,patch1=0:mangrove_log_top,stdrot=true +[1.19-]block:id=%mangrove_log,state=axis:y,patch0=0:mangrove_log,patch1=0:mangrove_log_top,patch2=0:mangrove_log,patch3=0:mangrove_log,patch4=0:mangrove_log_top,patch5=0:mangrove_log,stdrot=true +[1.19-]block:id=%mangrove_log,state=axis:z,patch0=0:mangrove_log,patch1=0:mangrove_log_top,stdrot=true +[1.19-]block:id=%mangrove_roots,patch0=0:mangrove_roots_side,patch1=0:mangrove_roots_top,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%muddy_mangrove_roots,state=axis:x,patch0=0:muddy_mangrove_roots_side,patch1=0:muddy_mangrove_roots_top,stdrot=true +[1.19-]block:id=%muddy_mangrove_roots,state=axis:y,patch0=0:muddy_mangrove_roots_side,patch1=0:muddy_mangrove_roots_top,patch2=0:muddy_mangrove_roots_side,patch3=0:muddy_mangrove_roots_side,patch4=0:muddy_mangrove_roots_top,patch5=0:muddy_mangrove_roots_side,stdrot=true +[1.19-]block:id=%muddy_mangrove_roots,state=axis:z,patch0=0:muddy_mangrove_roots_side,patch1=0:muddy_mangrove_roots_top,stdrot=true +[1.19-]block:id=%stripped_mangrove_log,state=axis:x,patch0=0:stripped_mangrove_log,patch1=0:stripped_mangrove_log_top,stdrot=true +[1.19-]block:id=%stripped_mangrove_log,state=axis:y,patch0=0:stripped_mangrove_log,patch1=0:stripped_mangrove_log_top,patch2=0:stripped_mangrove_log,patch3=0:stripped_mangrove_log,patch4=0:stripped_mangrove_log_top,patch5=0:stripped_mangrove_log,stdrot=true +[1.19-]block:id=%stripped_mangrove_log,state=axis:z,patch0=0:stripped_mangrove_log,patch1=0:stripped_mangrove_log_top,stdrot=true +[1.19-]block:id=%mangrove_wood,state=axis:x,patch0=0:mangrove_log,stdrot=true +[1.19-]block:id=%mangrove_wood,state=axis:y,patch0=0:mangrove_log,patch1=0:mangrove_log,patch2=0:mangrove_log,patch3=0:mangrove_log,patch4=0:mangrove_log,patch5=0:mangrove_log,stdrot=true +[1.19-]block:id=%mangrove_wood,state=axis:z,patch0=0:mangrove_log,stdrot=true +[1.19-]block:id=%mangrove_leaves,patch0=0:mangrove_leaves,patch1=0:mangrove_leaves,patch2=0:mangrove_leaves,patch3=0:mangrove_leaves,patch4=0:mangrove_leaves,patch5=0:mangrove_leaves,blockcolor=foliage,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_pressure_plate,state=powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_pressure_plate,state=powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:north/half:top/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:north/half:top/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:north/half:bottom/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:north/half:bottom/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:south/half:top/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:south/half:top/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:south/half:bottom/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:south/half:bottom/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:west/half:top/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:west/half:top/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:west/half:bottom/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:west/half:bottom/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:east/half:top/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:east/half:top/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:east/half:bottom/open:true,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_trapdoor,state=facing:east/half:bottom/open:false,patch0=0:mangrove_trapdoor,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:floor/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:floor/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:floor/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:floor/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:floor/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:floor/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:floor/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:floor/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:wall/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:wall/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:wall/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:wall/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:wall/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:wall/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:wall/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:wall/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:ceiling/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:north/face:ceiling/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:ceiling/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:south/face:ceiling/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:ceiling/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:west/face:ceiling/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:ceiling/powered:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_button,state=facing:east/face:ceiling/powered:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:top/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:top/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:top/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:bottom/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:bottom/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:bottom/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:bottom/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:north/half:bottom/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:top/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:top/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:top/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:top/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:top/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:bottom/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:bottom/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:bottom/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:bottom/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:south/half:bottom/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:top/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:top/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:top/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:top/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:top/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:bottom/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:bottom/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:bottom/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:bottom/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:west/half:bottom/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:top/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:top/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:top/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:top/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:top/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:bottom/shape:straight,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:bottom/shape:inner_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:bottom/shape:inner_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:bottom/shape:outer_left,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_stairs,state=facing:east/half:bottom/shape:outer_right,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_slab,state=type:top,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_slab,state=type:bottom,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_slab,state=type:double,patch0=0:mangrove_planks,patch1=0:mangrove_planks,patch2=0:mangrove_planks,patch3=0:mangrove_planks,patch4=0:mangrove_planks,patch5=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:north/in_wall:true/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:north/in_wall:true/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:north/in_wall:false/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:north/in_wall:false/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:south/in_wall:true/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:south/in_wall:true/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:south/in_wall:false/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:south/in_wall:false/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:west/in_wall:true/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:west/in_wall:true/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:west/in_wall:false/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:west/in_wall:false/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:east/in_wall:true/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:east/in_wall:true/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:east/in_wall:false/open:true,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence_gate,state=facing:east/in_wall:false/open:false,patch0=0:mangrove_planks,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:true/south:true/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:true/south:true/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:true/south:false/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:true/south:false/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:true/south:true/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:true/south:true/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:true/south:false/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:true/south:false/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:false/south:true/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:false/south:true/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:false/south:false/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:false/south:false/north:true,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:false/south:true/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:false/south:true/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:true/east:false/south:false/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_fence,state=west:false/east:false/south:false/north:false,patch0=0:mangrove_planks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:left/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:left/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:right/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:right/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:left/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:left/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:right/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:north/hinge:right/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:left/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:left/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:right/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:right/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:left/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:left/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:right/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:south/hinge:right/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:left/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:left/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:right/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:right/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:left/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:left/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:right/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:west/hinge:right/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:left/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:left/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:right/half:upper/open:true,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:right/half:upper/open:false,patch0=0:mangrove_door_top,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:left/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:left/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:right/half:lower/open:true,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_door,state=facing:east/hinge:right/half:lower/open:false,patch0=0:mangrove_door_bottom,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%mangrove_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,patch6=6,patch7=7,patch8=8,patch9=9,transparency=TRANSPARENT,txtid=mangrove_sign +[1.19-]block:id=%mangrove_wall_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,transparency=TRANSPARENT,txtid=mangrove_sign +[1.19-]block:id=%packed_mud,patch0=0:packed_mud,patch1=0:packed_mud,patch2=0:packed_mud,patch3=0:packed_mud,patch4=0:packed_mud,patch5=0:packed_mud,stdrot=true +[1.19-]block:id=%mud_bricks,patch0=0:mud_bricks,patch1=0:mud_bricks,patch2=0:mud_bricks,patch3=0:mud_bricks,patch4=0:mud_bricks,patch5=0:mud_bricks,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:bottom/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:bottom/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:bottom/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:bottom/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:bottom/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:top/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:top/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:top/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:top/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:top/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:bottom/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:bottom/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:bottom/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:bottom/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:south/half:bottom/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:top/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:top/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:top/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:top/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:top/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:bottom/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:bottom/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:bottom/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:bottom/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:west/half:bottom/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:top/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:top/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:top/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:top/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:top/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:bottom/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:bottom/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:bottom/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:bottom/shape:outer_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_stairs,state=facing:east/half:bottom/shape:outer_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_slab,state=type:top,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_slab,state=type:bottom,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_slab,state=type:double,patch0=0:mud_bricks,patch1=0:mud_bricks,patch2=0:mud_bricks,patch3=0:mud_bricks,patch4=0:mud_bricks,patch5=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:none/north:none,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:none/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:none/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:none/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:low/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:low/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:low/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:none/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:low/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:tall/north:none,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:none/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:low/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:tall/north:low,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:none/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:low/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:true/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:none/east:tall/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:low/east:tall/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud_brick_wall,state=west:tall/east:tall/up:false/south:tall/north:tall,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%mud,patch0=0:mud,patch1=0:mud,patch2=0:mud,patch3=0:mud,patch4=0:mud,patch5=0:mud,stdrot=true +[1.19-]block:id=%sculk,patch0=0:sculk,patch1=0:sculk,patch2=0:sculk,patch3=0:sculk,patch4=0:sculk,patch5=0:sculk,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:true/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:false/up:true/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:true/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:false/up:false/down:true,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:true/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:true/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:true/north:false/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:true/south:false/north:false/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:true/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:true/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:true/north:false/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:true/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:false/up:true/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:true/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_vein,state=east:false/south:false/north:false/west:false/up:false/down:false,patch0=0:sculk_vein,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_catalyst,state=bloom:true,patch0=0:sculk_catalyst_side_bloom,patch1=0:sculk_catalyst_bottom,patch2=0:sculk_catalyst_side_bloom,patch3=0:sculk_catalyst_side_bloom,patch4=0:sculk_catalyst_top_bloom,patch5=0:sculk_catalyst_side_bloom,stdrot=true +[1.19-]block:id=%sculk_catalyst,state=bloom:false,patch0=0:sculk_catalyst_side,patch1=0:sculk_catalyst_bottom,patch2=0:sculk_catalyst_side,patch3=0:sculk_catalyst_side,patch4=0:sculk_catalyst_top,patch5=0:sculk_catalyst_side,stdrot=true +[1.19-]block:id=%sculk_shrieker,state=can_summon:true,patch0=0:sculk_shrieker_side,patch1=0:sculk_shrieker_can_summon_inner_top,patch2=0:sculk_shrieker_bottom,patch3=0:sculk_shrieker_top,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%sculk_shrieker,state=can_summon:false,patch0=0:sculk_shrieker_side,patch1=0:sculk_shrieker_inner_top,patch2=0:sculk_shrieker_bottom,patch3=0:sculk_shrieker_top,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%ochre_froglight,state=axis:x,patch0=0:ochre_froglight_side,patch1=0:ochre_froglight_top,stdrot=true +[1.19-]block:id=%ochre_froglight,state=axis:y,patch0=0:ochre_froglight_side,patch1=0:ochre_froglight_top,patch2=0:ochre_froglight_side,patch3=0:ochre_froglight_side,patch4=0:ochre_froglight_top,patch5=0:ochre_froglight_side,stdrot=true +[1.19-]block:id=%ochre_froglight,state=axis:z,patch0=0:ochre_froglight_side,patch1=0:ochre_froglight_top,stdrot=true +[1.19-]block:id=%verdant_froglight,state=axis:x,patch0=0:verdant_froglight_side,patch1=0:verdant_froglight_top,stdrot=true +[1.19-]block:id=%verdant_froglight,state=axis:y,patch0=0:verdant_froglight_side,patch1=0:verdant_froglight_top,patch2=0:verdant_froglight_side,patch3=0:verdant_froglight_side,patch4=0:verdant_froglight_top,patch5=0:verdant_froglight_side,stdrot=true +[1.19-]block:id=%verdant_froglight,state=axis:z,patch0=0:verdant_froglight_side,patch1=0:verdant_froglight_top,stdrot=true +[1.19-]block:id=%pearlescent_froglight,state=axis:x,patch0=0:pearlescent_froglight_side,patch1=0:pearlescent_froglight_top,stdrot=true +[1.19-]block:id=%pearlescent_froglight,state=axis:y,patch0=0:pearlescent_froglight_side,patch1=0:pearlescent_froglight_top,patch2=0:pearlescent_froglight_side,patch3=0:pearlescent_froglight_side,patch4=0:pearlescent_froglight_top,patch5=0:pearlescent_froglight_side,stdrot=true +[1.19-]block:id=%pearlescent_froglight,state=axis:z,patch0=0:pearlescent_froglight_side,patch1=0:pearlescent_froglight_top,stdrot=true +[1.19-]block:id=%frogspawn,patch0=0:frogspawn,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%potted_mangrove_propagule,patch0=0:mangrove_propagule,patch1=0:flower_pot,patch2=0:dirt,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%potted_azalea_bush,patch0=0:flower_pot,patch1=0:dirt,patch2=0:potted_azalea_bush_top,patch3=0:potted_azalea_bush_side,patch4=0:potted_azalea_bush_plant,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%potted_flowering_azalea_bush,patch0=0:flower_pot,patch1=0:dirt,patch2=0:potted_flowering_azalea_bush_top,patch3=0:potted_flowering_azalea_bush_side,patch4=0:potted_azalea_bush_plant,transparency=TRANSPARENT,stdrot=true +[1.19-]block:id=%reinforced_deepslate,patch0=0:reinforced_deepslate_side,patch1=0:reinforced_deepslate_bottom,patch2=0:reinforced_deepslate_side,patch3=0:reinforced_deepslate_side,patch4=0:reinforced_deepslate_top,patch5=0:reinforced_deepslate_side,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:north,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:north,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:east,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:east,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:south,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:south,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:west,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:west,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:up,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:up,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:true/facing:down,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true +[1.19-]block:id=%lightning_rod,state=powered:false/facing:down,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true +>>>>>>> aae2146b (fixed mud_bricks sides so it is no longer transparent. thanks BlargCraft on Reddit.) From 8d8a4d088e897fe18fe7ac62261ade2eea1cc0c8 Mon Sep 17 00:00:00 2001 From: mastermc05 Date: Wed, 6 Jul 2022 16:28:14 +0300 Subject: [PATCH 07/11] fix 1.18.2 --- .../common/chunk/GenericMapChunkCache.java | 12 +++- .../v118_2/AsyncChunkProvider118_2.java | 61 ++++++++++++++++++- .../helper/v118_2/MapChunkCache118_2.java | 36 +++++------ 3 files changed, 84 insertions(+), 25 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java index 2cfc7ce4..a43c9198 100644 --- a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java +++ b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java @@ -766,7 +766,7 @@ public abstract class GenericMapChunkCache extends MapChunkCache { } /** - * Read NBT data from loaded chunks - do not needs to be called from server/world + * Read NBT data from loaded chunks - do not needs to be called from server/world

* Will throw {@link IllegalStateException} if not supporting */ public void getLoadedChunksAsync() { @@ -836,7 +836,9 @@ public abstract class GenericMapChunkCache extends MapChunkCache { } /** - * Prepare the chunks async + * Loads all chunks in the world asynchronously. + *

+ * If it is not supported, it will throw {@link IllegalStateException} */ public void loadChunksAsync() { getLoadedChunksAsync(); @@ -923,6 +925,12 @@ public abstract class GenericMapChunkCache extends MapChunkCache { return cnt; } + /** + * It loads chunks from the cache or from the world, and if the chunk is not visible, it fills it with stone, ocean or + * empty chunk + *

+ * if it's not supported, will throw {@link IllegalStateException} + */ public void readChunksAsync() { class SimplePair { //pair of the chunk and the data which is readed async private final Supplier supplier; diff --git a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java index 9c21562d..f043d870 100644 --- a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java +++ b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java @@ -1,31 +1,54 @@ package org.dynmap.bukkit.helper.v118_2; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.WorldServer; +import net.minecraft.world.level.chunk.Chunk; +import net.minecraft.world.level.chunk.IChunkAccess; +import net.minecraft.world.level.chunk.storage.ChunkRegionLoader; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.dynmap.MapManager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.function.Supplier; /** * The provider used to work with paper libs * Because paper libs need java 17 we can't interact with them directly */ +@SuppressWarnings({"JavaReflectionMemberAccess"}) //java don't know about paper public class AsyncChunkProvider118_2 { private final Thread ioThread; private final Method getChunk; private final Predicate ifFailed; + private final Method getAsyncSaveData; + private final Method save; + private int currTick = MinecraftServer.currentTick; + private int currChunks = 0; + AsyncChunkProvider118_2 () { try { Predicate ifFailed1 = null; - Method getChunk1 = null; + Method getChunk1 = null, getAsyncSaveData1 = null, save1 = null; Thread ioThread1 = null; try { Class threadClass = Class.forName("com.destroystokyo.paper.io.PaperFileIOThread"); + Class asyncChunkData = Arrays.stream(ChunkRegionLoader.class.getClasses()) + .filter(c -> c.getSimpleName().equals("AsyncSaveData")) + .findFirst() + .orElseThrow(RuntimeException::new); + getAsyncSaveData1 = ChunkRegionLoader.class.getMethod("getAsyncSaveData", WorldServer.class, IChunkAccess.class); + save1 = ChunkRegionLoader.class.getMethod("saveChunk", WorldServer.class, IChunkAccess.class, asyncChunkData); Class[] classes = threadClass.getClasses(); Class holder = Arrays.stream(classes).filter(aClass -> aClass.getSimpleName().equals("Holder")).findAny().orElseThrow(RuntimeException::new); ioThread1 = (Thread) holder.getField("INSTANCE").get(null); @@ -35,6 +58,8 @@ public class AsyncChunkProvider118_2 { } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { e.printStackTrace(); } + getAsyncSaveData = Objects.requireNonNull(getAsyncSaveData1); + save = Objects.requireNonNull(save1); ifFailed = Objects.requireNonNull(ifFailed1); getChunk = Objects.requireNonNull(getChunk1); ioThread = Objects.requireNonNull(ioThread1); @@ -57,4 +82,38 @@ public class AsyncChunkProvider118_2 { return null; }); } + + public synchronized Supplier getLoadedChunk(CraftWorld world, int x, int z) { + if (!world.isChunkLoaded(x, z)) return () -> null; + Chunk c = world.getHandle().getChunkIfLoaded(x, z); //already safe async on vanilla + if ((c == null) || c.o) return () -> null; // c.loaded + if (currTick != MinecraftServer.currentTick) { + currTick = MinecraftServer.currentTick; + currChunks = 0; + } + //prepare data synchronously + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + try { + return getAsyncSaveData.invoke(null, world.getHandle(), c); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }, ((CraftServer) Bukkit.getServer()).getServer()); + //we shouldn't stress main thread + if (++currChunks > MapManager.mapman.getMaxChunkLoadsPerTick()) { + try { + Thread.sleep(25); //hold the lock so other threads also won't stress main thread + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + //save data asynchronously + return () -> { + try { + return (NBTTagCompound) save.invoke(null, world.getHandle(), c, future.get()); + } catch (ReflectiveOperationException | ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + }; + } } diff --git a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java index 3971de10..c96b6670 100644 --- a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java +++ b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java @@ -1,10 +1,12 @@ package org.dynmap.bukkit.helper.v118_2; +import net.minecraft.server.MinecraftServer; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.dynmap.DynmapChunk; +import org.dynmap.MapManager; import org.dynmap.bukkit.helper.BukkitVersionHelper; import org.dynmap.bukkit.helper.BukkitWorld; import org.dynmap.common.chunk.GenericChunk; @@ -20,6 +22,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; /** @@ -37,11 +40,20 @@ public class MapChunkCache118_2 extends GenericMapChunkCache { // Load generic chunk from existing and already loaded chunk protected GenericChunk getLoadedChunk(DynmapChunk chunk) { - return getLoadedChunk(chunk, false).get(); + CraftWorld cw = (CraftWorld) w; + if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null; + Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z); //already safe async on vanilla + if ((c == null) || !c.o) return null; // c.loaded + NBTTagCompound nbt = ChunkRegionLoader.a(cw.getHandle(), c); + return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null; } @Override protected Supplier getLoadedChunkAsync(DynmapChunk ch) { - return getLoadedChunk(ch, true); + Supplier nbtSupplier = provider.getLoadedChunk((CraftWorld) w, ch.x, ch.z); + return () -> { + NBTTagCompound nbt = nbtSupplier.get(); + return nbt == null ? null : parseChunkFromNBT(new NBT.NBTCompound(nbt)); + }; } @Override @@ -57,26 +69,6 @@ public class MapChunkCache118_2 extends GenericMapChunkCache { } } - private Supplier getLoadedChunk(DynmapChunk chunk, boolean async) { - CraftWorld cw = (CraftWorld) w; - if (!cw.isChunkLoaded(chunk.x, chunk.z)) return () -> null; - Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z); //already safe async on vanilla - if ((c == null) || c.o) return () -> null; // c.loaded - if (async) { //the data of the chunk may change while we write, better to write it sync - CompletableFuture nbt = CompletableFuture.supplyAsync(() -> ChunkRegionLoader.a(cw.getHandle(), c), ((CraftServer) Bukkit.getServer()).getServer()); - return () -> { - NBTTagCompound compound = nbt.join(); - return compound == null ? null : parseChunkFromNBT(new NBT.NBTCompound(compound)); - }; - } else { - NBTTagCompound nbt = ChunkRegionLoader.a(cw.getHandle(), c); - GenericChunk genericChunk; - if (nbt != null) genericChunk = parseChunkFromNBT(new NBT.NBTCompound(nbt)); - else genericChunk = null; - return () -> genericChunk; - } - - } // Load generic chunk from unloaded chunk protected GenericChunk loadChunk(DynmapChunk chunk) { CraftWorld cw = (CraftWorld) w; From 17e60cff40b5bfbdb9a65816ac1b5c1031ea09d3 Mon Sep 17 00:00:00 2001 From: mastermc05 Date: Thu, 7 Jul 2022 15:34:16 +0300 Subject: [PATCH 08/11] fix 1.19 --- .../helper/v119/AsyncChunkProvider119.java | 62 ++++++++++++++++++- .../bukkit/helper/v119/MapChunkCache119.java | 44 +++++-------- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java index 7438575c..10ee620a 100644 --- a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java +++ b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java @@ -1,31 +1,53 @@ package org.dynmap.bukkit.helper.v119; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.WorldServer; +import net.minecraft.world.level.chunk.Chunk; +import net.minecraft.world.level.chunk.IChunkAccess; +import net.minecraft.world.level.chunk.storage.ChunkRegionLoader; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R1.CraftServer; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.dynmap.MapManager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.function.Supplier; /** * The provider used to work with paper libs * Because paper libs need java 17 we can't interact with them directly */ +@SuppressWarnings({"JavaReflectionMemberAccess"}) //java don't know about paper public class AsyncChunkProvider119 { private final Thread ioThread; private final Method getChunk; private final Predicate ifFailed; - AsyncChunkProvider119 () { + private final Method getAsyncSaveData; + private final Method save; + private int currTick = MinecraftServer.currentTick; + private int currChunks = 0; + + AsyncChunkProvider119() { try { Predicate ifFailed1 = null; - Method getChunk1 = null; + Method getChunk1 = null, getAsyncSaveData1 = null, save1 = null; Thread ioThread1 = null; try { Class threadClass = Class.forName("com.destroystokyo.paper.io.PaperFileIOThread"); + Class asyncChunkData = Arrays.stream(ChunkRegionLoader.class.getClasses()) + .filter(c -> c.getSimpleName().equals("AsyncSaveData")) + .findFirst() + .orElseThrow(RuntimeException::new); + getAsyncSaveData1 = ChunkRegionLoader.class.getMethod("getAsyncSaveData", WorldServer.class, IChunkAccess.class); + save1 = ChunkRegionLoader.class.getMethod("saveChunk", WorldServer.class, IChunkAccess.class, asyncChunkData); Class[] classes = threadClass.getClasses(); Class holder = Arrays.stream(classes).filter(aClass -> aClass.getSimpleName().equals("Holder")).findAny().orElseThrow(RuntimeException::new); ioThread1 = (Thread) holder.getField("INSTANCE").get(null); @@ -35,6 +57,8 @@ public class AsyncChunkProvider119 { } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { e.printStackTrace(); } + getAsyncSaveData = Objects.requireNonNull(getAsyncSaveData1); + save = Objects.requireNonNull(save1); ifFailed = Objects.requireNonNull(ifFailed1); getChunk = Objects.requireNonNull(getChunk1); ioThread = Objects.requireNonNull(ioThread1); @@ -57,4 +81,38 @@ public class AsyncChunkProvider119 { return null; }); } + + public synchronized Supplier getLoadedChunk(CraftWorld world, int x, int z) { + if (!world.isChunkLoaded(x, z)) return () -> null; + Chunk c = world.getHandle().getChunkIfLoaded(x, z); //already safe async on vanilla + if ((c == null) || c.o) return () -> null; // c.loaded + if (currTick != MinecraftServer.currentTick) { + currTick = MinecraftServer.currentTick; + currChunks = 0; + } + //prepare data synchronously + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + try { + return getAsyncSaveData.invoke(null, world.getHandle(), c); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + }, ((CraftServer) Bukkit.getServer()).getServer()); + //we shouldn't stress main thread + if (++currChunks > MapManager.mapman.getMaxChunkLoadsPerTick()) { + try { + Thread.sleep(25); //hold the lock so other threads also won't stress main thread + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + //save data asynchronously + return () -> { + try { + return (NBTTagCompound) save.invoke(null, world.getHandle(), c, future.get()); + } catch (ReflectiveOperationException | ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + }; + } } diff --git a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java index 4743e94f..a94c0898 100644 --- a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java +++ b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java @@ -1,8 +1,6 @@ package org.dynmap.bukkit.helper.v119; -import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.dynmap.DynmapChunk; import org.dynmap.bukkit.helper.BukkitVersionHelper; @@ -16,7 +14,6 @@ import net.minecraft.world.level.ChunkCoordIntPair; import net.minecraft.world.level.chunk.storage.ChunkRegionLoader; import net.minecraft.world.level.chunk.Chunk; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.NoSuchElementException; @@ -38,14 +35,24 @@ public class MapChunkCache119 extends GenericMapChunkCache { } // Load generic chunk from existing and already loaded chunk - protected GenericChunk getLoadedChunk(DynmapChunk chunk) { - return getLoadedChunk(chunk, false).get(); - } @Override - protected Supplier getLoadedChunkAsync(DynmapChunk ch) { - return getLoadedChunk(ch, true); + protected Supplier getLoadedChunkAsync(DynmapChunk chunk) { + Supplier supplier = provider.getLoadedChunk((CraftWorld) w, chunk.x, chunk.z); + return () -> { + NBTTagCompound nbt = supplier.get(); + return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null; + }; + } + protected GenericChunk getLoadedChunk(DynmapChunk chunk) { + CraftWorld cw = (CraftWorld) w; + if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null; + Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z); + if (c == null || !c.o) return null; // c.loaded + NBTTagCompound nbt = ChunkRegionLoader.a(cw.getHandle(), c); + return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null; } + // Load generic chunk from unloaded chunk @Override protected Supplier loadChunkAsync(DynmapChunk chunk){ try { @@ -59,27 +66,6 @@ public class MapChunkCache119 extends GenericMapChunkCache { } } - private Supplier getLoadedChunk(DynmapChunk chunk, boolean async) { - CraftWorld cw = (CraftWorld) w; - if (!cw.isChunkLoaded(chunk.x, chunk.z)) return () -> null; - Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z); //already safe async on vanilla - if ((c == null) || c.o) return () -> null; // c.loaded - if (async) { //the data of the chunk may change while we write, better to write it sync - CompletableFuture nbt = CompletableFuture.supplyAsync(() -> ChunkRegionLoader.a(cw.getHandle(), c), ((CraftServer) Bukkit.getServer()).getServer()); - return () -> { - NBTTagCompound compound = nbt.join(); - return compound == null ? null : parseChunkFromNBT(new NBT.NBTCompound(compound)); - }; - } else { - NBTTagCompound nbt = ChunkRegionLoader.a(cw.getHandle(), c); - GenericChunk genericChunk; - if (nbt != null) genericChunk = parseChunkFromNBT(new NBT.NBTCompound(nbt)); - else genericChunk = null; - return () -> genericChunk; - } - - } - // Load generic chunk from unloaded chunk protected GenericChunk loadChunk(DynmapChunk chunk) { CraftWorld cw = (CraftWorld) w; NBTTagCompound nbt = null; From b933f6b21cb29a781d89fe40964d44b4e589aff9 Mon Sep 17 00:00:00 2001 From: mastermc05 Date: Thu, 7 Jul 2022 16:21:22 +0300 Subject: [PATCH 09/11] Readd fix to copied code --- .../dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java | 2 +- .../org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java index f043d870..745527e6 100644 --- a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java +++ b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java @@ -86,7 +86,7 @@ public class AsyncChunkProvider118_2 { public synchronized Supplier getLoadedChunk(CraftWorld world, int x, int z) { if (!world.isChunkLoaded(x, z)) return () -> null; Chunk c = world.getHandle().getChunkIfLoaded(x, z); //already safe async on vanilla - if ((c == null) || c.o) return () -> null; // c.loaded + if ((c == null) || !c.o) return () -> null; // c.loaded if (currTick != MinecraftServer.currentTick) { currTick = MinecraftServer.currentTick; currChunks = 0; diff --git a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java index 10ee620a..ac93ee97 100644 --- a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java +++ b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java @@ -85,7 +85,7 @@ public class AsyncChunkProvider119 { public synchronized Supplier getLoadedChunk(CraftWorld world, int x, int z) { if (!world.isChunkLoaded(x, z)) return () -> null; Chunk c = world.getHandle().getChunkIfLoaded(x, z); //already safe async on vanilla - if ((c == null) || c.o) return () -> null; // c.loaded + if ((c == null) || !c.o) return () -> null; // c.loaded if (currTick != MinecraftServer.currentTick) { currTick = MinecraftServer.currentTick; currChunks = 0; From ca5d2f4990e92f2d07ea7649a4a9e696f16f799d Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Fri, 15 Jul 2022 03:29:16 +0200 Subject: [PATCH 10/11] Fix implicit cast. --- .../src/main/resources/extracted/web/standalone/MySQL_tiles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php index 17dc4f93..51699bc1 100644 --- a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php +++ b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php @@ -94,7 +94,7 @@ if ($stmt->fetch()) { header('Content-Type: image/jpeg'); } header('ETag: \'' . $thash . '\''); - header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tlast / 1000) . ' GMT'); + header('Last-Modified: ' . gmdate('D, d M Y H:i:s', (int) ($tlast / 1000)) . ' GMT'); if (is_null($tnewimage)) { echo $timage; } else { From 8e02c21a36e3d501f1c990f5fb7701a9b292781d Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Fri, 15 Jul 2022 03:30:26 +0200 Subject: [PATCH 11/11] Fix implicit cast. --- .../resources/extracted/web/standalone/PostgreSQL_tiles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php index 5afd0338..b95d00cd 100644 --- a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php +++ b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php @@ -99,7 +99,7 @@ if ($res && $timage) { header('Content-Type: image/jpeg'); } header('ETag: \'' . $thash . '\''); - header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tlast / 1000) . ' GMT'); + header('Last-Modified: ' . gmdate('D, d M Y H:i:s', (int) ($tlast / 1000)) . ' GMT'); echo stream_get_contents($timage); } else { header('Location: ../images/blank.png');