From ababfe669c2c2b6ed7c9fc6e69d91a8e10e1d03b Mon Sep 17 00:00:00 2001 From: Waterpicker Date: Mon, 1 Feb 2021 07:21:34 -0600 Subject: [PATCH] Various stuff related to Personal Pockets --- .../dimdoors/block/AncientFabricBlock.java | 16 ++++ .../dimdev/dimdoors/block/FabricBlock.java | 6 +- .../org/dimdev/dimdoors/block/ModBlocks.java | 20 ++++- .../dimdoors/pockets/PocketGenerator.java | 2 +- .../dimdoors/pockets/SchematicV2Handler.java | 15 +--- .../dimdoors/rift/registry/RiftRegistry.java | 5 +- .../rift/targets/PrivatePocketExitTarget.java | 6 +- .../rift/targets/PrivatePocketTarget.java | 15 ++-- .../dimdev/dimdoors/world/ModDimensions.java | 6 +- .../world/level/DimensionalRegistry.java | 9 ++- .../dimdev/dimdoors/world/pocket/Pocket.java | 69 +++++++++--------- ...tePocketData.java => PrivateRegistry.java} | 18 +---- .../v2/private/private_pocket_0.schem | Bin 370 -> 516 bytes .../v2/private/private_pocket_1.schem | Bin 607 -> 762 bytes .../v2/private/private_pocket_2.schem | Bin 1040 -> 1218 bytes .../v2/private/private_pocket_3.schem | Bin 1560 -> 1749 bytes .../v2/private/private_pocket_4.schem | Bin 2728 -> 2926 bytes .../v2/private/private_pocket_5.schem | Bin 4157 -> 4358 bytes .../v2/private/private_pocket_6.schem | Bin 6036 -> 6244 bytes .../v2/private/private_pocket_7.schem | Bin 8327 -> 8539 bytes 20 files changed, 110 insertions(+), 77 deletions(-) create mode 100644 src/main/java/org/dimdev/dimdoors/block/AncientFabricBlock.java rename src/main/java/org/dimdev/dimdoors/world/pocket/{PrivatePocketData.java => PrivateRegistry.java} (86%) diff --git a/src/main/java/org/dimdev/dimdoors/block/AncientFabricBlock.java b/src/main/java/org/dimdev/dimdoors/block/AncientFabricBlock.java new file mode 100644 index 00000000..bd6b42cf --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/block/AncientFabricBlock.java @@ -0,0 +1,16 @@ +package org.dimdev.dimdoors.block; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.Material; +import net.minecraft.util.DyeColor; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; + +public class AncientFabricBlock extends Block { + public AncientFabricBlock(DyeColor color) { + super(FabricBlockSettings.of(Material.STONE, color).strength(-1.0F, 3600000.0F).dropsNothing()); + } + +} diff --git a/src/main/java/org/dimdev/dimdoors/block/FabricBlock.java b/src/main/java/org/dimdev/dimdoors/block/FabricBlock.java index 86eb67a1..2d9da4db 100644 --- a/src/main/java/org/dimdev/dimdoors/block/FabricBlock.java +++ b/src/main/java/org/dimdev/dimdoors/block/FabricBlock.java @@ -1,5 +1,8 @@ package org.dimdev.dimdoors.block; +import java.util.HashMap; +import java.util.Map; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Material; @@ -15,8 +18,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import org.dimdev.dimdoors.util.InstanceMap; -class FabricBlock extends Block { +public class FabricBlock extends Block { FabricBlock(DyeColor color) { super(FabricBlockSettings.of(Material.STONE, color).lightLevel(15)); } diff --git a/src/main/java/org/dimdev/dimdoors/block/ModBlocks.java b/src/main/java/org/dimdev/dimdoors/block/ModBlocks.java index a168ff70..16167305 100644 --- a/src/main/java/org/dimdev/dimdoors/block/ModBlocks.java +++ b/src/main/java/org/dimdev/dimdoors/block/ModBlocks.java @@ -1,5 +1,6 @@ package org.dimdev.dimdoors.block; +import java.util.HashMap; import java.util.Map; import com.google.common.collect.Maps; @@ -18,6 +19,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; public final class ModBlocks { private static final Map BLOCKS = Maps.newLinkedHashMap(); + private static final Map FABRIC_BLOCKS = new HashMap<>(); + private static final Map ANCIENT_FABRIC_BLOCKS = new HashMap<>(); + public static final Block GOLD_DOOR = register("dimdoors:gold_door", new DoorBlock(FabricBlockSettings.of(Material.METAL, MaterialColor.GOLD).nonOpaque())); public static final Block QUARTZ_DOOR = register("dimdoors:quartz_door", new DoorBlock(FabricBlockSettings.of(Material.STONE, MaterialColor.QUARTZ).nonOpaque())); public static final Block OAK_DIMENSIONAL_DOOR = register("dimdoors:oak_dimensional_door", new DimensionalDoorBlock(FabricBlockSettings.of(Material.WOOD, MaterialColor.WOOD).nonOpaque().lightLevel(state -> ((DimensionalDoorBlock) state.getBlock()).hasBlockEntity(state) ? 10 : 0))); @@ -74,11 +78,15 @@ public final class ModBlocks { } private static Block registerAncientFabric(String id, DyeColor color) { - return register(id, new Block(FabricBlockSettings.of(Material.STONE, color).strength(-1.0F, 3600000.0F).dropsNothing())); + Block block = new AncientFabricBlock(color); + ANCIENT_FABRIC_BLOCKS.put(color, block); + return register(id, block); } private static Block registerFabric(String id, DyeColor color) { - return register(id, new FabricBlock(color)); + Block block = new FabricBlock(color); + FABRIC_BLOCKS.put(color, block); + return register(id, block); } public static void init() { @@ -93,6 +101,14 @@ public final class ModBlocks { BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ModBlocks.OAK_DIMENSIONAL_DOOR, ModBlocks.GOLD_DIMENSIONAL_DOOR, ModBlocks.IRON_DIMENSIONAL_DOOR, ModBlocks.OAK_DIMENSIONAL_TRAPDOOR, ModBlocks.QUARTZ_DIMENSIONAL_DOOR, ModBlocks.QUARTZ_DOOR); } + public static Block ancientFabricFromDye(DyeColor color) { + return ANCIENT_FABRIC_BLOCKS.get(color); + } + + public static Block fabricFromDye(DyeColor color) { + return FABRIC_BLOCKS.get(color); + } + private static class DoorBlock extends net.minecraft.block.DoorBlock { public DoorBlock(Settings settings) { super(settings); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java index 0d8897db..987f5404 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java @@ -47,7 +47,7 @@ public final class PocketGenerator { } public static Pocket generatePrivatePocketV2(VirtualLocation virtualLocation) { - return generateRandomPocketFromGroupV2(DimensionalDoorsInitializer.getWorld(ModDimensions.PUBLIC), "private", virtualLocation, null, null); + return generateRandomPocketFromGroupV2(DimensionalDoorsInitializer.getWorld(ModDimensions.PERSONAL), "private", virtualLocation, null, null); } // TODO: size of public pockets should increase with depth diff --git a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java index d4eba1fc..4f756aa0 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java @@ -10,6 +10,8 @@ import java.util.*; import com.google.common.collect.*; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.JsonOps; + import net.minecraft.nbt.*; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; @@ -36,21 +38,12 @@ public class SchematicV2Handler { long startTime = System.currentTimeMillis(); Set names = ImmutableSet.of("default_private", "default_public"); for (String name : names) { - try (BufferedReader reader = Files.newBufferedReader(Paths.get(SchematicV2Handler.class.getResource(String.format("/data/dimdoors/pockets/json/v2/%s.json", name)).toURI()))) { - List result = new ArrayList<>(); - while (true) { - String line = reader.readLine(); - if (line == null) { - break; - } - result.add(line); - } - + try { + List result = Files.readAllLines(Paths.get(SchematicV2Handler.class.getResource(String.format("/data/dimdoors/pockets/json/v2/%s.json", name)).toURI())); CompoundTag groupTag = StringNbtReader.parse(String.join("", result)); PocketGroup type = new PocketGroup().fromTag(groupTag); type.init(); this.pocketGroups.put(type.getGroup(), type); - } catch (IOException | URISyntaxException | CommandSyntaxException e) { e.printStackTrace(); } diff --git a/src/main/java/org/dimdev/dimdoors/rift/registry/RiftRegistry.java b/src/main/java/org/dimdev/dimdoors/rift/registry/RiftRegistry.java index ffdfb0d5..25601da0 100644 --- a/src/main/java/org/dimdev/dimdoors/rift/registry/RiftRegistry.java +++ b/src/main/java/org/dimdev/dimdoors/rift/registry/RiftRegistry.java @@ -13,9 +13,10 @@ import org.apache.logging.log4j.Logger; import org.dimdev.dimdoors.util.GraphUtils; import org.dimdev.dimdoors.util.Location; +import org.dimdev.dimdoors.world.level.DimensionalRegistry; import org.dimdev.dimdoors.world.pocket.Pocket; import org.dimdev.dimdoors.world.pocket.PocketDirectory; -import org.dimdev.dimdoors.world.pocket.PrivatePocketData; +import org.dimdev.dimdoors.world.pocket.PrivateRegistry; import org.jgrapht.graph.DefaultDirectedGraph; import org.jgrapht.graph.DefaultEdge; @@ -308,7 +309,7 @@ public class RiftRegistry { if (entrance != null) return entrance.location; // If there was no last used private entrance, get the first player's private pocket entrance - return this.getPocketEntrance(PrivatePocketData.instance().getPrivatePocket(playerUUID)); + return this.getPocketEntrance(DimensionalRegistry.getPrivateRegistry().getPrivatePocket(playerUUID)); } private void setPlayerRiftPointer(UUID playerUUID, Location rift, Map map) { diff --git a/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketExitTarget.java b/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketExitTarget.java index 9c199e7d..024911ec 100644 --- a/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketExitTarget.java +++ b/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketExitTarget.java @@ -10,7 +10,7 @@ import org.dimdev.dimdoors.util.RGBA; import org.dimdev.dimdoors.world.ModDimensions; import org.dimdev.dimdoors.world.pocket.Pocket; import org.dimdev.dimdoors.world.pocket.PocketDirectory; -import org.dimdev.dimdoors.world.pocket.PrivatePocketData; +import org.dimdev.dimdoors.world.pocket.PrivateRegistry; import net.minecraft.entity.Entity; import net.minecraft.text.TranslatableText; @@ -30,8 +30,8 @@ public class PrivatePocketExitTarget extends VirtualTarget implements EntityTarg UUID uuid = EntityUtils.getOwner(entity).getUuid(); if (uuid != null) { destLoc = DimensionalRegistry.getRiftRegistry().getPrivatePocketExit(uuid); - Pocket pocket = PrivatePocketData.instance().getPrivatePocket(uuid); - if (ModDimensions.isPocketDimension(this.location.getWorld()) && pocket != null && DimensionalRegistry.getPocketDirectory(pocket.world).getPocketAt(this.location.pos).equals(pocket)) { + Pocket pocket = DimensionalRegistry.getPrivateRegistry().getPrivatePocket(uuid); + if (ModDimensions.isPersonalPocketDimension(this.location.getWorld()) && pocket != null && DimensionalRegistry.getPocketDirectory(pocket.world).getPocketAt(this.location.pos).equals(pocket)) { DimensionalRegistry.getRiftRegistry().setLastPrivatePocketEntrance(uuid, this.location); // Remember which exit was used for next time the pocket is entered } if (destLoc == null || !(destLoc.getBlockEntity() instanceof RiftBlockEntity)) { diff --git a/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketTarget.java b/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketTarget.java index a21eb89b..7247035c 100644 --- a/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketTarget.java +++ b/src/main/java/org/dimdev/dimdoors/rift/targets/PrivatePocketTarget.java @@ -10,7 +10,7 @@ import org.dimdev.dimdoors.util.EntityUtils; import org.dimdev.dimdoors.util.Location; import org.dimdev.dimdoors.util.RGBA; import org.dimdev.dimdoors.world.pocket.Pocket; -import org.dimdev.dimdoors.world.pocket.PrivatePocketData; +import org.dimdev.dimdoors.world.pocket.PrivateRegistry; import org.dimdev.dimdoors.world.pocket.VirtualLocation; import net.minecraft.block.entity.BlockEntity; @@ -33,12 +33,12 @@ public class PrivatePocketTarget extends VirtualTarget implements EntityTarget { UUID uuid = EntityUtils.getOwner(entity).getUuid(); VirtualLocation virtualLocation = VirtualLocation.fromLocation(this.location); if (uuid != null) { - Pocket pocket = PrivatePocketData.instance().getPrivatePocket(uuid); + Pocket pocket = DimensionalRegistry.getPrivateRegistry().getPrivatePocket(uuid); if (pocket == null) { // generate the private pocket and get its entrances // set to where the pocket was first created pocket = PocketGenerator.generatePrivatePocketV2(new VirtualLocation(virtualLocation.getWorld(), virtualLocation.getX(), virtualLocation.getZ(), -1)); - PrivatePocketData.instance().setPrivatePocketID(uuid, pocket); + DimensionalRegistry.getPrivateRegistry().setPrivatePocketID(uuid, pocket); BlockEntity be = DimensionalRegistry.getRiftRegistry().getPocketEntrance(pocket).getBlockEntity(); this.processEntity(pocket, be, entity, uuid, yawOffset); } else { @@ -49,7 +49,7 @@ public class PrivatePocketTarget extends VirtualTarget implements EntityTarget { LOGGER.info("All entrances are gone, creating a new private pocket!"); pocket = PocketGenerator.generatePrivatePocketV2(new VirtualLocation(virtualLocation.getWorld(), virtualLocation.getX(), virtualLocation.getZ(), -1)); - PrivatePocketData.instance().setPrivatePocketID(uuid, pocket); + DimensionalRegistry.getPrivateRegistry().setPrivatePocketID(uuid, pocket); destLoc = DimensionalRegistry.getRiftRegistry().getPocketEntrance(pocket); } @@ -66,8 +66,11 @@ public class PrivatePocketTarget extends VirtualTarget implements EntityTarget { Item item = ((ItemEntity) entity).getStack().getItem(); if (item instanceof DyeItem) { - pocket.addDye(EntityUtils.getOwner(entity), ((DyeItem) item).getColor()); - entity.remove(); + if(pocket.addDye(EntityUtils.getOwner(entity), ((DyeItem) item).getColor())) { + entity.remove(); + } else { + ((EntityTarget) blockEntity).receiveEntity(entity, relativeYaw); + } } else { ((EntityTarget) blockEntity).receiveEntity(entity, relativeYaw); } diff --git a/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java b/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java index 4ab0784b..f70d787c 100644 --- a/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java +++ b/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java @@ -50,9 +50,11 @@ public final class ModDimensions { return isPocketDimension(world.getRegistryKey()); } - public static boolean isPocketDimension(RegistryKey type) { - System.out.println("Type: " + type); + public static boolean isPersonalPocketDimension(World world) { + return isPocketDimension(world.getRegistryKey()); + } + public static boolean isPocketDimension(RegistryKey type) { return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON); } diff --git a/src/main/java/org/dimdev/dimdoors/world/level/DimensionalRegistry.java b/src/main/java/org/dimdev/dimdoors/world/level/DimensionalRegistry.java index 36582931..9264d39d 100644 --- a/src/main/java/org/dimdev/dimdoors/world/level/DimensionalRegistry.java +++ b/src/main/java/org/dimdev/dimdoors/world/level/DimensionalRegistry.java @@ -15,18 +15,20 @@ import dev.onyxstudios.cca.api.v3.component.ComponentV3; import org.dimdev.dimdoors.rift.registry.RiftRegistry; import org.dimdev.dimdoors.world.ModDimensions; import org.dimdev.dimdoors.world.pocket.PocketDirectory; +import org.dimdev.dimdoors.world.pocket.PrivateRegistry; import static org.dimdev.dimdoors.DimensionalDoorsInitializer.getServer; public class DimensionalRegistry implements ComponentV3 { public Map, PocketDirectory> pocketRegistry = new HashMap<>(); RiftRegistry riftRegistry = new RiftRegistry(); + PrivateRegistry privateRegistry = new PrivateRegistry(); @Override public void readFromNbt(CompoundTag tag) { CompoundTag pocketRegistryTag = tag.getCompound("pocketRegistry"); pocketRegistry = pocketRegistryTag.getKeys().stream().collect(Collectors.toMap(a -> RegistryKey.of(Registry.DIMENSION, new Identifier(a)), a -> PocketDirectory.readFromNbt(a, pocketRegistryTag.getCompound(a)))); - riftRegistry = RiftRegistry.fromTag(pocketRegistry, tag.getCompound("riftRegistry")); + privateRegistry.fromTag(tag); } @Override @@ -36,6 +38,7 @@ public class DimensionalRegistry implements ComponentV3 { tag.put("pocketRegistry", pocketRegistryTag); tag.put("riftRegistry", riftRegistry.toTag()); + privateRegistry.toTag(tag); } public static DimensionalRegistry instance() { @@ -46,6 +49,10 @@ public class DimensionalRegistry implements ComponentV3 { return instance().riftRegistry; } + public static PrivateRegistry getPrivateRegistry() { + return instance().privateRegistry; + } + public static PocketDirectory getPocketDirectory(RegistryKey key) { if (!(ModDimensions.isPocketDimension(key))) { throw new UnsupportedOperationException("PocketRegistry is only available for pocket dimensions!"); diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/Pocket.java b/src/main/java/org/dimdev/dimdoors/world/pocket/Pocket.java index acc003a6..d676d581 100644 --- a/src/main/java/org/dimdev/dimdoors/world/pocket/Pocket.java +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/Pocket.java @@ -1,5 +1,7 @@ package org.dimdev.dimdoors.world.pocket; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.stream.IntStream; @@ -7,25 +9,32 @@ import java.util.stream.IntStream; import com.flowpowered.math.vector.Vector3i; import com.mojang.serialization.Codec; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.ChunkPos; import org.dimdev.dimdoors.DimensionalDoorsInitializer; +import org.dimdev.dimdoors.block.AncientFabricBlock; +import org.dimdev.dimdoors.block.FabricBlock; +import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.world.level.DimensionalRegistry; import org.dimdev.dimdoors.util.EntityUtils; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.world.ServerWorld; import net.minecraft.text.TranslatableText; import net.minecraft.util.DyeColor; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3i; +import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; public final class Pocket { - private static final int BLOCKS_PAINTED_PER_DYE = 1106; + private static final int BLOCKS_PAINTED_PER_DYE = 1000000; // TODO: please someone make all these private and add a getter & setter where needed public final int id; @@ -37,13 +46,14 @@ public final class Pocket { public RegistryKey world; - private Pocket(int id, BlockBox box, VirtualLocation virtualLocation, PocketColor dyeColor, PocketColor nextDyeColor, int count) { + private Pocket(int id, BlockBox box, VirtualLocation virtualLocation, PocketColor dyeColor, PocketColor nextDyeColor, int count, RegistryKey world) { this.id = id; this.box = box; this.virtualLocation = virtualLocation; this.dyeColor = dyeColor; this.nextDyeColor = nextDyeColor; this.count = count; + this.world = world; } public Pocket(int id, RegistryKey world, int x, int z) { @@ -76,8 +86,9 @@ public final class Pocket { return false; } - if (this.nextDyeColor != null && this.nextDyeColor == color) { - if (this.count + 1 > amountOfDyeRequiredToColor(this)) { + if (this.nextDyeColor != PocketColor.NONE && this.nextDyeColor == color) { + if (this.count + 1 > maxDye) { + repaint(dyeColor); this.dyeColor = color; this.nextDyeColor = PocketColor.NONE; this.count = 0; @@ -94,37 +105,25 @@ public final class Pocket { return true; } -// private void repaint(DyeColor dyeColor) { -// BlockPos origin = getOrigin(); -// World world = WorldUtils.getWorld(dim); -// BlockState innerWall = ModBlocks.getDefaultState()..withProperty(..., dyeColor); // <-- forgot the exact name of the color property -// BlockState outerWall = ModBlocks.ETERNAL_FABRIC.getDefaultState().withProperty(..., dyeColor); -// -// for (int x = origin.getX(); x < origin.getX() + size; x++) { -// for (int y = origin.getY(); y < origin.getY() + size; y++) { -// for (int z = origin.getZ(); z < origin.getZ() + size; z++) { -// int layer = Collections.min(Arrays.asList(x, y, z, size - 1 - x, size - 1 - y, size - 1 - z)); -// if (layer == 0) { -// if (world.getBlockState(x, y, z).getBlock() == ModBlocks.ETERNAL_FABRIC) { -// world.setBlockState(x, y, z, outerWall); -// } -// } else if (layer < 5) { -// if (world.getBlockState(x, y, z).getBlock() == ModBlocks.FABRIC) { -// world.setBlockState(x, y, z, innerWall); -// } -// } -// } -// } -// } -// -// return schematic; -// } + private void repaint(DyeColor dyeColor) { + ServerWorld serverWorld = DimensionalDoorsInitializer.getWorld(world); + BlockState innerWall = ModBlocks.fabricFromDye(dyeColor).getDefaultState(); + BlockState outerWall = ModBlocks.ancientFabricFromDye(dyeColor).getDefaultState(); + + BlockPos.stream(box).forEach(pos -> { + if (serverWorld.getBlockState(pos).getBlock() instanceof AncientFabricBlock) { + serverWorld.setBlockState(pos, outerWall); + } else if (serverWorld.getBlockState(pos).getBlock() instanceof FabricBlock) { + serverWorld.setBlockState(pos, innerWall); + } + }); + } private static int amountOfDyeRequiredToColor(Pocket pocket) { int outerVolume = pocket.box.getBlockCountX() * pocket.box.getBlockCountY() * pocket.box.getBlockCountZ(); int innerVolume = (pocket.box.getBlockCountX() - 5) * (pocket.box.getBlockCountY() - 5) * (pocket.box.getBlockCountZ() - 5); - return (outerVolume - innerVolume) / BLOCKS_PAINTED_PER_DYE; + return Math.min((outerVolume - innerVolume) / BLOCKS_PAINTED_PER_DYE, 1); } public void setSize(int x, int y, int z) { @@ -144,6 +143,7 @@ public final class Pocket { tag.putInt("dyeColor", this.dyeColor.getId()); tag.putInt("nextDyeColor", this.nextDyeColor.getId()); tag.putInt("count", this.count); + tag.putString("world", world.getValue().toString()); return tag; } @@ -155,7 +155,8 @@ public final class Pocket { VirtualLocation.fromTag(tag.getCompound("virtualLocation")), PocketColor.from(tag.getInt("dyeColor")), PocketColor.from(tag.getInt("nextDyeColor")), - tag.getInt("count") + tag.getInt("count"), + RegistryKey.of(Registry.DIMENSION, new Identifier(tag.getString("world"))) ); } diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/PrivatePocketData.java b/src/main/java/org/dimdev/dimdoors/world/pocket/PrivateRegistry.java similarity index 86% rename from src/main/java/org/dimdev/dimdoors/world/pocket/PrivatePocketData.java rename to src/main/java/org/dimdev/dimdoors/world/pocket/PrivateRegistry.java index bd4dfd9f..2338123f 100644 --- a/src/main/java/org/dimdev/dimdoors/world/pocket/PrivatePocketData.java +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/PrivateRegistry.java @@ -5,6 +5,8 @@ import java.util.UUID; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; + +import dev.onyxstudios.cca.api.v3.component.ComponentV3; import org.dimdev.dimdoors.DimensionalDoorsInitializer; import org.dimdev.dimdoors.world.level.DimensionalRegistry; @@ -17,7 +19,7 @@ import net.minecraft.world.World; import static net.minecraft.world.World.OVERWORLD; -public class PrivatePocketData extends PersistentState { +public class PrivateRegistry { protected static class PocketInfo { public final RegistryKey world; public final int id; @@ -46,19 +48,9 @@ public class PrivatePocketData extends PersistentState { protected BiMap privatePocketMap = HashBiMap.create(); // Player UUID -> Pocket Info TODO: fix AnnotatedNBT and use UUID rather than String - public PrivatePocketData(String name) { - super(name); + public PrivateRegistry() { } - public PrivatePocketData() { - super(DATA_NAME); - } - - public static PrivatePocketData instance() { - return DimensionalDoorsInitializer.getWorld(OVERWORLD).getPersistentStateManager().getOrCreate(PrivatePocketData::new, DATA_NAME); - } - - @Override public void fromTag(CompoundTag nbt) { CompoundTag tag = nbt.getCompound("privatePocketMap"); @@ -69,7 +61,6 @@ public class PrivatePocketData extends PersistentState { this.privatePocketMap = bm; } - @Override public CompoundTag toTag(CompoundTag nbt) { CompoundTag tag = new CompoundTag(); for (Map.Entry entry : this.privatePocketMap.entrySet()) { @@ -88,7 +79,6 @@ public class PrivatePocketData extends PersistentState { public void setPrivatePocketID(UUID playerUUID, Pocket pocket) { this.privatePocketMap.put(playerUUID, new PocketInfo(pocket.world, pocket.id)); - this.markDirty(); } public UUID getPrivatePocketOwner(Pocket pocket) { diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_0.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_0.schem index 06dd3daff0d3181306777b5be875e6b1af249289..290d9ed7c4fe4bd3cf2cf9264a742bab3250f5f4 100644 GIT binary patch literal 516 zcmV+f0{i_RiwFRvd=_8;|LvDeZ__{!h9_A&A2v}h6mbCY2O@FdR4GD&RN_EIB_zs+ zDr;-c#w#|vW<4QoPyA($oM1LdlfVfm2h(OGOMYhO>pi{+^k3&CP9^DFKyoY%65)|N z2Y@(%?kXYRw9wPSIbR=qnn_QW88g~iJ1b2V9zH0UYdaZP=cyc)(x{PfbM(WKvp6!S zXy_`mBPC6Z!z#RCv7}Sp*8aO4v#R?29g%?j^^SR|2{R?nyw3TpC15bs7IQBZ9Z2mt zCj>nFrC!=xqoqwBS3&m;`fz5D(T2`Tv=b^}FM-|>k}M=i0sWK1S4!1LZ@+VF@jJ$^ zTl}8+8}OJHs3#@Co`7`BBi1{TyItr%GcNxa(g1_UaNDA_9seip1UBKw>)=k{pH6OX zqX_YDurUIon=bGt+zH$XY`DM%;7(u@j=T=ua)CE4`Y>47r$bAcG}Z~{S_wqKs3j2R z&Nv@~VCxvFV~8gn(Jud^Gc&_gTAHeqProoEkQP{zw(O&wO<_HJ)kSgbMES`sR8Sh9lmlyRI*|GD5 zDTrfNL$Id+-NnIdfP2u^1>9Rty&9K!t%yx$e4>kBT~p{R-RNq-qtMLX6Zio{P&K|X G5C8y*#`F#V literal 370 zcmV-&0ge72iwFP!000000PUAeOT$1AhNsznn3U3s9>qTp@ZzbEi&*erQ4p*jl(HtX z&0@NVn<*9lwMS37Yo$g{YCXg@19N!Z*`1m9I3Bp?VT@BwGGySL@dSx*z#jmh;X&(N zU@(g0G)hyQ_wHw0)8p7Ms$8auCu3W<5j>P?5~x&D?8iJ2L6Xi<`>|0mNKlZUW~c(e zlN|lb)-YPo$V_v7H)ED%-=9%uu(O;ok0s$)@LMfIQ>!uPOr^q5b3r{Wwb2-Z-7oLC z3MDG~_-9^0>jJf1)7o&Ld4g&}F?2oH8X)nA6KCKK`=>(WNS7}r3VdbosleBUpTV>_ zMmdQIx(wP!rp0oGx7`BwFiFEZD+6@)Vbh{kjQ@$1!7?nl3RVVx+Sw^0v+*}r8iVz9 zH~0xFgO$OO8!Q1<2FtMID!AbW*DhS>yq!;dMUo`uo)sNv3}s}`wl*{uml)XF4q(q@ Q-Q)qh0$QJK*)9(N0Db_j6aWAK diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_1.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_1.schem index 88ebdc109a794daf6a53375aaf6416abf5cfe53b..1e9eca177c63d5429056bf78b7719a89c69c4158 100644 GIT binary patch literal 762 zcmb2|=3v-dBbLDM|LxuTd6x}D*gjldcK6zpPHBgjhHp%@O`f7cIYQz-K2Ax0E{as1 z^h};;dGO)Y9KNaiROaeI7R@ z?g=k_WOapNKvC;C0?1DK39#aIjf9vCwVGes+g5l zd~NcPbDvC}-tgHp=ck{ch~L^B?a>`26tCpFh{Pess6~SDE|gq~*=jxXp7^+qT(Ay}zLvcK?I?+RHCe zXSK%PF`3B8!OQ#h-?n?PygY2-XE_Wc?j*T29DE>V%*4aCeMYqKgMYqn?p`_Y;Q#sU zW-JvK*~|-@%|-6$?%S$(pu7Og)U#YU)exv!`G9H2yI*Yi8atw6ih{J0StNMe8nRd1 z`O14QpkVusCriSP0gdlrxE`?cwe+5a5Aq66damseOfZmOT(_|3x_O23!Ml$pO^%XO zK9FF*6yyAKUH*r*rrk$X)wdb}os__`qwQ4e{Rh0P<=x(XS*bk?%?CLOc&F~(cTk$^ zo!Im_S58SVvNa1nkkTrz#pkfcW$Y3>?<|0}6m&}hbwrZ9)u238$9ojLJYXT`_Ed^J+;F%m0V zCeHkn8GOt-{4uZ8jLmai-hB1$YRu{ULj@CVYu#X}(dvyY$gL}MUKRcE)70hR>viNq z-MB@KzGldzTRnL(Rr@-hd`F4ixh`41n>V-V8Iky|%~EsBcx5z^ta>Z#AwUcKc@S9C>&#uppwo(-NC z8uKD^Zv?+ld>Boy@TG-s51^C%^}@nHY??_x}Q);`qZ zt61=0$B%nX4e}2f*tz<;WzDZj1JxQZ-En+g#tV|XQ5d|}kco#)`G9Om-u1zwsBk|s z51acr4g-lh$!-k?AIKR49r=AmpvINSYYk=pSKWOPletoL`^s921%HcY-o8FZ?&863 cXP2hjZ}l=UoWJnrnU`!*%h&bCl`${?0IugIIRF3v diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_2.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_2.schem index 57dfb76eb2d501562d607bfcc4818012abeba499..1ac89c16c31878bc1b85fe6e1a2965cc6f6a6ba1 100644 GIT binary patch literal 1218 zcmb2|=3ua^5ldkB|MuGHtS4>~M?bEQzPoS5j_h?GdkKC)bxF5%c zdi*?7a;^IJkv(D)Q#F5Y7w4)B+}&LzaqQ)n=ibJ@;;%o<`F)ai@5^hu_3N^Hp8h%; zY2UNYHqZC^oYKQnW&3XzT%A|C?c?#o*S@9qzErE;bGJ7A_3X>tAGZAbUw!Op+3bHk zu8Q(^Z6B{Hy|+&Kb5Tj?kG!xG7h7NFn$9{lU&_2K+f{M?|Kqdw6>aH(!*arJ<)i~U$;OfDJJyj1CaLf z&rb#(1FGpP3KeYz>9v`!?k<_W;K+_uT?auH%sW4MagT8Tss>37!*#2Yz}7$i3^bBw zibQy*A=rw~l|@qu*}QsIuaW?}>Zgt6DGO%RW1*ouAV+?vnJ1Gvr%~wfDlImUTPy7R z`;5*xbQX?UKV$+Q9Pfv(7UE5JoQf?1PWL{`oVvI;Z$+H#yS<;!`K9hK(@qVP&i9H8 zb2jhs)^v-0|0QVJ?2EVlJ$rxj^t(&<;>_-DGmZZz#Gy5>rYK*ZbALX6 z%ES9PYiq(FdAY=TSA5U**SQtkudjdG`uSm7bvQ7`?BD(P_WYWv|C6I{{l55R>eQKQ zW+kr4`Fr(U>EVyemt$v|U*7q44S)WQNsn$Cw3cfhdOo>6J|d-1p*Z~X@$&N8>fK*o pNa+_x+Ldq3f109N?LRwh)4y+Q@o(y6?4*CPU&uRSF=+-P0|22SV}bwx literal 1040 zcmb2|=3sz;x7W^RNr%g@KFIDDzRq=X>*-741{Lxj)Ko6GI&-xytLI2lIv?TuWTLjO z$4l>$tIxT%@IUGE@N^cRUcLJlYdw2f;d;C56pQZ79_sgX!|#?_^PX1I-Isg)u1V?n zTk*kO-^E`3nBT3ocaO|Eee>CG-(A$tzxDRZ?V~mCj@{iLdHd_pf6eoMms$3NKYyHN zz1A=M?JoQH{Cj1$FJG;>J$L=?I;*>PN*-6+;^L+O*&-j1Gw?8g=aqQ*& z{j)=@{_VT{uKwA-`xZXm_rE;0I&yy?1OSL~PuUjDVtRh%Q=6In@|LJbwp8G!= zi>5qYsMQA2@pX^I!5?$wH6rC!C4n@=od>Fr*03Dqj^NOMrW`gdaN>Hn10!*DcXV{r zJhJrUmtSvw`nvz|%o%NY+i%3nEvwdVI}J?ba!Y=n|6O<8_j9hXef-(;7yra8-Ot$d LHt0*=bVddM;^6Ad diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_3.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_3.schem index 41b43e7cc7eccc7bb7b40155ed1fddf0c76651f6..e481b64d0f7f2fcef52cf70ae326ea2291c1b1ba 100644 GIT binary patch literal 1749 zcmb2|=3sbIBbLDM|Lyg=UD4MWSs%Q;*i&!vHCDRn;wAA9!V*1-r3&J_oGi2c3A71k zW|ws6_%3;D^)ggmIbZk_TcvV%u=V2!+MB)8QV(x;FnI29-!47j?wZQV4=95fz1qm*r@xle zKI(t+J^$qF`FYF#Ziu~7w0zF`vfr+;|9<`|?VrA1(oDZSpYQyuWq!xaZS*($m$g6M zeYS7D{onVk-j;jg{f?zpzJGQ_zJK?P{?#kzOxb+?*wZa~{^w8M?GIn=Jh!gsz{`)H QbARgVdI~2Wy3EV~0LLDW{r~^~ literal 1560 zcmb2|=3sz;x7U5MqSGbX9_okHWwoEVmH3ivPg4VD3!7Dj$HEI=+6DZcF7|Ml81u7b z%DN@HHSao>PdT+@$A!QjUSFQHzGmYsdE>q5;anT_w?A(GEUGc}S^aa(+#2IG$1|nm z`S)+TmN$2c^?#cgThpJf4u5|8?YmF^^w+oF{c`*B-`|DBJ8$K+ef_*z{?8VPXRFV4 zZ$4XQuIoSja8=>9d;28Im!JN7`D2c)-m=SYkM6LH=6QYk%f;&5 zN1s~M{(r~6v+n=l-RF1I{eOIWd;b5N-~B(cV)jP(y*;?*?%$&Sg4gdCetJ2#>`%eo zx%>B2-ASwedr`%6l8Wc0*?fTHUU*=yoPE4d27>xOyz44vwmG@kydP$O+{3$~&)F&_rRU4R zl-V5Gt$mL7gUb1PHZTWOw3LU>k$&JgZ*L{ksN)|w-mkMTKQP&*`ZL^G!F#cVc@657 z-=4v2Jg&TF_oF)u{-55Qh1uBWUIB94yeFd$>w7#JVxwt{(p(A8eioP|11tjr)v!N6 zEmFLJ#m=N9{reu5y?z~c+S Yue<-ge)jKc^>67Z6{ocJU1DYc0M*`7bpQYW diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_4.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_4.schem index 5f917b1af32e8d7f8ad258a82b76bae7640a07e9..734768bb3bc82b8e40d659611dbe7dcfb9fa428e 100644 GIT binary patch literal 2926 zcmeHJT}+Z;6t-Hc&5+ev{tRW6o2@l%ZD~4?t+ln*k5|>2WM!shYCt7?in6tZ6(!R) z$|SmI$;H<)fs}+n^{UiJToG9Vb)R3KMGO!XQ2Bn6elC#PF4^Ag?EN|CIq$pYea>OZ z)+UkSO{bG6uYI_cQI#%5G>t=?v&K~eD+k)|$X~Tz-^jSR`oq4xTkvfeN4sG56P=+& zB~U&u2P4JzIXX&A1!8OEuqqs!aWl1{?EPxEFKG3Aj^M2QL)RKUADs zJdX>~q;@SrI#Z7UwPyiqFmqfiVipcO$Fa$ImbY$-sB@LMOab+?4S>8U;mtv&m|pD`g6wj;bfjFc7-V-E6bQ?q2TYrki? z;KfPNj^)Rfw)E>p>ye)LNC4TzbzZlGUX2mCuI=mNJcGl7+lQ87*3ez=gvguy(l}7I zpyyUJozm81W_rB;+rR#Wx#EgA_|dJYa9T7mOh4TgbHgYMSI&J}9?edHCV-<1NIZ2c zM}i4*#eB!acZyZYgn%ro9SH$R2*`h^$CJxw6|L)5-hXUKl>Zu_k6{-;0&AQE_MPcd zKppB%EqYOClim&LZ&v{~)@cFIe)F-VqHTOR^M_pMt@A;YCKlG+O-@k8HA79Pe`Qz%p zvb)>9ZvH!edTQnWq{?sa*>^wfe*Jj%>)pG5xA*`5a`j)`@6)S4fB*WWV2}0N{CL}c zAKDN9dsR{O_ftvv{=0j2+`KOrckf>9-h2CZSlY+N-&@!I_UPT)U%!0Xu)j7UeoyV6 z+`a#;3zg|uJfBg63t3S7YFFWm?-?#kh ztGfCdcK77ppFdx=`|0xkU%&spe6`Rv_y5oG=li4P{Y~3j|0mz>T*aoE52wF=soEW> zr$0@;c3a->*MGO&*FA6l|I4R>iiqv^_f>y?_x}FRf4e__-(UOu_j~#J_;Y9UuRVS} zJ9pmNANXdnnnuz<(eAcJCGptM=}UIK1Ol z>+!M&^XlaFYEm#vxIVGlvy?cYl7K{`~yq&(CK+ogZ;r!2Df1I|Bgo@a|Xu diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_5.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_5.schem index 3d184517a2a042639dc04c1502898f30768ac1d9..2046cc56848840cd23c5023f2869af72f73d18c8 100644 GIT binary patch literal 4358 zcmb2|=3tPj6-!|F|Mtq+E}84H#~x0qa+6=2A>OVdRKwi#hE?goi3zSfyp0y}GZxy! zuGPHrYTlPAI@YUWyxxVp>`c*2DfAQA({23xXXAmZm;aXhj{S4Kt-XHFjyZ9Cr)xG! zo!ck1{qiQC_#S(n!v$4lcj~_%%KDLJyFcdr_x9Jz>+4PBrq$1ppTGR>*FE=pZ-1U` z|0mZt?#yoS^JTve7yW!vbSH0K?)UY}4^KY*c=hGYZ?{Cwd$WGo-OXor?436+=I)=| zsQtCSp8d!zw|{3H7aRNc|NX*EQg)U9W!LLJPqn(=b6@UR_v8ET*0dehe}1>5P{RE5 zf4cVLzn|;#@9p_{y&$E|{;a;<^oKR3HdS>h z_v(+|JpZ1b-~RSH{e8PDD=Yq-T;8nWISG!I#FS5Z__4x9uK)OBtW@=b+j=&9IHiGl z{(bwLD=x>5%K(t6^}l~^L`?>xVK|y>5Gi6b zr;L_1NL9sX;V@b_j1~@~EeAvz7%dz|8=OdK0Ff|8TMmP|<$&99k3asneSUjvg$&kc zg$n+8`t51L2{@=!K4sZXp%U_M&A4|RW{#@Jf&(D6g zKW9ID^3&t1CV#SEJ^%3bpT7%do?G9yKPl?ma`|UZIqp^4f;!RCAD8$4`E=O*-rmyf zGRN*7HMt`xm;0@~JM-`E+4HMw{@mPAYx}R_Z_O>g(;vm{q{8CguJ7NUTl(kw?Eilr zBwAD&+?jj*u>QT(_Jz;eD>w6$w_jfW{A-cr9DAvEwL5Rd_@B0ZaCtVre0Y`7AL(-w KizSsLco_iWTajG= literal 4157 zcmeHKZ%7ki9JWxhq%6uNW;+7K{yK_4VgH~nB0Wx_&!-XgXfI8w5M!+ImTO^g(Y(*GNt?T7GED}J2xdxKmEMy$KES<7Iq#R zdWqB=f9mcmp3vta)^9DMS61>y^ii~UVhJO0Uspm8d0gamJ_QGBK|#=rP;%!-$p!t* zq~dnJ9FL>e>iBpd!J{!t5F=Cr&~(C&E4%%$-9a4!2Y+gSzFDKeG$^bx8D}ahjRr%k z5ln=`!6n*mr`<%@3)6ACHMmUC3s3^bbf97thV?@FQ;2ZEP%_Ey?Wxnsi6;Or+eSI8 zL7iS1fpD&-j)!pjaGxG(_i!Lf03J}Q1DBGK7`z(03d+gJ5G=24#gtTl(zYZU1V}I4 z1X5nVoo)KjWFd;*5Z+vUygdDPLr|soB+trk>nf zk*y6?O7l~${{4}(_*yyK9n4t-+$0)9+H5bri0NFqU?1~_?#3A$*`4+a64N(D diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_6.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/private/private_pocket_6.schem index 2293427c220ca9de44f864b0ac365cce17ef4841..0f3e516fa461b70ed3b4099fd2318c6ab1aed1df 100644 GIT binary patch literal 6244 zcmb2|=3vmT6-!|F|Mu3|t|jH7$3Lbod#-vpxhyb7&odAj)L z&sR5DTF>;mAD#O=b>{uZS}WhncQ3#Ew_4n98UH!+^XI?+K74g{{jZABh<|^+{IGey z&g}QytlwXL@z=+!KWDZ(y}$hT;i8W(lD5X$-+LE-rrllqc=+?t6oLe}4Gu`91&c@36i5`|Fv4A>&o};n>GFZ-kP7E-p5z}`}^@{K9D;6@u&RdkJ)vm z`SW6RF8@oZ`tjt4XuQ<&{5$jI_H4a7zqaJ>r!U9s@6T27oP>tlV?3n$iN?cCu-R-;o?Cy9f z5#{>tzItNoro4`=n6V?j{Q2*KhpKHvx$U1n-_*kY6Tupj^!6MfDzNTww4bWo3G%=8 zvqRoIM0u;XV8xy3qt=WD8Yqd5rnJ#~Gg{b;7M-K@&1mg8+T<8*K#jIKN88ZE^wLH< z9;4l;(Z1(sPkMCtVRSHMbOeh0@id}_1`9068nz^6tQFMSF+ciM&&G$S!A+p@yspV; zW4kJzzxr%v#MNi-w*UR&?cGh0W}mOV{J1rG`Q^F5v2m-p@8-ST{`>IVmro4l$M66B zuH^g8#ChfO|9_v$zg_p8a+5`g!rQ z-|5VcJ$Kn3K9oMa{jB=x)Viw5Kcb&MmHaE&EVKW^z3$4-Z<2QYJEm{<>G68IPp{VQ ze!Ah-+_RV0zI<3!Z!!CPedXWc{(k$2-1s$iyQ_@ypFjPnzW zzk`=co^O5m?ODyQi_`D_I(psKHs{*ulImT*|2?bOIpZ7u^6K~Nu7`jA^oqN#?C-C|G#mOS6FAQ{~qJkws61 zgQ^5uorX@5s9ItgvG{97^^et`Pyg+{`>~*Io9(Zs z@3QJ`-r3*#n|XWNcDda5e_kKG`R(QA!`7|tt$_o zzxU^Z@8Y{ZAO8AT{kr+~(7sSw|;)in{{z- z<@eWozWMK_{d_yy%WX% zac}mL6sU;cdk zw#(~({`~jh&!-)C=j6Ws_vVZCJ~O$!|IdBul9~M~15TweFmx{}&5mW{>sr)FdRlnPP_rKzuNF~B92Ri9{uAW%ll-GJTK6lEi zKRECBAVi#}|Ess3+VTGc$S-*_xb+Q*vTXaIg+=<;V=HFtNYvYNgqX0kxWmt3H4F_wAZ`d;0OyZ=c-Y{+DU0X->$j&)Fu%D-~QDX57r_M(q3&68Ym zub%ro_xtyJp5Iq&e7x(#t2_`R zMwWXBr|XScvtka*LQ6@7YTdxyij;%-YCIo}7I(P-;foje#=X*n&%3TtY9zBsHjNJ3 z%!TZ2$~x%b8up!VFrG1fC)_GV8tGJp2~Ic(Z3Xw?xYMr zXt7hz)TS+JZ?EbaTH7)^!d6e=r!~mD;6ukw{Ugs$GMK{h7iOJ9RKMq=7S8J1 zLKhTiKt-Pai8{CEI{BA>>ZdxYBGm1 zwg^HVvFh{;USYBZ54{khrfS6=Y3(&xGt7+e_a1D#j}gc2&dX#&#WomfPW3K#;$rQCxdDvzY z+R#PCThcpRT8NyUMm%nWb=q$Rx?9al*6jN6P^yqGhhzg>>-@lY!oiJTF1}IK5`Hhf e;;rQ4@rs+^KB{T_-X7$8Rv@@TKX$QC-1P@b0YvZs literal 8327 zcmeHMUq};i92a^>3YCHyLE9k+6@)TN_SR}QnR7pz61$F3`Ab7>b~}OfTg0SjSk5o93w1xjbSTBA1a+M~&_dN_ zN(KL1ob1xZlrE2r%Z?D3wVcS0$}>8oTc?XehxCL{9Po7vsXddz&$ly6WN4mwpG%Vm z!s9WiUg>pP`>|e|`?$($!`+tN9=w$0c_Cf66U5ESQ^PCYocm%ZQDz3lgSEc?PRwNK zQ{a}KazUciWTMveBI|F~Hq%b|2l+WSQ@P?MYQfFSt;uY1gOz&2VN?2@j%S2ICZz-^d|3%K>YO)rHrB(&J6ac z$bBv|24=J2B$jiLG`Pn#Yf-gDr@2JV{dAiI_|nw5 zjU&(`GeQDifI~Qpy~{Mp5G2RVP5}oji0wt^O%jTt1b!g_8g8Zw-Ra1#$Bo7?1F$uB z)Nw;2M5Y*~6GbNhQ;p&HN5MBv@mGT5nh>M|IO)XcuJ{Gq#PR$?ifROoJ)Rt653MI2 zHVwlLmh~{~N)%Q*V8y{|hfN+fd5}g6XFHtj5YhqQLI~*~l7|Z%$PNjSJVf$vZwCNn zkgkDr4P@y6S_Wk4AUO-kSrAzOa`KRqhf)jxyZnDBa3E{j-}$>`<@BFB-9)Wkm#|YT z%lhf?xW-rho;37LD!f>}7{4B9ap+YoYtp%gFc-#1@&O%+gvMNsx(pu0OIHI#)fwAu J34Q{p`VEno!-W6<